/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 7788e48a651bef02993531a41aad2ca516d1d4a2:


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 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 70  ee(db, p);.    p
0b50: 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 62   = pPrior;.    b
0b60: 46 72 65 65 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a  Free = 1;.  }.}.
0b70: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
0b80: 65 20 61 20 53 65 6c 65 63 74 44 65 73 74 20 73  e a SelectDest s
0b90: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69  tructure..*/.voi
0ba0: 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  d sqlite3SelectD
0bb0: 65 73 74 49 6e 69 74 28 53 65 6c 65 63 74 44 65  estInit(SelectDe
0bc0: 73 74 20 2a 70 44 65 73 74 2c 20 69 6e 74 20 65  st *pDest, int e
0bd0: 44 65 73 74 2c 20 69 6e 74 20 69 50 61 72 6d 29  Dest, int iParm)
0be0: 7b 0a 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74  {.  pDest->eDest
0bf0: 20 3d 20 28 75 38 29 65 44 65 73 74 3b 0a 20 20   = (u8)eDest;.  
0c00: 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 20 3d  pDest->iSDParm =
0c10: 20 69 50 61 72 6d 3b 0a 20 20 70 44 65 73 74 2d   iParm;.  pDest-
0c20: 3e 7a 41 66 66 53 64 73 74 20 3d 20 30 3b 0a 20  >zAffSdst = 0;. 
0c30: 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20   pDest->iSdst = 
0c40: 30 3b 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64 73  0;.  pDest->nSds
0c50: 74 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  t = 0;.}.../*.**
0c60: 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
0c70: 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65  Select structure
0c80: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f   and return a po
0c90: 69 6e 74 65 72 20 74 6f 20 74 68 61 74 0a 2a 2a  inter to that.**
0ca0: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 53   structure..*/.S
0cb0: 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65  elect *sqlite3Se
0cc0: 6c 65 63 74 4e 65 77 28 0a 20 20 50 61 72 73 65  lectNew(.  Parse
0cd0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
0ce0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
0cf0: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
0d00: 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 2f  t *pEList,     /
0d10: 2a 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73 20  * which columns 
0d20: 74 6f 20 69 6e 63 6c 75 64 65 20 69 6e 20 74 68  to include in th
0d30: 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 53 72  e result */.  Sr
0d40: 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20  cList *pSrc,    
0d50: 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20      /* the FROM 
0d60: 63 6c 61 75 73 65 20 2d 2d 20 77 68 69 63 68 20  clause -- which 
0d70: 74 61 62 6c 65 73 20 74 6f 20 73 63 61 6e 20 2a  tables to scan *
0d80: 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
0d90: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65  ,         /* the
0da0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
0db0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72  .  ExprList *pGr
0dc0: 6f 75 70 42 79 2c 20 20 20 2f 2a 20 74 68 65 20  oupBy,   /* the 
0dd0: 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
0de0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69  */.  Expr *pHavi
0df0: 6e 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68  ng,        /* th
0e00: 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20  e HAVING clause 
0e10: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
0e20: 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 74 68  OrderBy,   /* th
0e30: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
0e40: 65 20 2a 2f 0a 20 20 75 33 32 20 73 65 6c 46 6c  e */.  u32 selFl
0e50: 61 67 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ags,         /* 
0e60: 46 6c 61 67 20 70 61 72 61 6d 65 74 65 72 73 2c  Flag parameters,
0e70: 20 73 75 63 68 20 61 73 20 53 46 5f 44 69 73 74   such as SF_Dist
0e80: 69 6e 63 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  inct */.  Expr *
0e90: 70 4c 69 6d 69 74 2c 20 20 20 20 20 20 20 20 20  pLimit,         
0ea0: 2f 2a 20 4c 49 4d 49 54 20 76 61 6c 75 65 2e 20  /* LIMIT value. 
0eb0: 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 6e 6f 74 20   NULL means not 
0ec0: 75 73 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  used */.  Expr *
0ed0: 70 4f 66 66 73 65 74 20 20 20 20 20 20 20 20 20  pOffset         
0ee0: 2f 2a 20 4f 46 46 53 45 54 20 76 61 6c 75 65 2e  /* OFFSET value.
0ef0: 20 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 6e 6f 20    NULL means no 
0f00: 6f 66 66 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 53  offset */.){.  S
0f10: 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 53  elect *pNew;.  S
0f20: 65 6c 65 63 74 20 73 74 61 6e 64 69 6e 3b 0a 20  elect standin;. 
0f30: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
0f40: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 4e 65  Parse->db;.  pNe
0f50: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
0f60: 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a  locRawNN(db, siz
0f70: 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20  eof(*pNew) );.  
0f80: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
0f90: 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d     assert( db->m
0fa0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
0fb0: 20 20 20 70 4e 65 77 20 3d 20 26 73 74 61 6e 64     pNew = &stand
0fc0: 69 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45  in;.  }.  if( pE
0fd0: 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  List==0 ){.    p
0fe0: 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  EList = sqlite3E
0ff0: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
1000: 61 72 73 65 2c 20 30 2c 20 73 71 6c 69 74 65 33  arse, 0, sqlite3
1010: 45 78 70 72 28 64 62 2c 54 4b 5f 41 53 54 45 52  Expr(db,TK_ASTER
1020: 49 53 4b 2c 30 29 29 3b 0a 20 20 7d 0a 20 20 70  ISK,0));.  }.  p
1030: 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 70 45  New->pEList = pE
1040: 4c 69 73 74 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70  List;.  pNew->op
1050: 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20   = TK_SELECT;.  
1060: 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d  pNew->selFlags =
1070: 20 73 65 6c 46 6c 61 67 73 3b 0a 20 20 70 4e 65   selFlags;.  pNe
1080: 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  w->iLimit = 0;. 
1090: 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d   pNew->iOffset =
10a0: 20 30 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52   0;.#if SELECTTR
10b0: 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 70 4e  ACE_ENABLED.  pN
10c0: 65 77 2d 3e 7a 53 65 6c 4e 61 6d 65 5b 30 5d 20  ew->zSelName[0] 
10d0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70 4e  = 0;.#endif.  pN
10e0: 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  ew->addrOpenEphm
10f0: 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77  [0] = -1;.  pNew
1100: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31  ->addrOpenEphm[1
1110: 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e  ] = -1;.  pNew->
1120: 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 30 3b 0a  nSelectRow = 0;.
1130: 20 20 69 66 28 20 70 53 72 63 3d 3d 30 20 29 20    if( pSrc==0 ) 
1140: 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 44 62  pSrc = sqlite3Db
1150: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
1160: 69 7a 65 6f 66 28 2a 70 53 72 63 29 29 3b 0a 20  izeof(*pSrc));. 
1170: 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 70 53   pNew->pSrc = pS
1180: 72 63 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65  rc;.  pNew->pWhe
1190: 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 70  re = pWhere;.  p
11a0: 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20  New->pGroupBy = 
11b0: 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 4e 65 77  pGroupBy;.  pNew
11c0: 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 48 61 76  ->pHaving = pHav
11d0: 69 6e 67 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72  ing;.  pNew->pOr
11e0: 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
11f0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72  ;.  pNew->pPrior
1200: 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e   = 0;.  pNew->pN
1210: 65 78 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  ext = 0;.  pNew-
1220: 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74  >pLimit = pLimit
1230: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65  ;.  pNew->pOffse
1240: 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 70  t = pOffset;.  p
1250: 4e 65 77 2d 3e 70 57 69 74 68 20 3d 20 30 3b 0a  New->pWith = 0;.
1260: 20 20 61 73 73 65 72 74 28 20 70 4f 66 66 73 65    assert( pOffse
1270: 74 3d 3d 30 20 7c 7c 20 70 4c 69 6d 69 74 21 3d  t==0 || pLimit!=
1280: 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  0 || pParse->nEr
1290: 72 3e 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  r>0 || db->mallo
12a0: 63 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20  cFailed!=0 );.  
12b0: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
12c0: 69 6c 65 64 20 29 20 7b 0a 20 20 20 20 63 6c 65  iled ) {.    cle
12d0: 61 72 53 65 6c 65 63 74 28 64 62 2c 20 70 4e 65  arSelect(db, pNe
12e0: 77 2c 20 70 4e 65 77 21 3d 26 73 74 61 6e 64 69  w, pNew!=&standi
12f0: 6e 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30  n);.    pNew = 0
1300: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
1310: 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 53 72  ssert( pNew->pSr
1320: 63 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  c!=0 || pParse->
1330: 6e 45 72 72 3e 30 20 29 3b 0a 20 20 7d 0a 20 20  nErr>0 );.  }.  
1340: 61 73 73 65 72 74 28 20 70 4e 65 77 21 3d 26 73  assert( pNew!=&s
1350: 74 61 6e 64 69 6e 20 29 3b 0a 20 20 72 65 74 75  tandin );.  retu
1360: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 23 69 66 20  rn pNew;.}..#if 
1370: 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42  SELECTTRACE_ENAB
1380: 4c 45 44 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  LED./*.** Set th
1390: 65 20 6e 61 6d 65 20 6f 66 20 61 20 53 65 6c 65  e name of a Sele
13a0: 63 74 20 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69  ct object.*/.voi
13b0: 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 53  d sqlite3SelectS
13c0: 65 74 4e 61 6d 65 28 53 65 6c 65 63 74 20 2a 70  etName(Select *p
13d0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
13e0: 61 6d 65 29 7b 0a 20 20 69 66 28 20 70 20 26 26  ame){.  if( p &&
13f0: 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 73 71   zName ){.    sq
1400: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
1410: 69 7a 65 6f 66 28 70 2d 3e 7a 53 65 6c 4e 61 6d  izeof(p->zSelNam
1420: 65 29 2c 20 70 2d 3e 7a 53 65 6c 4e 61 6d 65 2c  e), p->zSelName,
1430: 20 22 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20   "%s", zName);. 
1440: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a   }.}.#endif.../*
1450: 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 67  .** Delete the g
1460: 69 76 65 6e 20 53 65 6c 65 63 74 20 73 74 72 75  iven Select stru
1470: 63 74 75 72 65 20 61 6e 64 20 61 6c 6c 20 6f 66  cture and all of
1480: 20 69 74 73 20 73 75 62 73 74 72 75 63 74 75 72   its substructur
1490: 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
14a0: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
14b0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c  sqlite3 *db, Sel
14c0: 65 63 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  ect *p){.  if( p
14d0: 20 29 20 63 6c 65 61 72 53 65 6c 65 63 74 28 64   ) clearSelect(d
14e0: 62 2c 20 70 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a  b, p, 1);.}../*.
14f0: 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
1500: 74 65 72 20 74 6f 20 74 68 65 20 72 69 67 68 74  ter to the right
1510: 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61  -most SELECT sta
1520: 74 65 6d 65 6e 74 20 69 6e 20 61 20 63 6f 6d 70  tement in a comp
1530: 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ound..*/.static 
1540: 53 65 6c 65 63 74 20 2a 66 69 6e 64 52 69 67 68  Select *findRigh
1550: 74 6d 6f 73 74 28 53 65 6c 65 63 74 20 2a 70 29  tmost(Select *p)
1560: 7b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 70 4e  {.  while( p->pN
1570: 65 78 74 20 29 20 70 20 3d 20 70 2d 3e 70 4e 65  ext ) p = p->pNe
1580: 78 74 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a  xt;.  return p;.
1590: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 31  }../*.** Given 1
15a0: 20 74 6f 20 33 20 69 64 65 6e 74 69 66 69 65 72   to 3 identifier
15b0: 73 20 70 72 65 63 65 64 69 6e 67 20 74 68 65 20  s preceding the 
15c0: 4a 4f 49 4e 20 6b 65 79 77 6f 72 64 2c 20 64 65  JOIN keyword, de
15d0: 74 65 72 6d 69 6e 65 20 74 68 65 0a 2a 2a 20 74  termine the.** t
15e0: 79 70 65 20 6f 66 20 6a 6f 69 6e 2e 20 20 52 65  ype of join.  Re
15f0: 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20  turn an integer 
1600: 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20 65 78  constant that ex
1610: 70 72 65 73 73 65 73 20 74 68 61 74 20 74 79 70  presses that typ
1620: 65 0a 2a 2a 20 69 6e 20 74 65 72 6d 73 20 6f 66  e.** in terms of
1630: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   the following b
1640: 69 74 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a 2a  it values:.**.**
1650: 20 20 20 20 20 4a 54 5f 49 4e 4e 45 52 0a 2a 2a       JT_INNER.**
1660: 20 20 20 20 20 4a 54 5f 43 52 4f 53 53 0a 2a 2a       JT_CROSS.**
1670: 20 20 20 20 20 4a 54 5f 4f 55 54 45 52 0a 2a 2a       JT_OUTER.**
1680: 20 20 20 20 20 4a 54 5f 4e 41 54 55 52 41 4c 0a       JT_NATURAL.
1690: 2a 2a 20 20 20 20 20 4a 54 5f 4c 45 46 54 0a 2a  **     JT_LEFT.*
16a0: 2a 20 20 20 20 20 4a 54 5f 52 49 47 48 54 0a 2a  *     JT_RIGHT.*
16b0: 2a 0a 2a 2a 20 41 20 66 75 6c 6c 20 6f 75 74 65  *.** A full oute
16c0: 72 20 6a 6f 69 6e 20 69 73 20 74 68 65 20 63 6f  r join is the co
16d0: 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 4a 54 5f  mbination of JT_
16e0: 4c 45 46 54 20 61 6e 64 20 4a 54 5f 52 49 47 48  LEFT and JT_RIGH
16f0: 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69  T..**.** If an i
1700: 6c 6c 65 67 61 6c 20 6f 72 20 75 6e 73 75 70 70  llegal or unsupp
1710: 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70 65 20  orted join type 
1720: 69 73 20 73 65 65 6e 2c 20 74 68 65 6e 20 73 74  is seen, then st
1730: 69 6c 6c 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20  ill return.** a 
1740: 6a 6f 69 6e 20 74 79 70 65 2c 20 62 75 74 20 70  join type, but p
1750: 75 74 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 74  ut an error in t
1760: 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63 74  he pParse struct
1770: 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ure..*/.int sqli
1780: 74 65 33 4a 6f 69 6e 54 79 70 65 28 50 61 72 73  te3JoinType(Pars
1790: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
17a0: 20 2a 70 41 2c 20 54 6f 6b 65 6e 20 2a 70 42 2c   *pA, Token *pB,
17b0: 20 54 6f 6b 65 6e 20 2a 70 43 29 7b 0a 20 20 69   Token *pC){.  i
17c0: 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b  nt jointype = 0;
17d0: 0a 20 20 54 6f 6b 65 6e 20 2a 61 70 41 6c 6c 5b  .  Token *apAll[
17e0: 33 5d 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 3b 0a  3];.  Token *p;.
17f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1800: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1810: 20 20 30 31 32 33 34 35 36 37 38 39 20 31 32 33    0123456789 123
1820: 34 35 36 37 38 39 20 31 32 33 34 35 36 37 38 39  456789 123456789
1830: 20 31 32 33 20 2a 2f 0a 20 20 73 74 61 74 69 63   123 */.  static
1840: 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 4b 65 79   const char zKey
1850: 54 65 78 74 5b 5d 20 3d 20 22 6e 61 74 75 72 61  Text[] = "natura
1860: 6c 65 66 74 6f 75 74 65 72 69 67 68 74 66 75 6c  leftouterightful
1870: 6c 69 6e 6e 65 72 63 72 6f 73 73 22 3b 0a 20 20  linnercross";.  
1880: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
1890: 75 63 74 20 7b 0a 20 20 20 20 75 38 20 69 3b 20  uct {.    u8 i; 
18a0: 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e         /* Beginn
18b0: 69 6e 67 20 6f 66 20 6b 65 79 77 6f 72 64 20 74  ing of keyword t
18c0: 65 78 74 20 69 6e 20 7a 4b 65 79 54 65 78 74 5b  ext in zKeyText[
18d0: 5d 20 2a 2f 0a 20 20 20 20 75 38 20 6e 43 68 61  ] */.    u8 nCha
18e0: 72 3b 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20  r;    /* Length 
18f0: 6f 66 20 74 68 65 20 6b 65 79 77 6f 72 64 20 69  of the keyword i
1900: 6e 20 63 68 61 72 61 63 74 65 72 73 20 2a 2f 0a  n characters */.
1910: 20 20 20 20 75 38 20 63 6f 64 65 3b 20 20 20 20      u8 code;    
1920: 20 2f 2a 20 4a 6f 69 6e 20 74 79 70 65 20 6d 61   /* Join type ma
1930: 73 6b 20 2a 2f 0a 20 20 7d 20 61 4b 65 79 77 6f  sk */.  } aKeywo
1940: 72 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a 20  rd[] = {.    /* 
1950: 6e 61 74 75 72 61 6c 20 2a 2f 20 7b 20 30 2c 20  natural */ { 0, 
1960: 20 37 2c 20 4a 54 5f 4e 41 54 55 52 41 4c 20 20   7, JT_NATURAL  
1970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
1980: 0a 20 20 20 20 2f 2a 20 6c 65 66 74 20 20 20 20  .    /* left    
1990: 2a 2f 20 7b 20 36 2c 20 20 34 2c 20 4a 54 5f 4c  */ { 6,  4, JT_L
19a0: 45 46 54 7c 4a 54 5f 4f 55 54 45 52 20 20 20 20  EFT|JT_OUTER    
19b0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20        },.    /* 
19c0: 6f 75 74 65 72 20 20 20 2a 2f 20 7b 20 31 30 2c  outer   */ { 10,
19d0: 20 35 2c 20 4a 54 5f 4f 55 54 45 52 20 20 20 20   5, JT_OUTER    
19e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
19f0: 0a 20 20 20 20 2f 2a 20 72 69 67 68 74 20 20 20  .    /* right   
1a00: 2a 2f 20 7b 20 31 34 2c 20 35 2c 20 4a 54 5f 52  */ { 14, 5, JT_R
1a10: 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 20 20  IGHT|JT_OUTER   
1a20: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20        },.    /* 
1a30: 66 75 6c 6c 20 20 20 20 2a 2f 20 7b 20 31 39 2c  full    */ { 19,
1a40: 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52   4, JT_LEFT|JT_R
1a50: 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c  IGHT|JT_OUTER },
1a60: 0a 20 20 20 20 2f 2a 20 69 6e 6e 65 72 20 20 20  .    /* inner   
1a70: 2a 2f 20 7b 20 32 33 2c 20 35 2c 20 4a 54 5f 49  */ { 23, 5, JT_I
1a80: 4e 4e 45 52 20 20 20 20 20 20 20 20 20 20 20 20  NNER            
1a90: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20        },.    /* 
1aa0: 63 72 6f 73 73 20 20 20 2a 2f 20 7b 20 32 38 2c  cross   */ { 28,
1ab0: 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f   5, JT_INNER|JT_
1ac0: 43 52 4f 53 53 20 20 20 20 20 20 20 20 20 7d 2c  CROSS         },
1ad0: 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  .  };.  int i, j
1ae0: 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d 20 3d 20 70  ;.  apAll[0] = p
1af0: 41 3b 0a 20 20 61 70 41 6c 6c 5b 31 5d 20 3d 20  A;.  apAll[1] = 
1b00: 70 42 3b 0a 20 20 61 70 41 6c 6c 5b 32 5d 20 3d  pB;.  apAll[2] =
1b10: 20 70 43 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20   pC;.  for(i=0; 
1b20: 69 3c 33 20 26 26 20 61 70 41 6c 6c 5b 69 5d 3b  i<3 && apAll[i];
1b30: 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61   i++){.    p = a
1b40: 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20 20 66 6f 72  pAll[i];.    for
1b50: 28 6a 3d 30 3b 20 6a 3c 41 72 72 61 79 53 69 7a  (j=0; j<ArraySiz
1b60: 65 28 61 4b 65 79 77 6f 72 64 29 3b 20 6a 2b 2b  e(aKeyword); j++
1b70: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
1b80: 6e 3d 3d 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 6e  n==aKeyword[j].n
1b90: 43 68 61 72 20 0a 20 20 20 20 20 20 20 20 20 20  Char .          
1ba0: 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  && sqlite3StrNIC
1bb0: 6d 70 28 28 63 68 61 72 2a 29 70 2d 3e 7a 2c 20  mp((char*)p->z, 
1bc0: 26 7a 4b 65 79 54 65 78 74 5b 61 4b 65 79 77 6f  &zKeyText[aKeywo
1bd0: 72 64 5b 6a 5d 2e 69 5d 2c 20 70 2d 3e 6e 29 3d  rd[j].i], p->n)=
1be0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 6f  =0 ){.        jo
1bf0: 69 6e 74 79 70 65 20 7c 3d 20 61 4b 65 79 77 6f  intype |= aKeywo
1c00: 72 64 5b 6a 5d 2e 63 6f 64 65 3b 0a 20 20 20 20  rd[j].code;.    
1c10: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1c20: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73   }.    }.    tes
1c30: 74 63 61 73 65 28 20 6a 3d 3d 30 20 7c 7c 20 6a  tcase( j==0 || j
1c40: 3d 3d 31 20 7c 7c 20 6a 3d 3d 32 20 7c 7c 20 6a  ==1 || j==2 || j
1c50: 3d 3d 33 20 7c 7c 20 6a 3d 3d 34 20 7c 7c 20 6a  ==3 || j==4 || j
1c60: 3d 3d 35 20 7c 7c 20 6a 3d 3d 36 20 29 3b 0a 20  ==5 || j==6 );. 
1c70: 20 20 20 69 66 28 20 6a 3e 3d 41 72 72 61 79 53     if( j>=ArrayS
1c80: 69 7a 65 28 61 4b 65 79 77 6f 72 64 29 20 29 7b  ize(aKeyword) ){
1c90: 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20  .      jointype 
1ca0: 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b 0a 20 20 20  |= JT_ERROR;.   
1cb0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1cc0: 20 20 7d 0a 20 20 69 66 28 0a 20 20 20 20 20 28    }.  if(.     (
1cd0: 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 49  jointype & (JT_I
1ce0: 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29 29 3d  NNER|JT_OUTER))=
1cf0: 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55  =(JT_INNER|JT_OU
1d00: 54 45 52 29 20 7c 7c 0a 20 20 20 20 20 28 6a 6f  TER) ||.     (jo
1d10: 69 6e 74 79 70 65 20 26 20 4a 54 5f 45 52 52 4f  intype & JT_ERRO
1d20: 52 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 63  R)!=0.  ){.    c
1d30: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 70 20 3d  onst char *zSp =
1d40: 20 22 20 22 3b 0a 20 20 20 20 61 73 73 65 72 74   " ";.    assert
1d50: 28 20 70 42 21 3d 30 20 29 3b 0a 20 20 20 20 69  ( pB!=0 );.    i
1d60: 66 28 20 70 43 3d 3d 30 20 29 7b 20 7a 53 70 2b  f( pC==0 ){ zSp+
1d70: 2b 3b 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33  +; }.    sqlite3
1d80: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1d90: 20 22 75 6e 6b 6e 6f 77 6e 20 6f 72 20 75 6e 73   "unknown or uns
1da0: 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79  upported join ty
1db0: 70 65 3a 20 22 0a 20 20 20 20 20 20 20 22 25 54  pe: ".       "%T
1dc0: 20 25 54 25 73 25 54 22 2c 20 70 41 2c 20 70 42   %T%s%T", pA, pB
1dd0: 2c 20 7a 53 70 2c 20 70 43 29 3b 0a 20 20 20 20  , zSp, pC);.    
1de0: 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e  jointype = JT_IN
1df0: 4e 45 52 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  NER;.  }else if(
1e00: 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f   (jointype & JT_
1e10: 4f 55 54 45 52 29 21 3d 30 20 0a 20 20 20 20 20  OUTER)!=0 .     
1e20: 20 20 20 20 26 26 20 28 6a 6f 69 6e 74 79 70 65      && (jointype
1e30: 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52   & (JT_LEFT|JT_R
1e40: 49 47 48 54 29 29 21 3d 4a 54 5f 4c 45 46 54 20  IGHT))!=JT_LEFT 
1e50: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
1e60: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
1e70: 20 20 20 20 20 20 22 52 49 47 48 54 20 61 6e 64        "RIGHT and
1e80: 20 46 55 4c 4c 20 4f 55 54 45 52 20 4a 4f 49 4e   FULL OUTER JOIN
1e90: 73 20 61 72 65 20 6e 6f 74 20 63 75 72 72 65 6e  s are not curren
1ea0: 74 6c 79 20 73 75 70 70 6f 72 74 65 64 22 29 3b  tly supported");
1eb0: 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20  .    jointype = 
1ec0: 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 0a 20 20  JT_INNER;.  }.  
1ed0: 72 65 74 75 72 6e 20 6a 6f 69 6e 74 79 70 65 3b  return jointype;
1ee0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1ef0: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20   the index of a 
1f00: 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 74 61 62 6c  column in a tabl
1f10: 65 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66  e.  Return -1 if
1f20: 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69   the column.** i
1f30: 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20  s not contained 
1f40: 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f  in the table..*/
1f50: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6c 75  .static int colu
1f60: 6d 6e 49 6e 64 65 78 28 54 61 62 6c 65 20 2a 70  mnIndex(Table *p
1f70: 54 61 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  Tab, const char 
1f80: 2a 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b  *zCol){.  int i;
1f90: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54  .  for(i=0; i<pT
1fa0: 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ab->nCol; i++){.
1fb0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
1fc0: 74 72 49 43 6d 70 28 70 54 61 62 2d 3e 61 43 6f  trICmp(pTab->aCo
1fd0: 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c  l[i].zName, zCol
1fe0: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b  )==0 ) return i;
1ff0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31  .  }.  return -1
2000: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63  ;.}../*.** Searc
2010: 68 20 74 68 65 20 66 69 72 73 74 20 4e 20 74 61  h the first N ta
2020: 62 6c 65 73 20 69 6e 20 70 53 72 63 2c 20 66 72  bles in pSrc, fr
2030: 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74  om left to right
2040: 2c 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 0a  , looking for a.
2050: 2a 2a 20 74 61 62 6c 65 20 74 68 61 74 20 68 61  ** table that ha
2060: 73 20 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64  s a column named
2070: 20 7a 43 6f 6c 2e 20 20 0a 2a 2a 0a 2a 2a 20 57   zCol.  .**.** W
2080: 68 65 6e 20 66 6f 75 6e 64 2c 20 73 65 74 20 2a  hen found, set *
2090: 70 69 54 61 62 20 61 6e 64 20 2a 70 69 43 6f 6c  piTab and *piCol
20a0: 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 69 6e   to the table in
20b0: 64 65 78 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 69  dex and column i
20c0: 6e 64 65 78 0a 2a 2a 20 6f 66 20 74 68 65 20 6d  ndex.** of the m
20d0: 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 61  atching column a
20e0: 6e 64 20 72 65 74 75 72 6e 20 54 52 55 45 2e 0a  nd return TRUE..
20f0: 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 74 20 66 6f 75  **.** If not fou
2100: 6e 64 2c 20 72 65 74 75 72 6e 20 46 41 4c 53 45  nd, return FALSE
2110: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2120: 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e  tableAndColumnIn
2130: 64 65 78 28 0a 20 20 53 72 63 4c 69 73 74 20 2a  dex(.  SrcList *
2140: 70 53 72 63 2c 20 20 20 20 20 20 20 2f 2a 20 41  pSrc,       /* A
2150: 72 72 61 79 20 6f 66 20 74 61 62 6c 65 73 20 74  rray of tables t
2160: 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 69 6e  o search */.  in
2170: 74 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20  t N,            
2180: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2190: 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63 2d 3e  tables in pSrc->
21a0: 61 5b 5d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f  a[] to search */
21b0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
21c0: 43 6f 6c 2c 20 20 20 20 2f 2a 20 4e 61 6d 65 20  Col,    /* Name 
21d0: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 77 65  of the column we
21e0: 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72   are looking for
21f0: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 54 61 62   */.  int *piTab
2200: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72  ,          /* Wr
2210: 69 74 65 20 69 6e 64 65 78 20 6f 66 20 70 53 72  ite index of pSr
2220: 63 2d 3e 61 5b 5d 20 68 65 72 65 20 2a 2f 0a 20  c->a[] here */. 
2230: 20 69 6e 74 20 2a 70 69 43 6f 6c 20 20 20 20 20   int *piCol     
2240: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 69        /* Write i
2250: 6e 64 65 78 20 6f 66 20 70 53 72 63 2d 3e 61 5b  ndex of pSrc->a[
2260: 2a 70 69 54 61 62 5d 2e 70 54 61 62 2d 3e 61 43  *piTab].pTab->aC
2270: 6f 6c 5b 5d 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ol[] here */.){.
2280: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
2290: 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
22a0: 6f 70 69 6e 67 20 6f 76 65 72 20 74 61 62 6c 65  oping over table
22b0: 73 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69  s in pSrc */.  i
22c0: 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20 20 20 20  nt iCol;        
22d0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
22e0: 63 6f 6c 75 6d 6e 20 6d 61 74 63 68 69 6e 67 20  column matching 
22f0: 7a 43 6f 6c 20 2a 2f 0a 0a 20 20 61 73 73 65 72  zCol */..  asser
2300: 74 28 20 28 70 69 54 61 62 3d 3d 30 29 3d 3d 28  t( (piTab==0)==(
2310: 70 69 43 6f 6c 3d 3d 30 29 20 29 3b 20 20 2f 2a  piCol==0) );  /*
2320: 20 42 6f 74 68 20 6f 72 20 6e 65 69 74 68 65 72   Both or neither
2330: 20 61 72 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 66   are NULL */.  f
2340: 6f 72 28 69 3d 30 3b 20 69 3c 4e 3b 20 69 2b 2b  or(i=0; i<N; i++
2350: 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 63 6f  ){.    iCol = co
2360: 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72 63 2d 3e  lumnIndex(pSrc->
2370: 61 5b 69 5d 2e 70 54 61 62 2c 20 7a 43 6f 6c 29  a[i].pTab, zCol)
2380: 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d  ;.    if( iCol>=
2390: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
23a0: 69 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20  iTab ){.        
23b0: 2a 70 69 54 61 62 20 3d 20 69 3b 0a 20 20 20 20  *piTab = i;.    
23c0: 20 20 20 20 2a 70 69 43 6f 6c 20 3d 20 69 43 6f      *piCol = iCo
23d0: 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  l;.      }.     
23e0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
23f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
2400: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
2410: 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
2420: 74 6f 20 61 64 64 20 74 65 72 6d 73 20 69 6d 70  to add terms imp
2430: 6c 69 65 64 20 62 79 20 4a 4f 49 4e 20 73 79 6e  lied by JOIN syn
2440: 74 61 78 20 74 6f 20 74 68 65 0a 2a 2a 20 57 48  tax to the.** WH
2450: 45 52 45 20 63 6c 61 75 73 65 20 65 78 70 72 65  ERE clause expre
2460: 73 73 69 6f 6e 20 6f 66 20 61 20 53 45 4c 45 43  ssion of a SELEC
2470: 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 65  T statement. The
2480: 20 6e 65 77 20 74 65 72 6d 2c 20 77 68 69 63 68   new term, which
2490: 0a 2a 2a 20 69 73 20 41 4e 44 65 64 20 77 69 74  .** is ANDed wit
24a0: 68 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 57  h the existing W
24b0: 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69 73 20  HERE clause, is 
24c0: 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a  of the form:.**.
24d0: 2a 2a 20 20 20 20 28 74 61 62 31 2e 63 6f 6c 31  **    (tab1.col1
24e0: 20 3d 20 74 61 62 32 2e 63 6f 6c 32 29 0a 2a 2a   = tab2.col2).**
24f0: 0a 2a 2a 20 77 68 65 72 65 20 74 61 62 31 20 69  .** where tab1 i
2500: 73 20 74 68 65 20 69 53 72 63 27 74 68 20 74 61  s the iSrc'th ta
2510: 62 6c 65 20 69 6e 20 53 72 63 4c 69 73 74 20 70  ble in SrcList p
2520: 53 72 63 20 61 6e 64 20 74 61 62 32 20 69 73 20  Src and tab2 is 
2530: 74 68 65 20 0a 2a 2a 20 28 69 53 72 63 2b 31 29  the .** (iSrc+1)
2540: 27 74 68 2e 20 43 6f 6c 75 6d 6e 20 63 6f 6c 31  'th. Column col1
2550: 20 69 73 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 4c   is column iColL
2560: 65 66 74 20 6f 66 20 74 61 62 31 2c 20 61 6e 64  eft of tab1, and
2570: 20 63 6f 6c 32 20 69 73 0a 2a 2a 20 63 6f 6c 75   col2 is.** colu
2580: 6d 6e 20 69 43 6f 6c 52 69 67 68 74 20 6f 66 20  mn iColRight of 
2590: 74 61 62 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tab2..*/.static 
25a0: 76 6f 69 64 20 61 64 64 57 68 65 72 65 54 65 72  void addWhereTer
25b0: 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  m(.  Parse *pPar
25c0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
25d0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
25e0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63  context */.  Src
25f0: 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20  List *pSrc,     
2600: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2610: 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 69  List of tables i
2620: 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  n FROM clause */
2630: 0a 20 20 69 6e 74 20 69 4c 65 66 74 2c 20 20 20  .  int iLeft,   
2640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2650: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66     /* Index of f
2660: 69 72 73 74 20 74 61 62 6c 65 20 74 6f 20 6a 6f  irst table to jo
2670: 69 6e 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20  in in pSrc */.  
2680: 69 6e 74 20 69 43 6f 6c 4c 65 66 74 2c 20 20 20  int iColLeft,   
2690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a0: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75  /* Index of colu
26b0: 6d 6e 20 69 6e 20 66 69 72 73 74 20 74 61 62 6c  mn in first tabl
26c0: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 69 67 68  e */.  int iRigh
26d0: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
26e0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
26f0: 6f 66 20 73 65 63 6f 6e 64 20 74 61 62 6c 65 20  of second table 
2700: 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e 74  in pSrc */.  int
2710: 20 69 43 6f 6c 52 69 67 68 74 2c 20 20 20 20 20   iColRight,     
2720: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2730: 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20  Index of column 
2740: 69 6e 20 73 65 63 6f 6e 64 20 74 61 62 6c 65 20  in second table 
2750: 2a 2f 0a 20 20 69 6e 74 20 69 73 4f 75 74 65 72  */.  int isOuter
2760: 4a 6f 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20  Join,           
2770: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2780: 74 68 69 73 20 69 73 20 61 6e 20 4f 55 54 45 52  this is an OUTER
2790: 20 6a 6f 69 6e 20 2a 2f 0a 20 20 45 78 70 72 20   join */.  Expr 
27a0: 2a 2a 70 70 57 68 65 72 65 20 20 20 20 20 20 20  **ppWhere       
27b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
27c0: 2f 4f 55 54 3a 20 54 68 65 20 57 48 45 52 45 20  /OUT: The WHERE 
27d0: 63 6c 61 75 73 65 20 74 6f 20 61 64 64 20 74 6f  clause to add to
27e0: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
27f0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
2800: 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 31 3b 0a  b;.  Expr *pE1;.
2810: 20 20 45 78 70 72 20 2a 70 45 32 3b 0a 20 20 45    Expr *pE2;.  E
2820: 78 70 72 20 2a 70 45 71 3b 0a 0a 20 20 61 73 73  xpr *pEq;..  ass
2830: 65 72 74 28 20 69 4c 65 66 74 3c 69 52 69 67 68  ert( iLeft<iRigh
2840: 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
2850: 53 72 63 2d 3e 6e 53 72 63 3e 69 52 69 67 68 74  Src->nSrc>iRight
2860: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
2870: 72 63 2d 3e 61 5b 69 4c 65 66 74 5d 2e 70 54 61  rc->a[iLeft].pTa
2880: 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  b );.  assert( p
2890: 53 72 63 2d 3e 61 5b 69 52 69 67 68 74 5d 2e 70  Src->a[iRight].p
28a0: 54 61 62 20 29 3b 0a 0a 20 20 70 45 31 20 3d 20  Tab );..  pE1 = 
28b0: 73 71 6c 69 74 65 33 43 72 65 61 74 65 43 6f 6c  sqlite3CreateCol
28c0: 75 6d 6e 45 78 70 72 28 64 62 2c 20 70 53 72 63  umnExpr(db, pSrc
28d0: 2c 20 69 4c 65 66 74 2c 20 69 43 6f 6c 4c 65 66  , iLeft, iColLef
28e0: 74 29 3b 0a 20 20 70 45 32 20 3d 20 73 71 6c 69  t);.  pE2 = sqli
28f0: 74 65 33 43 72 65 61 74 65 43 6f 6c 75 6d 6e 45  te3CreateColumnE
2900: 78 70 72 28 64 62 2c 20 70 53 72 63 2c 20 69 52  xpr(db, pSrc, iR
2910: 69 67 68 74 2c 20 69 43 6f 6c 52 69 67 68 74 29  ight, iColRight)
2920: 3b 0a 0a 20 20 70 45 71 20 3d 20 73 71 6c 69 74  ;..  pEq = sqlit
2930: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
2940: 54 4b 5f 45 51 2c 20 70 45 31 2c 20 70 45 32 2c  TK_EQ, pE1, pE2,
2950: 20 30 29 3b 0a 20 20 69 66 28 20 70 45 71 20 26   0);.  if( pEq &
2960: 26 20 69 73 4f 75 74 65 72 4a 6f 69 6e 20 29 7b  & isOuterJoin ){
2970: 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70  .    ExprSetProp
2980: 65 72 74 79 28 70 45 71 2c 20 45 50 5f 46 72 6f  erty(pEq, EP_Fro
2990: 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 61 73 73 65  mJoin);.    asse
29a0: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
29b0: 65 72 74 79 28 70 45 71 2c 20 45 50 5f 54 6f 6b  erty(pEq, EP_Tok
29c0: 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65  enOnly|EP_Reduce
29d0: 64 29 20 29 3b 0a 20 20 20 20 45 78 70 72 53 65  d) );.    ExprSe
29e0: 74 56 56 41 50 72 6f 70 65 72 74 79 28 70 45 71  tVVAProperty(pEq
29f0: 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a  , EP_NoReduce);.
2a00: 20 20 20 20 70 45 71 2d 3e 69 52 69 67 68 74 4a      pEq->iRightJ
2a10: 6f 69 6e 54 61 62 6c 65 20 3d 20 28 69 31 36 29  oinTable = (i16)
2a20: 70 45 32 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 7d  pE2->iTable;.  }
2a30: 0a 20 20 2a 70 70 57 68 65 72 65 20 3d 20 73 71  .  *ppWhere = sq
2a40: 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c  lite3ExprAnd(db,
2a50: 20 2a 70 70 57 68 65 72 65 2c 20 70 45 71 29 3b   *ppWhere, pEq);
2a60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
2a70: 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72  e EP_FromJoin pr
2a80: 6f 70 65 72 74 79 20 6f 6e 20 61 6c 6c 20 74 65  operty on all te
2a90: 72 6d 73 20 6f 66 20 74 68 65 20 67 69 76 65 6e  rms of the given
2aa0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20   expression..** 
2ab0: 41 6e 64 20 73 65 74 20 74 68 65 20 45 78 70 72  And set the Expr
2ac0: 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  .iRightJoinTable
2ad0: 20 74 6f 20 69 54 61 62 6c 65 20 66 6f 72 20 65   to iTable for e
2ae0: 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65  very term in the
2af0: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  .** expression..
2b00: 2a 2a 0a 2a 2a 20 54 68 65 20 45 50 5f 46 72 6f  **.** The EP_Fro
2b10: 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20 69  mJoin property i
2b20: 73 20 75 73 65 64 20 6f 6e 20 74 65 72 6d 73 20  s used on terms 
2b30: 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
2b40: 20 74 6f 20 74 65 6c 6c 0a 2a 2a 20 74 68 65 20   to tell.** the 
2b50: 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
2b60: 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69 63  processing logic
2b70: 20 74 68 61 74 20 74 68 69 73 20 74 65 72 6d 20   that this term 
2b80: 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a 2a  is part of the.*
2b90: 2a 20 6a 6f 69 6e 20 72 65 73 74 72 69 63 74 69  * join restricti
2ba0: 6f 6e 20 73 70 65 63 69 66 69 65 64 20 69 6e 20  on specified in 
2bb0: 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  the ON or USING 
2bc0: 63 6c 61 75 73 65 20 61 6e 64 20 6e 6f 74 20 61  clause and not a
2bd0: 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20   part.** of the 
2be0: 6d 6f 72 65 20 67 65 6e 65 72 61 6c 20 57 48 45  more general WHE
2bf0: 52 45 20 63 6c 61 75 73 65 2e 20 20 54 68 65 73  RE clause.  Thes
2c00: 65 20 74 65 72 6d 73 20 61 72 65 20 6d 6f 76 65  e terms are move
2c10: 64 20 6f 76 65 72 20 74 6f 20 74 68 65 0a 2a 2a  d over to the.**
2c20: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 64 75   WHERE clause du
2c30: 72 69 6e 67 20 6a 6f 69 6e 20 70 72 6f 63 65 73  ring join proces
2c40: 73 69 6e 67 20 62 75 74 20 77 65 20 6e 65 65 64  sing but we need
2c50: 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61   to remember tha
2c60: 74 20 74 68 65 79 0a 2a 2a 20 6f 72 69 67 69 6e  t they.** origin
2c70: 61 74 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f  ated in the ON o
2c80: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 0a  r USING clause..
2c90: 2a 2a 0a 2a 2a 20 54 68 65 20 45 78 70 72 2e 69  **.** The Expr.i
2ca0: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 74  RightJoinTable t
2cb0: 65 6c 6c 73 20 74 68 65 20 57 48 45 52 45 20 63  ells the WHERE c
2cc0: 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67  lause processing
2cd0: 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 65 78 70   that the.** exp
2ce0: 72 65 73 73 69 6f 6e 20 64 65 70 65 6e 64 73 20  ression depends 
2cf0: 6f 6e 20 74 61 62 6c 65 20 69 52 69 67 68 74 4a  on table iRightJ
2d00: 6f 69 6e 54 61 62 6c 65 20 65 76 65 6e 20 69 66  oinTable even if
2d10: 20 74 68 61 74 20 74 61 62 6c 65 20 69 73 20 6e   that table is n
2d20: 6f 74 0a 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79  ot.** explicitly
2d30: 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68   mentioned in th
2d40: 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 54  e expression.  T
2d50: 68 61 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  hat information 
2d60: 69 73 20 6e 65 65 64 65 64 0a 2a 2a 20 66 6f 72  is needed.** for
2d70: 20 63 61 73 65 73 20 6c 69 6b 65 20 74 68 69 73   cases like this
2d80: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43  :.**.**    SELEC
2d90: 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54  T * FROM t1 LEFT
2da0: 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61   JOIN t2 ON t1.a
2db0: 3d 74 32 2e 62 20 41 4e 44 20 74 31 2e 78 3d 35  =t2.b AND t1.x=5
2dc0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 68 65 72 65  .**.** The where
2dd0: 20 63 6c 61 75 73 65 20 6e 65 65 64 73 20 74 6f   clause needs to
2de0: 20 64 65 66 65 72 20 74 68 65 20 68 61 6e 64 6c   defer the handl
2df0: 69 6e 67 20 6f 66 20 74 68 65 20 74 31 2e 78 3d  ing of the t1.x=
2e00: 35 0a 2a 2a 20 74 65 72 6d 20 75 6e 74 69 6c 20  5.** term until 
2e10: 61 66 74 65 72 20 74 68 65 20 74 32 20 6c 6f 6f  after the t2 loo
2e20: 70 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20  p of the join.  
2e30: 49 6e 20 74 68 61 74 20 77 61 79 2c 20 61 0a 2a  In that way, a.*
2e40: 2a 20 4e 55 4c 4c 20 74 32 20 72 6f 77 20 77 69  * NULL t2 row wi
2e50: 6c 6c 20 62 65 20 69 6e 73 65 72 74 65 64 20 77  ll be inserted w
2e60: 68 65 6e 65 76 65 72 20 74 31 2e 78 21 3d 35 2e  henever t1.x!=5.
2e70: 20 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 0a 2a    If we do not.*
2e80: 2a 20 64 65 66 65 72 20 74 68 65 20 68 61 6e 64  * defer the hand
2e90: 6c 69 6e 67 20 6f 66 20 74 31 2e 78 3d 35 2c 20  ling of t1.x=5, 
2ea0: 69 74 20 77 69 6c 6c 20 62 65 20 70 72 6f 63 65  it will be proce
2eb0: 73 73 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  ssed immediately
2ec0: 0a 2a 2a 20 61 66 74 65 72 20 74 68 65 20 74 31  .** after the t1
2ed0: 20 6c 6f 6f 70 20 61 6e 64 20 72 6f 77 73 20 77   loop and rows w
2ee0: 69 74 68 20 74 31 2e 78 21 3d 35 20 77 69 6c 6c  ith t1.x!=5 will
2ef0: 20 6e 65 76 65 72 20 61 70 70 65 61 72 20 69 6e   never appear in
2f00: 0a 2a 2a 20 74 68 65 20 6f 75 74 70 75 74 2c 20  .** the output, 
2f10: 77 68 69 63 68 20 69 73 20 69 6e 63 6f 72 72 65  which is incorre
2f20: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ct..*/.static vo
2f30: 69 64 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 45  id setJoinExpr(E
2f40: 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 54 61 62  xpr *p, int iTab
2f50: 6c 65 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 20  le){.  while( p 
2f60: 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50 72  ){.    ExprSetPr
2f70: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f  operty(p, EP_Fro
2f80: 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 61 73 73 65  mJoin);.    asse
2f90: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
2fa0: 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e  erty(p, EP_Token
2fb0: 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29  Only|EP_Reduced)
2fc0: 20 29 3b 0a 20 20 20 20 45 78 70 72 53 65 74 56   );.    ExprSetV
2fd0: 56 41 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  VAProperty(p, EP
2fe0: 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20  _NoReduce);.    
2ff0: 70 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  p->iRightJoinTab
3000: 6c 65 20 3d 20 28 69 31 36 29 69 54 61 62 6c 65  le = (i16)iTable
3010: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d  ;.    if( p->op=
3020: 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 26 26 20  =TK_FUNCTION && 
3030: 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20  p->x.pList ){.  
3040: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
3050: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 78   for(i=0; i<p->x
3060: 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  .pList->nExpr; i
3070: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 65 74  ++){.        set
3080: 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 78 2e 70 4c  JoinExpr(p->x.pL
3090: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  ist->a[i].pExpr,
30a0: 20 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20   iTable);.      
30b0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 65 74 4a  }.    }.    setJ
30c0: 6f 69 6e 45 78 70 72 28 70 2d 3e 70 4c 65 66 74  oinExpr(p->pLeft
30d0: 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 70  , iTable);.    p
30e0: 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20   = p->pRight;.  
30f0: 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  } .}../*.** This
3100: 20 72 6f 75 74 69 6e 65 20 70 72 6f 63 65 73 73   routine process
3110: 65 73 20 74 68 65 20 6a 6f 69 6e 20 69 6e 66 6f  es the join info
3120: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 53 45  rmation for a SE
3130: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
3140: 2a 2a 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  ** ON and USING 
3150: 63 6c 61 75 73 65 73 20 61 72 65 20 63 6f 6e 76  clauses are conv
3160: 65 72 74 65 64 20 69 6e 74 6f 20 65 78 74 72 61  erted into extra
3170: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48   terms of the WH
3180: 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e  ERE clause..** N
3190: 41 54 55 52 41 4c 20 6a 6f 69 6e 73 20 61 6c 73  ATURAL joins als
31a0: 6f 20 63 72 65 61 74 65 20 65 78 74 72 61 20 57  o create extra W
31b0: 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
31c0: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72  s..**.** The ter
31d0: 6d 73 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61  ms of a FROM cla
31e0: 75 73 65 20 61 72 65 20 63 6f 6e 74 61 69 6e 65  use are containe
31f0: 64 20 69 6e 20 74 68 65 20 53 65 6c 65 63 74 2e  d in the Select.
3200: 70 53 72 63 20 73 74 72 75 63 74 75 72 65 2e 0a  pSrc structure..
3210: 2a 2a 20 54 68 65 20 6c 65 66 74 20 6d 6f 73 74  ** The left most
3220: 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 66 69   table is the fi
3230: 72 73 74 20 65 6e 74 72 79 20 69 6e 20 53 65 6c  rst entry in Sel
3240: 65 63 74 2e 70 53 72 63 2e 20 20 54 68 65 20 72  ect.pSrc.  The r
3250: 69 67 68 74 2d 6d 6f 73 74 0a 2a 2a 20 74 61 62  ight-most.** tab
3260: 6c 65 20 69 73 20 74 68 65 20 6c 61 73 74 20 65  le is the last e
3270: 6e 74 72 79 2e 20 20 54 68 65 20 6a 6f 69 6e 20  ntry.  The join 
3280: 6f 70 65 72 61 74 6f 72 20 69 73 20 68 65 6c 64  operator is held
3290: 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74 6f   in the entry to
32a0: 0a 2a 2a 20 74 68 65 20 6c 65 66 74 2e 20 20 54  .** the left.  T
32b0: 68 75 73 20 65 6e 74 72 79 20 30 20 63 6f 6e 74  hus entry 0 cont
32c0: 61 69 6e 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70  ains the join op
32d0: 65 72 61 74 6f 72 20 66 6f 72 20 74 68 65 20 6a  erator for the j
32e0: 6f 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 65  oin between.** e
32f0: 6e 74 72 69 65 73 20 30 20 61 6e 64 20 31 2e 20  ntries 0 and 1. 
3300: 20 41 6e 79 20 4f 4e 20 6f 72 20 55 53 49 4e 47   Any ON or USING
3310: 20 63 6c 61 75 73 65 73 20 61 73 73 6f 63 69 61   clauses associa
3320: 74 65 64 20 77 69 74 68 20 74 68 65 20 6a 6f 69  ted with the joi
3330: 6e 20 61 72 65 0a 2a 2a 20 61 6c 73 6f 20 61 74  n are.** also at
3340: 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65  tached to the le
3350: 66 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20  ft entry..**.** 
3360: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
3370: 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20  urns the number 
3380: 6f 66 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e  of errors encoun
3390: 74 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  tered..*/.static
33a0: 20 69 6e 74 20 73 71 6c 69 74 65 50 72 6f 63 65   int sqliteProce
33b0: 73 73 4a 6f 69 6e 28 50 61 72 73 65 20 2a 70 50  ssJoin(Parse *pP
33c0: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29  arse, Select *p)
33d0: 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  {.  SrcList *pSr
33e0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
33f0: 20 20 20 20 2f 2a 20 41 6c 6c 20 74 61 62 6c 65      /* All table
3400: 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
3410: 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  ause */.  int i,
3420: 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
3430: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
3440: 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
3450: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
3460: 74 65 6d 20 2a 70 4c 65 66 74 3b 20 20 20 20 20  tem *pLeft;     
3470: 2f 2a 20 4c 65 66 74 20 74 61 62 6c 65 20 62 65  /* Left table be
3480: 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 20 20  ing joined */.  
3490: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
34a0: 74 65 6d 20 2a 70 52 69 67 68 74 3b 20 20 20 20  tem *pRight;    
34b0: 2f 2a 20 52 69 67 68 74 20 74 61 62 6c 65 20 62  /* Right table b
34c0: 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 0a  eing joined */..
34d0: 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63    pSrc = p->pSrc
34e0: 3b 0a 20 20 70 4c 65 66 74 20 3d 20 26 70 53 72  ;.  pLeft = &pSr
34f0: 63 2d 3e 61 5b 30 5d 3b 0a 20 20 70 52 69 67 68  c->a[0];.  pRigh
3500: 74 20 3d 20 26 70 4c 65 66 74 5b 31 5d 3b 0a 20  t = &pLeft[1];. 
3510: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63   for(i=0; i<pSrc
3520: 2d 3e 6e 53 72 63 2d 31 3b 20 69 2b 2b 2c 20 70  ->nSrc-1; i++, p
3530: 52 69 67 68 74 2b 2b 2c 20 70 4c 65 66 74 2b 2b  Right++, pLeft++
3540: 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4c  ){.    Table *pL
3550: 65 66 74 54 61 62 20 3d 20 70 4c 65 66 74 2d 3e  eftTab = pLeft->
3560: 70 54 61 62 3b 0a 20 20 20 20 54 61 62 6c 65 20  pTab;.    Table 
3570: 2a 70 52 69 67 68 74 54 61 62 20 3d 20 70 52 69  *pRightTab = pRi
3580: 67 68 74 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69  ght->pTab;.    i
3590: 6e 74 20 69 73 4f 75 74 65 72 3b 0a 0a 20 20 20  nt isOuter;..   
35a0: 20 69 66 28 20 4e 45 56 45 52 28 70 4c 65 66 74   if( NEVER(pLeft
35b0: 54 61 62 3d 3d 30 20 7c 7c 20 70 52 69 67 68 74  Tab==0 || pRight
35c0: 54 61 62 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e  Tab==0) ) contin
35d0: 75 65 3b 0a 20 20 20 20 69 73 4f 75 74 65 72 20  ue;.    isOuter 
35e0: 3d 20 28 70 52 69 67 68 74 2d 3e 66 67 2e 6a 6f  = (pRight->fg.jo
35f0: 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45  intype & JT_OUTE
3600: 52 29 21 3d 30 3b 0a 0a 20 20 20 20 2f 2a 20 57  R)!=0;..    /* W
3610: 68 65 6e 20 74 68 65 20 4e 41 54 55 52 41 4c 20  hen the NATURAL 
3620: 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65  keyword is prese
3630: 6e 74 2c 20 61 64 64 20 57 48 45 52 45 20 63 6c  nt, add WHERE cl
3640: 61 75 73 65 20 74 65 72 6d 73 20 66 6f 72 0a 20  ause terms for. 
3650: 20 20 20 2a 2a 20 65 76 65 72 79 20 63 6f 6c 75     ** every colu
3660: 6d 6e 20 74 68 61 74 20 74 68 65 20 74 77 6f 20  mn that the two 
3670: 74 61 62 6c 65 73 20 68 61 76 65 20 69 6e 20 63  tables have in c
3680: 6f 6d 6d 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ommon..    */.  
3690: 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 66 67    if( pRight->fg
36a0: 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e  .jointype & JT_N
36b0: 41 54 55 52 41 4c 20 29 7b 0a 20 20 20 20 20 20  ATURAL ){.      
36c0: 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20  if( pRight->pOn 
36d0: 7c 7c 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e  || pRight->pUsin
36e0: 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  g ){.        sql
36f0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
3700: 72 73 65 2c 20 22 61 20 4e 41 54 55 52 41 4c 20  rse, "a NATURAL 
3710: 6a 6f 69 6e 20 6d 61 79 20 6e 6f 74 20 68 61 76  join may not hav
3720: 65 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22  e ".           "
3730: 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  an ON or USING c
3740: 6c 61 75 73 65 22 2c 20 30 29 3b 0a 20 20 20 20  lause", 0);.    
3750: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
3760: 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
3770: 6a 3d 30 3b 20 6a 3c 70 52 69 67 68 74 54 61 62  j=0; j<pRightTab
3780: 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nCol; j++){.  
3790: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
37a0: 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  e;   /* Name of 
37b0: 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 69  column in the ri
37c0: 67 68 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  ght table */.   
37d0: 20 20 20 20 20 69 6e 74 20 69 4c 65 66 74 3b 20       int iLeft; 
37e0: 20 20 20 20 2f 2a 20 4d 61 74 63 68 69 6e 67 20      /* Matching 
37f0: 6c 65 66 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20  left table */.  
3800: 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66 74 43        int iLeftC
3810: 6f 6c 3b 20 20 2f 2a 20 4d 61 74 63 68 69 6e 67  ol;  /* Matching
3820: 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6c   column in the l
3830: 65 66 74 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20  eft table */..  
3840: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 52        zName = pR
3850: 69 67 68 74 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d  ightTab->aCol[j]
3860: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
3870: 69 66 28 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75  if( tableAndColu
3880: 6d 6e 49 6e 64 65 78 28 70 53 72 63 2c 20 69 2b  mnIndex(pSrc, i+
3890: 31 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c 65 66 74  1, zName, &iLeft
38a0: 2c 20 26 69 4c 65 66 74 43 6f 6c 29 20 29 7b 0a  , &iLeftCol) ){.
38b0: 20 20 20 20 20 20 20 20 20 20 61 64 64 57 68 65            addWhe
38c0: 72 65 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70  reTerm(pParse, p
38d0: 53 72 63 2c 20 69 4c 65 66 74 2c 20 69 4c 65 66  Src, iLeft, iLef
38e0: 74 43 6f 6c 2c 20 69 2b 31 2c 20 6a 2c 0a 20 20  tCol, i+1, j,.  
38f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3900: 20 20 20 20 20 69 73 4f 75 74 65 72 2c 20 26 70       isOuter, &p
3910: 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20  ->pWhere);.     
3920: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
3930: 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 73 61 6c   }..    /* Disal
3940: 6c 6f 77 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20  low both ON and 
3950: 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 69 6e  USING clauses in
3960: 20 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e 0a 20   the same join. 
3970: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52     */.    if( pR
3980: 69 67 68 74 2d 3e 70 4f 6e 20 26 26 20 70 52 69  ight->pOn && pRi
3990: 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20  ght->pUsing ){. 
39a0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
39b0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 61  rMsg(pParse, "ca
39c0: 6e 6e 6f 74 20 68 61 76 65 20 62 6f 74 68 20 4f  nnot have both O
39d0: 4e 20 61 6e 64 20 55 53 49 4e 47 20 22 0a 20 20  N and USING ".  
39e0: 20 20 20 20 20 20 22 63 6c 61 75 73 65 73 20 69        "clauses i
39f0: 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e 22  n the same join"
3a00: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
3a10: 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  1;.    }..    /*
3a20: 20 41 64 64 20 74 68 65 20 4f 4e 20 63 6c 61 75   Add the ON clau
3a30: 73 65 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  se to the end of
3a40: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
3a50: 65 2c 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a  e, connected by.
3a60: 20 20 20 20 2a 2a 20 61 6e 20 41 4e 44 20 6f 70      ** an AND op
3a70: 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20  erator..    */. 
3a80: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70     if( pRight->p
3a90: 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  On ){.      if( 
3aa0: 69 73 4f 75 74 65 72 20 29 20 73 65 74 4a 6f 69  isOuter ) setJoi
3ab0: 6e 45 78 70 72 28 70 52 69 67 68 74 2d 3e 70 4f  nExpr(pRight->pO
3ac0: 6e 2c 20 70 52 69 67 68 74 2d 3e 69 43 75 72 73  n, pRight->iCurs
3ad0: 6f 72 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 57  or);.      p->pW
3ae0: 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
3af0: 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62  prAnd(pParse->db
3b00: 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 70 52 69  , p->pWhere, pRi
3b10: 67 68 74 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 20  ght->pOn);.     
3b20: 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 3d 20 30   pRight->pOn = 0
3b30: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
3b40: 43 72 65 61 74 65 20 65 78 74 72 61 20 74 65 72  Create extra ter
3b50: 6d 73 20 6f 6e 20 74 68 65 20 57 48 45 52 45 20  ms on the WHERE 
3b60: 63 6c 61 75 73 65 20 66 6f 72 20 65 61 63 68 20  clause for each 
3b70: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 0a 20 20 20  column named.   
3b80: 20 2a 2a 20 69 6e 20 74 68 65 20 55 53 49 4e 47   ** in the USING
3b90: 20 63 6c 61 75 73 65 2e 20 20 45 78 61 6d 70 6c   clause.  Exampl
3ba0: 65 3a 20 49 66 20 74 68 65 20 74 77 6f 20 74 61  e: If the two ta
3bb0: 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65  bles to be joine
3bc0: 64 20 61 72 65 20 0a 20 20 20 20 2a 2a 20 41 20  d are .    ** A 
3bd0: 61 6e 64 20 42 20 61 6e 64 20 74 68 65 20 55 53  and B and the US
3be0: 49 4e 47 20 63 6c 61 75 73 65 20 6e 61 6d 65 73  ING clause names
3bf0: 20 58 2c 20 59 2c 20 61 6e 64 20 5a 2c 20 74 68   X, Y, and Z, th
3c00: 65 6e 20 61 64 64 20 74 68 69 73 0a 20 20 20 20  en add this.    
3c10: 2a 2a 20 74 6f 20 74 68 65 20 57 48 45 52 45 20  ** to the WHERE 
3c20: 63 6c 61 75 73 65 3a 20 20 20 20 41 2e 58 3d 42  clause:    A.X=B
3c30: 2e 58 20 41 4e 44 20 41 2e 59 3d 42 2e 59 20 41  .X AND A.Y=B.Y A
3c40: 4e 44 20 41 2e 5a 3d 42 2e 5a 0a 20 20 20 20 2a  ND A.Z=B.Z.    *
3c50: 2a 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f  * Report an erro
3c60: 72 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20  r if any column 
3c70: 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68 65  mentioned in the
3c80: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 69 73   USING clause is
3c90: 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f 6e 74  .    ** not cont
3ca0: 61 69 6e 65 64 20 69 6e 20 62 6f 74 68 20 74 61  ained in both ta
3cb0: 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65  bles to be joine
3cc0: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
3cd0: 28 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67  ( pRight->pUsing
3ce0: 20 29 7b 0a 20 20 20 20 20 20 49 64 4c 69 73 74   ){.      IdList
3cf0: 20 2a 70 4c 69 73 74 20 3d 20 70 52 69 67 68 74   *pList = pRight
3d00: 2d 3e 70 55 73 69 6e 67 3b 0a 20 20 20 20 20 20  ->pUsing;.      
3d10: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c 69 73 74  for(j=0; j<pList
3d20: 2d 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ->nId; j++){.   
3d30: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
3d40: 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ;     /* Name of
3d50: 20 74 68 65 20 74 65 72 6d 20 69 6e 20 74 68 65   the term in the
3d60: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 2a 2f   USING clause */
3d70: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65  .        int iLe
3d80: 66 74 3b 20 20 20 20 20 20 20 2f 2a 20 54 61 62  ft;       /* Tab
3d90: 6c 65 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 77  le on the left w
3da0: 69 74 68 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c  ith matching col
3db0: 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  umn name */.    
3dc0: 20 20 20 20 69 6e 74 20 69 4c 65 66 74 43 6f 6c      int iLeftCol
3dd0: 3b 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e  ;    /* Column n
3de0: 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 69 6e  umber of matchin
3df0: 67 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65 20  g column on the 
3e00: 6c 65 66 74 20 2a 2f 0a 20 20 20 20 20 20 20 20  left */.        
3e10: 69 6e 74 20 69 52 69 67 68 74 43 6f 6c 3b 20 20  int iRightCol;  
3e20: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65   /* Column numbe
3e30: 72 20 6f 66 20 6d 61 74 63 68 69 6e 67 20 63 6f  r of matching co
3e40: 6c 75 6d 6e 20 6f 6e 20 74 68 65 20 72 69 67 68  lumn on the righ
3e50: 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 7a 4e  t */..        zN
3e60: 61 6d 65 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 6a  ame = pList->a[j
3e70: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
3e80: 20 69 52 69 67 68 74 43 6f 6c 20 3d 20 63 6f 6c   iRightCol = col
3e90: 75 6d 6e 49 6e 64 65 78 28 70 52 69 67 68 74 54  umnIndex(pRightT
3ea0: 61 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab, zName);.    
3eb0: 20 20 20 20 69 66 28 20 69 52 69 67 68 74 43 6f      if( iRightCo
3ec0: 6c 3c 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  l<0.         || 
3ed0: 21 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49  !tableAndColumnI
3ee0: 6e 64 65 78 28 70 53 72 63 2c 20 69 2b 31 2c 20  ndex(pSrc, i+1, 
3ef0: 7a 4e 61 6d 65 2c 20 26 69 4c 65 66 74 2c 20 26  zName, &iLeft, &
3f00: 69 4c 65 66 74 43 6f 6c 29 0a 20 20 20 20 20 20  iLeftCol).      
3f10: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73    ){.          s
3f20: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
3f30: 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 6a  Parse, "cannot j
3f40: 6f 69 6e 20 75 73 69 6e 67 20 63 6f 6c 75 6d 6e  oin using column
3f50: 20 25 73 20 2d 20 63 6f 6c 75 6d 6e 20 22 0a 20   %s - column ". 
3f60: 20 20 20 20 20 20 20 20 20 20 20 22 6e 6f 74 20             "not 
3f70: 70 72 65 73 65 6e 74 20 69 6e 20 62 6f 74 68 20  present in both 
3f80: 74 61 62 6c 65 73 22 2c 20 7a 4e 61 6d 65 29 3b  tables", zName);
3f90: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
3fa0: 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  n 1;.        }. 
3fb0: 20 20 20 20 20 20 20 61 64 64 57 68 65 72 65 54         addWhereT
3fc0: 65 72 6d 28 70 50 61 72 73 65 2c 20 70 53 72 63  erm(pParse, pSrc
3fd0: 2c 20 69 4c 65 66 74 2c 20 69 4c 65 66 74 43 6f  , iLeft, iLeftCo
3fe0: 6c 2c 20 69 2b 31 2c 20 69 52 69 67 68 74 43 6f  l, i+1, iRightCo
3ff0: 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l,.             
4000: 20 20 20 20 20 20 20 20 69 73 4f 75 74 65 72 2c          isOuter,
4010: 20 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20   &p->pWhere);.  
4020: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
4030: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
4040: 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
4050: 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 4b 65  nce */.static Ke
4060: 79 49 6e 66 6f 20 2a 6b 65 79 49 6e 66 6f 46 72  yInfo *keyInfoFr
4070: 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61  omExprList(.  Pa
4080: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
4090: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
40a0: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
40b0: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
40c0: 2f 2a 20 46 6f 72 6d 20 74 68 65 20 4b 65 79 49  /* Form the KeyI
40d0: 6e 66 6f 20 6f 62 6a 65 63 74 20 66 72 6f 6d 20  nfo object from 
40e0: 74 68 69 73 20 45 78 70 72 4c 69 73 74 20 2a 2f  this ExprList */
40f0: 0a 20 20 69 6e 74 20 69 53 74 61 72 74 2c 20 20  .  int iStart,  
4100: 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e          /* Begin
4110: 20 77 69 74 68 20 74 68 69 73 20 63 6f 6c 75 6d   with this colum
4120: 6e 20 6f 66 20 70 4c 69 73 74 20 2a 2f 0a 20 20  n of pList */.  
4130: 69 6e 74 20 6e 45 78 74 72 61 20 20 20 20 20 20  int nExtra      
4140: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73       /* Add this
4150: 20 6d 61 6e 79 20 65 78 74 72 61 20 63 6f 6c 75   many extra colu
4160: 6d 6e 73 20 74 6f 20 74 68 65 20 65 6e 64 20 2a  mns to the end *
4170: 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  /.);../*.** Gene
4180: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
4190: 69 6c 6c 20 70 75 73 68 20 74 68 65 20 72 65 63  ill push the rec
41a0: 6f 72 64 20 69 6e 20 72 65 67 69 73 74 65 72 73  ord in registers
41b0: 20 72 65 67 44 61 74 61 0a 2a 2a 20 74 68 72 6f   regData.** thro
41c0: 75 67 68 20 72 65 67 44 61 74 61 2b 6e 44 61 74  ugh regData+nDat
41d0: 61 2d 31 20 6f 6e 74 6f 20 74 68 65 20 73 6f 72  a-1 onto the sor
41e0: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ter..*/.static v
41f0: 6f 69 64 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74  oid pushOntoSort
4200: 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  er(.  Parse *pPa
4210: 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rse,         /* 
4220: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
4230: 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a 70 53 6f  /.  SortCtx *pSo
4240: 72 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  rt,        /* In
4250: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
4260: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
4270: 75 73 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  use */.  Select 
4280: 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20 20  *pSelect,       
4290: 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 53 45 4c  /* The whole SEL
42a0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
42b0: 0a 20 20 69 6e 74 20 72 65 67 44 61 74 61 2c 20  .  int regData, 
42c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
42d0: 73 74 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64  st register hold
42e0: 69 6e 67 20 64 61 74 61 20 74 6f 20 62 65 20 73  ing data to be s
42f0: 6f 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72  orted */.  int r
4300: 65 67 4f 72 69 67 44 61 74 61 2c 20 20 20 20 20  egOrigData,     
4310: 20 20 2f 2a 20 46 69 72 73 74 20 72 65 67 69 73    /* First regis
4320: 74 65 72 20 68 6f 6c 64 69 6e 67 20 64 61 74 61  ter holding data
4330: 20 62 65 66 6f 72 65 20 70 61 63 6b 69 6e 67 20   before packing 
4340: 2a 2f 0a 20 20 69 6e 74 20 6e 44 61 74 61 2c 20  */.  int nData, 
4350: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4360: 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
4370: 73 20 69 6e 20 74 68 65 20 64 61 74 61 20 61 72  s in the data ar
4380: 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72  ray */.  int nPr
4390: 65 66 69 78 52 65 67 20 20 20 20 20 20 20 20 20  efixReg         
43a0: 2f 2a 20 4e 6f 2e 20 6f 66 20 72 65 67 20 70 72  /* No. of reg pr
43b0: 69 6f 72 20 74 6f 20 72 65 67 44 61 74 61 20 61  ior to regData a
43c0: 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65  vailable for use
43d0: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
43e0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
43f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4400: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6d            /* Stm
4410: 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  t under construc
4420: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 62 53  tion */.  int bS
4430: 65 71 20 3d 20 28 28 70 53 6f 72 74 2d 3e 73 6f  eq = ((pSort->so
4440: 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c  rtFlags & SORTFL
4450: 41 47 5f 55 73 65 53 6f 72 74 65 72 29 3d 3d 30  AG_UseSorter)==0
4460: 29 3b 0a 20 20 69 6e 74 20 6e 45 78 70 72 20 3d  );.  int nExpr =
4470: 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79   pSort->pOrderBy
4480: 2d 3e 6e 45 78 70 72 3b 20 20 20 20 20 20 20 20  ->nExpr;        
4490: 20 20 20 20 20 20 2f 2a 20 4e 6f 2e 20 6f 66 20        /* No. of 
44a0: 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 2a  ORDER BY terms *
44b0: 2f 0a 20 20 69 6e 74 20 6e 42 61 73 65 20 3d 20  /.  int nBase = 
44c0: 6e 45 78 70 72 20 2b 20 62 53 65 71 20 2b 20 6e  nExpr + bSeq + n
44d0: 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
44e0: 20 20 20 20 20 2f 2a 20 46 69 65 6c 64 73 20 69       /* Fields i
44f0: 6e 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20  n sorter record 
4500: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65  */.  int regBase
4510: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4530: 20 20 20 20 20 20 2f 2a 20 52 65 67 73 20 66 6f        /* Regs fo
4540: 72 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20  r sorter record 
4550: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f  */.  int regReco
4560: 72 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rd = ++pParse->n
4570: 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Mem;            
4580: 20 20 20 20 20 20 2f 2a 20 41 73 73 65 6d 62 6c        /* Assembl
4590: 65 64 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64  ed sorter record
45a0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 42 53 61 74   */.  int nOBSat
45b0: 20 3d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74   = pSort->nOBSat
45c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
45d0: 20 20 20 20 20 20 20 2f 2a 20 4f 52 44 45 52 20         /* ORDER 
45e0: 42 59 20 74 65 72 6d 73 20 74 6f 20 73 6b 69 70  BY terms to skip
45f0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20   */.  int op;   
4600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4610: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f           /* Opco
4620: 64 65 20 74 6f 20 61 64 64 20 73 6f 72 74 65 72  de to add sorter
4630: 20 72 65 63 6f 72 64 20 74 6f 20 73 6f 72 74 65   record to sorte
4640: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6d 69  r */.  int iLimi
4650: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
4660: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49 4d            /* LIM
4670: 49 54 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20  IT counter */.. 
4680: 20 61 73 73 65 72 74 28 20 62 53 65 71 3d 3d 30   assert( bSeq==0
4690: 20 7c 7c 20 62 53 65 71 3d 3d 31 20 29 3b 0a 20   || bSeq==1 );. 
46a0: 20 61 73 73 65 72 74 28 20 6e 44 61 74 61 3d 3d   assert( nData==
46b0: 31 20 7c 7c 20 72 65 67 44 61 74 61 3d 3d 72 65  1 || regData==re
46c0: 67 4f 72 69 67 44 61 74 61 20 29 3b 0a 20 20 69  gOrigData );.  i
46d0: 66 28 20 6e 50 72 65 66 69 78 52 65 67 20 29 7b  f( nPrefixReg ){
46e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 50 72  .    assert( nPr
46f0: 65 66 69 78 52 65 67 3d 3d 6e 45 78 70 72 2b 62  efixReg==nExpr+b
4700: 53 65 71 20 29 3b 0a 20 20 20 20 72 65 67 42 61  Seq );.    regBa
4710: 73 65 20 3d 20 72 65 67 44 61 74 61 20 2d 20 6e  se = regData - n
4720: 45 78 70 72 20 2d 20 62 53 65 71 3b 0a 20 20 7d  Expr - bSeq;.  }
4730: 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 42 61 73  else{.    regBas
4740: 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  e = pParse->nMem
4750: 20 2b 20 31 3b 0a 20 20 20 20 70 50 61 72 73 65   + 1;.    pParse
4760: 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 42 61 73 65 3b  ->nMem += nBase;
4770: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
4780: 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74 3d  Select->iOffset=
4790: 3d 30 20 7c 7c 20 70 53 65 6c 65 63 74 2d 3e 69  =0 || pSelect->i
47a0: 4c 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20 69 4c  Limit!=0 );.  iL
47b0: 69 6d 69 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  imit = pSelect->
47c0: 69 4f 66 66 73 65 74 20 3f 20 70 53 65 6c 65 63  iOffset ? pSelec
47d0: 74 2d 3e 69 4f 66 66 73 65 74 2b 31 20 3a 20 70  t->iOffset+1 : p
47e0: 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 3b 0a  Select->iLimit;.
47f0: 20 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 44 6f    pSort->labelDo
4800: 6e 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ne = sqlite3Vdbe
4810: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
4820: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
4830: 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
4840: 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2c  pSort->pOrderBy,
4850: 20 72 65 67 42 61 73 65 2c 20 72 65 67 4f 72 69   regBase, regOri
4860: 67 44 61 74 61 2c 0a 20 20 20 20 20 20 20 20 20  gData,.         
4870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4880: 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50   SQLITE_ECEL_DUP
4890: 7c 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46  |SQLITE_ECEL_REF
48a0: 29 3b 0a 20 20 69 66 28 20 62 53 65 71 20 29 7b  );.  if( bSeq ){
48b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
48c0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71  AddOp2(v, OP_Seq
48d0: 75 65 6e 63 65 2c 20 70 53 6f 72 74 2d 3e 69 45  uence, pSort->iE
48e0: 43 75 72 73 6f 72 2c 20 72 65 67 42 61 73 65 2b  Cursor, regBase+
48f0: 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 69 66  nExpr);.  }.  if
4900: 28 20 6e 50 72 65 66 69 78 52 65 67 3d 3d 30 20  ( nPrefixReg==0 
4910: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
4920: 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73  prCodeMove(pPars
4930: 65 2c 20 72 65 67 44 61 74 61 2c 20 72 65 67 42  e, regData, regB
4940: 61 73 65 2b 6e 45 78 70 72 2b 62 53 65 71 2c 20  ase+nExpr+bSeq, 
4950: 6e 44 61 74 61 29 3b 0a 20 20 7d 0a 20 20 73 71  nData);.  }.  sq
4960: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
4970: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
4980: 2c 20 72 65 67 42 61 73 65 2b 6e 4f 42 53 61 74  , regBase+nOBSat
4990: 2c 20 6e 42 61 73 65 2d 6e 4f 42 53 61 74 2c 20  , nBase-nOBSat, 
49a0: 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 69 66  regRecord);.  if
49b0: 28 20 6e 4f 42 53 61 74 3e 30 20 29 7b 0a 20 20  ( nOBSat>0 ){.  
49c0: 20 20 69 6e 74 20 72 65 67 50 72 65 76 4b 65 79    int regPrevKey
49d0: 3b 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74  ;   /* The first
49e0: 20 6e 4f 42 53 61 74 20 63 6f 6c 75 6d 6e 73 20   nOBSat columns 
49f0: 6f 66 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  of the previous 
4a00: 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61  row */.    int a
4a10: 64 64 72 46 69 72 73 74 3b 20 20 20 20 2f 2a 20  ddrFirst;    /* 
4a20: 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 4f  Address of the O
4a30: 50 5f 49 66 4e 6f 74 20 6f 70 63 6f 64 65 20 2a  P_IfNot opcode *
4a40: 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4a 6d  /.    int addrJm
4a50: 70 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65  p;      /* Addre
4a60: 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 4a 75 6d  ss of the OP_Jum
4a70: 70 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20  p opcode */.    
4a80: 56 64 62 65 4f 70 20 2a 70 4f 70 3b 20 20 20 20  VdbeOp *pOp;    
4a90: 20 20 2f 2a 20 4f 70 63 6f 64 65 20 74 68 61 74    /* Opcode that
4aa0: 20 6f 70 65 6e 73 20 74 68 65 20 73 6f 72 74 65   opens the sorte
4ab0: 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4b 65  r */.    int nKe
4ac0: 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  y;         /* Nu
4ad0: 6d 62 65 72 20 6f 66 20 73 6f 72 74 69 6e 67 20  mber of sorting 
4ae0: 6b 65 79 20 63 6f 6c 75 6d 6e 73 2c 20 69 6e 63  key columns, inc
4af0: 6c 75 64 69 6e 67 20 4f 50 5f 53 65 71 75 65 6e  luding OP_Sequen
4b00: 63 65 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66  ce */.    KeyInf
4b10: 6f 20 2a 70 4b 49 3b 20 20 20 20 20 2f 2a 20 4f  o *pKI;     /* O
4b20: 72 69 67 69 6e 61 6c 20 4b 65 79 49 6e 66 6f 20  riginal KeyInfo 
4b30: 6f 6e 20 74 68 65 20 73 6f 72 74 65 72 20 74 61  on the sorter ta
4b40: 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 72 65 67 50  ble */..    regP
4b50: 72 65 76 4b 65 79 20 3d 20 70 50 61 72 73 65 2d  revKey = pParse-
4b60: 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61  >nMem+1;.    pPa
4b70: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 53 6f  rse->nMem += pSo
4b80: 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20 20 20  rt->nOBSat;.    
4b90: 6e 4b 65 79 20 3d 20 6e 45 78 70 72 20 2d 20 70  nKey = nExpr - p
4ba0: 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 20 2b 20 62  Sort->nOBSat + b
4bb0: 53 65 71 3b 0a 20 20 20 20 69 66 28 20 62 53 65  Seq;.    if( bSe
4bc0: 71 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 46  q ){.      addrF
4bd0: 69 72 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64  irst = sqlite3Vd
4be0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
4bf0: 66 4e 6f 74 2c 20 72 65 67 42 61 73 65 2b 6e 45  fNot, regBase+nE
4c00: 78 70 72 29 3b 20 0a 20 20 20 20 7d 65 6c 73 65  xpr); .    }else
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 53 65 71 75  ddOp1(v, OP_Sequ
4c40: 65 6e 63 65 54 65 73 74 2c 20 70 53 6f 72 74 2d  enceTest, pSort-
4c50: 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  >iECursor);.    
4c60: 7d 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  }.    VdbeCovera
4c70: 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  ge(v);.    sqlit
4c80: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
4c90: 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 72 65 67 50  OP_Compare, regP
4ca0: 72 65 76 4b 65 79 2c 20 72 65 67 42 61 73 65 2c  revKey, regBase,
4cb0: 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 29 3b   pSort->nOBSat);
4cc0: 0a 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74  .    pOp = sqlit
4cd0: 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70  e3VdbeGetOp(v, p
4ce0: 53 6f 72 74 2d 3e 61 64 64 72 53 6f 72 74 49 6e  Sort->addrSortIn
4cf0: 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20 70 50  dex);.    if( pP
4d00: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
4d10: 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
4d20: 0a 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 6e  .    pOp->p2 = n
4d30: 4b 65 79 20 2b 20 6e 44 61 74 61 3b 0a 20 20 20  Key + nData;.   
4d40: 20 70 4b 49 20 3d 20 70 4f 70 2d 3e 70 34 2e 70   pKI = pOp->p4.p
4d50: 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 6d 65 6d  KeyInfo;.    mem
4d60: 73 65 74 28 70 4b 49 2d 3e 61 53 6f 72 74 4f 72  set(pKI->aSortOr
4d70: 64 65 72 2c 20 30 2c 20 70 4b 49 2d 3e 6e 46 69  der, 0, pKI->nFi
4d80: 65 6c 64 29 3b 20 2f 2a 20 4d 61 6b 65 73 20 4f  eld); /* Makes O
4d90: 50 5f 4a 75 6d 70 20 62 65 6c 6f 77 20 74 65 73  P_Jump below tes
4da0: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 73 71 6c  table */.    sql
4db0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
4dc0: 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a 29 70  (v, -1, (char*)p
4dd0: 4b 49 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  KI, P4_KEYINFO);
4de0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
4df0: 4b 49 2d 3e 6e 58 46 69 65 6c 64 3e 32 20 29 3b  KI->nXField>2 );
4e00: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 4b 65  .    pOp->p4.pKe
4e10: 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46  yInfo = keyInfoF
4e20: 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
4e30: 73 65 2c 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65  se, pSort->pOrde
4e40: 72 42 79 2c 20 6e 4f 42 53 61 74 2c 0a 20 20 20  rBy, nOBSat,.   
4e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e70: 20 20 20 20 20 20 20 20 70 4b 49 2d 3e 6e 58 46          pKI->nXF
4e80: 69 65 6c 64 2d 31 29 3b 0a 20 20 20 20 61 64 64  ield-1);.    add
4e90: 72 4a 6d 70 20 3d 20 73 71 6c 69 74 65 33 56 64  rJmp = sqlite3Vd
4ea0: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
4eb0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
4ec0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75  eAddOp3(v, OP_Ju
4ed0: 6d 70 2c 20 61 64 64 72 4a 6d 70 2b 31 2c 20 30  mp, addrJmp+1, 0
4ee0: 2c 20 61 64 64 72 4a 6d 70 2b 31 29 3b 20 56 64  , addrJmp+1); Vd
4ef0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
4f00: 20 20 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42     pSort->labelB
4f10: 6b 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 56 64  kOut = sqlite3Vd
4f20: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
4f30: 20 20 20 20 70 53 6f 72 74 2d 3e 72 65 67 52 65      pSort->regRe
4f40: 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d  turn = ++pParse-
4f50: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74  >nMem;.    sqlit
4f60: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
4f70: 4f 50 5f 47 6f 73 75 62 2c 20 70 53 6f 72 74 2d  OP_Gosub, pSort-
4f80: 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 53 6f 72  >regReturn, pSor
4f90: 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b 0a  t->labelBkOut);.
4fa0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4fb0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73 65  ddOp1(v, OP_Rese
4fc0: 74 53 6f 72 74 65 72 2c 20 70 53 6f 72 74 2d 3e  tSorter, pSort->
4fd0: 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 69  iECursor);.    i
4fe0: 66 28 20 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20  f( iLimit ){.   
4ff0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5000: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  dOp2(v, OP_IfNot
5010: 2c 20 69 4c 69 6d 69 74 2c 20 70 53 6f 72 74 2d  , iLimit, pSort-
5020: 3e 6c 61 62 65 6c 44 6f 6e 65 29 3b 0a 20 20 20  >labelDone);.   
5030: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
5040: 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  v);.    }.    sq
5050: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
5060: 65 28 76 2c 20 61 64 64 72 46 69 72 73 74 29 3b  e(v, addrFirst);
5070: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
5080: 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c  CodeMove(pParse,
5090: 20 72 65 67 42 61 73 65 2c 20 72 65 67 50 72 65   regBase, regPre
50a0: 76 4b 65 79 2c 20 70 53 6f 72 74 2d 3e 6e 4f 42  vKey, pSort->nOB
50b0: 53 61 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Sat);.    sqlite
50c0: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
50d0: 20 61 64 64 72 4a 6d 70 29 3b 0a 20 20 7d 0a 20   addrJmp);.  }. 
50e0: 20 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74   if( pSort->sort
50f0: 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47  Flags & SORTFLAG
5100: 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20  _UseSorter ){.  
5110: 20 20 6f 70 20 3d 20 4f 50 5f 53 6f 72 74 65 72    op = OP_Sorter
5120: 49 6e 73 65 72 74 3b 0a 20 20 7d 65 6c 73 65 7b  Insert;.  }else{
5130: 0a 20 20 20 20 6f 70 20 3d 20 4f 50 5f 49 64 78  .    op = OP_Idx
5140: 49 6e 73 65 72 74 3b 0a 20 20 7d 0a 20 20 73 71  Insert;.  }.  sq
5150: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
5160: 76 2c 20 6f 70 2c 20 70 53 6f 72 74 2d 3e 69 45  v, op, pSort->iE
5170: 43 75 72 73 6f 72 2c 20 72 65 67 52 65 63 6f 72  Cursor, regRecor
5180: 64 29 3b 0a 20 20 69 66 28 20 69 4c 69 6d 69 74  d);.  if( iLimit
5190: 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72   ){.    int addr
51a0: 3b 0a 20 20 20 20 69 6e 74 20 72 31 20 3d 20 30  ;.    int r1 = 0
51b0: 3b 0a 20 20 20 20 2f 2a 20 46 69 6c 6c 20 74 68  ;.    /* Fill th
51c0: 65 20 73 6f 72 74 65 72 20 75 6e 74 69 6c 20 69  e sorter until i
51d0: 74 20 63 6f 6e 74 61 69 6e 73 20 4c 49 4d 49 54  t contains LIMIT
51e0: 2b 4f 46 46 53 45 54 20 65 6e 74 72 69 65 73 2e  +OFFSET entries.
51f0: 20 20 28 54 68 65 20 69 4c 69 6d 69 74 0a 20 20    (The iLimit.  
5200: 20 20 2a 2a 20 72 65 67 69 73 74 65 72 20 69 73    ** register is
5210: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 69 74   initialized wit
5220: 68 20 76 61 6c 75 65 20 6f 66 20 4c 49 4d 49 54  h value of LIMIT
5230: 2b 4f 46 46 53 45 54 2e 29 20 20 41 66 74 65 72  +OFFSET.)  After
5240: 20 74 68 65 20 73 6f 72 74 65 72 0a 20 20 20 20   the sorter.    
5250: 2a 2a 20 66 69 6c 6c 73 20 75 70 2c 20 64 65 6c  ** fills up, del
5260: 65 74 65 20 74 68 65 20 6c 65 61 73 74 20 65 6e  ete the least en
5270: 74 72 79 20 69 6e 20 74 68 65 20 73 6f 72 74 65  try in the sorte
5280: 72 20 61 66 74 65 72 20 65 61 63 68 20 69 6e 73  r after each ins
5290: 65 72 74 2e 0a 20 20 20 20 2a 2a 20 54 68 75 73  ert..    ** Thus
52a0: 20 77 65 20 6e 65 76 65 72 20 68 6f 6c 64 20 6d   we never hold m
52b0: 6f 72 65 20 74 68 61 6e 20 74 68 65 20 4c 49 4d  ore than the LIM
52c0: 49 54 2b 4f 46 46 53 45 54 20 72 6f 77 73 20 69  IT+OFFSET rows i
52d0: 6e 20 6d 65 6d 6f 72 79 20 61 74 20 6f 6e 63 65  n memory at once
52e0: 20 2a 2f 0a 20 20 20 20 61 64 64 72 20 3d 20 73   */.    addr = s
52f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
5300: 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 5a 65 72 6f  (v, OP_IfNotZero
5310: 2c 20 69 4c 69 6d 69 74 2c 20 30 2c 20 31 29 3b  , iLimit, 0, 1);
5320: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
5330: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
5340: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4c 61  eAddOp1(v, OP_La
5350: 73 74 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72  st, pSort->iECur
5360: 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 70 53  sor);.    if( pS
5370: 6f 72 74 2d 3e 62 4f 72 64 65 72 65 64 49 6e 6e  ort->bOrderedInn
5380: 65 72 4c 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20  erLoop ){.      
5390: 72 31 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  r1 = ++pParse->n
53a0: 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Mem;.      sqlit
53b0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
53c0: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 53 6f 72 74  OP_Column, pSort
53d0: 2d 3e 69 45 43 75 72 73 6f 72 2c 20 6e 45 78 70  ->iECursor, nExp
53e0: 72 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64  r, r1);.      Vd
53f0: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73  beComment((v, "s
5400: 65 71 22 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  eq"));.    }.   
5410: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5420: 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c  p1(v, OP_Delete,
5430: 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72   pSort->iECursor
5440: 29 3b 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74  );.    if( pSort
5450: 2d 3e 62 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c  ->bOrderedInnerL
5460: 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  oop ){.      /* 
5470: 49 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  If the inner loo
5480: 70 20 69 73 20 64 72 69 76 65 6e 20 62 79 20 61  p is driven by a
5490: 6e 20 69 6e 64 65 78 20 73 75 63 68 20 74 68 61  n index such tha
54a0: 74 20 76 61 6c 75 65 73 20 66 72 6f 6d 0a 20 20  t values from.  
54b0: 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20      ** the same 
54c0: 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iteration of the
54d0: 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 61 72 65 20   inner loop are 
54e0: 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 2c  in sorted order,
54f0: 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 69   then.      ** i
5500: 6d 6d 65 64 69 61 74 65 6c 79 20 6a 75 6d 70 20  mmediately jump 
5510: 74 6f 20 74 68 65 20 6e 65 78 74 20 69 74 65 72  to the next iter
5520: 61 74 69 6f 6e 20 6f 66 20 61 6e 20 69 6e 6e 65  ation of an inne
5530: 72 20 6c 6f 6f 70 20 69 66 20 74 68 65 0a 20 20  r loop if the.  
5540: 20 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 72 6f      ** entry fro
5550: 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 74  m the current it
5560: 65 72 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  eration does not
5570: 20 66 69 74 20 69 6e 74 6f 20 74 68 65 20 74 6f   fit into the to
5580: 70 0a 20 20 20 20 20 20 2a 2a 20 4c 49 4d 49 54  p.      ** LIMIT
5590: 2b 4f 46 46 53 45 54 20 65 6e 74 72 69 65 73 20  +OFFSET entries 
55a0: 6f 66 20 74 68 65 20 73 6f 72 74 65 72 2e 20 2a  of the sorter. *
55b0: 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 42 72 6b  /.      int iBrk
55c0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
55d0: 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 32  rrentAddr(v) + 2
55e0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
55f0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
5600: 45 71 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70  Eq, regBase+nExp
5610: 72 2c 20 69 42 72 6b 2c 20 72 31 29 3b 0a 20 20  r, iBrk, r1);.  
5620: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
5630: 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54  hangeP5(v, SQLIT
5640: 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
5650: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
5660: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
5670: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
5680: 76 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a  v, addr);.  }.}.
5690: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20  ./*.** Add code 
56a0: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
56b0: 20 4f 46 46 53 45 54 0a 2a 2f 0a 73 74 61 74 69   OFFSET.*/.stati
56c0: 63 20 76 6f 69 64 20 63 6f 64 65 4f 66 66 73 65  c void codeOffse
56d0: 74 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20  t(.  Vdbe *v,   
56e0: 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
56f0: 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69  te code into thi
5700: 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f  s VM */.  int iO
5710: 66 66 73 65 74 2c 20 20 20 20 20 20 2f 2a 20 52  ffset,      /* R
5720: 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
5730: 74 68 65 20 6f 66 66 73 65 74 20 63 6f 75 6e 74  the offset count
5740: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e  er */.  int iCon
5750: 74 69 6e 75 65 20 20 20 20 20 2f 2a 20 4a 75 6d  tinue     /* Jum
5760: 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74  p here to skip t
5770: 68 65 20 63 75 72 72 65 6e 74 20 72 65 63 6f 72  he current recor
5780: 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69 4f  d */.){.  if( iO
5790: 66 66 73 65 74 3e 30 20 29 7b 0a 20 20 20 20 73  ffset>0 ){.    s
57a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
57b0: 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4f  (v, OP_IfPos, iO
57c0: 66 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65  ffset, iContinue
57d0: 2c 20 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61  , 1); VdbeCovera
57e0: 67 65 28 76 29 3b 0a 20 20 20 20 56 64 62 65 43  ge(v);.    VdbeC
57f0: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46 46 53  omment((v, "OFFS
5800: 45 54 22 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ET"));.  }.}../*
5810: 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 68 61  .** Add code tha
5820: 74 20 77 69 6c 6c 20 63 68 65 63 6b 20 74 6f 20  t will check to 
5830: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 4e 20  make sure the N 
5840: 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69  registers starti
5850: 6e 67 20 61 74 20 69 4d 65 6d 0a 2a 2a 20 66 6f  ng at iMem.** fo
5860: 72 6d 20 61 20 64 69 73 74 69 6e 63 74 20 65 6e  rm a distinct en
5870: 74 72 79 2e 20 20 69 54 61 62 20 69 73 20 61 20  try.  iTab is a 
5880: 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68  sorting index th
5890: 61 74 20 68 6f 6c 64 73 20 70 72 65 76 69 6f 75  at holds previou
58a0: 73 6c 79 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d 62  sly.** seen comb
58b0: 69 6e 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20  inations of the 
58c0: 4e 20 76 61 6c 75 65 73 2e 20 20 41 20 6e 65 77  N values.  A new
58d0: 20 65 6e 74 72 79 20 69 73 20 6d 61 64 65 20 69   entry is made i
58e0: 6e 20 69 54 61 62 0a 2a 2a 20 69 66 20 74 68 65  n iTab.** if the
58f0: 20 63 75 72 72 65 6e 74 20 4e 20 76 61 6c 75 65   current N value
5900: 73 20 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a  s are new..**.**
5910: 20 41 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 52   A jump to addrR
5920: 65 70 65 61 74 20 69 73 20 6d 61 64 65 20 61 6e  epeat is made an
5930: 64 20 74 68 65 20 4e 2b 31 20 76 61 6c 75 65 73  d the N+1 values
5940: 20 61 72 65 20 70 6f 70 70 65 64 20 66 72 6f 6d   are popped from
5950: 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 66   the.** stack if
5960: 20 74 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d 65   the top N eleme
5970: 6e 74 73 20 61 72 65 20 6e 6f 74 20 64 69 73 74  nts are not dist
5980: 69 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  inct..*/.static 
5990: 76 6f 69 64 20 63 6f 64 65 44 69 73 74 69 6e 63  void codeDistinc
59a0: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
59b0: 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69  se,     /* Parsi
59c0: 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  ng and code gene
59d0: 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
59e0: 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20 20  /.  int iTab,   
59f0: 20 20 20 20 20 20 20 2f 2a 20 41 20 73 6f 72 74         /* A sort
5a00: 69 6e 67 20 69 6e 64 65 78 20 75 73 65 64 20 74  ing index used t
5a10: 6f 20 74 65 73 74 20 66 6f 72 20 64 69 73 74 69  o test for disti
5a20: 6e 63 74 6e 65 73 73 20 2a 2f 0a 20 20 69 6e 74  nctness */.  int
5a30: 20 61 64 64 72 52 65 70 65 61 74 2c 20 20 20 20   addrRepeat,    
5a40: 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20  /* Jump to here 
5a50: 69 66 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 20  if not distinct 
5a60: 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20  */.  int N,     
5a70: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
5a80: 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 2a 2f  r of elements */
5a90: 0a 20 20 69 6e 74 20 69 4d 65 6d 20 20 20 20 20  .  int iMem     
5aa0: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 65        /* First e
5ab0: 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56  lement */.){.  V
5ac0: 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 72 31  dbe *v;.  int r1
5ad0: 3b 0a 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d  ;..  v = pParse-
5ae0: 3e 70 56 64 62 65 3b 0a 20 20 72 31 20 3d 20 73  >pVdbe;.  r1 = s
5af0: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
5b00: 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69  (pParse);.  sqli
5b10: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
5b20: 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 54  (v, OP_Found, iT
5b30: 61 62 2c 20 61 64 64 72 52 65 70 65 61 74 2c 20  ab, addrRepeat, 
5b40: 69 4d 65 6d 2c 20 4e 29 3b 20 56 64 62 65 43 6f  iMem, N); VdbeCo
5b50: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c  verage(v);.  sql
5b60: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
5b70: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
5b80: 20 69 4d 65 6d 2c 20 4e 2c 20 72 31 29 3b 0a 20   iMem, N, r1);. 
5b90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5ba0: 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49  p4Int(v, OP_IdxI
5bb0: 6e 73 65 72 74 2c 20 69 54 61 62 2c 20 72 31 2c  nsert, iTab, r1,
5bc0: 20 69 4d 65 6d 2c 20 4e 29 3b 0a 20 20 73 71 6c   iMem, N);.  sql
5bd0: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
5be0: 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
5bf0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
5c00: 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
5c10: 74 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  the code for the
5c20: 20 69 6e 73 69 64 65 20 6f 66 20 74 68 65 20 69   inside of the i
5c30: 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20  nner loop.** of 
5c40: 61 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20  a SELECT..**.** 
5c50: 49 66 20 73 72 63 54 61 62 20 69 73 20 6e 65 67  If srcTab is neg
5c60: 61 74 69 76 65 2c 20 74 68 65 6e 20 74 68 65 20  ative, then the 
5c70: 70 45 4c 69 73 74 20 65 78 70 72 65 73 73 69 6f  pEList expressio
5c80: 6e 73 0a 2a 2a 20 61 72 65 20 65 76 61 6c 75 61  ns.** are evalua
5c90: 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ted in order to 
5ca0: 67 65 74 20 74 68 65 20 64 61 74 61 20 66 6f 72  get the data for
5cb0: 20 74 68 69 73 20 72 6f 77 2e 20 20 49 66 20 73   this row.  If s
5cc0: 72 63 54 61 62 20 69 73 0a 2a 2a 20 7a 65 72 6f  rcTab is.** zero
5cd0: 20 6f 72 20 6d 6f 72 65 2c 20 74 68 65 6e 20 64   or more, then d
5ce0: 61 74 61 20 69 73 20 70 75 6c 6c 65 64 20 66 72  ata is pulled fr
5cf0: 6f 6d 20 73 72 63 54 61 62 20 61 6e 64 20 70 45  om srcTab and pE
5d00: 4c 69 73 74 20 69 73 20 75 73 65 64 20 6f 6e 6c  List is used onl
5d10: 79 20 0a 2a 2a 20 74 6f 20 67 65 74 20 6e 75 6d  y .** to get num
5d20: 62 65 72 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20  ber columns and 
5d30: 74 68 65 20 64 61 74 61 74 79 70 65 20 66 6f 72  the datatype for
5d40: 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f   each column..*/
5d50: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c  .static void sel
5d60: 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20 20  ectInnerLoop(.  
5d70: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
5d80: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
5d90: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
5da0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
5db0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
5dc0: 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65 63  e complete selec
5dd0: 74 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  t statement bein
5de0: 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 45 78 70  g coded */.  Exp
5df0: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20  rList *pEList,  
5e00: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
5e10: 76 61 6c 75 65 73 20 62 65 69 6e 67 20 65 78 74  values being ext
5e20: 72 61 63 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  racted */.  int 
5e30: 73 72 63 54 61 62 2c 20 20 20 20 20 20 20 20 20  srcTab,         
5e40: 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61 74 61      /* Pull data
5e50: 20 66 72 6f 6d 20 74 68 69 73 20 74 61 62 6c 65   from this table
5e60: 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a 70   */.  SortCtx *p
5e70: 53 6f 72 74 2c 20 20 20 20 20 20 20 20 20 2f 2a  Sort,         /*
5e80: 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e   If not NULL, in
5e90: 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 70 72 6f  fo on how to pro
5ea0: 63 65 73 73 20 4f 52 44 45 52 20 42 59 20 2a 2f  cess ORDER BY */
5eb0: 0a 20 20 44 69 73 74 69 6e 63 74 43 74 78 20 2a  .  DistinctCtx *
5ec0: 70 44 69 73 74 69 6e 63 74 2c 20 2f 2a 20 49 66  pDistinct, /* If
5ed0: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e 66 6f 20   not NULL, info 
5ee0: 6f 6e 20 68 6f 77 20 74 6f 20 70 72 6f 63 65 73  on how to proces
5ef0: 73 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a 20 20  s DISTINCT */.  
5f00: 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
5f10: 74 2c 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74  t,      /* How t
5f20: 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65  o dispose of the
5f30: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e   results */.  in
5f40: 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20 20  t iContinue,    
5f50: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
5f60: 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77  re to continue w
5f70: 69 74 68 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a  ith next row */.
5f80: 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20 20 20    int iBreak    
5f90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
5fa0: 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20  p here to break 
5fb0: 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  out of the inner
5fc0: 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20 56 64   loop */.){.  Vd
5fd0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
5fe0: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
5ff0: 20 20 69 6e 74 20 68 61 73 44 69 73 74 69 6e 63    int hasDistinc
6000: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  t;        /* Tru
6010: 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43  e if the DISTINC
6020: 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65  T keyword is pre
6030: 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65  sent */.  int re
6040: 67 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20  gResult;        
6050: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f        /* Start o
6060: 66 20 6d 65 6d 6f 72 79 20 68 6f 6c 64 69 6e 67  f memory holding
6070: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
6080: 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65   int eDest = pDe
6090: 73 74 2d 3e 65 44 65 73 74 3b 20 20 20 2f 2a 20  st->eDest;   /* 
60a0: 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f  How to dispose o
60b0: 66 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69  f results */.  i
60c0: 6e 74 20 69 50 61 72 6d 20 3d 20 70 44 65 73 74  nt iParm = pDest
60d0: 2d 3e 69 53 44 50 61 72 6d 3b 20 2f 2a 20 46 69  ->iSDParm; /* Fi
60e0: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
60f0: 64 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20  disposal method 
6100: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c 74  */.  int nResult
6110: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
6120: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
6130: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  sult columns */.
6140: 20 20 69 6e 74 20 6e 50 72 65 66 69 78 52 65 67    int nPrefixReg
6150: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
6160: 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61   Number of extra
6170: 20 72 65 67 69 73 74 65 72 73 20 62 65 66 6f 72   registers befor
6180: 65 20 72 65 67 52 65 73 75 6c 74 20 2a 2f 0a 0a  e regResult */..
6190: 20 20 61 73 73 65 72 74 28 20 76 20 29 3b 0a 20    assert( v );. 
61a0: 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21   assert( pEList!
61b0: 3d 30 20 29 3b 0a 20 20 68 61 73 44 69 73 74 69  =0 );.  hasDisti
61c0: 6e 63 74 20 3d 20 70 44 69 73 74 69 6e 63 74 20  nct = pDistinct 
61d0: 3f 20 70 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e  ? pDistinct->eTn
61e0: 63 74 54 79 70 65 20 3a 20 57 48 45 52 45 5f 44  ctType : WHERE_D
61f0: 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20  ISTINCT_NOOP;.  
6200: 69 66 28 20 70 53 6f 72 74 20 26 26 20 70 53 6f  if( pSort && pSo
6210: 72 74 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20  rt->pOrderBy==0 
6220: 29 20 70 53 6f 72 74 20 3d 20 30 3b 0a 20 20 69  ) pSort = 0;.  i
6230: 66 28 20 70 53 6f 72 74 3d 3d 30 20 26 26 20 21  f( pSort==0 && !
6240: 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20  hasDistinct ){. 
6250: 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6e 74     assert( iCont
6260: 69 6e 75 65 21 3d 30 20 29 3b 0a 20 20 20 20 63  inue!=0 );.    c
6270: 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e  odeOffset(v, p->
6280: 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e  iOffset, iContin
6290: 75 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50  ue);.  }..  /* P
62a0: 75 6c 6c 20 74 68 65 20 72 65 71 75 65 73 74 65  ull the requeste
62b0: 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a  d columns..  */.
62c0: 20 20 6e 52 65 73 75 6c 74 43 6f 6c 20 3d 20 70    nResultCol = p
62d0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a 20  EList->nExpr;.. 
62e0: 20 69 66 28 20 70 44 65 73 74 2d 3e 69 53 64 73   if( pDest->iSds
62f0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  t==0 ){.    if( 
6300: 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 6e  pSort ){.      n
6310: 50 72 65 66 69 78 52 65 67 20 3d 20 70 53 6f 72  PrefixReg = pSor
6320: 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  t->pOrderBy->nEx
6330: 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 21 28  pr;.      if( !(
6340: 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73  pSort->sortFlags
6350: 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53   & SORTFLAG_UseS
6360: 6f 72 74 65 72 29 20 29 20 6e 50 72 65 66 69 78  orter) ) nPrefix
6370: 52 65 67 2b 2b 3b 0a 20 20 20 20 20 20 70 50 61  Reg++;.      pPa
6380: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 50 72  rse->nMem += nPr
6390: 65 66 69 78 52 65 67 3b 0a 20 20 20 20 7d 0a 20  efixReg;.    }. 
63a0: 20 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20     pDest->iSdst 
63b0: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
63c0: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d  ;.    pParse->nM
63d0: 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c  em += nResultCol
63e0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 44  ;.  }else if( pD
63f0: 65 73 74 2d 3e 69 53 64 73 74 2b 6e 52 65 73 75  est->iSdst+nResu
6400: 6c 74 43 6f 6c 20 3e 20 70 50 61 72 73 65 2d 3e  ltCol > pParse->
6410: 6e 4d 65 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 54  nMem ){.    /* T
6420: 68 69 73 20 69 73 20 61 6e 20 65 72 72 6f 72 20  his is an error 
6430: 63 6f 6e 64 69 74 69 6f 6e 20 74 68 61 74 20 63  condition that c
6440: 61 6e 20 72 65 73 75 6c 74 2c 20 66 6f 72 20 65  an result, for e
6450: 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 61 20 53  xample, when a S
6460: 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20 6f 6e 20  ELECT.    ** on 
6470: 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  the right-hand s
6480: 69 64 65 20 6f 66 20 61 6e 20 49 4e 53 45 52 54  ide of an INSERT
6490: 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 72   contains more r
64a0: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68  esult columns th
64b0: 61 6e 0a 20 20 20 20 2a 2a 20 74 68 65 72 65 20  an.    ** there 
64c0: 61 72 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  are columns in t
64d0: 68 65 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20  he table on the 
64e0: 6c 65 66 74 2e 20 20 54 68 65 20 65 72 72 6f 72  left.  The error
64f0: 20 77 69 6c 6c 20 62 65 20 63 61 75 67 68 74 0a   will be caught.
6500: 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 70 6f 72      ** and repor
6510: 74 65 64 20 6c 61 74 65 72 2e 20 20 42 75 74 20  ted later.  But 
6520: 77 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20  we need to make 
6530: 73 75 72 65 20 65 6e 6f 75 67 68 20 6d 65 6d 6f  sure enough memo
6540: 72 79 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 0a  ry is allocated.
6550: 20 20 20 20 2a 2a 20 74 6f 20 61 76 6f 69 64 20      ** to avoid 
6560: 6f 74 68 65 72 20 73 70 75 72 69 6f 75 73 20 65  other spurious e
6570: 72 72 6f 72 73 20 69 6e 20 74 68 65 20 6d 65 61  rrors in the mea
6580: 6e 74 69 6d 65 2e 20 2a 2f 0a 20 20 20 20 70 50  ntime. */.    pP
6590: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52  arse->nMem += nR
65a0: 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d 0a 20 20  esultCol;.  }.  
65b0: 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 6e  pDest->nSdst = n
65c0: 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 72 65 67  ResultCol;.  reg
65d0: 52 65 73 75 6c 74 20 3d 20 70 44 65 73 74 2d 3e  Result = pDest->
65e0: 69 53 64 73 74 3b 0a 20 20 69 66 28 20 73 72 63  iSdst;.  if( src
65f0: 54 61 62 3e 3d 30 20 29 7b 0a 20 20 20 20 66 6f  Tab>=0 ){.    fo
6600: 72 28 69 3d 30 3b 20 69 3c 6e 52 65 73 75 6c 74  r(i=0; i<nResult
6610: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
6620: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6630: 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
6640: 20 73 72 63 54 61 62 2c 20 69 2c 20 72 65 67 52   srcTab, i, regR
6650: 65 73 75 6c 74 2b 69 29 3b 0a 20 20 20 20 20 20  esult+i);.      
6660: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
6670: 22 25 73 22 2c 20 70 45 4c 69 73 74 2d 3e 61 5b  "%s", pEList->a[
6680: 69 5d 2e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  i].zName));.    
6690: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44  }.  }else if( eD
66a0: 65 73 74 21 3d 53 52 54 5f 45 78 69 73 74 73 20  est!=SRT_Exists 
66b0: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
66c0: 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20   destination is 
66d0: 61 6e 20 45 58 49 53 54 53 28 2e 2e 2e 29 20 65  an EXISTS(...) e
66e0: 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 20 61  xpression, the a
66f0: 63 74 75 61 6c 0a 20 20 20 20 2a 2a 20 76 61 6c  ctual.    ** val
6700: 75 65 73 20 72 65 74 75 72 6e 65 64 20 62 79 20  ues returned by 
6710: 74 68 65 20 53 45 4c 45 43 54 20 61 72 65 20 6e  the SELECT are n
6720: 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20  ot required..   
6730: 20 2a 2f 0a 20 20 20 20 75 38 20 65 63 65 6c 46   */.    u8 ecelF
6740: 6c 61 67 73 3b 0a 20 20 20 20 69 66 28 20 65 44  lags;.    if( eD
6750: 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20  est==SRT_Mem || 
6760: 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
6770: 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f  t || eDest==SRT_
6780: 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20  Coroutine ){.   
6790: 20 20 20 65 63 65 6c 46 6c 61 67 73 20 3d 20 53     ecelFlags = S
67a0: 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 3b 0a  QLITE_ECEL_DUP;.
67b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
67c0: 20 65 63 65 6c 46 6c 61 67 73 20 3d 20 30 3b 0a   ecelFlags = 0;.
67d0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
67e0: 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73  3ExprCodeExprLis
67f0: 74 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74  t(pParse, pEList
6800: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 30 2c 20  , regResult, 0, 
6810: 65 63 65 6c 46 6c 61 67 73 29 3b 0a 20 20 7d 0a  ecelFlags);.  }.
6820: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 44 49 53  .  /* If the DIS
6830: 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 77 61  TINCT keyword wa
6840: 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 74 68 65  s present on the
6850: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
6860: 74 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69 73 20  t.  ** and this 
6870: 72 6f 77 20 68 61 73 20 62 65 65 6e 20 73 65 65  row has been see
6880: 6e 20 62 65 66 6f 72 65 2c 20 74 68 65 6e 20 64  n before, then d
6890: 6f 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69 73 20  o not make this 
68a0: 72 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20 6f 66  row.  ** part of
68b0: 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a   the result..  *
68c0: 2f 0a 20 20 69 66 28 20 68 61 73 44 69 73 74 69  /.  if( hasDisti
68d0: 6e 63 74 20 29 7b 0a 20 20 20 20 73 77 69 74 63  nct ){.    switc
68e0: 68 28 20 70 44 69 73 74 69 6e 63 74 2d 3e 65 54  h( pDistinct->eT
68f0: 6e 63 74 54 79 70 65 20 29 7b 0a 20 20 20 20 20  nctType ){.     
6900: 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53 54   case WHERE_DIST
6910: 49 4e 43 54 5f 4f 52 44 45 52 45 44 3a 20 7b 0a  INCT_ORDERED: {.
6920: 20 20 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a          VdbeOp *
6930: 70 4f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  pOp;            
6940: 2f 2a 20 4e 6f 20 6c 6f 6e 67 65 72 20 72 65 71  /* No longer req
6950: 75 69 72 65 64 20 4f 70 65 6e 45 70 68 65 6d 65  uired OpenEpheme
6960: 72 61 6c 20 69 6e 73 74 72 2e 20 2a 2f 0a 20 20  ral instr. */.  
6970: 20 20 20 20 20 20 69 6e 74 20 69 4a 75 6d 70 3b        int iJump;
6980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6990: 20 4a 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f   Jump destinatio
69a0: 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  n */.        int
69b0: 20 72 65 67 50 72 65 76 3b 20 20 20 20 20 20 20   regPrev;       
69c0: 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73       /* Previous
69d0: 20 72 6f 77 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a   row content */.
69e0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f  .        /* Allo
69f0: 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74  cate space for t
6a00: 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20  he previous row 
6a10: 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 67 50 72  */.        regPr
6a20: 65 76 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  ev = pParse->nMe
6a30: 6d 2b 31 3b 0a 20 20 20 20 20 20 20 20 70 50 61  m+1;.        pPa
6a40: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65  rse->nMem += nRe
6a50: 73 75 6c 74 43 6f 6c 3b 0a 0a 20 20 20 20 20 20  sultCol;..      
6a60: 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 68 65 20    /* Change the 
6a70: 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
6a80: 20 63 6f 64 65 64 20 65 61 72 6c 69 65 72 20 74   coded earlier t
6a90: 6f 20 61 6e 20 4f 50 5f 4e 75 6c 6c 0a 20 20 20  o an OP_Null.   
6aa0: 20 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68 65       ** sets the
6ab0: 20 4d 45 4d 5f 43 6c 65 61 72 65 64 20 62 69 74   MEM_Cleared bit
6ac0: 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 72 65   on the first re
6ad0: 67 69 73 74 65 72 20 6f 66 20 74 68 65 0a 20 20  gister of the.  
6ae0: 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75        ** previou
6af0: 73 20 76 61 6c 75 65 2e 20 20 54 68 69 73 20 77  s value.  This w
6b00: 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20 4f 50  ill cause the OP
6b10: 5f 4e 65 20 62 65 6c 6f 77 20 74 6f 20 61 6c 77  _Ne below to alw
6b20: 61 79 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  ays.        ** f
6b30: 61 69 6c 20 6f 6e 20 74 68 65 20 66 69 72 73 74  ail on the first
6b40: 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
6b50: 65 20 6c 6f 6f 70 20 65 76 65 6e 20 69 66 20 74  e loop even if t
6b60: 68 65 20 66 69 72 73 74 0a 20 20 20 20 20 20 20  he first.       
6b70: 20 2a 2a 20 72 6f 77 20 69 73 20 61 6c 6c 20 4e   ** row is all N
6b80: 55 4c 4c 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ULLs..        */
6b90: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
6ba0: 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70  VdbeChangeToNoop
6bb0: 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 61  (v, pDistinct->a
6bc0: 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20 20  ddrTnct);.      
6bd0: 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56    pOp = sqlite3V
6be0: 64 62 65 47 65 74 4f 70 28 76 2c 20 70 44 69 73  dbeGetOp(v, pDis
6bf0: 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29  tinct->addrTnct)
6c00: 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f  ;.        pOp->o
6c10: 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 75 6c 6c 3b  pcode = OP_Null;
6c20: 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31  .        pOp->p1
6c30: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4f   = 1;.        pO
6c40: 70 2d 3e 70 32 20 3d 20 72 65 67 50 72 65 76 3b  p->p2 = regPrev;
6c50: 0a 0a 20 20 20 20 20 20 20 20 69 4a 75 6d 70 20  ..        iJump 
6c60: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
6c70: 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 6e 52  rentAddr(v) + nR
6c80: 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 20 20 20 20  esultCol;.      
6c90: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65    for(i=0; i<nRe
6ca0: 73 75 6c 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  sultCol; i++){. 
6cb0: 20 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71           CollSeq
6cc0: 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65   *pColl = sqlite
6cd0: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
6ce0: 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69  rse, pEList->a[i
6cf0: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
6d00: 20 20 20 20 69 66 28 20 69 3c 6e 52 65 73 75 6c      if( i<nResul
6d10: 74 43 6f 6c 2d 31 20 29 7b 0a 20 20 20 20 20 20  tCol-1 ){.      
6d20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6d30: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 65  eAddOp3(v, OP_Ne
6d40: 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 2c 20 69  , regResult+i, i
6d50: 4a 75 6d 70 2c 20 72 65 67 50 72 65 76 2b 69 29  Jump, regPrev+i)
6d60: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 56 64  ;.            Vd
6d70: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
6d80: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
6d90: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
6da0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
6db0: 20 4f 50 5f 45 71 2c 20 72 65 67 52 65 73 75 6c   OP_Eq, regResul
6dc0: 74 2b 69 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20  t+i, iContinue, 
6dd0: 72 65 67 50 72 65 76 2b 69 29 3b 0a 20 20 20 20  regPrev+i);.    
6de0: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
6df0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
6e00: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
6e10: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
6e20: 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 6f 6e 73  eP4(v, -1, (cons
6e30: 74 20 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20  t char *)pColl, 
6e40: 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20  P4_COLLSEQ);.   
6e50: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
6e60: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51  beChangeP5(v, SQ
6e70: 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20  LITE_NULLEQ);.  
6e80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6e90: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 56  assert( sqlite3V
6ea0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
6eb0: 29 3d 3d 69 4a 75 6d 70 20 7c 7c 20 70 50 61 72  )==iJump || pPar
6ec0: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
6ed0: 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20  iled );.        
6ee0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6ef0: 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65  3(v, OP_Copy, re
6f00: 67 52 65 73 75 6c 74 2c 20 72 65 67 50 72 65 76  gResult, regPrev
6f10: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2d 31 29 3b  , nResultCol-1);
6f20: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
6f30: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 63        }..      c
6f40: 61 73 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e  ase WHERE_DISTIN
6f50: 43 54 5f 55 4e 49 51 55 45 3a 20 7b 0a 20 20 20  CT_UNIQUE: {.   
6f60: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
6f70: 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20  ChangeToNoop(v, 
6f80: 70 44 69 73 74 69 6e 63 74 2d 3e 61 64 64 72 54  pDistinct->addrT
6f90: 6e 63 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72  nct);.        br
6fa0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  eak;.      }..  
6fb0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
6fc0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
6fd0: 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54  Distinct->eTnctT
6fe0: 79 70 65 3d 3d 57 48 45 52 45 5f 44 49 53 54 49  ype==WHERE_DISTI
6ff0: 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 20 29 3b  NCT_UNORDERED );
7000: 0a 20 20 20 20 20 20 20 20 63 6f 64 65 44 69 73  .        codeDis
7010: 74 69 6e 63 74 28 70 50 61 72 73 65 2c 20 70 44  tinct(pParse, pD
7020: 69 73 74 69 6e 63 74 2d 3e 74 61 62 54 6e 63 74  istinct->tabTnct
7030: 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6e 52 65  , iContinue, nRe
7040: 73 75 6c 74 43 6f 6c 2c 0a 20 20 20 20 20 20 20  sultCol,.       
7050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
7060: 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20  gResult);.      
7070: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
7080: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
7090: 53 6f 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Sort==0 ){.     
70a0: 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70   codeOffset(v, p
70b0: 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74  ->iOffset, iCont
70c0: 69 6e 75 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  inue);.    }.  }
70d0: 0a 0a 20 20 73 77 69 74 63 68 28 20 65 44 65 73  ..  switch( eDes
70e0: 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74  t ){.    /* In t
70f0: 68 69 73 20 6d 6f 64 65 2c 20 77 72 69 74 65 20  his mode, write 
7100: 65 61 63 68 20 71 75 65 72 79 20 72 65 73 75 6c  each query resul
7110: 74 20 74 6f 20 74 68 65 20 6b 65 79 20 6f 66 20  t to the key of 
7120: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20  the temporary.  
7130: 20 20 2a 2a 20 74 61 62 6c 65 20 69 50 61 72 6d    ** table iParm
7140: 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ..    */.#ifndef
7150: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
7160: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 20  POUND_SELECT.   
7170: 20 63 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e 3a   case SRT_Union:
7180: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b   {.      int r1;
7190: 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
71a0: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
71b0: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
71c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
71d0: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
71e0: 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73   regResult, nRes
71f0: 75 6c 74 43 6f 6c 2c 20 72 31 29 3b 0a 20 20 20  ultCol, r1);.   
7200: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7210: 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64  dOp4Int(v, OP_Id
7220: 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20  xInsert, iParm, 
7230: 72 31 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e  r1, regResult, n
7240: 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20  ResultCol);.    
7250: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
7260: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
7270: 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  r1);.      break
7280: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
7290: 43 6f 6e 73 74 72 75 63 74 20 61 20 72 65 63 6f  Construct a reco
72a0: 72 64 20 66 72 6f 6d 20 74 68 65 20 71 75 65 72  rd from the quer
72b0: 79 20 72 65 73 75 6c 74 2c 20 62 75 74 20 69 6e  y result, but in
72c0: 73 74 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a 20  stead of.    ** 
72d0: 73 61 76 69 6e 67 20 74 68 61 74 20 72 65 63 6f  saving that reco
72e0: 72 64 2c 20 75 73 65 20 69 74 20 61 73 20 61 20  rd, use it as a 
72f0: 6b 65 79 20 74 6f 20 64 65 6c 65 74 65 20 65 6c  key to delete el
7300: 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20 20 20 20  ements from.    
7310: 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  ** the temporary
7320: 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20   table iParm..  
7330: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
7340: 54 5f 45 78 63 65 70 74 3a 20 7b 0a 20 20 20 20  T_Except: {.    
7350: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7360: 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78 44 65 6c  Op3(v, OP_IdxDel
7370: 65 74 65 2c 20 69 50 61 72 6d 2c 20 72 65 67 52  ete, iParm, regR
7380: 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f  esult, nResultCo
7390: 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
73a0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
73b0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
73c0: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a  POUND_SELECT */.
73d0: 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68  .    /* Store th
73e0: 65 20 72 65 73 75 6c 74 20 61 73 20 64 61 74 61  e result as data
73f0: 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65 20   using a unique 
7400: 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  key..    */.    
7410: 63 61 73 65 20 53 52 54 5f 46 69 66 6f 3a 0a 20  case SRT_Fifo:. 
7420: 20 20 20 63 61 73 65 20 53 52 54 5f 44 69 73 74     case SRT_Dist
7430: 46 69 66 6f 3a 0a 20 20 20 20 63 61 73 65 20 53  Fifo:.    case S
7440: 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61  RT_Table:.    ca
7450: 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a  se SRT_EphemTab:
7460: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 20   {.      int r1 
7470: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
7480: 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 50  Range(pParse, nP
7490: 72 65 66 69 78 52 65 67 2b 31 29 3b 0a 20 20 20  refixReg+1);.   
74a0: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
74b0: 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b  st==SRT_Table );
74c0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
74d0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65   eDest==SRT_Ephe
74e0: 6d 54 61 62 20 29 3b 0a 20 20 20 20 20 20 74 65  mTab );.      te
74f0: 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53  stcase( eDest==S
7500: 52 54 5f 46 69 66 6f 20 29 3b 0a 20 20 20 20 20  RT_Fifo );.     
7510: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
7520: 3d 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20 29  ==SRT_DistFifo )
7530: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
7540: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
7550: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52  MakeRecord, regR
7560: 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f  esult, nResultCo
7570: 6c 2c 20 72 31 2b 6e 50 72 65 66 69 78 52 65 67  l, r1+nPrefixReg
7580: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
7590: 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20 20  E_OMIT_CTE.     
75a0: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
75b0: 44 69 73 74 46 69 66 6f 20 29 7b 0a 20 20 20 20  DistFifo ){.    
75c0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 65      /* If the de
75d0: 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 44 69 73  stination is Dis
75e0: 74 46 69 66 6f 2c 20 74 68 65 6e 20 63 75 72 73  tFifo, then curs
75f0: 6f 72 20 28 69 50 61 72 6d 2b 31 29 20 69 73 20  or (iParm+1) is 
7600: 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  open.        ** 
7610: 6f 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20  on an ephemeral 
7620: 69 6e 64 65 78 2e 20 49 66 20 74 68 65 20 63 75  index. If the cu
7630: 72 72 65 6e 74 20 72 6f 77 20 69 73 20 61 6c 72  rrent row is alr
7640: 65 61 64 79 20 70 72 65 73 65 6e 74 0a 20 20 20  eady present.   
7650: 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 69       ** in the i
7660: 6e 64 65 78 2c 20 64 6f 20 6e 6f 74 20 77 72 69  ndex, do not wri
7670: 74 65 20 69 74 20 74 6f 20 74 68 65 20 6f 75 74  te it to the out
7680: 70 75 74 2e 20 49 66 20 6e 6f 74 2c 20 61 64 64  put. If not, add
7690: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
76a0: 63 75 72 72 65 6e 74 20 72 6f 77 20 74 6f 20 74  current row to t
76b0: 68 65 20 69 6e 64 65 78 20 61 6e 64 20 70 72 6f  he index and pro
76c0: 63 65 65 64 20 77 69 74 68 20 77 72 69 74 69 6e  ceed with writin
76d0: 67 20 69 74 20 74 6f 20 74 68 65 0a 20 20 20 20  g it to the.    
76e0: 20 20 20 20 2a 2a 20 6f 75 74 70 75 74 20 74 61      ** output ta
76f0: 62 6c 65 20 61 73 20 77 65 6c 6c 2e 20 20 2a 2f  ble as well.  */
7700: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64  .        int add
7710: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  r = sqlite3VdbeC
7720: 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20  urrentAddr(v) + 
7730: 34 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  4;.        sqlit
7740: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
7750: 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 50 61  v, OP_Found, iPa
7760: 72 6d 2b 31 2c 20 61 64 64 72 2c 20 72 31 2c 20  rm+1, addr, r1, 
7770: 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  0);.        Vdbe
7780: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
7790: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
77a0: 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
77b0: 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  IdxInsert, iParm
77c0: 2b 31 2c 20 72 31 2c 72 65 67 52 65 73 75 6c 74  +1, r1,regResult
77d0: 2c 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20  ,nResultCol);.  
77e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
77f0: 6f 72 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ort==0 );.      
7800: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  }.#endif.      i
7810: 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20  f( pSort ){.    
7820: 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74      pushOntoSort
7830: 65 72 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74  er(pParse, pSort
7840: 2c 20 70 2c 20 72 31 2b 6e 50 72 65 66 69 78 52  , p, r1+nPrefixR
7850: 65 67 2c 72 65 67 52 65 73 75 6c 74 2c 31 2c 6e  eg,regResult,1,n
7860: 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20 20  PrefixReg);.    
7870: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7880: 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65   int r2 = sqlite
7890: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
78a0: 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
78b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
78c0: 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69  , OP_NewRowid, i
78d0: 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20  Parm, r2);.     
78e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
78f0: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72  dOp3(v, OP_Inser
7900: 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20 72 32  t, iParm, r1, r2
7910: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
7920: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
7930: 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29  , OPFLAG_APPEND)
7940: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
7950: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
7960: 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20  pParse, r2);.   
7970: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
7980: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
7990: 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20 6e  ge(pParse, r1, n
79a0: 50 72 65 66 69 78 52 65 67 2b 31 29 3b 0a 20 20  PrefixReg+1);.  
79b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
79c0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
79d0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
79e0: 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20     /* If we are 
79f0: 63 72 65 61 74 69 6e 67 20 61 20 73 65 74 20 66  creating a set f
7a00: 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28  or an "expr IN (
7a10: 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e  SELECT ...)" con
7a20: 73 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74  struct,.    ** t
7a30: 68 65 6e 20 74 68 65 72 65 20 73 68 6f 75 6c 64  hen there should
7a40: 20 62 65 20 61 20 73 69 6e 67 6c 65 20 69 74 65   be a single ite
7a50: 6d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20  m on the stack. 
7a60: 20 57 72 69 74 65 20 74 68 69 73 0a 20 20 20 20   Write this.    
7a70: 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74 68 65  ** item into the
7a80: 20 73 65 74 20 74 61 62 6c 65 20 77 69 74 68 20   set table with 
7a90: 62 6f 67 75 73 20 64 61 74 61 2e 0a 20 20 20 20  bogus data..    
7aa0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
7ab0: 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  Set: {.      if(
7ac0: 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20   pSort ){.      
7ad0: 20 20 2f 2a 20 41 74 20 66 69 72 73 74 20 67 6c    /* At first gl
7ae0: 61 6e 63 65 20 79 6f 75 20 77 6f 75 6c 64 20 74  ance you would t
7af0: 68 69 6e 6b 20 77 65 20 63 6f 75 6c 64 20 6f 70  hink we could op
7b00: 74 69 6d 69 7a 65 20 6f 75 74 20 74 68 65 0a 20  timize out the. 
7b10: 20 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52 20         ** ORDER 
7b20: 42 59 20 69 6e 20 74 68 69 73 20 63 61 73 65 20  BY in this case 
7b30: 73 69 6e 63 65 20 74 68 65 20 6f 72 64 65 72 20  since the order 
7b40: 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  of entries in th
7b50: 65 20 73 65 74 0a 20 20 20 20 20 20 20 20 2a 2a  e set.        **
7b60: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72   does not matter
7b70: 2e 20 20 42 75 74 20 74 68 65 72 65 20 6d 69 67  .  But there mig
7b80: 68 74 20 62 65 20 61 20 4c 49 4d 49 54 20 63 6c  ht be a LIMIT cl
7b90: 61 75 73 65 2c 20 69 6e 20 77 68 69 63 68 0a 20  ause, in which. 
7ba0: 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20 74         ** case t
7bb0: 68 65 20 6f 72 64 65 72 20 64 6f 65 73 20 6d 61  he order does ma
7bc0: 74 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  tter */.        
7bd0: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a  pushOntoSorter(.
7be0: 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72              pPar
7bf0: 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65  se, pSort, p, re
7c00: 67 52 65 73 75 6c 74 2c 20 72 65 67 52 65 73 75  gResult, regResu
7c10: 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20  lt, nResultCol, 
7c20: 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20  nPrefixReg);.   
7c30: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7c40: 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74    int r1 = sqlit
7c50: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
7c60: 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 61 73  rse);.        as
7c70: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 74 72  sert( sqlite3Str
7c80: 6c 65 6e 33 30 28 70 44 65 73 74 2d 3e 7a 41 66  len30(pDest->zAf
7c90: 66 53 64 73 74 29 3d 3d 6e 52 65 73 75 6c 74 43  fSdst)==nResultC
7ca0: 6f 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ol );.        sq
7cb0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
7cc0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
7cd0: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65  , regResult, nRe
7ce0: 73 75 6c 74 43 6f 6c 2c 20 0a 20 20 20 20 20 20  sultCol, .      
7cf0: 20 20 20 20 20 20 72 31 2c 20 70 44 65 73 74 2d        r1, pDest-
7d00: 3e 7a 41 66 66 53 64 73 74 2c 20 6e 52 65 73 75  >zAffSdst, nResu
7d10: 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20  ltCol);.        
7d20: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
7d30: 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
7d40: 50 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74  Parse, regResult
7d50: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20  , nResultCol);. 
7d60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
7d70: 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
7d80: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61  P_IdxInsert, iPa
7d90: 72 6d 2c 20 72 31 2c 20 72 65 67 52 65 73 75 6c  rm, r1, regResul
7da0: 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a  t, nResultCol);.
7db0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
7dc0: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
7dd0: 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
7de0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
7df0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
7e00: 20 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20 69   any row exist i
7e10: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
7e20: 2c 20 72 65 63 6f 72 64 20 74 68 61 74 20 66 61  , record that fa
7e30: 63 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20  ct and abort..  
7e40: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
7e50: 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20 20  T_Exists: {.    
7e60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7e70: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
7e80: 72 2c 20 31 2c 20 69 50 61 72 6d 29 3b 0a 20 20  r, 1, iParm);.  
7e90: 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54      /* The LIMIT
7ea0: 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72   clause will ter
7eb0: 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20  minate the loop 
7ec0: 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20  for us */.      
7ed0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
7ee0: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
7ef0: 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20  a scalar select 
7f00: 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20  that is part of 
7f10: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74  an expression, t
7f20: 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65  hen.    ** store
7f30: 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20   the results in 
7f40: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
7f50: 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 6f 72 20 61  memory cell or a
7f60: 72 72 61 79 20 6f 66 20 0a 20 20 20 20 2a 2a 20  rray of .    ** 
7f70: 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 6e 64  memory cells and
7f80: 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68   break out of th
7f90: 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20  e scan loop..   
7fa0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
7fb0: 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73  _Mem: {.      as
7fc0: 73 65 72 74 28 20 6e 52 65 73 75 6c 74 43 6f 6c  sert( nResultCol
7fd0: 3d 3d 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 29  ==pDest->nSdst )
7fe0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f 72  ;.      if( pSor
7ff0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73  t ){.        pus
8000: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20 20  hOntoSorter(.   
8010: 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c           pParse,
8020: 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52 65   pSort, p, regRe
8030: 73 75 6c 74 2c 20 72 65 67 52 65 73 75 6c 74 2c  sult, regResult,
8040: 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 6e 50 72   nResultCol, nPr
8050: 65 66 69 78 52 65 67 29 3b 0a 20 20 20 20 20 20  efixReg);.      
8060: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
8070: 73 73 65 72 74 28 20 72 65 67 52 65 73 75 6c 74  ssert( regResult
8080: 3d 3d 69 50 61 72 6d 20 29 3b 0a 20 20 20 20 20  ==iParm );.     
8090: 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20     /* The LIMIT 
80a0: 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70  clause will jump
80b0: 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70   out of the loop
80c0: 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
80d0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
80e0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
80f0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
8100: 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a  MIT_SUBQUERY */.
8110: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 43 6f  .    case SRT_Co
8120: 72 6f 75 74 69 6e 65 3a 20 20 20 20 20 20 20 2f  routine:       /
8130: 2a 20 53 65 6e 64 20 64 61 74 61 20 74 6f 20 61  * Send data to a
8140: 20 63 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   co-routine */. 
8150: 20 20 20 63 61 73 65 20 53 52 54 5f 4f 75 74 70     case SRT_Outp
8160: 75 74 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20  ut: {        /* 
8170: 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c  Return the resul
8180: 74 73 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74  ts */.      test
8190: 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54  case( eDest==SRT
81a0: 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20  _Coroutine );.  
81b0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
81c0: 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
81d0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f  );.      if( pSo
81e0: 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75  rt ){.        pu
81f0: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61  shOntoSorter(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 52 65 73  egResult, regRes
8220: 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c  ult, nResultCol,
8230: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8240: 20 20 20 20 20 20 20 20 6e 50 72 65 66 69 78 52          nPrefixR
8250: 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eg);.      }else
8260: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
8270: 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20  Coroutine ){.   
8280: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8290: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
82a0: 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61  ld, pDest->iSDPa
82b0: 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  rm);.      }else
82c0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
82d0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
82e0: 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 72 65 67  P_ResultRow, reg
82f0: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
8300: 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
8310: 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
8320: 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
8330: 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e  se, regResult, n
8340: 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20  ResultCol);.    
8350: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
8360: 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  .    }..#ifndef 
8370: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
8380: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
8390: 20 72 65 73 75 6c 74 73 20 69 6e 74 6f 20 61 20   results into a 
83a0: 70 72 69 6f 72 69 74 79 20 71 75 65 75 65 20 74  priority queue t
83b0: 68 61 74 20 69 73 20 6f 72 64 65 72 20 61 63 63  hat is order acc
83c0: 6f 72 64 69 6e 67 20 74 6f 0a 20 20 20 20 2a 2a  ording to.    **
83d0: 20 70 44 65 73 74 2d 3e 70 4f 72 64 65 72 42 79   pDest->pOrderBy
83e0: 20 28 69 6e 20 70 53 4f 29 2e 20 20 70 44 65 73   (in pSO).  pDes
83f0: 74 2d 3e 69 53 44 50 61 72 6d 20 28 69 6e 20 69  t->iSDParm (in i
8400: 50 61 72 6d 29 20 69 73 20 74 68 65 20 63 75 72  Parm) is the cur
8410: 73 6f 72 20 66 6f 72 20 61 6e 0a 20 20 20 20 2a  sor for an.    *
8420: 2a 20 69 6e 64 65 78 20 77 69 74 68 20 70 53 4f  * index with pSO
8430: 2d 3e 6e 45 78 70 72 2b 32 20 63 6f 6c 75 6d 6e  ->nExpr+2 column
8440: 73 2e 20 20 42 75 69 6c 64 20 61 20 6b 65 79 20  s.  Build a key 
8450: 75 73 69 6e 67 20 70 53 4f 20 66 6f 72 20 74 68  using pSO for th
8460: 65 20 66 69 72 73 74 0a 20 20 20 20 2a 2a 20 70  e first.    ** p
8470: 53 4f 2d 3e 6e 45 78 70 72 20 63 6f 6c 75 6d 6e  SO->nExpr column
8480: 73 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72  s, then make sur
8490: 65 20 61 6c 6c 20 6b 65 79 73 20 61 72 65 20 75  e all keys are u
84a0: 6e 69 71 75 65 20 62 79 20 61 64 64 69 6e 67 20  nique by adding 
84b0: 61 0a 20 20 20 20 2a 2a 20 66 69 6e 61 6c 20 4f  a.    ** final O
84c0: 50 5f 53 65 71 75 65 6e 63 65 20 63 6f 6c 75 6d  P_Sequence colum
84d0: 6e 2e 20 20 54 68 65 20 6c 61 73 74 20 63 6f 6c  n.  The last col
84e0: 75 6d 6e 20 69 73 20 74 68 65 20 72 65 63 6f 72  umn is the recor
84f0: 64 20 61 73 20 61 20 62 6c 6f 62 2e 0a 20 20 20  d as a blob..   
8500: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
8510: 5f 44 69 73 74 51 75 65 75 65 3a 0a 20 20 20 20  _DistQueue:.    
8520: 63 61 73 65 20 53 52 54 5f 51 75 65 75 65 3a 20  case SRT_Queue: 
8530: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4b 65 79  {.      int nKey
8540: 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 2c 20  ;.      int r1, 
8550: 72 32 2c 20 72 33 3b 0a 20 20 20 20 20 20 69 6e  r2, r3;.      in
8560: 74 20 61 64 64 72 54 65 73 74 20 3d 20 30 3b 0a  t addrTest = 0;.
8570: 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
8580: 70 53 4f 3b 0a 20 20 20 20 20 20 70 53 4f 20 3d  pSO;.      pSO =
8590: 20 70 44 65 73 74 2d 3e 70 4f 72 64 65 72 42 79   pDest->pOrderBy
85a0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
85b0: 70 53 4f 20 29 3b 0a 20 20 20 20 20 20 6e 4b 65  pSO );.      nKe
85c0: 79 20 3d 20 70 53 4f 2d 3e 6e 45 78 70 72 3b 0a  y = pSO->nExpr;.
85d0: 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
85e0: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
85f0: 72 73 65 29 3b 0a 20 20 20 20 20 20 72 32 20 3d  rse);.      r2 =
8600: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
8610: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 4b 65  ange(pParse, nKe
8620: 79 2b 32 29 3b 0a 20 20 20 20 20 20 72 33 20 3d  y+2);.      r3 =
8630: 20 72 32 2b 6e 4b 65 79 2b 31 3b 0a 20 20 20 20   r2+nKey+1;.    
8640: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
8650: 5f 44 69 73 74 51 75 65 75 65 20 29 7b 0a 20 20  _DistQueue ){.  
8660: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
8670: 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 44  destination is D
8680: 69 73 74 51 75 65 75 65 2c 20 74 68 65 6e 20 63  istQueue, then c
8690: 75 72 73 6f 72 20 28 69 50 61 72 6d 2b 31 29 20  ursor (iParm+1) 
86a0: 69 73 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20  is open.        
86b0: 2a 2a 20 6f 6e 20 61 20 73 65 63 6f 6e 64 20 65  ** on a second e
86c0: 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20 74  phemeral index t
86d0: 68 61 74 20 68 6f 6c 64 73 20 61 6c 6c 20 76 61  hat holds all va
86e0: 6c 75 65 73 20 65 76 65 72 79 20 70 72 65 76 69  lues every previ
86f0: 6f 75 73 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a  ously.        **
8700: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 71 75   added to the qu
8710: 65 75 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  eue. */.        
8720: 61 64 64 72 54 65 73 74 20 3d 20 73 71 6c 69 74  addrTest = sqlit
8730: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
8740: 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 50 61  v, OP_Found, iPa
8750: 72 6d 2b 31 2c 20 30 2c 20 0a 20 20 20 20 20 20  rm+1, 0, .      
8760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8780: 20 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65    regResult, nRe
8790: 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20  sultCol);.      
87a0: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
87b0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
87c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
87d0: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
87e0: 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  ord, regResult, 
87f0: 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72 33 29 3b  nResultCol, r3);
8800: 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74  .      if( eDest
8810: 3d 3d 53 52 54 5f 44 69 73 74 51 75 65 75 65 20  ==SRT_DistQueue 
8820: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
8830: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
8840: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50  OP_IdxInsert, iP
8850: 61 72 6d 2b 31 2c 20 72 33 29 3b 0a 20 20 20 20  arm+1, r3);.    
8860: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
8870: 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
8880: 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29  G_USESEEKRESULT)
8890: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
88a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4b 65 79 3b  for(i=0; i<nKey;
88b0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73   i++){.        s
88c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
88d0: 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 0a 20 20  (v, OP_SCopy,.  
88e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
88f0: 20 20 20 20 20 20 20 20 72 65 67 52 65 73 75 6c          regResul
8900: 74 20 2b 20 70 53 4f 2d 3e 61 5b 69 5d 2e 75 2e  t + pSO->a[i].u.
8910: 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 2d 20  x.iOrderByCol - 
8920: 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1,.             
8930: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 32 2b               r2+
8940: 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i);.      }.    
8950: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8960: 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e  Op2(v, OP_Sequen
8970: 63 65 2c 20 69 50 61 72 6d 2c 20 72 32 2b 6e 4b  ce, iParm, r2+nK
8980: 65 79 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ey);.      sqlit
8990: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
89a0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
89b0: 32 2c 20 6e 4b 65 79 2b 32 2c 20 72 31 29 3b 0a  2, nKey+2, r1);.
89c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
89d0: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
89e0: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72  _IdxInsert, iPar
89f0: 6d 2c 20 72 31 2c 20 72 32 2c 20 6e 4b 65 79 2b  m, r1, r2, nKey+
8a00: 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 64  2);.      if( ad
8a10: 64 72 54 65 73 74 20 29 20 73 71 6c 69 74 65 33  drTest ) sqlite3
8a20: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
8a30: 61 64 64 72 54 65 73 74 29 3b 0a 20 20 20 20 20  addrTest);.     
8a40: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
8a50: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
8a60: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
8a70: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
8a80: 65 28 70 50 61 72 73 65 2c 20 72 32 2c 20 6e 4b  e(pParse, r2, nK
8a90: 65 79 2b 32 29 3b 0a 20 20 20 20 20 20 62 72 65  ey+2);.      bre
8aa0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
8ab0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
8ac0: 43 54 45 20 2a 2f 0a 0a 0a 0a 23 69 66 20 21 64  CTE */....#if !d
8ad0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
8ae0: 49 54 5f 54 52 49 47 47 45 52 29 0a 20 20 20 20  IT_TRIGGER).    
8af0: 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 72  /* Discard the r
8b00: 65 73 75 6c 74 73 2e 20 20 54 68 69 73 20 69 73  esults.  This is
8b10: 20 75 73 65 64 20 66 6f 72 20 53 45 4c 45 43 54   used for SELECT
8b20: 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 73 69   statements insi
8b30: 64 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 6f  de.    ** the bo
8b40: 64 79 20 6f 66 20 61 20 54 52 49 47 47 45 52 2e  dy of a TRIGGER.
8b50: 20 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66    The purpose of
8b60: 20 73 75 63 68 20 73 65 6c 65 63 74 73 20 69 73   such selects is
8b70: 20 74 6f 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20   to call.    ** 
8b80: 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e  user-defined fun
8b90: 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61 76 65  ctions that have
8ba0: 20 73 69 64 65 20 65 66 66 65 63 74 73 2e 20 20   side effects.  
8bb0: 57 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 0a 20  We do not care. 
8bc0: 20 20 20 2a 2a 20 61 62 6f 75 74 20 74 68 65 20     ** about the 
8bd0: 61 63 74 75 61 6c 20 72 65 73 75 6c 74 73 20 6f  actual results o
8be0: 66 20 74 68 65 20 73 65 6c 65 63 74 2e 0a 20 20  f the select..  
8bf0: 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74    */.    default
8c00: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
8c10: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ( eDest==SRT_Dis
8c20: 63 61 72 64 20 29 3b 0a 20 20 20 20 20 20 62 72  card );.      br
8c30: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
8c40: 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70  f.  }..  /* Jump
8c50: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
8c60: 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c  he loop if the L
8c70: 49 4d 49 54 20 69 73 20 72 65 61 63 68 65 64 2e  IMIT is reached.
8c80: 20 20 45 78 63 65 70 74 2c 20 69 66 0a 20 20 2a    Except, if.  *
8c90: 2a 20 74 68 65 72 65 20 69 73 20 61 20 73 6f 72  * there is a sor
8ca0: 74 65 72 2c 20 69 6e 20 77 68 69 63 68 20 63 61  ter, in which ca
8cb0: 73 65 20 74 68 65 20 73 6f 72 74 65 72 20 68 61  se the sorter ha
8cc0: 73 20 61 6c 72 65 61 64 79 20 6c 69 6d 69 74 65  s already limite
8cd0: 64 0a 20 20 2a 2a 20 74 68 65 20 6f 75 74 70 75  d.  ** the outpu
8ce0: 74 20 66 6f 72 20 75 73 2e 0a 20 20 2a 2f 0a 20  t for us..  */. 
8cf0: 20 69 66 28 20 70 53 6f 72 74 3d 3d 30 20 26 26   if( pSort==0 &&
8d00: 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20   p->iLimit ){.  
8d10: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8d20: 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75  Op2(v, OP_DecrJu
8d30: 6d 70 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69  mpZero, p->iLimi
8d40: 74 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65  t, iBreak); Vdbe
8d50: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d  Coverage(v);.  }
8d60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
8d70: 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a  te a KeyInfo obj
8d80: 65 63 74 20 73 75 66 66 69 63 69 65 6e 74 20 66  ect sufficient f
8d90: 6f 72 20 61 6e 20 69 6e 64 65 78 20 6f 66 20 4e  or an index of N
8da0: 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 61 6e 64   key columns and
8db0: 0a 2a 2a 20 58 20 65 78 74 72 61 20 63 6f 6c 75  .** X extra colu
8dc0: 6d 6e 73 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20  mns..*/.KeyInfo 
8dd0: 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41  *sqlite3KeyInfoA
8de0: 6c 6c 6f 63 28 73 71 6c 69 74 65 33 20 2a 64 62  lloc(sqlite3 *db
8df0: 2c 20 69 6e 74 20 4e 2c 20 69 6e 74 20 58 29 7b  , int N, int X){
8e00: 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20 3d 20  .  int nExtra = 
8e10: 28 4e 2b 58 29 2a 28 73 69 7a 65 6f 66 28 43 6f  (N+X)*(sizeof(Co
8e20: 6c 6c 53 65 71 2a 29 2b 31 29 3b 0a 20 20 4b 65  llSeq*)+1);.  Ke
8e30: 79 49 6e 66 6f 20 2a 70 20 3d 20 73 71 6c 69 74  yInfo *p = sqlit
8e40: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
8e50: 64 62 2c 20 73 69 7a 65 6f 66 28 4b 65 79 49 6e  db, sizeof(KeyIn
8e60: 66 6f 29 20 2b 20 6e 45 78 74 72 61 29 3b 0a 20  fo) + nExtra);. 
8e70: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 70 2d   if( p ){.    p-
8e80: 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  >aSortOrder = (u
8e90: 38 2a 29 26 70 2d 3e 61 43 6f 6c 6c 5b 4e 2b 58  8*)&p->aColl[N+X
8ea0: 5d 3b 0a 20 20 20 20 70 2d 3e 6e 46 69 65 6c 64  ];.    p->nField
8eb0: 20 3d 20 28 75 31 36 29 4e 3b 0a 20 20 20 20 70   = (u16)N;.    p
8ec0: 2d 3e 6e 58 46 69 65 6c 64 20 3d 20 28 75 31 36  ->nXField = (u16
8ed0: 29 58 3b 0a 20 20 20 20 70 2d 3e 65 6e 63 20 3d  )X;.    p->enc =
8ee0: 20 45 4e 43 28 64 62 29 3b 0a 20 20 20 20 70 2d   ENC(db);.    p-
8ef0: 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 70 2d  >db = db;.    p-
8f00: 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 6d  >nRef = 1;.    m
8f10: 65 6d 73 65 74 28 26 70 5b 31 5d 2c 20 30 2c 20  emset(&p[1], 0, 
8f20: 6e 45 78 74 72 61 29 3b 0a 20 20 7d 65 6c 73 65  nExtra);.  }else
8f30: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d  {.    sqlite3Oom
8f40: 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 7d 0a 20  Fault(db);.  }. 
8f50: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
8f60: 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61  .** Deallocate a
8f70: 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a   KeyInfo object.
8f80: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4b  */.void sqlite3K
8f90: 65 79 49 6e 66 6f 55 6e 72 65 66 28 4b 65 79 49  eyInfoUnref(KeyI
8fa0: 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  nfo *p){.  if( p
8fb0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
8fc0: 70 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20  p->nRef>0 );.   
8fd0: 20 70 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20   p->nRef--;.    
8fe0: 69 66 28 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29  if( p->nRef==0 )
8ff0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
9000: 2d 3e 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a  ->db, p);.  }.}.
9010: 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 6e 65  ./*.** Make a ne
9020: 77 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4b  w pointer to a K
9030: 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f  eyInfo object.*/
9040: 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65  .KeyInfo *sqlite
9050: 33 4b 65 79 49 6e 66 6f 52 65 66 28 4b 65 79 49  3KeyInfoRef(KeyI
9060: 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  nfo *p){.  if( p
9070: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
9080: 70 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20  p->nRef>0 );.   
9090: 20 70 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a   p->nRef++;.  }.
90a0: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 23    return p;.}..#
90b0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
90c0: 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  UG./*.** Return 
90d0: 54 52 55 45 20 69 66 20 61 20 4b 65 79 49 6e 66  TRUE if a KeyInf
90e0: 6f 20 6f 62 6a 65 63 74 20 63 61 6e 20 62 65 20  o object can be 
90f0: 63 68 61 6e 67 65 2e 20 20 54 68 65 20 4b 65 79  change.  The Key
9100: 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2a 20 63  Info object.** c
9110: 61 6e 20 6f 6e 6c 79 20 62 65 20 63 68 61 6e 67  an only be chang
9120: 65 64 20 69 66 20 74 68 69 73 20 69 73 20 6a 75  ed if this is ju
9130: 73 74 20 61 20 73 69 6e 67 6c 65 20 72 65 66 65  st a single refe
9140: 72 65 6e 63 65 20 74 6f 20 74 68 65 20 6f 62 6a  rence to the obj
9150: 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ect..**.** This 
9160: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
9170: 6f 6e 6c 79 20 69 6e 73 69 64 65 20 6f 66 20 61  only inside of a
9180: 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
9190: 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ts..*/.int sqlit
91a0: 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65  e3KeyInfoIsWrite
91b0: 61 62 6c 65 28 4b 65 79 49 6e 66 6f 20 2a 70 29  able(KeyInfo *p)
91c0: 7b 20 72 65 74 75 72 6e 20 70 2d 3e 6e 52 65 66  { return p->nRef
91d0: 3d 3d 31 3b 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  ==1; }.#endif /*
91e0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f   SQLITE_DEBUG */
91f0: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e  ../*.** Given an
9200: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
9210: 2c 20 67 65 6e 65 72 61 74 65 20 61 20 4b 65 79  , generate a Key
9220: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  Info structure t
9230: 68 61 74 20 72 65 63 6f 72 64 73 0a 2a 2a 20 74  hat records.** t
9240: 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
9250: 75 65 6e 63 65 20 66 6f 72 20 65 61 63 68 20 65  uence for each e
9260: 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 61  xpression in tha
9270: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  t expression lis
9280: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
9290: 45 78 70 72 4c 69 73 74 20 69 73 20 61 6e 20 4f  ExprList is an O
92a0: 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50  RDER BY or GROUP
92b0: 20 42 59 20 63 6c 61 75 73 65 20 74 68 65 6e 20   BY clause then 
92c0: 74 68 65 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a  the resulting.**
92d0: 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
92e0: 72 65 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  re is appropriat
92f0: 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69  e for initializi
9300: 6e 67 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64  ng a virtual ind
9310: 65 78 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65  ex to.** impleme
9320: 6e 74 20 74 68 61 74 20 63 6c 61 75 73 65 2e 20  nt that clause. 
9330: 20 49 66 20 74 68 65 20 45 78 70 72 4c 69 73 74   If the ExprList
9340: 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 73   is the result s
9350: 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54 0a 2a  et of a SELECT.*
9360: 2a 20 74 68 65 6e 20 74 68 65 20 4b 65 79 49 6e  * then the KeyIn
9370: 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20  fo structure is 
9380: 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
9390: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76  initializing a v
93a0: 69 72 74 75 61 6c 0a 2a 2a 20 69 6e 64 65 78 20  irtual.** index 
93b0: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 44  to implement a D
93c0: 49 53 54 49 4e 43 54 20 74 65 73 74 2e 0a 2a 2a  ISTINCT test..**
93d0: 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  .** Space to hol
93e0: 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74  d the KeyInfo st
93f0: 72 75 63 74 75 72 65 20 69 73 20 6f 62 74 61 69  ructure is obtai
9400: 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e  ned from malloc.
9410: 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a    The calling.**
9420: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73   function is res
9430: 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 73 65 65  ponsible for see
9440: 69 6e 67 20 74 68 61 74 20 74 68 69 73 20 73 74  ing that this st
9450: 72 75 63 74 75 72 65 20 69 73 20 65 76 65 6e 74  ructure is event
9460: 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 0a  ually.** freed..
9470: 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79 49 6e 66  */.static KeyInf
9480: 6f 20 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78  o *keyInfoFromEx
9490: 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20  prList(.  Parse 
94a0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
94b0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
94c0: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
94d0: 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 46  *pList,     /* F
94e0: 6f 72 6d 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  orm the KeyInfo 
94f0: 6f 62 6a 65 63 74 20 66 72 6f 6d 20 74 68 69 73  object from this
9500: 20 45 78 70 72 4c 69 73 74 20 2a 2f 0a 20 20 69   ExprList */.  i
9510: 6e 74 20 69 53 74 61 72 74 2c 20 20 20 20 20 20  nt iStart,      
9520: 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 77 69 74      /* Begin wit
9530: 68 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 6f 66  h this column of
9540: 20 70 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20   pList */.  int 
9550: 6e 45 78 74 72 61 20 20 20 20 20 20 20 20 20 20  nExtra          
9560: 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e   /* Add this man
9570: 79 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20  y extra columns 
9580: 74 6f 20 74 68 65 20 65 6e 64 20 2a 2f 0a 29 7b  to the end */.){
9590: 0a 20 20 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20  .  int nExpr;.  
95a0: 4b 65 79 49 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a  KeyInfo *pInfo;.
95b0: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
95c0: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
95d0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
95e0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
95f0: 20 69 3b 0a 0a 20 20 6e 45 78 70 72 20 3d 20 70   i;..  nExpr = p
9600: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70  List->nExpr;.  p
9610: 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65  Info = sqlite3Ke
9620: 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e  yInfoAlloc(db, n
9630: 45 78 70 72 2d 69 53 74 61 72 74 2c 20 6e 45 78  Expr-iStart, nEx
9640: 74 72 61 2b 31 29 3b 0a 20 20 69 66 28 20 70 49  tra+1);.  if( pI
9650: 6e 66 6f 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nfo ){.    asser
9660: 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  t( sqlite3KeyInf
9670: 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 49 6e  oIsWriteable(pIn
9680: 66 6f 29 20 29 3b 0a 20 20 20 20 66 6f 72 28 69  fo) );.    for(i
9690: 3d 69 53 74 61 72 74 2c 20 70 49 74 65 6d 3d 70  =iStart, pItem=p
96a0: 4c 69 73 74 2d 3e 61 2b 69 53 74 61 72 74 3b 20  List->a+iStart; 
96b0: 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49  i<nExpr; i++, pI
96c0: 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 43 6f  tem++){.      Co
96d0: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
96e0: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
96f0: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
9700: 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45  Parse, pItem->pE
9710: 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  xpr);.      if( 
9720: 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d  !pColl ) pColl =
9730: 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a   db->pDfltColl;.
9740: 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f        pInfo->aCo
9750: 6c 6c 5b 69 2d 69 53 74 61 72 74 5d 20 3d 20 70  ll[i-iStart] = p
9760: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 49 6e 66  Coll;.      pInf
9770: 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 2d  o->aSortOrder[i-
9780: 69 53 74 61 72 74 5d 20 3d 20 70 49 74 65 6d 2d  iStart] = pItem-
9790: 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  >sortOrder;.    
97a0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
97b0: 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e  Info;.}../*.** N
97c0: 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65  ame of the conne
97d0: 63 74 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2c 20  ction operator, 
97e0: 75 73 65 64 20 66 6f 72 20 65 72 72 6f 72 20 6d  used for error m
97f0: 65 73 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74  essages..*/.stat
9800: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  ic const char *s
9810: 65 6c 65 63 74 4f 70 4e 61 6d 65 28 69 6e 74 20  electOpName(int 
9820: 69 64 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  id){.  char *z;.
9830: 20 20 73 77 69 74 63 68 28 20 69 64 20 29 7b 0a    switch( id ){.
9840: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a      case TK_ALL:
9850: 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f         z = "UNIO
9860: 4e 20 41 4c 4c 22 3b 20 20 20 62 72 65 61 6b 3b  N ALL";   break;
9870: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
9880: 45 52 53 45 43 54 3a 20 7a 20 3d 20 22 49 4e 54  ERSECT: z = "INT
9890: 45 52 53 45 43 54 22 3b 20 20 20 62 72 65 61 6b  ERSECT";   break
98a0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  ;.    case TK_EX
98b0: 43 45 50 54 3a 20 20 20 20 7a 20 3d 20 22 45 58  CEPT:    z = "EX
98c0: 43 45 50 54 22 3b 20 20 20 20 20 20 62 72 65 61  CEPT";      brea
98d0: 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  k;.    default: 
98e0: 20 20 20 20 20 20 20 20 20 20 7a 20 3d 20 22 55            z = "U
98f0: 4e 49 4f 4e 22 3b 20 20 20 20 20 20 20 62 72 65  NION";       bre
9900: 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ak;.  }.  return
9910: 20 7a 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53   z;.}..#ifndef S
9920: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
9930: 49 4e 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20  IN./*.** Unless 
9940: 61 6e 20 22 45 58 50 4c 41 49 4e 20 51 55 45 52  an "EXPLAIN QUER
9950: 59 20 50 4c 41 4e 22 20 63 6f 6d 6d 61 6e 64 20  Y PLAN" command 
9960: 69 73 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73  is being process
9970: 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ed, this functio
9980: 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  n.** is a no-op.
9990: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 61   Otherwise, it a
99a0: 64 64 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  dds a single row
99b0: 20 6f 66 20 6f 75 74 70 75 74 20 74 6f 20 74 68   of output to th
99c0: 65 20 45 51 50 20 72 65 73 75 6c 74 2c 0a 2a 2a  e EQP result,.**
99d0: 20 77 68 65 72 65 20 74 68 65 20 63 61 70 74 69   where the capti
99e0: 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  on is of the for
99f0: 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 55 53 45 20  m:.**.**   "USE 
9a00: 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f 52 20  TEMP B-TREE FOR 
9a10: 78 78 78 22 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65  xxx".**.** where
9a20: 20 78 78 78 20 69 73 20 6f 6e 65 20 6f 66 20 22   xxx is one of "
9a30: 44 49 53 54 49 4e 43 54 22 2c 20 22 4f 52 44 45  DISTINCT", "ORDE
9a40: 52 20 42 59 22 20 6f 72 20 22 47 52 4f 55 50 20  R BY" or "GROUP 
9a50: 42 59 22 2e 20 45 78 61 63 74 6c 79 20 77 68 69  BY". Exactly whi
9a60: 63 68 0a 2a 2a 20 69 73 20 64 65 74 65 72 6d 69  ch.** is determi
9a70: 6e 65 64 20 62 79 20 74 68 65 20 7a 55 73 61 67  ned by the zUsag
9a80: 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  e argument..*/.s
9a90: 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61  tatic void expla
9aa0: 69 6e 54 65 6d 70 54 61 62 6c 65 28 50 61 72 73  inTempTable(Pars
9ab0: 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
9ac0: 20 63 68 61 72 20 2a 7a 55 73 61 67 65 29 7b 0a   char *zUsage){.
9ad0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
9ae0: 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20  plain==2 ){.    
9af0: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
9b00: 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 63 68 61  ->pVdbe;.    cha
9b10: 72 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65  r *zMsg = sqlite
9b20: 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d  3MPrintf(pParse-
9b30: 3e 64 62 2c 20 22 55 53 45 20 54 45 4d 50 20 42  >db, "USE TEMP B
9b40: 2d 54 52 45 45 20 46 4f 52 20 25 73 22 2c 20 7a  -TREE FOR %s", z
9b50: 55 73 61 67 65 29 3b 0a 20 20 20 20 73 71 6c 69  Usage);.    sqli
9b60: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
9b70: 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61   OP_Explain, pPa
9b80: 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20  rse->iSelectId, 
9b90: 30 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44  0, 0, zMsg, P4_D
9ba0: 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a  YNAMIC);.  }.}..
9bb0: 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 65 78 70  /*.** Assign exp
9bc0: 72 65 73 73 69 6f 6e 20 62 20 74 6f 20 6c 76 61  ression b to lva
9bd0: 6c 75 65 20 61 2e 20 41 20 73 65 63 6f 6e 64 2c  lue a. A second,
9be0: 20 6e 6f 2d 6f 70 2c 20 76 65 72 73 69 6f 6e 20   no-op, version 
9bf0: 6f 66 20 74 68 69 73 20 6d 61 63 72 6f 0a 2a 2a  of this macro.**
9c00: 20 69 73 20 70 72 6f 76 69 64 65 64 20 77 68 65   is provided whe
9c10: 6e 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  n SQLITE_OMIT_EX
9c20: 50 4c 41 49 4e 20 69 73 20 64 65 66 69 6e 65 64  PLAIN is defined
9c30: 2e 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 74 68  . This allows th
9c40: 65 20 63 6f 64 65 0a 2a 2a 20 69 6e 20 73 71 6c  e code.** in sql
9c50: 69 74 65 33 53 65 6c 65 63 74 28 29 20 74 6f 20  ite3Select() to 
9c60: 61 73 73 69 67 6e 20 76 61 6c 75 65 73 20 74 6f  assign values to
9c70: 20 73 74 72 75 63 74 75 72 65 20 6d 65 6d 62 65   structure membe
9c80: 72 20 76 61 72 69 61 62 6c 65 73 20 74 68 61 74  r variables that
9c90: 0a 2a 2a 20 6f 6e 6c 79 20 65 78 69 73 74 20 69  .** only exist i
9ca0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
9cb0: 50 4c 41 49 4e 20 69 73 20 6e 6f 74 20 64 65 66  PLAIN is not def
9cc0: 69 6e 65 64 20 77 69 74 68 6f 75 74 20 70 6f 6c  ined without pol
9cd0: 6c 75 74 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f  luting the.** co
9ce0: 64 65 20 77 69 74 68 20 23 69 66 6e 64 65 66 20  de with #ifndef 
9cf0: 64 69 72 65 63 74 69 76 65 73 2e 0a 2a 2f 0a 23  directives..*/.#
9d00: 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 53   define explainS
9d10: 65 74 49 6e 74 65 67 65 72 28 61 2c 20 62 29 20  etInteger(a, b) 
9d20: 61 20 3d 20 62 0a 0a 23 65 6c 73 65 0a 2f 2a 20  a = b..#else./* 
9d30: 4e 6f 2d 6f 70 20 76 65 72 73 69 6f 6e 73 20 6f  No-op versions o
9d40: 66 20 74 68 65 20 65 78 70 6c 61 69 6e 58 58 58  f the explainXXX
9d50: 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64  () functions and
9d60: 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a 23 20 64 65   macros. */.# de
9d70: 66 69 6e 65 20 65 78 70 6c 61 69 6e 54 65 6d 70  fine explainTemp
9d80: 54 61 62 6c 65 28 79 2c 7a 29 0a 23 20 64 65 66  Table(y,z).# def
9d90: 69 6e 65 20 65 78 70 6c 61 69 6e 53 65 74 49 6e  ine explainSetIn
9da0: 74 65 67 65 72 28 79 2c 7a 29 0a 23 65 6e 64 69  teger(y,z).#endi
9db0: 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  f..#if !defined(
9dc0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
9dd0: 41 49 4e 29 20 26 26 20 21 64 65 66 69 6e 65 64  AIN) && !defined
9de0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d  (SQLITE_OMIT_COM
9df0: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 29 0a 2f 2a  POUND_SELECT)./*
9e00: 0a 2a 2a 20 55 6e 6c 65 73 73 20 61 6e 20 22 45  .** Unless an "E
9e10: 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
9e20: 4e 22 20 63 6f 6d 6d 61 6e 64 20 69 73 20 62 65  N" command is be
9e30: 69 6e 67 20 70 72 6f 63 65 73 73 65 64 2c 20 74  ing processed, t
9e40: 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
9e50: 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65  is a no-op. Othe
9e60: 72 77 69 73 65 2c 20 69 74 20 61 64 64 73 20 61  rwise, it adds a
9e70: 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 6f   single row of o
9e80: 75 74 70 75 74 20 74 6f 20 74 68 65 20 45 51 50  utput to the EQP
9e90: 20 72 65 73 75 6c 74 2c 0a 2a 2a 20 77 68 65 72   result,.** wher
9ea0: 65 20 74 68 65 20 63 61 70 74 69 6f 6e 20 69 73  e the caption is
9eb0: 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 74   of one of the t
9ec0: 77 6f 20 66 6f 72 6d 73 3a 0a 2a 2a 0a 2a 2a 20  wo forms:.**.** 
9ed0: 20 20 22 43 4f 4d 50 4f 53 49 54 45 20 53 55 42    "COMPOSITE SUB
9ee0: 51 55 45 52 49 45 53 20 69 53 75 62 31 20 61 6e  QUERIES iSub1 an
9ef0: 64 20 69 53 75 62 32 20 28 6f 70 29 22 0a 2a 2a  d iSub2 (op)".**
9f00: 20 20 20 22 43 4f 4d 50 4f 53 49 54 45 20 53 55     "COMPOSITE SU
9f10: 42 51 55 45 52 49 45 53 20 69 53 75 62 31 20 61  BQUERIES iSub1 a
9f20: 6e 64 20 69 53 75 62 32 20 55 53 49 4e 47 20 54  nd iSub2 USING T
9f30: 45 4d 50 20 42 2d 54 52 45 45 20 28 6f 70 29 22  EMP B-TREE (op)"
9f40: 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 69 53 75  .**.** where iSu
9f50: 62 31 20 61 6e 64 20 69 53 75 62 32 20 61 72 65  b1 and iSub2 are
9f60: 20 74 68 65 20 69 6e 74 65 67 65 72 73 20 70 61   the integers pa
9f70: 73 73 65 64 20 61 73 20 74 68 65 20 63 6f 72 72  ssed as the corr
9f80: 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 66 75 6e  esponding.** fun
9f90: 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 73  ction parameters
9fa0: 2c 20 61 6e 64 20 6f 70 20 69 73 20 74 68 65 20  , and op is the 
9fb0: 74 65 78 74 20 72 65 70 72 65 73 65 6e 74 61 74  text representat
9fc0: 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 72 61 6d  ion of the param
9fd0: 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20 73  eter.** of the s
9fe0: 61 6d 65 20 6e 61 6d 65 2e 20 54 68 65 20 70 61  ame name. The pa
9ff0: 72 61 6d 65 74 65 72 20 22 6f 70 22 20 6d 75 73  rameter "op" mus
a000: 74 20 62 65 20 6f 6e 65 20 6f 66 20 54 4b 5f 55  t be one of TK_U
a010: 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c  NION, TK_EXCEPT,
a020: 0a 2a 2a 20 54 4b 5f 49 4e 54 45 52 53 45 43 54  .** TK_INTERSECT
a030: 20 6f 72 20 54 4b 5f 41 4c 4c 2e 20 54 68 65 20   or TK_ALL. The 
a040: 66 69 72 73 74 20 66 6f 72 6d 20 69 73 20 75 73  first form is us
a050: 65 64 20 69 66 20 61 72 67 75 6d 65 6e 74 20 62  ed if argument b
a060: 55 73 65 54 6d 70 20 69 73 20 0a 2a 2a 20 66 61  UseTmp is .** fa
a070: 6c 73 65 2c 20 6f 72 20 74 68 65 20 73 65 63 6f  lse, or the seco
a080: 6e 64 20 66 6f 72 6d 20 69 66 20 69 74 20 69 73  nd form if it is
a090: 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   true..*/.static
a0a0: 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 43 6f 6d   void explainCom
a0b0: 70 6f 73 69 74 65 28 0a 20 20 50 61 72 73 65 20  posite(.  Parse 
a0c0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
a0d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
a0e0: 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  se context */.  
a0f0: 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20  int op,         
a100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a110: 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 55 4e 49  /* One of TK_UNI
a120: 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54 20 65 74  ON, TK_EXCEPT et
a130: 63 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62  c. */.  int iSub
a140: 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
a150: 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 71 75          /* Subqu
a160: 65 72 79 20 69 64 20 31 20 2a 2f 0a 20 20 69 6e  ery id 1 */.  in
a170: 74 20 69 53 75 62 32 2c 20 20 20 20 20 20 20 20  t iSub2,        
a180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a190: 20 53 75 62 71 75 65 72 79 20 69 64 20 32 20 2a   Subquery id 2 *
a1a0: 2f 0a 20 20 69 6e 74 20 62 55 73 65 54 6d 70 20  /.  int bUseTmp 
a1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1c0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
a1d0: 20 74 65 6d 70 20 74 61 62 6c 65 20 77 61 73 20   temp table was 
a1e0: 75 73 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73  used */.){.  ass
a1f0: 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  ert( op==TK_UNIO
a200: 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 45 58 43 45  N || op==TK_EXCE
a210: 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54  PT || op==TK_INT
a220: 45 52 53 45 43 54 20 7c 7c 20 6f 70 3d 3d 54 4b  ERSECT || op==TK
a230: 5f 41 4c 4c 20 29 3b 0a 20 20 69 66 28 20 70 50  _ALL );.  if( pP
a240: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  arse->explain==2
a250: 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20   ){.    Vdbe *v 
a260: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
a270: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 20  .    char *zMsg 
a280: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
a290: 28 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  (.        pParse
a2a0: 2d 3e 64 62 2c 20 22 43 4f 4d 50 4f 55 4e 44 20  ->db, "COMPOUND 
a2b0: 53 55 42 51 55 45 52 49 45 53 20 25 64 20 41 4e  SUBQUERIES %d AN
a2c0: 44 20 25 64 20 25 73 28 25 73 29 22 2c 20 69 53  D %d %s(%s)", iS
a2d0: 75 62 31 2c 20 69 53 75 62 32 2c 0a 20 20 20 20  ub1, iSub2,.    
a2e0: 20 20 20 20 62 55 73 65 54 6d 70 3f 22 55 53 49      bUseTmp?"USI
a2f0: 4e 47 20 54 45 4d 50 20 42 2d 54 52 45 45 20 22  NG TEMP B-TREE "
a300: 3a 22 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d  :"", selectOpNam
a310: 65 28 6f 70 29 0a 20 20 20 20 29 3b 0a 20 20 20  e(op).    );.   
a320: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a330: 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e  p4(v, OP_Explain
a340: 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63  , pParse->iSelec
a350: 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c  tId, 0, 0, zMsg,
a360: 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P4_DYNAMIC);.  
a370: 7d 0a 7d 0a 23 65 6c 73 65 0a 2f 2a 20 4e 6f 2d  }.}.#else./* No-
a380: 6f 70 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74  op versions of t
a390: 68 65 20 65 78 70 6c 61 69 6e 58 58 58 28 29 20  he explainXXX() 
a3a0: 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6d 61  functions and ma
a3b0: 63 72 6f 73 2e 20 2a 2f 0a 23 20 64 65 66 69 6e  cros. */.# defin
a3c0: 65 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69  e explainComposi
a3d0: 74 65 28 76 2c 77 2c 78 2c 79 2c 7a 29 0a 23 65  te(v,w,x,y,z).#e
a3e0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  ndif../*.** If t
a3f0: 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 77 61  he inner loop wa
a400: 73 20 67 65 6e 65 72 61 74 65 64 20 75 73 69 6e  s generated usin
a410: 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f 72  g a non-null pOr
a420: 64 65 72 42 79 20 61 72 67 75 6d 65 6e 74 2c 0a  derBy argument,.
a430: 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  ** then the resu
a440: 6c 74 73 20 77 65 72 65 20 70 6c 61 63 65 64 20  lts were placed 
a450: 69 6e 20 61 20 73 6f 72 74 65 72 2e 20 20 41 66  in a sorter.  Af
a460: 74 65 72 20 74 68 65 20 6c 6f 6f 70 20 69 73 20  ter the loop is 
a470: 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 77 65  terminated.** we
a480: 20 6e 65 65 64 20 74 6f 20 72 75 6e 20 74 68 65   need to run the
a490: 20 73 6f 72 74 65 72 20 61 6e 64 20 6f 75 74 70   sorter and outp
a4a0: 75 74 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20  ut the results. 
a4b0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   The following.*
a4c0: 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  * routine genera
a4d0: 74 65 73 20 74 68 65 20 63 6f 64 65 20 6e 65 65  tes the code nee
a4e0: 64 65 64 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a  ded to do that..
a4f0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67  */.static void g
a500: 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28  enerateSortTail(
a510: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
a520: 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
a530: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
a540: 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 2f  ect *p,        /
a550: 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61  * The SELECT sta
a560: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 6f 72 74  tement */.  Sort
a570: 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20 2f 2a  Ctx *pSort,   /*
a580: 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20   Information on 
a590: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
a5a0: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f  use */.  int nCo
a5b0: 6c 75 6d 6e 2c 20 20 20 20 20 20 2f 2a 20 4e 75  lumn,      /* Nu
a5c0: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
a5d0: 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c  of data */.  Sel
a5e0: 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 2f  ectDest *pDest /
a5f0: 2a 20 57 72 69 74 65 20 74 68 65 20 73 6f 72 74  * Write the sort
a600: 65 64 20 72 65 73 75 6c 74 73 20 68 65 72 65 20  ed results here 
a610: 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
a620: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
a630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a640: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72 65 70       /* The prep
a650: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a  ared statement *
a660: 2f 0a 20 20 69 6e 74 20 61 64 64 72 42 72 65 61  /.  int addrBrea
a670: 6b 20 3d 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c  k = pSort->label
a680: 44 6f 6e 65 3b 20 20 20 20 20 20 20 20 20 20 20  Done;           
a690: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
a6a0: 20 65 78 69 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20   exit loop */.  
a6b0: 69 6e 74 20 61 64 64 72 43 6f 6e 74 69 6e 75 65  int addrContinue
a6c0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
a6d0: 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20 2f 2a 20  keLabel(v);  /* 
a6e0: 4a 75 6d 70 20 68 65 72 65 20 66 6f 72 20 6e 65  Jump here for ne
a6f0: 78 74 20 63 79 63 6c 65 20 2a 2f 0a 20 20 69 6e  xt cycle */.  in
a700: 74 20 61 64 64 72 3b 0a 20 20 69 6e 74 20 61 64  t addr;.  int ad
a710: 64 72 4f 6e 63 65 20 3d 20 30 3b 0a 20 20 69 6e  drOnce = 0;.  in
a720: 74 20 69 54 61 62 3b 0a 20 20 45 78 70 72 4c 69  t iTab;.  ExprLi
a730: 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70  st *pOrderBy = p
a740: 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 3b 0a  Sort->pOrderBy;.
a750: 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44    int eDest = pD
a760: 65 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69 6e  est->eDest;.  in
a770: 74 20 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d  t iParm = pDest-
a780: 3e 69 53 44 50 61 72 6d 3b 0a 20 20 69 6e 74 20  >iSDParm;.  int 
a790: 72 65 67 52 6f 77 3b 0a 20 20 69 6e 74 20 72 65  regRow;.  int re
a7a0: 67 52 6f 77 69 64 3b 0a 20 20 69 6e 74 20 6e 4b  gRowid;.  int nK
a7b0: 65 79 3b 0a 20 20 69 6e 74 20 69 53 6f 72 74 54  ey;.  int iSortT
a7c0: 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ab;             
a7d0: 20 20 20 20 20 20 2f 2a 20 53 6f 72 74 65 72 20        /* Sorter 
a7e0: 63 75 72 73 6f 72 20 74 6f 20 72 65 61 64 20 66  cursor to read f
a7f0: 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 6f  rom */.  int nSo
a800: 72 74 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  rtData;         
a810: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 61 69           /* Trai
a820: 6c 69 6e 67 20 76 61 6c 75 65 73 20 74 6f 20 72  ling values to r
a830: 65 61 64 20 66 72 6f 6d 20 73 6f 72 74 65 72 20  ead from sorter 
a840: 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  */.  int i;.  in
a850: 74 20 62 53 65 71 3b 20 20 20 20 20 20 20 20 20  t bSeq;         
a860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a870: 20 54 72 75 65 20 69 66 20 73 6f 72 74 65 72 20   True if sorter 
a880: 72 65 63 6f 72 64 20 69 6e 63 6c 75 64 65 73 20  record includes 
a890: 73 65 71 2e 20 6e 6f 2e 20 2a 2f 0a 23 69 66 64  seq. no. */.#ifd
a8a0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
a8b0: 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54  _EXPLAIN_COMMENT
a8c0: 53 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  S.  struct ExprL
a8d0: 69 73 74 5f 69 74 65 6d 20 2a 61 4f 75 74 45 78  ist_item *aOutEx
a8e0: 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b   = p->pEList->a;
a8f0: 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
a900: 74 28 20 61 64 64 72 42 72 65 61 6b 3c 30 20 29  t( addrBreak<0 )
a910: 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 6c  ;.  if( pSort->l
a920: 61 62 65 6c 42 6b 4f 75 74 20 29 7b 0a 20 20 20  abelBkOut ){.   
a930: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a940: 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
a950: 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e  pSort->regReturn
a960: 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b  , pSort->labelBk
a970: 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Out);.    sqlite
a980: 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64  3VdbeGoto(v, add
a990: 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 73 71 6c  rBreak);.    sql
a9a0: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
a9b0: 61 62 65 6c 28 76 2c 20 70 53 6f 72 74 2d 3e 6c  abel(v, pSort->l
a9c0: 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20 7d 0a  abelBkOut);.  }.
a9d0: 20 20 69 54 61 62 20 3d 20 70 53 6f 72 74 2d 3e    iTab = pSort->
a9e0: 69 45 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20  iECursor;.  if( 
a9f0: 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
aa00: 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f  t || eDest==SRT_
aa10: 43 6f 72 6f 75 74 69 6e 65 20 7c 7c 20 65 44 65  Coroutine || eDe
aa20: 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 29 7b 0a 20  st==SRT_Mem ){. 
aa30: 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20 30 3b     regRowid = 0;
aa40: 0a 20 20 20 20 72 65 67 52 6f 77 20 3d 20 70 44  .    regRow = pD
aa50: 65 73 74 2d 3e 69 53 64 73 74 3b 0a 20 20 20 20  est->iSdst;.    
aa60: 6e 53 6f 72 74 44 61 74 61 20 3d 20 6e 43 6f 6c  nSortData = nCol
aa70: 75 6d 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  umn;.  }else{.  
aa80: 20 20 72 65 67 52 6f 77 69 64 20 3d 20 73 71 6c    regRowid = sql
aa90: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
aaa0: 50 61 72 73 65 29 3b 0a 20 20 20 20 72 65 67 52  Parse);.    regR
aab0: 6f 77 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  ow = sqlite3GetT
aac0: 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
aad0: 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 6e   nColumn);.    n
aae0: 53 6f 72 74 44 61 74 61 20 3d 20 6e 43 6f 6c 75  SortData = nColu
aaf0: 6d 6e 3b 0a 20 20 7d 0a 20 20 6e 4b 65 79 20 3d  mn;.  }.  nKey =
ab00: 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
ab10: 20 2d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74   - pSort->nOBSat
ab20: 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 73  ;.  if( pSort->s
ab30: 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46  ortFlags & SORTF
ab40: 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 20 29 7b  LAG_UseSorter ){
ab50: 0a 20 20 20 20 69 6e 74 20 72 65 67 53 6f 72 74  .    int regSort
ab60: 4f 75 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Out = ++pParse->
ab70: 6e 4d 65 6d 3b 0a 20 20 20 20 69 53 6f 72 74 54  nMem;.    iSortT
ab80: 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ab = pParse->nTa
ab90: 62 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 53 6f  b++;.    if( pSo
aba0: 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 20 29  rt->labelBkOut )
abb0: 7b 0a 20 20 20 20 20 20 61 64 64 72 4f 6e 63 65  {.      addrOnce
abc0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
abd0: 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29  dOp0(v, OP_Once)
abe0: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
abf0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
ac00: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
ac10: 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c  , OP_OpenPseudo,
ac20: 20 69 53 6f 72 74 54 61 62 2c 20 72 65 67 53 6f   iSortTab, regSo
ac30: 72 74 4f 75 74 2c 20 6e 4b 65 79 2b 31 2b 6e 53  rtOut, nKey+1+nS
ac40: 6f 72 74 44 61 74 61 29 3b 0a 20 20 20 20 69 66  ortData);.    if
ac50: 28 20 61 64 64 72 4f 6e 63 65 20 29 20 73 71 6c  ( addrOnce ) sql
ac60: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
ac70: 28 76 2c 20 61 64 64 72 4f 6e 63 65 29 3b 0a 20  (v, addrOnce);. 
ac80: 20 20 20 61 64 64 72 20 3d 20 31 20 2b 20 73 71     addr = 1 + sq
ac90: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
aca0: 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74  v, OP_SorterSort
acb0: 2c 20 69 54 61 62 2c 20 61 64 64 72 42 72 65 61  , iTab, addrBrea
acc0: 6b 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  k);.    VdbeCove
acd0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 63 6f 64  rage(v);.    cod
ace0: 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f  eOffset(v, p->iO
acf0: 66 66 73 65 74 2c 20 61 64 64 72 43 6f 6e 74 69  ffset, addrConti
ad00: 6e 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  nue);.    sqlite
ad10: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
ad20: 50 5f 53 6f 72 74 65 72 44 61 74 61 2c 20 69 54  P_SorterData, iT
ad30: 61 62 2c 20 72 65 67 53 6f 72 74 4f 75 74 2c 20  ab, regSortOut, 
ad40: 69 53 6f 72 74 54 61 62 29 3b 0a 20 20 20 20 62  iSortTab);.    b
ad50: 53 65 71 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  Seq = 0;.  }else
ad60: 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 31 20 2b  {.    addr = 1 +
ad70: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ad80: 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 69  p2(v, OP_Sort, i
ad90: 54 61 62 2c 20 61 64 64 72 42 72 65 61 6b 29 3b  Tab, addrBreak);
ada0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
adb0: 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74  ;.    codeOffset
adc0: 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20  (v, p->iOffset, 
add0: 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  addrContinue);. 
ade0: 20 20 20 69 53 6f 72 74 54 61 62 20 3d 20 69 54     iSortTab = iT
adf0: 61 62 3b 0a 20 20 20 20 62 53 65 71 20 3d 20 31  ab;.    bSeq = 1
ae00: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
ae10: 20 69 3c 6e 53 6f 72 74 44 61 74 61 3b 20 69 2b   i<nSortData; i+
ae20: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  +){.    sqlite3V
ae30: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
ae40: 43 6f 6c 75 6d 6e 2c 20 69 53 6f 72 74 54 61 62  Column, iSortTab
ae50: 2c 20 6e 4b 65 79 2b 62 53 65 71 2b 69 2c 20 72  , nKey+bSeq+i, r
ae60: 65 67 52 6f 77 2b 69 29 3b 0a 20 20 20 20 56 64  egRow+i);.    Vd
ae70: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
ae80: 73 22 2c 20 61 4f 75 74 45 78 5b 69 5d 2e 7a 4e  s", aOutEx[i].zN
ae90: 61 6d 65 20 3f 20 61 4f 75 74 45 78 5b 69 5d 2e  ame ? aOutEx[i].
aea0: 7a 4e 61 6d 65 20 3a 20 61 4f 75 74 45 78 5b 69  zName : aOutEx[i
aeb0: 5d 2e 7a 53 70 61 6e 29 29 3b 0a 20 20 7d 0a 20  ].zSpan));.  }. 
aec0: 20 73 77 69 74 63 68 28 20 65 44 65 73 74 20 29   switch( eDest )
aed0: 7b 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45  {.    case SRT_E
aee0: 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20  phemTab: {.     
aef0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
af00: 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  p2(v, OP_NewRowi
af10: 64 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77  d, iParm, regRow
af20: 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  id);.      sqlit
af30: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
af40: 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  OP_Insert, iParm
af50: 2c 20 72 65 67 52 6f 77 2c 20 72 65 67 52 6f 77  , regRow, regRow
af60: 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  id);.      sqlit
af70: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
af80: 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29  , OPFLAG_APPEND)
af90: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
afa0: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
afb0: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
afc0: 59 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53  Y.    case SRT_S
afd0: 65 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  et: {.      asse
afe0: 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 73 71 6c  rt( nColumn==sql
aff0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 44 65  ite3Strlen30(pDe
b000: 73 74 2d 3e 7a 41 66 66 53 64 73 74 29 20 29 3b  st->zAffSdst) );
b010: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
b020: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d  beAddOp4(v, OP_M
b030: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 6f  akeRecord, regRo
b040: 77 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 65 67 52  w, nColumn, regR
b050: 6f 77 69 64 2c 0a 20 20 20 20 20 20 20 20 20 20  owid,.          
b060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 44                pD
b070: 65 73 74 2d 3e 7a 41 66 66 53 64 73 74 2c 20 6e  est->zAffSdst, n
b080: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 73  Column);.      s
b090: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
b0a0: 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
b0b0: 61 72 73 65 2c 20 72 65 67 52 6f 77 2c 20 6e 43  arse, regRow, nC
b0c0: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 73 71  olumn);.      sq
b0d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
b0e0: 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  nt(v, OP_IdxInse
b0f0: 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f  rt, iParm, regRo
b100: 77 69 64 2c 20 72 65 67 52 6f 77 2c 20 6e 43 6f  wid, regRow, nCo
b110: 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 62 72 65  lumn);.      bre
b120: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
b130: 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20  se SRT_Mem: {.  
b140: 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54      /* The LIMIT
b150: 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72   clause will ter
b160: 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20  minate the loop 
b170: 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20  for us */.      
b180: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
b190: 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  dif.    default:
b1a0: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
b1b0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
b1c0: 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54  ut || eDest==SRT
b1d0: 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 20 0a 20  _Coroutine ); . 
b1e0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
b1f0: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
b200: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
b210: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  se( eDest==SRT_C
b220: 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20 20  oroutine );.    
b230: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
b240: 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20  _Output ){.     
b250: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b260: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(v, OP_Resul
b270: 74 52 6f 77 2c 20 70 44 65 73 74 2d 3e 69 53 64  tRow, pDest->iSd
b280: 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  st, nColumn);.  
b290: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
b2a0: 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
b2b0: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 44 65  ange(pParse, pDe
b2c0: 73 74 2d 3e 69 53 64 73 74 2c 20 6e 43 6f 6c 75  st->iSdst, nColu
b2d0: 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  mn);.      }else
b2e0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
b2f0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
b300: 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e  P_Yield, pDest->
b310: 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  iSDParm);.      
b320: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
b330: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
b340: 65 67 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 69  egRowid ){.    i
b350: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 65  f( eDest==SRT_Se
b360: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
b370: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
b380: 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f  ge(pParse, regRo
b390: 77 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  w, nColumn);.   
b3a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
b3b0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
b3c0: 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52  Reg(pParse, regR
b3d0: 6f 77 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ow);.    }.    s
b3e0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
b3f0: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
b400: 52 6f 77 69 64 29 3b 0a 20 20 7d 0a 20 20 2f 2a  Rowid);.  }.  /*
b410: 20 54 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74   The bottom of t
b420: 68 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73  he loop.  */.  s
b430: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
b440: 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 43 6f  eLabel(v, addrCo
b450: 6e 74 69 6e 75 65 29 3b 0a 20 20 69 66 28 20 70  ntinue);.  if( p
b460: 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20  Sort->sortFlags 
b470: 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f  & SORTFLAG_UseSo
b480: 72 74 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  rter ){.    sqli
b490: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
b4a0: 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20   OP_SorterNext, 
b4b0: 69 54 61 62 2c 20 61 64 64 72 29 3b 20 56 64 62  iTab, addr); Vdb
b4c0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
b4d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
b4e0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
b4f0: 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61  OP_Next, iTab, a
b500: 64 64 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61  ddr); VdbeCovera
b510: 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ge(v);.  }.  if(
b520: 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72   pSort->regRetur
b530: 6e 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 41  n ) sqlite3VdbeA
b540: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
b550: 72 6e 2c 20 70 53 6f 72 74 2d 3e 72 65 67 52 65  rn, pSort->regRe
b560: 74 75 72 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33  turn);.  sqlite3
b570: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
b580: 28 76 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a  (v, addrBreak);.
b590: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
b5a0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  a pointer to a s
b5b0: 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67  tring containing
b5c0: 20 74 68 65 20 27 64 65 63 6c 61 72 61 74 69 6f   the 'declaratio
b5d0: 6e 20 74 79 70 65 27 20 6f 66 20 74 68 65 0a 2a  n type' of the.*
b5e0: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  * expression pEx
b5f0: 70 72 2e 20 54 68 65 20 73 74 72 69 6e 67 20 6d  pr. The string m
b600: 61 79 20 62 65 20 74 72 65 61 74 65 64 20 61 73  ay be treated as
b610: 20 73 74 61 74 69 63 20 62 79 20 74 68 65 20 63   static by the c
b620: 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73  aller..**.** Als
b630: 6f 20 74 72 79 20 74 6f 20 65 73 74 69 6d 61 74  o try to estimat
b640: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
b650: 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65  e returned value
b660: 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 61 74   and return that
b670: 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 2a 70  .** result in *p
b680: 45 73 74 57 69 64 74 68 2e 0a 2a 2a 0a 2a 2a 20  EstWidth..**.** 
b690: 54 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  The declaration 
b6a0: 74 79 70 65 20 69 73 20 74 68 65 20 65 78 61 63  type is the exac
b6b0: 74 20 64 61 74 61 74 79 70 65 20 64 65 66 69 6e  t datatype defin
b6c0: 69 74 69 6f 6e 20 65 78 74 72 61 63 74 65 64 20  ition extracted 
b6d0: 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6f 72 69 67  from the.** orig
b6e0: 69 6e 61 6c 20 43 52 45 41 54 45 20 54 41 42 4c  inal CREATE TABL
b6f0: 45 20 73 74 61 74 65 6d 65 6e 74 20 69 66 20 74  E statement if t
b700: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
b710: 20 61 20 63 6f 6c 75 6d 6e 2e 20 54 68 65 0a 2a   a column. The.*
b720: 2a 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  * declaration ty
b730: 70 65 20 66 6f 72 20 61 20 52 4f 57 49 44 20 66  pe for a ROWID f
b740: 69 65 6c 64 20 69 73 20 49 4e 54 45 47 45 52 2e  ield is INTEGER.
b750: 20 45 78 61 63 74 6c 79 20 77 68 65 6e 20 61 6e   Exactly when an
b760: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69   expression.** i
b770: 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 63  s considered a c
b780: 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20 63 6f 6d  olumn can be com
b790: 70 6c 65 78 20 69 6e 20 74 68 65 20 70 72 65 73  plex in the pres
b7a0: 65 6e 63 65 20 6f 66 20 73 75 62 71 75 65 72 69  ence of subqueri
b7b0: 65 73 2e 20 54 68 65 0a 2a 2a 20 72 65 73 75 6c  es. The.** resul
b7c0: 74 2d 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e  t-set expression
b7d0: 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 66   in all of the f
b7e0: 6f 6c 6c 6f 77 69 6e 67 20 53 45 4c 45 43 54 20  ollowing SELECT 
b7f0: 73 74 61 74 65 6d 65 6e 74 73 20 69 73 20 0a 2a  statements is .*
b800: 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 63  * considered a c
b810: 6f 6c 75 6d 6e 20 62 79 20 74 68 69 73 20 66 75  olumn by this fu
b820: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  nction..**.**   
b830: 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20  SELECT col FROM 
b840: 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54  tbl;.**   SELECT
b850: 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f   (SELECT col FRO
b860: 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45  M tbl;.**   SELE
b870: 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 46  CT (SELECT col F
b880: 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 20 20 53  ROM tbl);.**   S
b890: 45 4c 45 43 54 20 61 62 63 20 46 52 4f 4d 20 28  ELECT abc FROM (
b8a0: 53 45 4c 45 43 54 20 63 6f 6c 20 41 53 20 61 62  SELECT col AS ab
b8b0: 63 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20  c FROM tbl);.** 
b8c0: 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74  .** The declarat
b8d0: 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 6e 79  ion type for any
b8e0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 74 68 65   expression othe
b8f0: 72 20 74 68 61 6e 20 61 20 63 6f 6c 75 6d 6e 20  r than a column 
b900: 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54  is NULL..**.** T
b910: 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20  his routine has 
b920: 65 69 74 68 65 72 20 33 20 6f 72 20 36 20 70 61  either 3 or 6 pa
b930: 72 61 6d 65 74 65 72 73 20 64 65 70 65 6e 64 69  rameters dependi
b940: 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72  ng on whether or
b950: 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 53 51 4c 49   not.** the SQLI
b960: 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
b970: 5f 4d 45 54 41 44 41 54 41 20 63 6f 6d 70 69 6c  _METADATA compil
b980: 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73  e-time option is
b990: 20 75 73 65 64 2e 0a 2a 2f 0a 23 69 66 64 65 66   used..*/.#ifdef
b9a0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
b9b0: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 23  OLUMN_METADATA.#
b9c0: 20 64 65 66 69 6e 65 20 63 6f 6c 75 6d 6e 54 79   define columnTy
b9d0: 70 65 28 41 2c 42 2c 43 2c 44 2c 45 2c 46 29 20  pe(A,B,C,D,E,F) 
b9e0: 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28 41  columnTypeImpl(A
b9f0: 2c 42 2c 43 2c 44 2c 45 2c 46 29 0a 23 65 6c 73  ,B,C,D,E,F).#els
ba00: 65 20 2f 2a 20 69 66 20 21 64 65 66 69 6e 65 64  e /* if !defined
ba10: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43  (SQLITE_ENABLE_C
ba20: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 29 20  OLUMN_METADATA) 
ba30: 2a 2f 0a 23 20 64 65 66 69 6e 65 20 63 6f 6c 75  */.# define colu
ba40: 6d 6e 54 79 70 65 28 41 2c 42 2c 43 2c 44 2c 45  mnType(A,B,C,D,E
ba50: 2c 46 29 20 63 6f 6c 75 6d 6e 54 79 70 65 49 6d  ,F) columnTypeIm
ba60: 70 6c 28 41 2c 42 2c 46 29 0a 23 65 6e 64 69 66  pl(A,B,F).#endif
ba70: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
ba80: 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 49 6d  ar *columnTypeIm
ba90: 70 6c 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78  pl(.  NameContex
baa0: 74 20 2a 70 4e 43 2c 20 0a 20 20 45 78 70 72 20  t *pNC, .  Expr 
bab0: 2a 70 45 78 70 72 2c 0a 23 69 66 64 65 66 20 53  *pExpr,.#ifdef S
bac0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
bad0: 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 63  UMN_METADATA.  c
bae0: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72  onst char **pzOr
baf0: 69 67 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68  igDb,.  const ch
bb00: 61 72 20 2a 2a 70 7a 4f 72 69 67 54 61 62 2c 0a  ar **pzOrigTab,.
bb10: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70    const char **p
bb20: 7a 4f 72 69 67 43 6f 6c 2c 0a 23 65 6e 64 69 66  zOrigCol,.#endif
bb30: 0a 20 20 75 38 20 2a 70 45 73 74 57 69 64 74 68  .  u8 *pEstWidth
bb40: 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74  .){.  char const
bb50: 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20 69   *zType = 0;.  i
bb60: 6e 74 20 6a 3b 0a 20 20 75 38 20 65 73 74 57 69  nt j;.  u8 estWi
bb70: 64 74 68 20 3d 20 31 3b 0a 23 69 66 64 65 66 20  dth = 1;.#ifdef 
bb80: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
bb90: 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20  LUMN_METADATA.  
bba0: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69  char const *zOri
bbb0: 67 44 62 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  gDb = 0;.  char 
bbc0: 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 54 61 62 20  const *zOrigTab 
bbd0: 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73  = 0;.  char cons
bbe0: 74 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b  t *zOrigCol = 0;
bbf0: 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
bc00: 74 28 20 70 45 78 70 72 21 3d 30 20 29 3b 0a 20  t( pExpr!=0 );. 
bc10: 20 61 73 73 65 72 74 28 20 70 4e 43 2d 3e 70 53   assert( pNC->pS
bc20: 72 63 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 73  rcList!=0 );.  s
bc30: 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
bc40: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
bc50: 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20  AGG_COLUMN:.    
bc60: 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20  case TK_COLUMN: 
bc70: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65  {.      /* The e
bc80: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63  xpression is a c
bc90: 6f 6c 75 6d 6e 2e 20 4c 6f 63 61 74 65 20 74 68  olumn. Locate th
bca0: 65 20 74 61 62 6c 65 20 74 68 65 20 63 6f 6c 75  e table the colu
bcb0: 6d 6e 20 69 73 20 62 65 69 6e 67 0a 20 20 20 20  mn is being.    
bcc0: 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64 20 66    ** extracted f
bcd0: 72 6f 6d 20 69 6e 20 4e 61 6d 65 43 6f 6e 74 65  rom in NameConte
bce0: 78 74 2e 70 53 72 63 4c 69 73 74 2e 20 54 68 69  xt.pSrcList. Thi
bcf0: 73 20 74 61 62 6c 65 20 6d 61 79 20 62 65 20 72  s table may be r
bd00: 65 61 6c 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  eal.      ** dat
bd10: 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72 20 61  abase table or a
bd20: 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20 20   subquery..     
bd30: 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20   */.      Table 
bd40: 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20  *pTab = 0;      
bd50: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 73        /* Table s
bd60: 74 72 75 63 74 75 72 65 20 63 6f 6c 75 6d 6e 20  tructure column 
bd70: 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
bd80: 6d 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63  m */.      Selec
bd90: 74 20 2a 70 53 20 3d 20 30 3b 20 20 20 20 20 20  t *pS = 0;      
bda0: 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74         /* Select
bdb0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65   the column is e
bdc0: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f  xtracted from */
bdd0: 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  .      int iCol 
bde0: 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
bdf0: 3b 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63  ;  /* Index of c
be00: 6f 6c 75 6d 6e 20 69 6e 20 70 54 61 62 20 2a 2f  olumn in pTab */
be10: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
be20: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41   pExpr->op==TK_A
be30: 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  GG_COLUMN );.   
be40: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
be50: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
be60: 4e 20 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  N );.      while
be70: 28 20 70 4e 43 20 26 26 20 21 70 54 61 62 20 29  ( pNC && !pTab )
be80: 7b 0a 20 20 20 20 20 20 20 20 53 72 63 4c 69 73  {.        SrcLis
be90: 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 4e  t *pTabList = pN
bea0: 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 20  C->pSrcList;.   
beb0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 6a 3c 70       for(j=0;j<p
bec0: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26  TabList->nSrc &&
bed0: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   pTabList->a[j].
bee0: 69 43 75 72 73 6f 72 21 3d 70 45 78 70 72 2d 3e  iCursor!=pExpr->
bef0: 69 54 61 62 6c 65 3b 6a 2b 2b 29 3b 0a 20 20 20  iTable;j++);.   
bf00: 20 20 20 20 20 69 66 28 20 6a 3c 70 54 61 62 4c       if( j<pTabL
bf10: 69 73 74 2d 3e 6e 53 72 63 20 29 7b 0a 20 20 20  ist->nSrc ){.   
bf20: 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 54         pTab = pT
bf30: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61  abList->a[j].pTa
bf40: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 20  b;.          pS 
bf50: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  = pTabList->a[j]
bf60: 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  .pSelect;.      
bf70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
bf80: 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e     pNC = pNC->pN
bf90: 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ext;.        }. 
bfa0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
bfb0: 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ( pTab==0 ){.   
bfc0: 20 20 20 20 20 2f 2a 20 41 74 20 6f 6e 65 20 74       /* At one t
bfd0: 69 6d 65 2c 20 63 6f 64 65 20 73 75 63 68 20 61  ime, code such a
bfe0: 73 20 22 53 45 4c 45 43 54 20 6e 65 77 2e 78 22  s "SELECT new.x"
bff0: 20 77 69 74 68 69 6e 20 61 20 74 72 69 67 67 65   within a trigge
c000: 72 20 77 6f 75 6c 64 0a 20 20 20 20 20 20 20 20  r would.        
c010: 2a 2a 20 63 61 75 73 65 20 74 68 69 73 20 63 6f  ** cause this co
c020: 6e 64 69 74 69 6f 6e 20 74 6f 20 72 75 6e 2e 20  ndition to run. 
c030: 20 53 69 6e 63 65 20 74 68 65 6e 2c 20 77 65 20   Since then, we 
c040: 68 61 76 65 20 72 65 73 74 72 75 63 74 75 72 65  have restructure
c050: 64 20 68 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a  d how.        **
c060: 20 74 72 69 67 67 65 72 20 63 6f 64 65 20 69 73   trigger code is
c070: 20 67 65 6e 65 72 61 74 65 64 20 61 6e 64 20 73   generated and s
c080: 6f 20 74 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e  o this condition
c090: 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 0a 20   is no longer . 
c0a0: 20 20 20 20 20 20 20 2a 2a 20 70 6f 73 73 69 62         ** possib
c0b0: 6c 65 2e 20 48 6f 77 65 76 65 72 2c 20 69 74 20  le. However, it 
c0c0: 63 61 6e 20 73 74 69 6c 6c 20 62 65 20 74 72 75  can still be tru
c0d0: 65 20 66 6f 72 20 73 74 61 74 65 6d 65 6e 74 73  e for statements
c0e0: 20 6c 69 6b 65 0a 20 20 20 20 20 20 20 20 2a 2a   like.        **
c0f0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
c100: 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
c110: 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54     **   CREATE T
c120: 41 42 4c 45 20 74 31 28 63 6f 6c 20 49 4e 54 45  ABLE t1(col INTE
c130: 47 45 52 29 3b 0a 20 20 20 20 20 20 20 20 2a 2a  GER);.        **
c140: 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43     SELECT (SELEC
c150: 54 20 74 31 2e 63 6f 6c 29 20 46 52 4f 4d 20 46  T t1.col) FROM F
c160: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 20 20  ROM t1;.        
c170: 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 68  **.        ** wh
c180: 65 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28 29 20  en columnType() 
c190: 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65  is called on the
c1a0: 20 65 78 70 72 65 73 73 69 6f 6e 20 22 74 31 2e   expression "t1.
c1b0: 63 6f 6c 22 20 69 6e 20 74 68 65 20 0a 20 20 20  col" in the .   
c1c0: 20 20 20 20 20 2a 2a 20 73 75 62 2d 73 65 6c 65       ** sub-sele
c1d0: 63 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ct. In this case
c1e0: 2c 20 73 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e  , set the column
c1f0: 20 74 79 70 65 20 74 6f 20 4e 55 4c 4c 2c 20 65   type to NULL, e
c200: 76 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ven.        ** t
c210: 68 6f 75 67 68 20 69 74 20 73 68 6f 75 6c 64 20  hough it should 
c220: 72 65 61 6c 6c 79 20 62 65 20 22 49 4e 54 45 47  really be "INTEG
c230: 45 52 22 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ER"..        **.
c240: 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20          ** This 
c250: 69 73 20 6e 6f 74 20 61 20 70 72 6f 62 6c 65 6d  is not a problem
c260: 2c 20 61 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20  , as the column 
c270: 74 79 70 65 20 6f 66 20 22 74 31 2e 63 6f 6c 22  type of "t1.col"
c280: 20 69 73 20 6e 65 76 65 72 0a 20 20 20 20 20 20   is never.      
c290: 20 20 2a 2a 20 75 73 65 64 2e 20 57 68 65 6e 20    ** used. When 
c2a0: 63 6f 6c 75 6d 6e 54 79 70 65 28 29 20 69 73 20  columnType() is 
c2b0: 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65 78  called on the ex
c2c0: 70 72 65 73 73 69 6f 6e 20 0a 20 20 20 20 20 20  pression .      
c2d0: 20 20 2a 2a 20 22 28 53 45 4c 45 43 54 20 74 31    ** "(SELECT t1
c2e0: 2e 63 6f 6c 29 22 2c 20 74 68 65 20 63 6f 72 72  .col)", the corr
c2f0: 65 63 74 20 74 79 70 65 20 69 73 20 72 65 74 75  ect type is retu
c300: 72 6e 65 64 20 28 73 65 65 20 74 68 65 20 54 4b  rned (see the TK
c310: 5f 53 45 4c 45 43 54 0a 20 20 20 20 20 20 20 20  _SELECT.        
c320: 2a 2a 20 62 72 61 6e 63 68 20 62 65 6c 6f 77 2e  ** branch below.
c330: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65    */.        bre
c340: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ak;.      }..   
c350: 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 20     assert( pTab 
c360: 26 26 20 70 45 78 70 72 2d 3e 70 54 61 62 3d 3d  && pExpr->pTab==
c370: 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20 69 66  pTab );.      if
c380: 28 20 70 53 20 29 7b 0a 20 20 20 20 20 20 20 20  ( pS ){.        
c390: 2f 2a 20 54 68 65 20 22 74 61 62 6c 65 22 20 69  /* The "table" i
c3a0: 73 20 61 63 74 75 61 6c 6c 79 20 61 20 73 75 62  s actually a sub
c3b0: 2d 73 65 6c 65 63 74 20 6f 72 20 61 20 76 69 65  -select or a vie
c3c0: 77 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  w in the FROM cl
c3d0: 61 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  ause.        ** 
c3e0: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  of the SELECT st
c3f0: 61 74 65 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20  atement. Return 
c400: 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  the declaration 
c410: 74 79 70 65 20 61 6e 64 20 6f 72 69 67 69 6e 0a  type and origin.
c420: 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20          ** data 
c430: 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 2d 73  for the result-s
c440: 65 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  et column of the
c450: 20 73 75 62 2d 73 65 6c 65 63 74 2e 0a 20 20 20   sub-select..   
c460: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
c470: 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 41  if( iCol>=0 && A
c480: 4c 57 41 59 53 28 69 43 6f 6c 3c 70 53 2d 3e 70  LWAYS(iCol<pS->p
c490: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b  EList->nExpr) ){
c4a0: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
c4b0: 20 69 43 6f 6c 20 69 73 20 6c 65 73 73 20 74 68   iCol is less th
c4c0: 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  an zero, then th
c4d0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 71  e expression req
c4e0: 75 65 73 74 73 20 74 68 65 0a 20 20 20 20 20 20  uests the.      
c4f0: 20 20 20 20 2a 2a 20 72 6f 77 69 64 20 6f 66 20      ** rowid of 
c500: 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 20 6f  the sub-select o
c510: 72 20 76 69 65 77 2e 20 54 68 69 73 20 65 78 70  r view. This exp
c520: 72 65 73 73 69 6f 6e 20 69 73 20 6c 65 67 61 6c  ression is legal
c530: 20 28 73 65 65 20 0a 20 20 20 20 20 20 20 20 20   (see .         
c540: 20 2a 2a 20 74 65 73 74 20 63 61 73 65 20 6d 69   ** test case mi
c550: 73 63 32 2e 32 2e 32 29 20 2d 20 69 74 20 61 6c  sc2.2.2) - it al
c560: 77 61 79 73 20 65 76 61 6c 75 61 74 65 73 20 74  ways evaluates t
c570: 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 20 20  o NULL..        
c580: 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 2a    **.          *
c590: 2a 20 54 68 65 20 41 4c 57 41 59 53 28 29 20 69  * The ALWAYS() i
c5a0: 73 20 62 65 63 61 75 73 65 20 69 43 6f 6c 3e 3d  s because iCol>=
c5b0: 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  pS->pEList->nExp
c5c0: 72 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65 6e  r will have been
c5d0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61  .          ** ca
c5e0: 75 67 68 74 20 61 6c 72 65 61 64 79 20 62 79 20  ught already by 
c5f0: 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 2e  name resolution.
c600: 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
c610: 20 20 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74          NameCont
c620: 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 20  ext sNC;.       
c630: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d     Expr *p = pS-
c640: 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d  >pEList->a[iCol]
c650: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
c660: 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
c670: 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20   pS->pSrc;.     
c680: 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d       sNC.pNext =
c690: 20 70 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20   pNC;.          
c6a0: 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43  sNC.pParse = pNC
c6b0: 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20  ->pParse;.      
c6c0: 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75      zType = colu
c6d0: 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 26  mnType(&sNC, p,&
c6e0: 7a 4f 72 69 67 44 62 2c 26 7a 4f 72 69 67 54 61  zOrigDb,&zOrigTa
c6f0: 62 2c 26 7a 4f 72 69 67 43 6f 6c 2c 20 26 65 73  b,&zOrigCol, &es
c700: 74 57 69 64 74 68 29 3b 20 0a 20 20 20 20 20 20  tWidth); .      
c710: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
c720: 69 66 28 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  if( pTab->pSchem
c730: 61 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  a ){.        /* 
c740: 41 20 72 65 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  A real table */.
c750: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
c760: 21 70 53 20 29 3b 0a 20 20 20 20 20 20 20 20 69  !pS );.        i
c770: 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c  f( iCol<0 ) iCol
c780: 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a   = pTab->iPKey;.
c790: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
c7a0: 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f  iCol==-1 || (iCo
c7b0: 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61  l>=0 && iCol<pTa
c7c0: 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 23 69 66 64  b->nCol) );.#ifd
c7d0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
c7e0: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
c7f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f  .        if( iCo
c800: 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  l<0 ){.         
c810: 20 7a 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45   zType = "INTEGE
c820: 52 22 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f  R";.          zO
c830: 72 69 67 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22  rigCol = "rowid"
c840: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
c850: 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67  .          zOrig
c860: 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  Col = pTab->aCol
c870: 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  [iCol].zName;.  
c880: 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20          zType = 
c890: 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 54 79 70  sqlite3ColumnTyp
c8a0: 65 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  e(&pTab->aCol[iC
c8b0: 6f 6c 5d 2c 30 29 3b 0a 20 20 20 20 20 20 20 20  ol],0);.        
c8c0: 20 20 65 73 74 57 69 64 74 68 20 3d 20 70 54 61    estWidth = pTa
c8d0: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 73 7a  b->aCol[iCol].sz
c8e0: 45 73 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  Est;.        }. 
c8f0: 20 20 20 20 20 20 20 7a 4f 72 69 67 54 61 62 20         zOrigTab 
c900: 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20  = pTab->zName;. 
c910: 20 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e         if( pNC->
c920: 70 50 61 72 73 65 20 29 7b 0a 20 20 20 20 20 20  pParse ){.      
c930: 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71      int iDb = sq
c940: 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
c950: 65 78 28 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e  ex(pNC->pParse->
c960: 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
c970: 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f  a);.          zO
c980: 72 69 67 44 62 20 3d 20 70 4e 43 2d 3e 70 50 61  rigDb = pNC->pPa
c990: 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62  rse->db->aDb[iDb
c9a0: 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20  ].zDbSName;.    
c9b0: 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
c9c0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
c9d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70  {.          zTyp
c9e0: 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20  e = "INTEGER";. 
c9f0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
ca00: 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20          zType = 
ca10: 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 54 79 70  sqlite3ColumnTyp
ca20: 65 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  e(&pTab->aCol[iC
ca30: 6f 6c 5d 2c 30 29 3b 0a 20 20 20 20 20 20 20 20  ol],0);.        
ca40: 20 20 65 73 74 57 69 64 74 68 20 3d 20 70 54 61    estWidth = pTa
ca50: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 73 7a  b->aCol[iCol].sz
ca60: 45 73 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23  Est;.        }.#
ca70: 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20  endif.      }.  
ca80: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
ca90: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
caa0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
cab0: 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54    case TK_SELECT
cac0: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  : {.      /* The
cad0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
cae0: 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 52 65 74   sub-select. Ret
caf0: 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74  urn the declarat
cb00: 69 6f 6e 20 74 79 70 65 20 61 6e 64 0a 20 20 20  ion type and.   
cb10: 20 20 20 2a 2a 20 6f 72 69 67 69 6e 20 69 6e 66     ** origin inf
cb20: 6f 20 66 6f 72 20 74 68 65 20 73 69 6e 67 6c 65  o for the single
cb30: 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72   column in the r
cb40: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
cb50: 20 53 45 4c 45 43 54 0a 20 20 20 20 20 20 2a 2a   SELECT.      **
cb60: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20   statement..    
cb70: 20 20 2a 2f 0a 20 20 20 20 20 20 4e 61 6d 65 43    */.      NameC
cb80: 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20  ontext sNC;.    
cb90: 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 70    Select *pS = p
cba0: 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b  Expr->x.pSelect;
cbb0: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d  .      Expr *p =
cbc0: 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30   pS->pEList->a[0
cbd0: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61  ].pExpr;.      a
cbe0: 73 73 65 72 74 28 20 45 78 70 72 48 61 73 50 72  ssert( ExprHasPr
cbf0: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
cc00: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
cc10: 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73       sNC.pSrcLis
cc20: 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20  t = pS->pSrc;.  
cc30: 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20      sNC.pNext = 
cc40: 70 4e 43 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70  pNC;.      sNC.p
cc50: 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61  Parse = pNC->pPa
cc60: 72 73 65 3b 0a 20 20 20 20 20 20 7a 54 79 70 65  rse;.      zType
cc70: 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73   = columnType(&s
cc80: 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c  NC, p, &zOrigDb,
cc90: 20 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72   &zOrigTab, &zOr
cca0: 69 67 43 6f 6c 2c 20 26 65 73 74 57 69 64 74 68  igCol, &estWidth
ccb0: 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ); .      break;
ccc0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
ccd0: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
cce0: 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
ccf0: 45 54 41 44 41 54 41 20 20 0a 20 20 69 66 28 20  ETADATA  .  if( 
cd00: 70 7a 4f 72 69 67 44 62 20 29 7b 0a 20 20 20 20  pzOrigDb ){.    
cd10: 61 73 73 65 72 74 28 20 70 7a 4f 72 69 67 54 61  assert( pzOrigTa
cd20: 62 20 26 26 20 70 7a 4f 72 69 67 43 6f 6c 20 29  b && pzOrigCol )
cd30: 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 44 62 20  ;.    *pzOrigDb 
cd40: 3d 20 7a 4f 72 69 67 44 62 3b 0a 20 20 20 20 2a  = zOrigDb;.    *
cd50: 70 7a 4f 72 69 67 54 61 62 20 3d 20 7a 4f 72 69  pzOrigTab = zOri
cd60: 67 54 61 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69  gTab;.    *pzOri
cd70: 67 43 6f 6c 20 3d 20 7a 4f 72 69 67 43 6f 6c 3b  gCol = zOrigCol;
cd80: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
cd90: 28 20 70 45 73 74 57 69 64 74 68 20 29 20 2a 70  ( pEstWidth ) *p
cda0: 45 73 74 57 69 64 74 68 20 3d 20 65 73 74 57 69  EstWidth = estWi
cdb0: 64 74 68 3b 0a 20 20 72 65 74 75 72 6e 20 7a 54  dth;.  return zT
cdc0: 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ype;.}../*.** Ge
cdd0: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
cde0: 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56   will tell the V
cdf0: 44 42 45 20 74 68 65 20 64 65 63 6c 61 72 61 74  DBE the declarat
ce00: 69 6f 6e 20 74 79 70 65 73 20 6f 66 20 63 6f 6c  ion types of col
ce10: 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72  umns.** in the r
ce20: 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74  esult set..*/.st
ce30: 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61  atic void genera
ce40: 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 0a 20  teColumnTypes(. 
ce50: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
ce60: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63       /* Parser c
ce70: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
ce80: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20  ist *pTabList,  
ce90: 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65  /* List of table
cea0: 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  s */.  ExprList 
ceb0: 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78  *pEList    /* Ex
cec0: 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69  pressions defini
ced0: 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ng the result se
cee0: 74 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20  t */.){.#ifndef 
cef0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c  SQLITE_OMIT_DECL
cf00: 54 59 50 45 0a 20 20 56 64 62 65 20 2a 76 20 3d  TYPE.  Vdbe *v =
cf10: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
cf20: 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43    int i;.  NameC
cf30: 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 73 4e  ontext sNC;.  sN
cf40: 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61  C.pSrcList = pTa
cf50: 62 4c 69 73 74 3b 0a 20 20 73 4e 43 2e 70 50 61  bList;.  sNC.pPa
cf60: 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
cf70: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73  for(i=0; i<pELis
cf80: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
cf90: 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45      Expr *p = pE
cfa0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
cfb0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
cfc0: 20 2a 7a 54 79 70 65 3b 0a 23 69 66 64 65 66 20   *zType;.#ifdef 
cfd0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
cfe0: 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20  LUMN_METADATA.  
cff0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
d000: 72 69 67 44 62 20 3d 20 30 3b 0a 20 20 20 20 63  rigDb = 0;.    c
d010: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67  onst char *zOrig
d020: 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e  Tab = 0;.    con
d030: 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 43 6f  st char *zOrigCo
d040: 6c 20 3d 20 30 3b 0a 20 20 20 20 7a 54 79 70 65  l = 0;.    zType
d050: 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73   = columnType(&s
d060: 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c  NC, p, &zOrigDb,
d070: 20 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72   &zOrigTab, &zOr
d080: 69 67 43 6f 6c 2c 20 30 29 3b 0a 0a 20 20 20 20  igCol, 0);..    
d090: 2f 2a 20 54 68 65 20 76 64 62 65 20 6d 75 73 74  /* The vdbe must
d0a0: 20 6d 61 6b 65 20 69 74 73 20 6f 77 6e 20 63 6f   make its own co
d0b0: 70 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  py of the column
d0c0: 2d 74 79 70 65 20 61 6e 64 20 6f 74 68 65 72 20  -type and other 
d0d0: 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 73  .    ** column s
d0e0: 70 65 63 69 66 69 63 20 73 74 72 69 6e 67 73 2c  pecific strings,
d0f0: 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 63 68   in case the sch
d100: 65 6d 61 20 69 73 20 72 65 73 65 74 20 62 65 66  ema is reset bef
d110: 6f 72 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  ore this.    ** 
d120: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
d130: 69 73 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20  is deleted..    
d140: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
d150: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
d160: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 41 54 41 42  i, COLNAME_DATAB
d170: 41 53 45 2c 20 7a 4f 72 69 67 44 62 2c 20 53 51  ASE, zOrigDb, SQ
d180: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
d190: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
d1a0: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
d1b0: 20 43 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45 2c 20   COLNAME_TABLE, 
d1c0: 7a 4f 72 69 67 54 61 62 2c 20 53 51 4c 49 54 45  zOrigTab, SQLITE
d1d0: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
d1e0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
d1f0: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
d200: 4e 41 4d 45 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f 72  NAME_COLUMN, zOr
d210: 69 67 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52  igCol, SQLITE_TR
d220: 41 4e 53 49 45 4e 54 29 3b 0a 23 65 6c 73 65 0a  ANSIENT);.#else.
d230: 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75      zType = colu
d240: 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20  mnType(&sNC, p, 
d250: 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 23 65 6e  0, 0, 0, 0);.#en
d260: 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 56  dif.    sqlite3V
d270: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
d280: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 45 43 4c   i, COLNAME_DECL
d290: 54 59 50 45 2c 20 7a 54 79 70 65 2c 20 53 51 4c  TYPE, zType, SQL
d2a0: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
d2b0: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64    }.#endif /* !d
d2c0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
d2d0: 49 54 5f 44 45 43 4c 54 59 50 45 29 20 2a 2f 0a  IT_DECLTYPE) */.
d2e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
d2f0: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
d300: 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74   tell the VDBE t
d310: 68 65 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c 75  he names of colu
d320: 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65  mns.** in the re
d330: 73 75 6c 74 20 73 65 74 2e 20 20 54 68 69 73 20  sult set.  This 
d340: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75  information is u
d350: 73 65 64 20 74 6f 20 70 72 6f 76 69 64 65 20 74  sed to provide t
d360: 68 65 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d 20 76 61  he.** azCol[] va
d370: 6c 75 65 73 20 69 6e 20 74 68 65 20 63 61 6c 6c  lues in the call
d380: 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  back..*/.static 
d390: 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c  void generateCol
d3a0: 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 50 61 72 73  umnNames(.  Pars
d3b0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
d3c0: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
d3d0: 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
d3e0: 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69  pTabList,  /* Li
d3f0: 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a  st of tables */.
d400: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
d410: 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73  st    /* Express
d420: 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68  ions defining th
d430: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
d440: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
d450: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
d460: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69  int i, j;.  sqli
d470: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
d480: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c 6c  ->db;.  int full
d490: 4e 61 6d 65 73 2c 20 73 68 6f 72 74 4e 61 6d 65  Names, shortName
d4a0: 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  s;..#ifndef SQLI
d4b0: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
d4c0: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
d4d0: 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b 69 70  an EXPLAIN, skip
d4e0: 20 74 68 69 73 20 73 74 65 70 20 2a 2f 0a 20 20   this step */.  
d4f0: 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
d500: 61 69 6e 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ain ){.    retur
d510: 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  n;.  }.#endif.. 
d520: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6c   if( pParse->col
d530: 4e 61 6d 65 73 53 65 74 20 7c 7c 20 64 62 2d 3e  NamesSet || db->
d540: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
d550: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
d560: 20 76 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72   v!=0 );.  asser
d570: 74 28 20 70 54 61 62 4c 69 73 74 21 3d 30 20 29  t( pTabList!=0 )
d580: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e  ;.  pParse->colN
d590: 61 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20 20 66  amesSet = 1;.  f
d5a0: 75 6c 6c 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e  ullNames = (db->
d5b0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  flags & SQLITE_F
d5c0: 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b  ullColNames)!=0;
d5d0: 0a 20 20 73 68 6f 72 74 4e 61 6d 65 73 20 3d 20  .  shortNames = 
d5e0: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
d5f0: 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65  ITE_ShortColName
d600: 73 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33  s)!=0;.  sqlite3
d610: 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76  VdbeSetNumCols(v
d620: 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
d630: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
d640: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
d650: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 3b  +){.    Expr *p;
d660: 0a 20 20 20 20 70 20 3d 20 70 45 4c 69 73 74 2d  .    p = pEList-
d670: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
d680: 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29   if( NEVER(p==0)
d690: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
d6a0: 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69   if( pEList->a[i
d6b0: 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  ].zName ){.     
d6c0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70   char *zName = p
d6d0: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  EList->a[i].zNam
d6e0: 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e;.      sqlite3
d6f0: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
d700: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , i, COLNAME_NAM
d710: 45 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45  E, zName, SQLITE
d720: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
d730: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6f 70   }else if( p->op
d740: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70  ==TK_COLUMN || p
d750: 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op==TK_AGG_COL
d760: 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 54 61 62  UMN ){.      Tab
d770: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20  le *pTab;.      
d780: 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20  char *zCol;.    
d790: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e    int iCol = p->
d7a0: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 66  iColumn;.      f
d7b0: 6f 72 28 6a 3d 30 3b 20 41 4c 57 41 59 53 28 6a  or(j=0; ALWAYS(j
d7c0: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 29  <pTabList->nSrc)
d7d0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
d7e0: 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  if( pTabList->a[
d7f0: 6a 5d 2e 69 43 75 72 73 6f 72 3d 3d 70 2d 3e 69  j].iCursor==p->i
d800: 54 61 62 6c 65 20 29 20 62 72 65 61 6b 3b 0a 20  Table ) break;. 
d810: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
d820: 65 72 74 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d  ert( j<pTabList-
d830: 3e 6e 53 72 63 20 29 3b 0a 20 20 20 20 20 20 70  >nSrc );.      p
d840: 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Tab = pTabList->
d850: 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20  a[j].pTab;.     
d860: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43   if( iCol<0 ) iC
d870: 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79  ol = pTab->iPKey
d880: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
d890: 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f  iCol==-1 || (iCo
d8a0: 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61  l>=0 && iCol<pTa
d8b0: 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20  b->nCol) );.    
d8c0: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a    if( iCol<0 ){.
d8d0: 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22          zCol = "
d8e0: 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 7d 65  rowid";.      }e
d8f0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f  lse{.        zCo
d900: 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  l = pTab->aCol[i
d910: 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Col].zName;.    
d920: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 73    }.      if( !s
d930: 68 6f 72 74 4e 61 6d 65 73 20 26 26 20 21 66 75  hortNames && !fu
d940: 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20  llNames ){.     
d950: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
d960: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
d970: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 0a 20 20  OLNAME_NAME, .  
d980: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
d990: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 45  3DbStrDup(db, pE
d9a0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e  List->a[i].zSpan
d9b0: 29 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49  ), SQLITE_DYNAMI
d9c0: 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  C);.      }else 
d9d0: 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20 29 7b  if( fullNames ){
d9e0: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
d9f0: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Name = 0;.      
da00: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
da10: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
da20: 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  .%s", pTab->zNam
da30: 65 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20  e, zCol);.      
da40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
da50: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
da60: 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d  LNAME_NAME, zNam
da70: 65 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49  e, SQLITE_DYNAMI
da80: 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  C);.      }else{
da90: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
daa0: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
dab0: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , i, COLNAME_NAM
dac0: 45 2c 20 7a 43 6f 6c 2c 20 53 51 4c 49 54 45 5f  E, zCol, SQLITE_
dad0: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
dae0: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
daf0: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
db00: 2a 7a 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  *z = pEList->a[i
db10: 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 7a  ].zSpan;.      z
db20: 20 3d 20 7a 3d 3d 30 20 3f 20 73 71 6c 69 74 65   = z==0 ? sqlite
db30: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 63 6f  3MPrintf(db, "co
db40: 6c 75 6d 6e 25 64 22 2c 20 69 2b 31 29 20 3a 20  lumn%d", i+1) : 
db50: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
db60: 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73 71  db, z);.      sq
db70: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
db80: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
db90: 45 5f 4e 41 4d 45 2c 20 7a 2c 20 53 51 4c 49 54  E_NAME, z, SQLIT
dba0: 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  E_DYNAMIC);.    
dbb0: 7d 0a 20 20 7d 0a 20 20 67 65 6e 65 72 61 74 65  }.  }.  generate
dbc0: 43 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50 61 72  ColumnTypes(pPar
dbd0: 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45  se, pTabList, pE
dbe0: 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  List);.}../*.** 
dbf0: 47 69 76 65 6e 20 61 6e 20 65 78 70 72 65 73 73  Given an express
dc00: 69 6f 6e 20 6c 69 73 74 20 28 77 68 69 63 68 20  ion list (which 
dc10: 69 73 20 72 65 61 6c 6c 79 20 74 68 65 20 6c 69  is really the li
dc20: 73 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e  st of expression
dc30: 73 0a 2a 2a 20 74 68 61 74 20 66 6f 72 6d 20 74  s.** that form t
dc40: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
dc50: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
dc60: 65 6e 74 29 20 63 6f 6d 70 75 74 65 20 61 70 70  ent) compute app
dc70: 72 6f 70 72 69 61 74 65 0a 2a 2a 20 63 6f 6c 75  ropriate.** colu
dc80: 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20 61 20 74  mn names for a t
dc90: 61 62 6c 65 20 74 68 61 74 20 77 6f 75 6c 64 20  able that would 
dca0: 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73 73  hold the express
dcb0: 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ion list..**.** 
dcc0: 41 6c 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  All column names
dcd0: 20 77 69 6c 6c 20 62 65 20 75 6e 69 71 75 65 2e   will be unique.
dce0: 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20  .**.** Only the 
dcf0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 72 65  column names are
dd00: 20 63 6f 6d 70 75 74 65 64 2e 20 20 43 6f 6c 75   computed.  Colu
dd10: 6d 6e 2e 7a 54 79 70 65 2c 20 43 6f 6c 75 6d 6e  mn.zType, Column
dd20: 2e 7a 43 6f 6c 6c 2c 0a 2a 2a 20 61 6e 64 20 6f  .zColl,.** and o
dd30: 74 68 65 72 20 66 69 65 6c 64 73 20 6f 66 20 43  ther fields of C
dd40: 6f 6c 75 6d 6e 20 61 72 65 20 7a 65 72 6f 65 64  olumn are zeroed
dd50: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
dd60: 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
dd70: 65 73 73 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72  ess.  If a memor
dd80: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72  y allocation err
dd90: 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 73 74  or occurs,.** st
dda0: 6f 72 65 20 4e 55 4c 4c 20 69 6e 20 2a 70 61 43  ore NULL in *paC
ddb0: 6f 6c 20 61 6e 64 20 30 20 69 6e 20 2a 70 6e 43  ol and 0 in *pnC
ddc0: 6f 6c 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ol and return SQ
ddd0: 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 69  LITE_NOMEM..*/.i
dde0: 6e 74 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e  nt sqlite3Column
ddf0: 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20  sFromExprList(. 
de00: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
de10: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
de20: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
de30: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
de40: 74 2c 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72  t,       /* Expr
de50: 20 6c 69 73 74 20 66 72 6f 6d 20 77 68 69 63 68   list from which
de60: 20 74 6f 20 64 65 72 69 76 65 20 63 6f 6c 75 6d   to derive colum
de70: 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 31 36  n names */.  i16
de80: 20 2a 70 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20   *pnCol,        
de90: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
dea0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
deb0: 6d 6e 73 20 68 65 72 65 20 2a 2f 0a 20 20 43 6f  mns here */.  Co
dec0: 6c 75 6d 6e 20 2a 2a 70 61 43 6f 6c 20 20 20 20  lumn **paCol    
ded0: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
dee0: 68 65 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 6c 69  he new column li
def0: 73 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  st here */.){.  
df00: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
df10: 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 44  arse->db;   /* D
df20: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
df30: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a  on */.  int i, j
df40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
df50: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
df60: 74 65 72 73 20 2a 2f 0a 20 20 75 33 32 20 63 6e  ters */.  u32 cn
df70: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
df80: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 61        /* Index a
df90: 64 64 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65  dded to make the
dfa0: 20 6e 61 6d 65 20 75 6e 69 71 75 65 20 2a 2f 0a   name unique */.
dfb0: 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20    Column *aCol, 
dfc0: 2a 70 43 6f 6c 3b 20 20 20 20 20 20 20 20 2f 2a  *pCol;        /*
dfd0: 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
dfe0: 72 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  r result columns
dff0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20   */.  int nCol; 
e000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e010: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
e020: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
e030: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 45 78  sult set */.  Ex
e040: 70 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  pr *p;          
e050: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
e060: 72 65 73 73 69 6f 6e 20 66 6f 72 20 61 20 73 69  ression for a si
e070: 6e 67 6c 65 20 72 65 73 75 6c 74 20 63 6f 6c 75  ngle result colu
e080: 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e  mn */.  char *zN
e090: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
e0a0: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61      /* Column na
e0b0: 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d  me */.  int nNam
e0c0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
e0d0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6e      /* Size of n
e0e0: 61 6d 65 20 69 6e 20 7a 4e 61 6d 65 5b 5d 20 2a  ame in zName[] *
e0f0: 2f 0a 20 20 48 61 73 68 20 68 74 3b 20 20 20 20  /.  Hash ht;    
e100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e110: 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20 6f 66  /* Hash table of
e120: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f   column names */
e130: 0a 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 49  ..  sqlite3HashI
e140: 6e 69 74 28 26 68 74 29 3b 0a 20 20 69 66 28 20  nit(&ht);.  if( 
e150: 70 45 4c 69 73 74 20 29 7b 0a 20 20 20 20 6e 43  pEList ){.    nC
e160: 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78  ol = pEList->nEx
e170: 70 72 3b 0a 20 20 20 20 61 43 6f 6c 20 3d 20 73  pr;.    aCol = s
e180: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
e190: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 61 43  ro(db, sizeof(aC
e1a0: 6f 6c 5b 30 5d 29 2a 6e 43 6f 6c 29 3b 0a 20 20  ol[0])*nCol);.  
e1b0: 20 20 74 65 73 74 63 61 73 65 28 20 61 43 6f 6c    testcase( aCol
e1c0: 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ==0 );.  }else{.
e1d0: 20 20 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20      nCol = 0;.  
e1e0: 20 20 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 7d 0a    aCol = 0;.  }.
e1f0: 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 3d 3d    assert( nCol==
e200: 28 69 31 36 29 6e 43 6f 6c 20 29 3b 0a 20 20 2a  (i16)nCol );.  *
e210: 70 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20  pnCol = nCol;.  
e220: 2a 70 61 43 6f 6c 20 3d 20 61 43 6f 6c 3b 0a 0a  *paCol = aCol;..
e230: 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d    for(i=0, pCol=
e240: 61 43 6f 6c 3b 20 69 3c 6e 43 6f 6c 20 26 26 20  aCol; i<nCol && 
e250: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
e260: 64 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  d; i++, pCol++){
e270: 0a 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 61  .    /* Get an a
e280: 70 70 72 6f 70 72 69 61 74 65 20 6e 61 6d 65 20  ppropriate name 
e290: 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20  for the column. 
e2a0: 20 20 20 2a 2f 0a 20 20 20 20 70 20 3d 20 73 71     */.    p = sq
e2b0: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
e2c0: 6c 61 74 65 28 70 45 4c 69 73 74 2d 3e 61 5b 69  late(pEList->a[i
e2d0: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66  ].pExpr);.    if
e2e0: 28 20 28 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73  ( (zName = pELis
e2f0: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d  t->a[i].zName)!=
e300: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  0 ){.      /* If
e310: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74   the column cont
e320: 61 69 6e 73 20 61 6e 20 22 41 53 20 3c 6e 61 6d  ains an "AS <nam
e330: 65 3e 22 20 70 68 72 61 73 65 2c 20 75 73 65 20  e>" phrase, use 
e340: 3c 6e 61 6d 65 3e 20 61 73 20 74 68 65 20 6e 61  <name> as the na
e350: 6d 65 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b  me */.    }else{
e360: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 43 6f  .      Expr *pCo
e370: 6c 45 78 70 72 20 3d 20 70 3b 20 20 2f 2a 20 54  lExpr = p;  /* T
e380: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  he expression th
e390: 61 74 20 69 73 20 74 68 65 20 72 65 73 75 6c 74  at is the result
e3a0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a   column name */.
e3b0: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
e3c0: 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61  b;         /* Ta
e3d0: 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ble associated w
e3e0: 69 74 68 20 74 68 69 73 20 65 78 70 72 65 73 73  ith this express
e3f0: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 77 68 69  ion */.      whi
e400: 6c 65 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70  le( pColExpr->op
e410: 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20 20  ==TK_DOT ){.    
e420: 20 20 20 20 70 43 6f 6c 45 78 70 72 20 3d 20 70      pColExpr = p
e430: 43 6f 6c 45 78 70 72 2d 3e 70 52 69 67 68 74 3b  ColExpr->pRight;
e440: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
e450: 20 70 43 6f 6c 45 78 70 72 21 3d 30 20 29 3b 0a   pColExpr!=0 );.
e460: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
e470: 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d  ( pColExpr->op==
e480: 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 41 4c 57  TK_COLUMN && ALW
e490: 41 59 53 28 70 43 6f 6c 45 78 70 72 2d 3e 70 54  AYS(pColExpr->pT
e4a0: 61 62 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  ab!=0) ){.      
e4b0: 20 20 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e 73    /* For columns
e4c0: 20 75 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20   use the column 
e4d0: 6e 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  name name */.   
e4e0: 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
e4f0: 70 43 6f 6c 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  pColExpr->iColum
e500: 6e 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 20  n;.        pTab 
e510: 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 54 61 62  = pColExpr->pTab
e520: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43  ;.        if( iC
e530: 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54  ol<0 ) iCol = pT
e540: 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20  ab->iPKey;.     
e550: 20 20 20 7a 4e 61 6d 65 20 3d 20 69 43 6f 6c 3e     zName = iCol>
e560: 3d 30 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  =0 ? pTab->aCol[
e570: 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 20 3a 20 22 72  iCol].zName : "r
e580: 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c  owid";.      }el
e590: 73 65 20 69 66 28 20 70 43 6f 6c 45 78 70 72 2d  se if( pColExpr-
e5a0: 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20  >op==TK_ID ){.  
e5b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
e5c0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
e5d0: 43 6f 6c 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  ColExpr, EP_IntV
e5e0: 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20  alue) );.       
e5f0: 20 7a 4e 61 6d 65 20 3d 20 70 43 6f 6c 45 78 70   zName = pColExp
e600: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20  r->u.zToken;.   
e610: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e620: 20 20 2f 2a 20 55 73 65 20 74 68 65 20 6f 72 69    /* Use the ori
e630: 67 69 6e 61 6c 20 74 65 78 74 20 6f 66 20 74 68  ginal text of th
e640: 65 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73  e column express
e650: 69 6f 6e 20 61 73 20 69 74 73 20 6e 61 6d 65 20  ion as its name 
e660: 2a 2f 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  */.        zName
e670: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
e680: 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  zSpan;.      }. 
e690: 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d     }.    zName =
e6a0: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
e6b0: 64 62 2c 20 22 25 73 22 2c 20 7a 4e 61 6d 65 29  db, "%s", zName)
e6c0: 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73  ;..    /* Make s
e6d0: 75 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ure the column n
e6e0: 61 6d 65 20 69 73 20 75 6e 69 71 75 65 2e 20 20  ame is unique.  
e6f0: 49 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20 6e  If the name is n
e700: 6f 74 20 75 6e 69 71 75 65 2c 0a 20 20 20 20 2a  ot unique,.    *
e710: 2a 20 61 70 70 65 6e 64 20 61 6e 20 69 6e 74 65  * append an inte
e720: 67 65 72 20 74 6f 20 74 68 65 20 6e 61 6d 65 20  ger to the name 
e730: 73 6f 20 74 68 61 74 20 69 74 20 62 65 63 6f 6d  so that it becom
e740: 65 73 20 75 6e 69 71 75 65 2e 0a 20 20 20 20 2a  es unique..    *
e750: 2f 0a 20 20 20 20 63 6e 74 20 3d 20 30 3b 0a 20  /.    cnt = 0;. 
e760: 20 20 20 77 68 69 6c 65 28 20 7a 4e 61 6d 65 20     while( zName 
e770: 26 26 20 73 71 6c 69 74 65 33 48 61 73 68 46 69  && sqlite3HashFi
e780: 6e 64 28 26 68 74 2c 20 7a 4e 61 6d 65 29 21 3d  nd(&ht, zName)!=
e790: 30 20 29 7b 0a 20 20 20 20 20 20 6e 4e 61 6d 65  0 ){.      nName
e7a0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
e7b0: 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  30(zName);.     
e7c0: 20 69 66 28 20 6e 4e 61 6d 65 3e 30 20 29 7b 0a   if( nName>0 ){.
e7d0: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 6e 4e          for(j=nN
e7e0: 61 6d 65 2d 31 3b 20 6a 3e 30 20 26 26 20 73 71  ame-1; j>0 && sq
e7f0: 6c 69 74 65 33 49 73 64 69 67 69 74 28 7a 4e 61  lite3Isdigit(zNa
e800: 6d 65 5b 6a 5d 29 3b 20 6a 2d 2d 29 7b 7d 0a 20  me[j]); j--){}. 
e810: 20 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65         if( zName
e820: 5b 6a 5d 3d 3d 27 3a 27 20 29 20 6e 4e 61 6d 65  [j]==':' ) nName
e830: 20 3d 20 6a 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = j;.      }.  
e840: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
e850: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
e860: 25 2e 2a 7a 3a 25 75 22 2c 20 6e 4e 61 6d 65 2c  %.*z:%u", nName,
e870: 20 7a 4e 61 6d 65 2c 20 2b 2b 63 6e 74 29 3b 0a   zName, ++cnt);.
e880: 20 20 20 20 20 20 69 66 28 20 63 6e 74 3e 33 20        if( cnt>3 
e890: 29 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d  ) sqlite3_random
e8a0: 6e 65 73 73 28 73 69 7a 65 6f 66 28 63 6e 74 29  ness(sizeof(cnt)
e8b0: 2c 20 26 63 6e 74 29 3b 0a 20 20 20 20 7d 0a 20  , &cnt);.    }. 
e8c0: 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d     pCol->zName =
e8d0: 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 73 71 6c 69   zName;.    sqli
e8e0: 74 65 33 43 6f 6c 75 6d 6e 50 72 6f 70 65 72 74  te3ColumnPropert
e8f0: 69 65 73 46 72 6f 6d 4e 61 6d 65 28 30 2c 20 70  iesFromName(0, p
e900: 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e  Col);.    if( zN
e910: 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33 48 61  ame && sqlite3Ha
e920: 73 68 49 6e 73 65 72 74 28 26 68 74 2c 20 7a 4e  shInsert(&ht, zN
e930: 61 6d 65 2c 20 70 43 6f 6c 29 3d 3d 70 43 6f 6c  ame, pCol)==pCol
e940: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
e950: 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20  3OomFault(db);. 
e960: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
e970: 65 33 48 61 73 68 43 6c 65 61 72 28 26 68 74 29  e3HashClear(&ht)
e980: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
e990: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
e9a0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 69 3b 20 6a 2b  for(j=0; j<i; j+
e9b0: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
e9c0: 33 44 62 46 72 65 65 28 64 62 2c 20 61 43 6f 6c  3DbFree(db, aCol
e9d0: 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [j].zName);.    
e9e0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
e9f0: 72 65 65 28 64 62 2c 20 61 43 6f 6c 29 3b 0a 20  ree(db, aCol);. 
ea00: 20 20 20 2a 70 61 43 6f 6c 20 3d 20 30 3b 0a 20     *paCol = 0;. 
ea10: 20 20 20 2a 70 6e 43 6f 6c 20 3d 20 30 3b 0a 20     *pnCol = 0;. 
ea20: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
ea30: 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d  _NOMEM_BKPT;.  }
ea40: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
ea50: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  _OK;.}../*.** Ad
ea60: 64 20 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61  d type and colla
ea70: 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tion information
ea80: 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 6c 69 73   to a column lis
ea90: 74 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 20  t based on.** a 
eaa0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
eab0: 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 63 6f 6c  ..** .** The col
eac0: 75 6d 6e 20 6c 69 73 74 20 70 72 65 73 75 6d 61  umn list presuma
ead0: 62 6c 79 20 63 61 6d 65 20 66 72 6f 6d 20 73 65  bly came from se
eae0: 6c 65 63 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 46  lectColumnNamesF
eaf0: 72 6f 6d 45 78 70 72 4c 69 73 74 28 29 2e 0a 2a  romExprList()..*
eb00: 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73  * The column lis
eb10: 74 20 68 61 73 20 6f 6e 6c 79 20 6e 61 6d 65 73  t has only names
eb20: 2c 20 6e 6f 74 20 74 79 70 65 73 20 6f 72 20 63  , not types or c
eb30: 6f 6c 6c 61 74 69 6f 6e 73 2e 20 20 54 68 69 73  ollations.  This
eb40: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 6f 65 73  .** routine goes
eb50: 20 74 68 72 6f 75 67 68 20 61 6e 64 20 61 64 64   through and add
eb60: 73 20 74 68 65 20 74 79 70 65 73 20 61 6e 64 20  s the types and 
eb70: 63 6f 6c 6c 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a  collations..**.*
eb80: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
eb90: 65 71 75 69 72 65 73 20 74 68 61 74 20 61 6c 6c  equires that all
eba0: 20 69 64 65 6e 74 69 66 69 65 72 73 20 69 6e 20   identifiers in 
ebb0: 74 68 65 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74  the SELECT.** st
ebc0: 61 74 65 6d 65 6e 74 20 62 65 20 72 65 73 6f 6c  atement be resol
ebd0: 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ved..*/.void sql
ebe0: 69 74 65 33 53 65 6c 65 63 74 41 64 64 43 6f 6c  ite3SelectAddCol
ebf0: 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74  umnTypeAndCollat
ec00: 69 6f 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ion(.  Parse *pP
ec10: 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
ec20: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 73  Parsing contexts
ec30: 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
ec40: 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  b,          /* A
ec50: 64 64 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 69  dd column type i
ec60: 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68  nformation to th
ec70: 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 53 65  is table */.  Se
ec80: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20  lect *pSelect   
ec90: 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 75 73      /* SELECT us
eca0: 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
ecb0: 74 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74  types and collat
ecc0: 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ions */.){.  sql
ecd0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
ece0: 65 2d 3e 64 62 3b 0a 20 20 4e 61 6d 65 43 6f 6e  e->db;.  NameCon
ecf0: 74 65 78 74 20 73 4e 43 3b 0a 20 20 43 6f 6c 75  text sNC;.  Colu
ed00: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 43 6f 6c 6c  mn *pCol;.  Coll
ed10: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e  Seq *pColl;.  in
ed20: 74 20 69 3b 0a 20 20 45 78 70 72 20 2a 70 3b 0a  t i;.  Expr *p;.
ed30: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
ed40: 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 75 36 34  t_item *a;.  u64
ed50: 20 73 7a 41 6c 6c 20 3d 20 30 3b 0a 0a 20 20 61   szAll = 0;..  a
ed60: 73 73 65 72 74 28 20 70 53 65 6c 65 63 74 21 3d  ssert( pSelect!=
ed70: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  0 );.  assert( (
ed80: 70 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67  pSelect->selFlag
ed90: 73 20 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 29  s & SF_Resolved)
eda0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
edb0: 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 70 53 65   pTab->nCol==pSe
edc0: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  lect->pEList->nE
edd0: 78 70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  xpr || db->mallo
ede0: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28  cFailed );.  if(
edf0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
ee00: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65  d ) return;.  me
ee10: 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69  mset(&sNC, 0, si
ee20: 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 73 4e  zeof(sNC));.  sN
ee30: 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 65  C.pSrcList = pSe
ee40: 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 61 20  lect->pSrc;.  a 
ee50: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  = pSelect->pELis
ee60: 74 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  t->a;.  for(i=0,
ee70: 20 70 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c   pCol=pTab->aCol
ee80: 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; i<pTab->nCol; 
ee90: 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20  i++, pCol++){.  
eea0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
eeb0: 79 70 65 3b 0a 20 20 20 20 69 6e 74 20 6e 2c 20  ype;.    int n, 
eec0: 6d 3b 0a 20 20 20 20 70 20 3d 20 61 5b 69 5d 2e  m;.    p = a[i].
eed0: 70 45 78 70 72 3b 0a 20 20 20 20 7a 54 79 70 65  pExpr;.    zType
eee0: 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73   = columnType(&s
eef0: 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30 2c 20  NC, p, 0, 0, 0, 
ef00: 26 70 43 6f 6c 2d 3e 73 7a 45 73 74 29 3b 0a 20  &pCol->szEst);. 
ef10: 20 20 20 73 7a 41 6c 6c 20 2b 3d 20 70 43 6f 6c     szAll += pCol
ef20: 2d 3e 73 7a 45 73 74 3b 0a 20 20 20 20 70 43 6f  ->szEst;.    pCo
ef30: 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71  l->affinity = sq
ef40: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
ef50: 79 28 70 29 3b 0a 20 20 20 20 69 66 28 20 7a 54  y(p);.    if( zT
ef60: 79 70 65 20 26 26 20 28 6d 20 3d 20 73 71 6c 69  ype && (m = sqli
ef70: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 79 70  te3Strlen30(zTyp
ef80: 65 29 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 6e  e))>0 ){.      n
ef90: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
efa0: 33 30 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b  30(pCol->zName);
efb0: 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61  .      pCol->zNa
efc0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65  me = sqlite3DbRe
efd0: 61 6c 6c 6f 63 4f 72 46 72 65 65 28 64 62 2c 20  allocOrFree(db, 
efe0: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 6e 2b 6d  pCol->zName, n+m
eff0: 2b 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  +2);.      if( p
f000: 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20  Col->zName ){.  
f010: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 43        memcpy(&pC
f020: 6f 6c 2d 3e 7a 4e 61 6d 65 5b 6e 2b 31 5d 2c 20  ol->zName[n+1], 
f030: 7a 54 79 70 65 2c 20 6d 2b 31 29 3b 0a 20 20 20  zType, m+1);.   
f040: 20 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c       pCol->colFl
f050: 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 48  ags |= COLFLAG_H
f060: 41 53 54 59 50 45 3b 0a 20 20 20 20 20 20 7d 0a  ASTYPE;.      }.
f070: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43      }.    if( pC
f080: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 30 20  ol->affinity==0 
f090: 29 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  ) pCol->affinity
f0a0: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c   = SQLITE_AFF_BL
f0b0: 4f 42 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20  OB;.    pColl = 
f0c0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
f0d0: 65 71 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  eq(pParse, p);. 
f0e0: 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 26 26 20     if( pColl && 
f0f0: 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3d 3d 30 20 29  pCol->zColl==0 )
f100: 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 43  {.      pCol->zC
f110: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 53  oll = sqlite3DbS
f120: 74 72 44 75 70 28 64 62 2c 20 70 43 6f 6c 6c 2d  trDup(db, pColl-
f130: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  >zName);.    }. 
f140: 20 7d 0a 20 20 70 54 61 62 2d 3e 73 7a 54 61 62   }.  pTab->szTab
f150: 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Row = sqlite3Log
f160: 45 73 74 28 73 7a 41 6c 6c 2a 34 29 3b 0a 7d 0a  Est(szAll*4);.}.
f170: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 53  ./*.** Given a S
f180: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
f190: 20 67 65 6e 65 72 61 74 65 20 61 20 54 61 62 6c   generate a Tabl
f1a0: 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
f1b0: 20 64 65 73 63 72 69 62 65 73 0a 2a 2a 20 74 68   describes.** th
f1c0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
f1d0: 74 68 61 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a  that SELECT..*/.
f1e0: 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 52 65  Table *sqlite3Re
f1f0: 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
f200: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
f210: 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b  elect *pSelect){
f220: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
f230: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
f240: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
f250: 74 20 73 61 76 65 64 46 6c 61 67 73 3b 0a 0a 20  t savedFlags;.. 
f260: 20 73 61 76 65 64 46 6c 61 67 73 20 3d 20 64 62   savedFlags = db
f270: 2d 3e 66 6c 61 67 73 3b 0a 20 20 64 62 2d 3e 66  ->flags;.  db->f
f280: 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
f290: 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20  FullColNames;.  
f2a0: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
f2b0: 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65  ITE_ShortColName
f2c0: 73 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  s;.  sqlite3Sele
f2d0: 63 74 50 72 65 70 28 70 50 61 72 73 65 2c 20 70  ctPrep(pParse, p
f2e0: 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69 66  Select, 0);.  if
f2f0: 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  ( pParse->nErr )
f300: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 77 68 69   return 0;.  whi
f310: 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e 70 50 72  le( pSelect->pPr
f320: 69 6f 72 20 29 20 70 53 65 6c 65 63 74 20 3d 20  ior ) pSelect = 
f330: 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b  pSelect->pPrior;
f340: 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20 73  .  db->flags = s
f350: 61 76 65 64 46 6c 61 67 73 3b 0a 20 20 70 54 61  avedFlags;.  pTa
f360: 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  b = sqlite3DbMal
f370: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
f380: 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a 20 20 69  of(Table) );.  i
f390: 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
f3a0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
f3b0: 20 20 2f 2a 20 54 68 65 20 73 71 6c 69 74 65 33    /* The sqlite3
f3c0: 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
f3d0: 74 28 29 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  t() is only used
f3e0: 20 6e 20 63 6f 6e 74 65 78 74 73 20 77 68 65 72   n contexts wher
f3f0: 65 20 6c 6f 6f 6b 61 73 69 64 65 0a 20 20 2a 2a  e lookaside.  **
f400: 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a   is disabled */.
f410: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6c 6f    assert( db->lo
f420: 6f 6b 61 73 69 64 65 2e 62 44 69 73 61 62 6c 65  okaside.bDisable
f430: 20 29 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 65 66   );.  pTab->nRef
f440: 20 3d 20 31 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e   = 1;.  pTab->zN
f450: 61 6d 65 20 3d 20 30 3b 0a 20 20 70 54 61 62 2d  ame = 0;.  pTab-
f460: 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30  >nRowLogEst = 20
f470: 30 3b 20 61 73 73 65 72 74 28 20 32 30 30 3d 3d  0; assert( 200==
f480: 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30  sqlite3LogEst(10
f490: 34 38 35 37 36 29 20 29 3b 0a 20 20 73 71 6c 69  48576) );.  sqli
f4a0: 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78  te3ColumnsFromEx
f4b0: 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
f4c0: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2c 20  Select->pEList, 
f4d0: 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54  &pTab->nCol, &pT
f4e0: 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 73 71 6c  ab->aCol);.  sql
f4f0: 69 74 65 33 53 65 6c 65 63 74 41 64 64 43 6f 6c  ite3SelectAddCol
f500: 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74  umnTypeAndCollat
f510: 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  ion(pParse, pTab
f520: 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 70 54  , pSelect);.  pT
f530: 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a  ab->iPKey = -1;.
f540: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
f550: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71  Failed ){.    sq
f560: 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
f570: 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20  (db, pTab);.    
f580: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
f590: 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a  return pTab;.}..
f5a0: 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 56 44 42 45  /*.** Get a VDBE
f5b0: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70   for the given p
f5c0: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 2e 20 20  arser context.  
f5d0: 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65  Create a new one
f5e0: 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   if necessary..*
f5f0: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
f600: 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c  curs, return NUL
f610: 4c 20 61 6e 64 20 6c 65 61 76 65 20 61 20 6d 65  L and leave a me
f620: 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e  ssage in pParse.
f630: 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54  .*/.static SQLIT
f640: 45 5f 4e 4f 49 4e 4c 49 4e 45 20 56 64 62 65 20  E_NOINLINE Vdbe 
f650: 2a 61 6c 6c 6f 63 56 64 62 65 28 50 61 72 73 65  *allocVdbe(Parse
f660: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62   *pParse){.  Vdb
f670: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
f680: 56 64 62 65 20 3d 20 73 71 6c 69 74 65 33 56 64  Vdbe = sqlite3Vd
f690: 62 65 43 72 65 61 74 65 28 70 50 61 72 73 65 29  beCreate(pParse)
f6a0: 3b 0a 20 20 69 66 28 20 76 20 29 20 73 71 6c 69  ;.  if( v ) sqli
f6b0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
f6c0: 20 4f 50 5f 49 6e 69 74 2c 20 30 2c 20 31 29 3b   OP_Init, 0, 1);
f6d0: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70  .  if( pParse->p
f6e0: 54 6f 70 6c 65 76 65 6c 3d 3d 30 0a 20 20 20 26  Toplevel==0.   &
f6f0: 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e  & OptimizationEn
f700: 61 62 6c 65 64 28 70 50 61 72 73 65 2d 3e 64 62  abled(pParse->db
f710: 2c 53 51 4c 49 54 45 5f 46 61 63 74 6f 72 4f 75  ,SQLITE_FactorOu
f720: 74 43 6f 6e 73 74 29 0a 20 20 29 7b 0a 20 20 20  tConst).  ){.   
f730: 20 70 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73 74   pParse->okConst
f740: 46 61 63 74 6f 72 20 3d 20 31 3b 0a 20 20 7d 0a  Factor = 1;.  }.
f750: 20 20 72 65 74 75 72 6e 20 76 3b 0a 7d 0a 56 64    return v;.}.Vd
f760: 62 65 20 2a 73 71 6c 69 74 65 33 47 65 74 56 64  be *sqlite3GetVd
f770: 62 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  be(Parse *pParse
f780: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
f790: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
f7a0: 72 65 74 75 72 6e 20 76 20 3f 20 76 20 3a 20 61  return v ? v : a
f7b0: 6c 6c 6f 63 56 64 62 65 28 70 50 61 72 73 65 29  llocVdbe(pParse)
f7c0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  ;.}.../*.** Comp
f7d0: 75 74 65 20 74 68 65 20 69 4c 69 6d 69 74 20 61  ute the iLimit a
f7e0: 6e 64 20 69 4f 66 66 73 65 74 20 66 69 65 6c 64  nd iOffset field
f7f0: 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  s of the SELECT 
f800: 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20  based on the.** 
f810: 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73  pLimit and pOffs
f820: 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20  et expressions. 
f830: 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66   pLimit and pOff
f840: 73 65 74 20 68 6f 6c 64 20 74 68 65 20 65 78 70  set hold the exp
f850: 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74  ressions.** that
f860: 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6f   appear in the o
f870: 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74  riginal SQL stat
f880: 65 6d 65 6e 74 20 61 66 74 65 72 20 74 68 65 20  ement after the 
f890: 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
f8a0: 0a 2a 2a 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f  .** keywords.  O
f8b0: 72 20 4e 55 4c 4c 20 69 66 20 74 68 6f 73 65 20  r NULL if those 
f8c0: 6b 65 79 77 6f 72 64 73 20 61 72 65 20 6f 6d 69  keywords are omi
f8d0: 74 74 65 64 2e 20 69 4c 69 6d 69 74 20 61 6e 64  tted. iLimit and
f8e0: 20 69 4f 66 66 73 65 74 20 0a 2a 2a 20 61 72 65   iOffset .** are
f8f0: 20 74 68 65 20 69 6e 74 65 67 65 72 20 6d 65 6d   the integer mem
f900: 6f 72 79 20 72 65 67 69 73 74 65 72 20 6e 75 6d  ory register num
f910: 62 65 72 73 20 66 6f 72 20 63 6f 75 6e 74 65 72  bers for counter
f920: 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74  s used to comput
f930: 65 20 0a 2a 2a 20 74 68 65 20 6c 69 6d 69 74 20  e .** the limit 
f940: 61 6e 64 20 6f 66 66 73 65 74 2e 20 20 49 66 20  and offset.  If 
f950: 74 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69  there is no limi
f960: 74 20 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c  t and/or offset,
f970: 20 74 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74   then .** iLimit
f980: 20 61 6e 64 20 69 4f 66 66 73 65 74 20 61 72 65   and iOffset are
f990: 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a   negative..**.**
f9a0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
f9b0: 61 6e 67 65 73 20 74 68 65 20 76 61 6c 75 65 73  anges the values
f9c0: 20 6f 66 20 69 4c 69 6d 69 74 20 61 6e 64 20 69   of iLimit and i
f9d0: 4f 66 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a  Offset only if.*
f9e0: 2a 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66  * a limit or off
f9f0: 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62  set is defined b
fa00: 79 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66  y pLimit and pOf
fa10: 66 73 65 74 2e 20 20 69 4c 69 6d 69 74 20 61 6e  fset.  iLimit an
fa20: 64 0a 2a 2a 20 69 4f 66 66 73 65 74 20 73 68 6f  d.** iOffset sho
fa30: 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 72  uld have been pr
fa40: 65 73 65 74 20 74 6f 20 61 70 70 72 6f 70 72 69  eset to appropri
fa50: 61 74 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  ate default valu
fa60: 65 73 20 28 7a 65 72 6f 29 0a 2a 2a 20 70 72 69  es (zero).** pri
fa70: 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68  or to calling th
fa80: 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a  is routine..**.*
fa90: 2a 20 54 68 65 20 69 4f 66 66 73 65 74 20 72 65  * The iOffset re
faa0: 67 69 73 74 65 72 20 28 69 66 20 69 74 20 65 78  gister (if it ex
fab0: 69 73 74 73 29 20 69 73 20 69 6e 69 74 69 61 6c  ists) is initial
fac0: 69 7a 65 64 20 74 6f 20 74 68 65 20 76 61 6c 75  ized to the valu
fad0: 65 0a 2a 2a 20 6f 66 20 74 68 65 20 4f 46 46 53  e.** of the OFFS
fae0: 45 54 2e 20 20 54 68 65 20 69 4c 69 6d 69 74 20  ET.  The iLimit 
faf0: 72 65 67 69 73 74 65 72 20 69 73 20 69 6e 69 74  register is init
fb00: 69 61 6c 69 7a 65 64 20 74 6f 20 4c 49 4d 49 54  ialized to LIMIT
fb10: 2e 20 20 52 65 67 69 73 74 65 72 0a 2a 2a 20 69  .  Register.** i
fb20: 4f 66 66 73 65 74 2b 31 20 69 73 20 69 6e 69 74  Offset+1 is init
fb30: 69 61 6c 69 7a 65 64 20 74 6f 20 4c 49 4d 49 54  ialized to LIMIT
fb40: 2b 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 4f  +OFFSET..**.** O
fb50: 6e 6c 79 20 69 66 20 70 4c 69 6d 69 74 21 3d 30  nly if pLimit!=0
fb60: 20 6f 72 20 70 4f 66 66 73 65 74 21 3d 30 20 64   or pOffset!=0 d
fb70: 6f 20 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69  o the limit regi
fb80: 73 74 65 72 73 20 67 65 74 0a 2a 2a 20 72 65 64  sters get.** red
fb90: 65 66 69 6e 65 64 2e 20 20 54 68 65 20 55 4e 49  efined.  The UNI
fba0: 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20  ON ALL operator 
fbb0: 75 73 65 73 20 74 68 69 73 20 70 72 6f 70 65 72  uses this proper
fbc0: 74 79 20 74 6f 20 66 6f 72 63 65 0a 2a 2a 20 74  ty to force.** t
fbd0: 68 65 20 72 65 75 73 65 20 6f 66 20 74 68 65 20  he reuse of the 
fbe0: 73 61 6d 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f  same limit and o
fbf0: 66 66 73 65 74 20 72 65 67 69 73 74 65 72 73 20  ffset registers 
fc00: 61 63 72 6f 73 73 20 6d 75 6c 74 69 70 6c 65 0a  across multiple.
fc10: 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
fc20: 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ents..*/.static 
fc30: 76 6f 69 64 20 63 6f 6d 70 75 74 65 4c 69 6d 69  void computeLimi
fc40: 74 52 65 67 69 73 74 65 72 73 28 50 61 72 73 65  tRegisters(Parse
fc50: 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
fc60: 20 2a 70 2c 20 69 6e 74 20 69 42 72 65 61 6b 29   *p, int iBreak)
fc70: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 30 3b  {.  Vdbe *v = 0;
fc80: 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74 20 3d 20  .  int iLimit = 
fc90: 30 3b 0a 20 20 69 6e 74 20 69 4f 66 66 73 65 74  0;.  int iOffset
fca0: 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 66 28  ;.  int n;.  if(
fcb0: 20 70 2d 3e 69 4c 69 6d 69 74 20 29 20 72 65 74   p->iLimit ) ret
fcc0: 75 72 6e 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a  urn;..  /* .  **
fcd0: 20 22 4c 49 4d 49 54 20 2d 31 22 20 61 6c 77 61   "LIMIT -1" alwa
fce0: 79 73 20 73 68 6f 77 73 20 61 6c 6c 20 72 6f 77  ys shows all row
fcf0: 73 2e 20 20 54 68 65 72 65 20 69 73 20 73 6f 6d  s.  There is som
fd00: 65 0a 20 20 2a 2a 20 63 6f 6e 74 72 6f 76 65 72  e.  ** controver
fd10: 73 79 20 61 62 6f 75 74 20 77 68 61 74 20 74 68  sy about what th
fd20: 65 20 63 6f 72 72 65 63 74 20 62 65 68 61 76 69  e correct behavi
fd30: 6f 72 20 73 68 6f 75 6c 64 20 62 65 2e 0a 20 20  or should be..  
fd40: 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 69  ** The current i
fd50: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e  mplementation in
fd60: 74 65 72 70 72 65 74 73 20 22 4c 49 4d 49 54 20  terprets "LIMIT 
fd70: 30 22 20 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20  0" to mean.  ** 
fd80: 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20  no rows..  */.  
fd90: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
fda0: 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
fdb0: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66   assert( p->pOff
fdc0: 73 65 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 4c 69  set==0 || p->pLi
fdd0: 6d 69 74 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  mit!=0 );.  if( 
fde0: 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  p->pLimit ){.   
fdf0: 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 69 4c 69   p->iLimit = iLi
fe00: 6d 69 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  mit = ++pParse->
fe10: 6e 4d 65 6d 3b 0a 20 20 20 20 76 20 3d 20 73 71  nMem;.    v = sq
fe20: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
fe30: 72 73 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74  rse);.    assert
fe40: 28 20 76 21 3d 30 20 29 3b 0a 20 20 20 20 69 66  ( v!=0 );.    if
fe50: 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  ( sqlite3ExprIsI
fe60: 6e 74 65 67 65 72 28 70 2d 3e 70 4c 69 6d 69 74  nteger(p->pLimit
fe70: 2c 20 26 6e 29 20 29 7b 0a 20 20 20 20 20 20 73  , &n) ){.      s
fe80: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
fe90: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
fea0: 6e 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20  n, iLimit);.    
feb0: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
fec0: 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72  , "LIMIT counter
fed0: 22 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  "));.      if( n
fee0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
fef0: 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
ff00: 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
ff10: 20 7d 65 6c 73 65 20 69 66 28 20 6e 3e 3d 30 20   }else if( n>=0 
ff20: 26 26 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  && p->nSelectRow
ff30: 3e 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 28  >sqlite3LogEst((
ff40: 75 36 34 29 6e 29 20 29 7b 0a 20 20 20 20 20 20  u64)n) ){.      
ff50: 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
ff60: 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  = sqlite3LogEst(
ff70: 28 75 36 34 29 6e 29 3b 0a 20 20 20 20 20 20 20  (u64)n);.       
ff80: 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20   p->selFlags |= 
ff90: 53 46 5f 46 69 78 65 64 4c 69 6d 69 74 3b 0a 20  SF_FixedLimit;. 
ffa0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
ffb0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
ffc0: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
ffd0: 70 2d 3e 70 4c 69 6d 69 74 2c 20 69 4c 69 6d 69  p->pLimit, iLimi
ffe0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
fff0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
10000 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 4c 69  P_MustBeInt, iLi
10010 6d 69 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  mit); VdbeCovera
10020 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62  ge(v);.      Vdb
10030 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49  eComment((v, "LI
10040 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a  MIT counter"));.
10050 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10060 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
10070 4e 6f 74 2c 20 69 4c 69 6d 69 74 2c 20 69 42 72  Not, iLimit, iBr
10080 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61  eak); VdbeCovera
10090 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ge(v);.    }.   
100a0 20 69 66 28 20 70 2d 3e 70 4f 66 66 73 65 74 20   if( p->pOffset 
100b0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66  ){.      p->iOff
100c0 73 65 74 20 3d 20 69 4f 66 66 73 65 74 20 3d 20  set = iOffset = 
100d0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
100e0 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
100f0 65 6d 2b 2b 3b 20 20 20 2f 2a 20 41 6c 6c 6f 63  em++;   /* Alloc
10100 61 74 65 20 61 6e 20 65 78 74 72 61 20 72 65 67  ate an extra reg
10110 69 73 74 65 72 20 66 6f 72 20 6c 69 6d 69 74 2b  ister for limit+
10120 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 20 20  offset */.      
10130 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
10140 70 50 61 72 73 65 2c 20 70 2d 3e 70 4f 66 66 73  pParse, p->pOffs
10150 65 74 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20  et, iOffset);.  
10160 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10170 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74  ddOp1(v, OP_Must
10180 42 65 49 6e 74 2c 20 69 4f 66 66 73 65 74 29 3b  BeInt, iOffset);
10190 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
101a0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
101b0 65 6e 74 28 28 76 2c 20 22 4f 46 46 53 45 54 20  ent((v, "OFFSET 
101c0 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20  counter"));.    
101d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
101e0 4f 70 33 28 76 2c 20 4f 50 5f 4f 66 66 73 65 74  Op3(v, OP_Offset
101f0 4c 69 6d 69 74 2c 20 69 4c 69 6d 69 74 2c 20 69  Limit, iLimit, i
10200 4f 66 66 73 65 74 2b 31 2c 20 69 4f 66 66 73 65  Offset+1, iOffse
10210 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  t);.      VdbeCo
10220 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54  mment((v, "LIMIT
10230 2b 4f 46 46 53 45 54 22 29 29 3b 0a 20 20 20 20  +OFFSET"));.    
10240 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  }.  }.}..#ifndef
10250 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
10260 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a  POUND_SELECT./*.
10270 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 70  ** Return the ap
10280 70 72 6f 70 72 69 61 74 65 20 63 6f 6c 6c 61 74  propriate collat
10290 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
102a0 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c   the iCol-th col
102b0 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 72 65  umn of.** the re
102c0 73 75 6c 74 20 73 65 74 20 66 6f 72 20 74 68 65  sult set for the
102d0 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74   compound-select
102e0 20 73 74 61 74 65 6d 65 6e 74 20 22 70 22 2e 20   statement "p". 
102f0 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 0a   Return NULL if.
10300 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61  ** the column ha
10310 73 20 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f 6c  s no default col
10320 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e  lating sequence.
10330 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61  .**.** The colla
10340 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f  ting sequence fo
10350 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  r the compound s
10360 65 6c 65 63 74 20 69 73 20 74 61 6b 65 6e 20 66  elect is taken f
10370 72 6f 6d 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d  rom the.** left-
10380 6d 6f 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65  most term of the
10390 20 73 65 6c 65 63 74 20 74 68 61 74 20 68 61 73   select that has
103a0 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71   a collating seq
103b0 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  uence..*/.static
103c0 20 43 6f 6c 6c 53 65 71 20 2a 6d 75 6c 74 69 53   CollSeq *multiS
103d0 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 50 61 72  electCollSeq(Par
103e0 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
103f0 63 74 20 2a 70 2c 20 69 6e 74 20 69 43 6f 6c 29  ct *p, int iCol)
10400 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65  {.  CollSeq *pRe
10410 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  t;.  if( p->pPri
10420 6f 72 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d  or ){.    pRet =
10430 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c   multiSelectColl
10440 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  Seq(pParse, p->p
10450 50 72 69 6f 72 2c 20 69 43 6f 6c 29 3b 0a 20 20  Prior, iCol);.  
10460 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52 65 74 20  }else{.    pRet 
10470 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  = 0;.  }.  asser
10480 74 28 20 69 43 6f 6c 3e 3d 30 20 29 3b 0a 20 20  t( iCol>=0 );.  
10490 2f 2a 20 69 43 6f 6c 20 6d 75 73 74 20 62 65 20  /* iCol must be 
104a0 6c 65 73 73 20 74 68 61 6e 20 70 2d 3e 70 45 4c  less than p->pEL
104b0 69 73 74 2d 3e 6e 45 78 70 72 2e 20 20 4f 74 68  ist->nExpr.  Oth
104c0 65 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72 20  erwise an error 
104d0 77 6f 75 6c 64 0a 20 20 2a 2a 20 68 61 76 65 20  would.  ** have 
104e0 62 65 65 6e 20 74 68 72 6f 77 6e 20 64 75 72 69  been thrown duri
104f0 6e 67 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69  ng name resoluti
10500 6f 6e 20 61 6e 64 20 77 65 20 77 6f 75 6c 64 20  on and we would 
10510 6e 6f 74 20 68 61 76 65 20 67 6f 74 74 65 6e 0a  not have gotten.
10520 20 20 2a 2a 20 74 68 69 73 20 66 61 72 20 2a 2f    ** this far */
10530 0a 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20 26  .  if( pRet==0 &
10540 26 20 41 4c 57 41 59 53 28 69 43 6f 6c 3c 70 2d  & ALWAYS(iCol<p-
10550 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20  >pEList->nExpr) 
10560 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71  ){.    pRet = sq
10570 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
10580 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69  (pParse, p->pELi
10590 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70  st->a[iCol].pExp
105a0 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
105b0 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pRet;.}../*.** 
105c0 54 68 65 20 73 65 6c 65 63 74 20 73 74 61 74 65  The select state
105d0 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73 20 74  ment passed as t
105e0 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65  he second parame
105f0 74 65 72 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e  ter is a compoun
10600 64 20 53 45 4c 45 43 54 0a 2a 2a 20 77 69 74 68  d SELECT.** with
10610 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
10620 75 73 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69  use. This functi
10630 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 64  on allocates and
10640 20 72 65 74 75 72 6e 73 20 61 20 4b 65 79 49 6e   returns a KeyIn
10650 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  fo.** structure 
10660 73 75 69 74 61 62 6c 65 20 66 6f 72 20 69 6d 70  suitable for imp
10670 6c 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 4f 52  lementing the OR
10680 44 45 52 20 42 59 2e 0a 2a 2a 0a 2a 2a 20 53 70  DER BY..**.** Sp
10690 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
106a0 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
106b0 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  e is obtained fr
106c0 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 54 68 65 20 63  om malloc. The c
106d0 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69  alling.** functi
106e0 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  on is responsibl
106f0 65 20 66 6f 72 20 65 6e 73 75 72 69 6e 67 20 74  e for ensuring t
10700 68 61 74 20 74 68 69 73 20 73 74 72 75 63 74 75  hat this structu
10710 72 65 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79  re is eventually
10720 0a 2a 2a 20 66 72 65 65 64 2e 0a 2a 2f 0a 73 74  .** freed..*/.st
10730 61 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6d 75  atic KeyInfo *mu
10740 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79  ltiSelectOrderBy
10750 4b 65 79 49 6e 66 6f 28 50 61 72 73 65 20 2a 70  KeyInfo(Parse *p
10760 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
10770 2c 20 69 6e 74 20 6e 45 78 74 72 61 29 7b 0a 20  , int nExtra){. 
10780 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
10790 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
107a0 79 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42  y;.  int nOrderB
107b0 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d  y = p->pOrderBy-
107c0 3e 6e 45 78 70 72 3b 0a 20 20 73 71 6c 69 74 65  >nExpr;.  sqlite
107d0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
107e0 64 62 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  db;.  KeyInfo *p
107f0 52 65 74 20 3d 20 73 71 6c 69 74 65 33 4b 65 79  Ret = sqlite3Key
10800 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 4f  InfoAlloc(db, nO
10810 72 64 65 72 42 79 2b 6e 45 78 74 72 61 2c 20 31  rderBy+nExtra, 1
10820 29 3b 0a 20 20 69 66 28 20 70 52 65 74 20 29 7b  );.  if( pRet ){
10830 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
10840 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65  for(i=0; i<nOrde
10850 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rBy; i++){.     
10860 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
10870 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
10880 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 3b 0a  pOrderBy->a[i];.
10890 20 20 20 20 20 20 45 78 70 72 20 2a 70 54 65 72        Expr *pTer
108a0 6d 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  m = pItem->pExpr
108b0 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  ;.      CollSeq 
108c0 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 20 20 20 20 69  *pColl;..      i
108d0 66 28 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20  f( pTerm->flags 
108e0 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a  & EP_Collate ){.
108f0 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
10900 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
10910 65 71 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d  eq(pParse, pTerm
10920 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
10930 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
10940 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53  multiSelectCollS
10950 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20 70 49  eq(pParse, p, pI
10960 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42  tem->u.x.iOrderB
10970 79 43 6f 6c 2d 31 29 3b 0a 20 20 20 20 20 20 20  yCol-1);.       
10980 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20   if( pColl==0 ) 
10990 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c  pColl = db->pDfl
109a0 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70  tColl;.        p
109b0 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
109c0 78 70 72 20 3d 0a 20 20 20 20 20 20 20 20 20 20  xpr =.          
109d0 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f  sqlite3ExprAddCo
109e0 6c 6c 61 74 65 53 74 72 69 6e 67 28 70 50 61 72  llateString(pPar
109f0 73 65 2c 20 70 54 65 72 6d 2c 20 70 43 6f 6c 6c  se, pTerm, pColl
10a00 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
10a10 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
10a20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73  sqlite3KeyInfoIs
10a30 57 72 69 74 65 61 62 6c 65 28 70 52 65 74 29 20  Writeable(pRet) 
10a40 29 3b 0a 20 20 20 20 20 20 70 52 65 74 2d 3e 61  );.      pRet->a
10a50 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f 6c 6c 3b  Coll[i] = pColl;
10a60 0a 20 20 20 20 20 20 70 52 65 74 2d 3e 61 53 6f  .      pRet->aSo
10a70 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 4f 72  rtOrder[i] = pOr
10a80 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74  derBy->a[i].sort
10a90 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  Order;.    }.  }
10aa0 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  ..  return pRet;
10ab0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
10ac0 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a  TE_OMIT_CTE./*.*
10ad0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67  * This routine g
10ae0 65 6e 65 72 61 74 65 73 20 56 44 42 45 20 63 6f  enerates VDBE co
10af0 64 65 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  de to compute th
10b00 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 57  e content of a W
10b10 49 54 48 20 52 45 43 55 52 53 49 56 45 0a 2a 2a  ITH RECURSIVE.**
10b20 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f   query of the fo
10b30 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 3c 72 65 63  rm:.**.**   <rec
10b40 75 72 73 69 76 65 2d 74 61 62 6c 65 3e 20 41 53  ursive-table> AS
10b50 20 28 3c 73 65 74 75 70 2d 71 75 65 72 79 3e 20   (<setup-query> 
10b60 55 4e 49 4f 4e 20 5b 41 4c 4c 5d 20 3c 72 65 63  UNION [ALL] <rec
10b70 75 72 73 69 76 65 2d 71 75 65 72 79 3e 29 0a 2a  ursive-query>).*
10b80 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
10b90 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f            \_____
10ba0 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20  ______/         
10bb0 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f      \___________
10bc0 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20 20 20  ____/.**        
10bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10be0 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 20 20 20     p->pPrior    
10bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c00 20 20 70 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65    p.**.**.** The
10c10 72 65 20 69 73 20 65 78 61 63 74 6c 79 20 6f 6e  re is exactly on
10c20 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  e reference to t
10c30 68 65 20 72 65 63 75 72 73 69 76 65 2d 74 61 62  he recursive-tab
10c40 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  le in the FROM c
10c50 6c 61 75 73 65 0a 2a 2a 20 6f 66 20 72 65 63 75  lause.** of recu
10c60 72 73 69 76 65 2d 71 75 65 72 79 2c 20 6d 61 72  rsive-query, mar
10c70 6b 65 64 20 77 69 74 68 20 74 68 65 20 53 72 63  ked with the Src
10c80 4c 69 73 74 2d 3e 61 5b 5d 2e 66 67 2e 69 73 52  List->a[].fg.isR
10c90 65 63 75 72 73 69 76 65 20 66 6c 61 67 2e 0a 2a  ecursive flag..*
10ca0 2a 0a 2a 2a 20 54 68 65 20 73 65 74 75 70 2d 71  *.** The setup-q
10cb0 75 65 72 79 20 72 75 6e 73 20 6f 6e 63 65 20 74  uery runs once t
10cc0 6f 20 67 65 6e 65 72 61 74 65 20 61 6e 20 69 6e  o generate an in
10cd0 69 74 69 61 6c 20 73 65 74 20 6f 66 20 72 6f 77  itial set of row
10ce0 73 20 74 68 61 74 20 67 6f 0a 2a 2a 20 69 6e 74  s that go.** int
10cf0 6f 20 61 20 51 75 65 75 65 20 74 61 62 6c 65 2e  o a Queue table.
10d00 20 20 52 6f 77 73 20 61 72 65 20 65 78 74 72 61    Rows are extra
10d10 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20 51 75  cted from the Qu
10d20 65 75 65 20 74 61 62 6c 65 20 6f 6e 65 20 62 79  eue table one by
10d30 0a 2a 2a 20 6f 6e 65 2e 20 20 45 61 63 68 20 72  .** one.  Each r
10d40 6f 77 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  ow extracted fro
10d50 6d 20 51 75 65 75 65 20 69 73 20 6f 75 74 70 75  m Queue is outpu
10d60 74 20 74 6f 20 70 44 65 73 74 2e 20 20 54 68 65  t to pDest.  The
10d70 6e 20 74 68 65 20 73 69 6e 67 6c 65 0a 2a 2a 20  n the single.** 
10d80 65 78 74 72 61 63 74 65 64 20 72 6f 77 20 28 6e  extracted row (n
10d90 6f 77 20 69 6e 20 74 68 65 20 69 43 75 72 72 65  ow in the iCurre
10da0 6e 74 20 74 61 62 6c 65 29 20 62 65 63 6f 6d 65  nt table) become
10db0 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  s the content of
10dc0 20 74 68 65 0a 2a 2a 20 72 65 63 75 72 73 69 76   the.** recursiv
10dd0 65 2d 74 61 62 6c 65 20 66 6f 72 20 61 20 72 65  e-table for a re
10de0 63 75 72 73 69 76 65 2d 71 75 65 72 79 20 72 75  cursive-query ru
10df0 6e 2e 20 20 54 68 65 20 6f 75 74 70 75 74 20 6f  n.  The output o
10e00 66 20 74 68 65 20 72 65 63 75 72 73 69 76 65 2d  f the recursive-
10e10 71 75 65 72 79 0a 2a 2a 20 69 73 20 61 64 64 65  query.** is adde
10e20 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  d back into the 
10e30 51 75 65 75 65 20 74 61 62 6c 65 2e 20 20 54 68  Queue table.  Th
10e40 65 6e 20 61 6e 6f 74 68 65 72 20 72 6f 77 20 69  en another row i
10e50 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  s extracted from
10e60 20 51 75 65 75 65 0a 2a 2a 20 61 6e 64 20 74 68   Queue.** and th
10e70 65 20 69 74 65 72 61 74 69 6f 6e 20 63 6f 6e 74  e iteration cont
10e80 69 6e 75 65 73 20 75 6e 74 69 6c 20 74 68 65 20  inues until the 
10e90 51 75 65 75 65 20 74 61 62 6c 65 20 69 73 20 65  Queue table is e
10ea0 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  mpty..**.** If t
10eb0 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72  he compound quer
10ec0 79 20 6f 70 65 72 61 74 6f 72 20 69 73 20 55 4e  y operator is UN
10ed0 49 4f 4e 20 74 68 65 6e 20 6e 6f 20 64 75 70 6c  ION then no dupl
10ee0 69 63 61 74 65 20 72 6f 77 73 20 61 72 65 20 65  icate rows are e
10ef0 76 65 72 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20  ver.** inserted 
10f00 69 6e 74 6f 20 74 68 65 20 51 75 65 75 65 20 74  into the Queue t
10f10 61 62 6c 65 2e 20 20 54 68 65 20 69 44 69 73 74  able.  The iDist
10f20 69 6e 63 74 20 74 61 62 6c 65 20 6b 65 65 70 73  inct table keeps
10f30 20 61 20 63 6f 70 79 20 6f 66 20 61 6c 6c 20 72   a copy of all r
10f40 6f 77 73 0a 2a 2a 20 74 68 61 74 20 68 61 76 65  ows.** that have
10f50 20 65 76 65 72 20 62 65 65 6e 20 69 6e 73 65 72   ever been inser
10f60 74 65 64 20 69 6e 74 6f 20 51 75 65 75 65 20 61  ted into Queue a
10f70 6e 64 20 63 61 75 73 65 73 20 64 75 70 6c 69 63  nd causes duplic
10f80 61 74 65 73 20 74 6f 20 62 65 0a 2a 2a 20 64 69  ates to be.** di
10f90 73 63 61 72 64 65 64 2e 20 20 49 66 20 74 68 65  scarded.  If the
10fa0 20 6f 70 65 72 61 74 6f 72 20 69 73 20 55 4e 49   operator is UNI
10fb0 4f 4e 20 41 4c 4c 2c 20 74 68 65 6e 20 64 75 70  ON ALL, then dup
10fc0 6c 69 63 61 74 65 73 20 61 72 65 20 61 6c 6c 6f  licates are allo
10fd0 77 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74  wed..** .** If t
10fe0 68 65 20 71 75 65 72 79 20 68 61 73 20 61 6e 20  he query has an 
10ff0 4f 52 44 45 52 20 42 59 2c 20 74 68 65 6e 20 65  ORDER BY, then e
11000 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 51 75  ntries in the Qu
11010 65 75 65 20 74 61 62 6c 65 20 61 72 65 20 6b 65  eue table are ke
11020 70 74 20 69 6e 0a 2a 2a 20 4f 52 44 45 52 20 42  pt in.** ORDER B
11030 59 20 6f 72 64 65 72 20 61 6e 64 20 74 68 65 20  Y order and the 
11040 66 69 72 73 74 20 65 6e 74 72 79 20 69 73 20 65  first entry is e
11050 78 74 72 61 63 74 65 64 20 66 6f 72 20 65 61 63  xtracted for eac
11060 68 20 63 79 63 6c 65 2e 20 20 57 69 74 68 6f 75  h cycle.  Withou
11070 74 0a 2a 2a 20 61 6e 20 4f 52 44 45 52 20 42 59  t.** an ORDER BY
11080 2c 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c  , the Queue tabl
11090 65 20 69 73 20 6a 75 73 74 20 61 20 46 49 46 4f  e is just a FIFO
110a0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 4c 49 4d  ..**.** If a LIM
110b0 49 54 20 63 6c 61 75 73 65 20 69 73 20 70 72 6f  IT clause is pro
110c0 76 69 64 65 64 2c 20 74 68 65 6e 20 74 68 65 20  vided, then the 
110d0 69 74 65 72 61 74 69 6f 6e 20 73 74 6f 70 73 20  iteration stops 
110e0 61 66 74 65 72 20 4c 49 4d 49 54 20 72 6f 77 73  after LIMIT rows
110f0 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 6f 75  .** have been ou
11100 74 70 75 74 20 74 6f 20 70 44 65 73 74 2e 20 20  tput to pDest.  
11110 41 20 4c 49 4d 49 54 20 6f 66 20 7a 65 72 6f 20  A LIMIT of zero 
11120 6d 65 61 6e 73 20 74 6f 20 6f 75 74 70 75 74 20  means to output 
11130 6e 6f 20 72 6f 77 73 20 61 6e 64 20 61 0a 2a 2a  no rows and a.**
11140 20 6e 65 67 61 74 69 76 65 20 4c 49 4d 49 54 20   negative LIMIT 
11150 6d 65 61 6e 73 20 74 6f 20 6f 75 74 70 75 74 20  means to output 
11160 61 6c 6c 20 72 6f 77 73 2e 20 20 49 66 20 74 68  all rows.  If th
11170 65 72 65 20 69 73 20 61 6c 73 6f 20 61 6e 20 4f  ere is also an O
11180 46 46 53 45 54 20 63 6c 61 75 73 65 0a 2a 2a 20  FFSET clause.** 
11190 77 69 74 68 20 61 20 70 6f 73 69 74 69 76 65 20  with a positive 
111a0 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 68 65 20  value, then the 
111b0 66 69 72 73 74 20 4f 46 46 53 45 54 20 6f 75 74  first OFFSET out
111c0 70 75 74 73 20 61 72 65 20 64 69 73 63 61 72 64  puts are discard
111d0 65 64 20 72 61 74 68 65 72 0a 2a 2a 20 74 68 61  ed rather.** tha
111e0 6e 20 62 65 69 6e 67 20 73 65 6e 74 20 74 6f 20  n being sent to 
111f0 70 44 65 73 74 2e 20 20 54 68 65 20 4c 49 4d 49  pDest.  The LIMI
11200 54 20 63 6f 75 6e 74 20 64 6f 65 73 20 6e 6f 74  T count does not
11210 20 62 65 67 69 6e 20 75 6e 74 69 6c 20 61 66 74   begin until aft
11220 65 72 20 4f 46 46 53 45 54 0a 2a 2a 20 72 6f 77  er OFFSET.** row
11230 73 20 68 61 76 65 20 62 65 65 6e 20 73 6b 69 70  s have been skip
11240 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ped..*/.static v
11250 6f 69 64 20 67 65 6e 65 72 61 74 65 57 69 74 68  oid generateWith
11260 52 65 63 75 72 73 69 76 65 51 75 65 72 79 28 0a  RecursiveQuery(.
11270 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
11280 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
11290 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
112a0 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
112b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63        /* The rec
112c0 75 72 73 69 76 65 20 53 45 4c 45 43 54 20 74 6f  ursive SELECT to
112d0 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53   be coded */.  S
112e0 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
112f0 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
11300 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65  do with query re
11310 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 53 72  sults */.){.  Sr
11320 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70 2d  cList *pSrc = p-
11330 3e 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54  >pSrc;      /* T
11340 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
11350 66 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20  f the recursive 
11360 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e  query */.  int n
11370 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  Col = p->pEList-
11380 3e 6e 45 78 70 72 3b 20 20 2f 2a 20 4e 75 6d 62  >nExpr;  /* Numb
11390 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
113a0 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20 74   the recursive t
113b0 61 62 6c 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a  able */.  Vdbe *
113c0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
113d0 65 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  e;      /* The p
113e0 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
113f0 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  t under construc
11400 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74  tion */.  Select
11410 20 2a 70 53 65 74 75 70 20 3d 20 70 2d 3e 70 50   *pSetup = p->pP
11420 72 69 6f 72 3b 20 20 20 2f 2a 20 54 68 65 20 73  rior;   /* The s
11430 65 74 75 70 20 71 75 65 72 79 20 2a 2f 0a 20 20  etup query */.  
11440 69 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20 20  int addrTop;    
11450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11460 20 54 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70   Top of the loop
11470 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f   */.  int addrCo
11480 6e 74 2c 20 61 64 64 72 42 72 65 61 6b 3b 20 20  nt, addrBreak;  
11490 20 20 20 20 2f 2a 20 43 4f 4e 54 49 4e 55 45 20      /* CONTINUE 
114a0 61 6e 64 20 42 52 45 41 4b 20 61 64 64 72 65 73  and BREAK addres
114b0 73 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75  ses */.  int iCu
114c0 72 72 65 6e 74 20 3d 20 30 3b 20 20 20 20 20 20  rrent = 0;      
114d0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 43 75         /* The Cu
114e0 72 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20  rrent table */. 
114f0 20 69 6e 74 20 72 65 67 43 75 72 72 65 6e 74 3b   int regCurrent;
11500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11510 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69  * Register holdi
11520 6e 67 20 43 75 72 72 65 6e 74 20 74 61 62 6c 65  ng Current table
11530 20 2a 2f 0a 20 20 69 6e 74 20 69 51 75 65 75 65   */.  int iQueue
11540 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11550 20 20 20 20 2f 2a 20 54 68 65 20 51 75 65 75 65      /* The Queue
11560 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
11570 69 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 20 20  iDistinct = 0;  
11580 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 20            /* To 
11590 65 6e 73 75 72 65 20 75 6e 69 71 75 65 20 72 65  ensure unique re
115a0 73 75 6c 74 73 20 69 66 20 55 4e 49 4f 4e 20 2a  sults if UNION *
115b0 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20  /.  int eDest = 
115c0 53 52 54 5f 46 69 66 6f 3b 20 20 20 20 20 20 20  SRT_Fifo;       
115d0 20 20 2f 2a 20 48 6f 77 20 74 6f 20 77 72 69 74    /* How to writ
115e0 65 20 74 6f 20 51 75 65 75 65 20 2a 2f 0a 20 20  e to Queue */.  
115f0 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 51  SelectDest destQ
11600 75 65 75 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  ueue;         /*
11610 20 53 65 6c 65 63 74 44 65 73 74 20 74 61 72 67   SelectDest targ
11620 65 74 74 69 6e 67 20 74 68 65 20 51 75 65 75 65  etting the Queue
11630 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
11640 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
11650 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
11660 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
11670 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
11680 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11690 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20  Result code */. 
116a0 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
116b0 72 42 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f  rBy;           /
116c0 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63  * The ORDER BY c
116d0 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 20  lause */.  Expr 
116e0 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65  *pLimit, *pOffse
116f0 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65  t;       /* Save
11700 64 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  d LIMIT and OFFS
11710 45 54 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c  ET */.  int regL
11720 69 6d 69 74 2c 20 72 65 67 4f 66 66 73 65 74 3b  imit, regOffset;
11730 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
11740 72 73 20 75 73 65 64 20 62 79 20 4c 49 4d 49 54  rs used by LIMIT
11750 20 61 6e 64 20 4f 46 46 53 45 54 20 2a 2f 0a 0a   and OFFSET */..
11760 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 75 74 68    /* Obtain auth
11770 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20 64 6f 20  orization to do 
11780 61 20 72 65 63 75 72 73 69 76 65 20 71 75 65 72  a recursive quer
11790 79 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74  y */.  if( sqlit
117a0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
117b0 73 65 2c 20 53 51 4c 49 54 45 5f 52 45 43 55 52  se, SQLITE_RECUR
117c0 53 49 56 45 2c 20 30 2c 20 30 2c 20 30 29 20 29  SIVE, 0, 0, 0) )
117d0 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 50   return;..  /* P
117e0 72 6f 63 65 73 73 20 74 68 65 20 4c 49 4d 49 54  rocess the LIMIT
117f0 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61 75   and OFFSET clau
11800 73 65 73 2c 20 69 66 20 74 68 65 79 20 65 78 69  ses, if they exi
11810 73 74 20 2a 2f 0a 20 20 61 64 64 72 42 72 65 61  st */.  addrBrea
11820 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  k = sqlite3VdbeM
11830 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 63  akeLabel(v);.  c
11840 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
11850 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20  ters(pParse, p, 
11860 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 70 4c  addrBreak);.  pL
11870 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
11880 3b 0a 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d  ;.  pOffset = p-
11890 3e 70 4f 66 66 73 65 74 3b 0a 20 20 72 65 67 4c  >pOffset;.  regL
118a0 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74  imit = p->iLimit
118b0 3b 0a 20 20 72 65 67 4f 66 66 73 65 74 20 3d 20  ;.  regOffset = 
118c0 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d  p->iOffset;.  p-
118d0 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4f 66  >pLimit = p->pOf
118e0 66 73 65 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 69  fset = 0;.  p->i
118f0 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4f 66 66 73  Limit = p->iOffs
11900 65 74 20 3d 20 30 3b 0a 20 20 70 4f 72 64 65 72  et = 0;.  pOrder
11910 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
11920 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74  ;..  /* Locate t
11930 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
11940 20 6f 66 20 74 68 65 20 43 75 72 72 65 6e 74 20   of the Current 
11950 74 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69  table */.  for(i
11960 3d 30 3b 20 41 4c 57 41 59 53 28 69 3c 70 53 72  =0; ALWAYS(i<pSr
11970 63 2d 3e 6e 53 72 63 29 3b 20 69 2b 2b 29 7b 0a  c->nSrc); i++){.
11980 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b      if( pSrc->a[
11990 69 5d 2e 66 67 2e 69 73 52 65 63 75 72 73 69 76  i].fg.isRecursiv
119a0 65 20 29 7b 0a 20 20 20 20 20 20 69 43 75 72 72  e ){.      iCurr
119b0 65 6e 74 20 3d 20 70 53 72 63 2d 3e 61 5b 69 5d  ent = pSrc->a[i]
119c0 2e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20  .iCursor;.      
119d0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
119e0 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
119f0 63 75 72 73 6f 72 73 20 6e 75 6d 62 65 72 73 20  cursors numbers 
11a00 66 6f 72 20 51 75 65 75 65 20 61 6e 64 20 44 69  for Queue and Di
11a10 73 74 69 6e 63 74 2e 20 20 54 68 65 20 63 75 72  stinct.  The cur
11a20 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 0a 20  sor number for. 
11a30 20 2a 2a 20 74 68 65 20 44 69 73 74 69 6e 63 74   ** the Distinct
11a40 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 65   table must be e
11a50 78 61 63 74 6c 79 20 6f 6e 65 20 67 72 65 61 74  xactly one great
11a60 65 72 20 74 68 61 6e 20 51 75 65 75 65 20 69 6e  er than Queue in
11a70 20 6f 72 64 65 72 0a 20 20 2a 2a 20 66 6f 72 20   order.  ** for 
11a80 74 68 65 20 53 52 54 5f 44 69 73 74 46 69 66 6f  the SRT_DistFifo
11a90 20 61 6e 64 20 53 52 54 5f 44 69 73 74 51 75 65   and SRT_DistQue
11aa0 75 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 73 20  ue destinations 
11ab0 74 6f 20 77 6f 72 6b 2e 20 2a 2f 0a 20 20 69 51  to work. */.  iQ
11ac0 75 65 75 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e  ueue = pParse->n
11ad0 54 61 62 2b 2b 3b 0a 20 20 69 66 28 20 70 2d 3e  Tab++;.  if( p->
11ae0 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a  op==TK_UNION ){.
11af0 20 20 20 20 65 44 65 73 74 20 3d 20 70 4f 72 64      eDest = pOrd
11b00 65 72 42 79 20 3f 20 53 52 54 5f 44 69 73 74 51  erBy ? SRT_DistQ
11b10 75 65 75 65 20 3a 20 53 52 54 5f 44 69 73 74 46  ueue : SRT_DistF
11b20 69 66 6f 3b 0a 20 20 20 20 69 44 69 73 74 69 6e  ifo;.    iDistin
11b30 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ct = pParse->nTa
11b40 62 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  b++;.  }else{.  
11b50 20 20 65 44 65 73 74 20 3d 20 70 4f 72 64 65 72    eDest = pOrder
11b60 42 79 20 3f 20 53 52 54 5f 51 75 65 75 65 20 3a  By ? SRT_Queue :
11b70 20 53 52 54 5f 46 69 66 6f 3b 0a 20 20 7d 0a 20   SRT_Fifo;.  }. 
11b80 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
11b90 73 74 49 6e 69 74 28 26 64 65 73 74 51 75 65 75  stInit(&destQueu
11ba0 65 2c 20 65 44 65 73 74 2c 20 69 51 75 65 75 65  e, eDest, iQueue
11bb0 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
11bc0 65 20 63 75 72 73 6f 72 73 20 66 6f 72 20 43 75  e cursors for Cu
11bd0 72 72 65 6e 74 2c 20 51 75 65 75 65 2c 20 61 6e  rrent, Queue, an
11be0 64 20 44 69 73 74 69 6e 63 74 2e 20 2a 2f 0a 20  d Distinct. */. 
11bf0 20 72 65 67 43 75 72 72 65 6e 74 20 3d 20 2b 2b   regCurrent = ++
11c00 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
11c10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11c20 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75  3(v, OP_OpenPseu
11c30 64 6f 2c 20 69 43 75 72 72 65 6e 74 2c 20 72 65  do, iCurrent, re
11c40 67 43 75 72 72 65 6e 74 2c 20 6e 43 6f 6c 29 3b  gCurrent, nCol);
11c50 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
11c60 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  ){.    KeyInfo *
11c70 70 4b 65 79 49 6e 66 6f 20 3d 20 6d 75 6c 74 69  pKeyInfo = multi
11c80 53 65 6c 65 63 74 4f 72 64 65 72 42 79 4b 65 79  SelectOrderByKey
11c90 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 2c 20  Info(pParse, p, 
11ca0 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
11cb0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
11cc0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69  OpenEphemeral, i
11cd0 51 75 65 75 65 2c 20 70 4f 72 64 65 72 42 79 2d  Queue, pOrderBy-
11ce0 3e 6e 45 78 70 72 2b 32 2c 20 30 2c 0a 20 20 20  >nExpr+2, 0,.   
11cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d00 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e     (char*)pKeyIn
11d10 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
11d20 0a 20 20 20 20 64 65 73 74 51 75 65 75 65 2e 70  .    destQueue.p
11d30 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
11d40 42 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  By;.  }else{.   
11d50 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11d60 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
11d70 65 6d 65 72 61 6c 2c 20 69 51 75 65 75 65 2c 20  emeral, iQueue, 
11d80 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20 56 64 62  nCol);.  }.  Vdb
11d90 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 51 75  eComment((v, "Qu
11da0 65 75 65 20 74 61 62 6c 65 22 29 29 3b 0a 20 20  eue table"));.  
11db0 69 66 28 20 69 44 69 73 74 69 6e 63 74 20 29 7b  if( iDistinct ){
11dc0 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e  .    p->addrOpen
11dd0 45 70 68 6d 5b 30 5d 20 3d 20 73 71 6c 69 74 65  Ephm[0] = sqlite
11de0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
11df0 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
11e00 20 69 44 69 73 74 69 6e 63 74 2c 20 30 29 3b 0a   iDistinct, 0);.
11e10 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20      p->selFlags 
11e20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65  |= SF_UsesEpheme
11e30 72 61 6c 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44  ral;.  }..  /* D
11e40 65 74 61 63 68 20 74 68 65 20 4f 52 44 45 52 20  etach the ORDER 
11e50 42 59 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74  BY clause from t
11e60 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  he compound SELE
11e70 43 54 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65  CT */.  p->pOrde
11e80 72 42 79 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53  rBy = 0;..  /* S
11e90 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
11ea0 20 6f 66 20 74 68 65 20 73 65 74 75 70 2d 71 75   of the setup-qu
11eb0 65 72 79 20 69 6e 20 51 75 65 75 65 2e 20 2a 2f  ery in Queue. */
11ec0 0a 20 20 70 53 65 74 75 70 2d 3e 70 4e 65 78 74  .  pSetup->pNext
11ed0 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c   = 0;.  rc = sql
11ee0 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
11ef0 65 2c 20 70 53 65 74 75 70 2c 20 26 64 65 73 74  e, pSetup, &dest
11f00 51 75 65 75 65 29 3b 0a 20 20 70 53 65 74 75 70  Queue);.  pSetup
11f10 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 69  ->pNext = p;.  i
11f20 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64  f( rc ) goto end
11f30 5f 6f 66 5f 72 65 63 75 72 73 69 76 65 5f 71 75  _of_recursive_qu
11f40 65 72 79 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20  ery;..  /* Find 
11f50 74 68 65 20 6e 65 78 74 20 72 6f 77 20 69 6e 20  the next row in 
11f60 74 68 65 20 51 75 65 75 65 20 61 6e 64 20 6f 75  the Queue and ou
11f70 74 70 75 74 20 74 68 61 74 20 72 6f 77 20 2a 2f  tput that row */
11f80 0a 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c  .  addrTop = sql
11f90 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
11fa0 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 51 75  , OP_Rewind, iQu
11fb0 65 75 65 2c 20 61 64 64 72 42 72 65 61 6b 29 3b  eue, addrBreak);
11fc0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
11fd0 3b 0a 0a 20 20 2f 2a 20 54 72 61 6e 73 66 65 72  ;..  /* Transfer
11fe0 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 69 6e   the next row in
11ff0 20 51 75 65 75 65 20 6f 76 65 72 20 74 6f 20 43   Queue over to C
12000 75 72 72 65 6e 74 20 2a 2f 0a 20 20 73 71 6c 69  urrent */.  sqli
12010 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
12020 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 69 43 75   OP_NullRow, iCu
12030 72 72 65 6e 74 29 3b 20 2f 2a 20 54 6f 20 72 65  rrent); /* To re
12040 73 65 74 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  set column cache
12050 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72   */.  if( pOrder
12060 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  By ){.    sqlite
12070 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
12080 50 5f 43 6f 6c 75 6d 6e 2c 20 69 51 75 65 75 65  P_Column, iQueue
12090 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  , pOrderBy->nExp
120a0 72 2b 31 2c 20 72 65 67 43 75 72 72 65 6e 74 29  r+1, regCurrent)
120b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
120c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
120d0 28 76 2c 20 4f 50 5f 52 6f 77 44 61 74 61 2c 20  (v, OP_RowData, 
120e0 69 51 75 65 75 65 2c 20 72 65 67 43 75 72 72 65  iQueue, regCurre
120f0 6e 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  nt);.  }.  sqlit
12100 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
12110 4f 50 5f 44 65 6c 65 74 65 2c 20 69 51 75 65 75  OP_Delete, iQueu
12120 65 29 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74  e);..  /* Output
12130 20 74 68 65 20 73 69 6e 67 6c 65 20 72 6f 77 20   the single row 
12140 69 6e 20 43 75 72 72 65 6e 74 20 2a 2f 0a 20 20  in Current */.  
12150 61 64 64 72 43 6f 6e 74 20 3d 20 73 71 6c 69 74  addrCont = sqlit
12160 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
12170 76 29 3b 0a 20 20 63 6f 64 65 4f 66 66 73 65 74  v);.  codeOffset
12180 28 76 2c 20 72 65 67 4f 66 66 73 65 74 2c 20 61  (v, regOffset, a
12190 64 64 72 43 6f 6e 74 29 3b 0a 20 20 73 65 6c 65  ddrCont);.  sele
121a0 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
121b0 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74  se, p, p->pEList
121c0 2c 20 69 43 75 72 72 65 6e 74 2c 0a 20 20 20 20  , iCurrent,.    
121d0 20 20 30 2c 20 30 2c 20 70 44 65 73 74 2c 20 61    0, 0, pDest, a
121e0 64 64 72 43 6f 6e 74 2c 20 61 64 64 72 42 72 65  ddrCont, addrBre
121f0 61 6b 29 3b 0a 20 20 69 66 28 20 72 65 67 4c 69  ak);.  if( regLi
12200 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  mit ){.    sqlit
12210 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
12220 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c  OP_DecrJumpZero,
12230 20 72 65 67 4c 69 6d 69 74 2c 20 61 64 64 72 42   regLimit, addrB
12240 72 65 61 6b 29 3b 0a 20 20 20 20 56 64 62 65 43  reak);.    VdbeC
12250 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a  overage(v);.  }.
12260 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
12270 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
12280 72 43 6f 6e 74 29 3b 0a 0a 20 20 2f 2a 20 45 78  rCont);..  /* Ex
12290 65 63 75 74 65 20 74 68 65 20 72 65 63 75 72 73  ecute the recurs
122a0 69 76 65 20 53 45 4c 45 43 54 20 74 61 6b 69 6e  ive SELECT takin
122b0 67 20 74 68 65 20 73 69 6e 67 6c 65 20 72 6f 77  g the single row
122c0 20 69 6e 20 43 75 72 72 65 6e 74 20 61 73 0a 20   in Current as. 
122d0 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 66 6f   ** the value fo
122e0 72 20 74 68 65 20 72 65 63 75 72 73 69 76 65 2d  r the recursive-
122f0 74 61 62 6c 65 2e 20 53 74 6f 72 65 20 74 68 65  table. Store the
12300 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20   results in the 
12310 51 75 65 75 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  Queue..  */.  if
12320 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
12330 53 46 5f 41 67 67 72 65 67 61 74 65 20 29 7b 0a  SF_Aggregate ){.
12340 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
12350 4d 73 67 28 70 50 61 72 73 65 2c 20 22 72 65 63  Msg(pParse, "rec
12360 75 72 73 69 76 65 20 61 67 67 72 65 67 61 74 65  ursive aggregate
12370 20 71 75 65 72 69 65 73 20 6e 6f 74 20 73 75 70   queries not sup
12380 70 6f 72 74 65 64 22 29 3b 0a 20 20 7d 65 6c 73  ported");.  }els
12390 65 7b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  e{.    p->pPrior
123a0 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
123b0 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
123c0 70 2c 20 26 64 65 73 74 51 75 65 75 65 29 3b 0a  p, &destQueue);.
123d0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
123e0 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 20 20 20 20  Prior==0 );.    
123f0 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 53 65 74  p->pPrior = pSet
12400 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4b 65  up;.  }..  /* Ke
12410 65 70 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 6c  ep running the l
12420 6f 6f 70 20 75 6e 74 69 6c 20 74 68 65 20 51 75  oop until the Qu
12430 65 75 65 20 69 73 20 65 6d 70 74 79 20 2a 2f 0a  eue is empty */.
12440 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
12450 6f 28 76 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20  o(v, addrTop);. 
12460 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
12470 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
12480 42 72 65 61 6b 29 3b 0a 0a 65 6e 64 5f 6f 66 5f  Break);..end_of_
12490 72 65 63 75 72 73 69 76 65 5f 71 75 65 72 79 3a  recursive_query:
124a0 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
124b0 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  stDelete(pParse-
124c0 3e 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  >db, p->pOrderBy
124d0 29 3b 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42 79  );.  p->pOrderBy
124e0 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70   = pOrderBy;.  p
124f0 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69  ->pLimit = pLimi
12500 74 3b 0a 20 20 70 2d 3e 70 4f 66 66 73 65 74 20  t;.  p->pOffset 
12510 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 72 65 74  = pOffset;.  ret
12520 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  urn;.}.#endif /*
12530 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45   SQLITE_OMIT_CTE
12540 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20   */../* Forward 
12550 72 65 66 65 72 65 6e 63 65 73 20 2a 2f 0a 73 74  references */.st
12560 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65  atic int multiSe
12570 6c 65 63 74 4f 72 64 65 72 42 79 28 0a 20 20 50  lectOrderBy(.  P
12580 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
12590 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
125a0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
125b0 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
125c0 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d     /* The right-
125d0 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20  most of SELECTs 
125e0 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
125f0 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
12600 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74  st     /* What t
12610 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20  o do with query 
12620 72 65 73 75 6c 74 73 20 2a 2f 0a 29 3b 0a 0a 2f  results */.);../
12630 2a 0a 2a 2a 20 48 61 6e 64 6c 65 20 74 68 65 20  *.** Handle the 
12640 73 70 65 63 69 61 6c 20 63 61 73 65 20 6f 66 20  special case of 
12650 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63  a compound-selec
12660 74 20 74 68 61 74 20 6f 72 69 67 69 6e 61 74 65  t that originate
12670 73 20 66 72 6f 6d 20 61 0a 2a 2a 20 56 41 4c 55  s from a.** VALU
12680 45 53 20 63 6c 61 75 73 65 2e 20 20 42 79 20 68  ES clause.  By h
12690 61 6e 64 6c 69 6e 67 20 74 68 69 73 20 61 73 20  andling this as 
126a0 61 20 73 70 65 63 69 61 6c 20 63 61 73 65 2c 20  a special case, 
126b0 77 65 20 61 76 6f 69 64 20 64 65 65 70 0a 2a 2a  we avoid deep.**
126c0 20 72 65 63 75 72 73 69 6f 6e 2c 20 61 6e 64 20   recursion, and 
126d0 74 68 75 73 20 64 6f 20 6e 6f 74 20 6e 65 65 64  thus do not need
126e0 20 74 6f 20 65 6e 66 6f 72 63 65 20 74 68 65 20   to enforce the 
126f0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d  SQLITE_LIMIT_COM
12700 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2a 2a 20  POUND_SELECT.** 
12710 6f 6e 20 61 20 56 41 4c 55 45 53 20 63 6c 61 75  on a VALUES clau
12720 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 63 61 75 73  se..**.** Becaus
12730 65 20 74 68 65 20 53 65 6c 65 63 74 20 6f 62 6a  e the Select obj
12740 65 63 74 20 6f 72 69 67 69 6e 61 74 65 73 20 66  ect originates f
12750 72 6f 6d 20 61 20 56 41 4c 55 45 53 20 63 6c 61  rom a VALUES cla
12760 75 73 65 3a 0a 2a 2a 20 20 20 28 31 29 20 49 74  use:.**   (1) It
12770 20 68 61 73 20 6e 6f 20 4c 49 4d 49 54 20 6f 72   has no LIMIT or
12780 20 4f 46 46 53 45 54 0a 2a 2a 20 20 20 28 32 29   OFFSET.**   (2)
12790 20 41 6c 6c 20 74 65 72 6d 73 20 61 72 65 20 55   All terms are U
127a0 4e 49 4f 4e 20 41 4c 4c 0a 2a 2a 20 20 20 28 33  NION ALL.**   (3
127b0 29 20 54 68 65 72 65 20 69 73 20 6e 6f 20 4f 52  ) There is no OR
127c0 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 2a 2f  DER BY clause.*/
127d0 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74  .static int mult
127e0 69 53 65 6c 65 63 74 56 61 6c 75 65 73 28 0a 20  iSelectValues(. 
127f0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
12800 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
12810 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
12820 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
12830 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
12840 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54  t-most of SELECT
12850 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  s to be coded */
12860 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
12870 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74  Dest     /* What
12880 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72   to do with quer
12890 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a  y results */.){.
128a0 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72    Select *pPrior
128b0 3b 0a 20 20 69 6e 74 20 6e 52 6f 77 20 3d 20 31  ;.  int nRow = 1
128c0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a  ;.  int rc = 0;.
128d0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 65 6c    assert( p->sel
128e0 46 6c 61 67 73 20 26 20 53 46 5f 4d 75 6c 74 69  Flags & SF_Multi
128f0 56 61 6c 75 65 20 29 3b 0a 20 20 64 6f 7b 0a 20  Value );.  do{. 
12900 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 65     assert( p->se
12910 6c 46 6c 61 67 73 20 26 20 53 46 5f 56 61 6c 75  lFlags & SF_Valu
12920 65 73 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  es );.    assert
12930 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20  ( p->op==TK_ALL 
12940 7c 7c 20 28 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  || (p->op==TK_SE
12950 4c 45 43 54 20 26 26 20 70 2d 3e 70 50 72 69 6f  LECT && p->pPrio
12960 72 3d 3d 30 29 20 29 3b 0a 20 20 20 20 61 73 73  r==0) );.    ass
12970 65 72 74 28 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d  ert( p->pLimit==
12980 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
12990 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20 29   p->pOffset==0 )
129a0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
129b0 3e 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 2d 3e  >pNext==0 || p->
129c0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70  pEList->nExpr==p
129d0 2d 3e 70 4e 65 78 74 2d 3e 70 45 4c 69 73 74 2d  ->pNext->pEList-
129e0 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 69 66  >nExpr );.    if
129f0 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  ( p->pPrior==0 )
12a00 20 62 72 65 61 6b 3b 0a 20 20 20 20 61 73 73 65   break;.    asse
12a10 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 2d 3e 70  rt( p->pPrior->p
12a20 4e 65 78 74 3d 3d 70 20 29 3b 0a 20 20 20 20 70  Next==p );.    p
12a30 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
12a40 20 20 6e 52 6f 77 2b 2b 3b 0a 20 20 7d 77 68 69    nRow++;.  }whi
12a50 6c 65 28 31 29 3b 0a 20 20 77 68 69 6c 65 28 20  le(1);.  while( 
12a60 70 20 29 7b 0a 20 20 20 20 70 50 72 69 6f 72 20  p ){.    pPrior 
12a70 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  = p->pPrior;.   
12a80 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
12a90 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
12aa0 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
12ab0 2c 20 70 44 65 73 74 29 3b 0a 20 20 20 20 70 2d  , pDest);.    p-
12ac0 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
12ad0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 62  ;.    if( rc ) b
12ae0 72 65 61 6b 3b 0a 20 20 20 20 70 2d 3e 6e 53 65  reak;.    p->nSe
12af0 6c 65 63 74 52 6f 77 20 3d 20 6e 52 6f 77 3b 0a  lectRow = nRow;.
12b00 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74      p = p->pNext
12b10 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
12b20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
12b30 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
12b40 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 61 20  ed to process a 
12b50 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 66  compound query f
12b60 6f 72 6d 20 66 72 6f 6d 0a 2a 2a 20 74 77 6f 20  orm from.** two 
12b70 6f 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65  or more separate
12b80 20 71 75 65 72 69 65 73 20 75 73 69 6e 67 20 55   queries using U
12b90 4e 49 4f 4e 2c 20 55 4e 49 4f 4e 20 41 4c 4c 2c  NION, UNION ALL,
12ba0 20 45 58 43 45 50 54 2c 20 6f 72 0a 2a 2a 20 49   EXCEPT, or.** I
12bb0 4e 54 45 52 53 45 43 54 0a 2a 2a 0a 2a 2a 20 22  NTERSECT.**.** "
12bc0 70 22 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  p" points to the
12bd0 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 74   right-most of t
12be0 68 65 20 74 77 6f 20 71 75 65 72 69 65 73 2e 20  he two queries. 
12bf0 20 74 68 65 20 71 75 65 72 79 20 6f 6e 20 74 68   the query on th
12c00 65 0a 2a 2a 20 6c 65 66 74 20 69 73 20 70 2d 3e  e.** left is p->
12c10 70 50 72 69 6f 72 2e 20 20 54 68 65 20 6c 65 66  pPrior.  The lef
12c20 74 20 71 75 65 72 79 20 63 6f 75 6c 64 20 61 6c  t query could al
12c30 73 6f 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64  so be a compound
12c40 20 71 75 65 72 79 0a 2a 2a 20 69 6e 20 77 68 69   query.** in whi
12c50 63 68 20 63 61 73 65 20 74 68 69 73 20 72 6f 75  ch case this rou
12c60 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61 6c  tine will be cal
12c70 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c 79 2e  led recursively.
12c80 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75   .**.** The resu
12c90 6c 74 73 20 6f 66 20 74 68 65 20 74 6f 74 61 6c  lts of the total
12ca0 20 71 75 65 72 79 20 61 72 65 20 74 6f 20 62 65   query are to be
12cb0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 61 20   written into a 
12cc0 64 65 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f  destination.** o
12cd0 66 20 74 79 70 65 20 65 44 65 73 74 20 77 69 74  f type eDest wit
12ce0 68 20 70 61 72 61 6d 65 74 65 72 20 69 50 61 72  h parameter iPar
12cf0 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65  m..**.** Example
12d00 20 31 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 20   1:  Consider a 
12d10 74 68 72 65 65 2d 77 61 79 20 63 6f 6d 70 6f 75  three-way compou
12d20 6e 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  nd SQL statement
12d30 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  ..**.**     SELE
12d40 43 54 20 61 20 46 52 4f 4d 20 74 31 20 55 4e 49  CT a FROM t1 UNI
12d50 4f 4e 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d  ON SELECT b FROM
12d60 20 74 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54   t2 UNION SELECT
12d70 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a   c FROM t3.**.**
12d80 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   This statement 
12d90 69 73 20 70 61 72 73 65 64 20 75 70 20 61 73 20  is parsed up as 
12da0 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
12db0 20 20 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d     SELECT c FROM
12dc0 20 74 33 0a 2a 2a 20 20 20 20 20 20 7c 0a 2a 2a   t3.**      |.**
12dd0 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 3e 20 20 53        `----->  S
12de0 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32 0a  ELECT b FROM t2.
12df0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
12e00 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
12e10 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 2d 3e 20 20        `------>  
12e20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31  SELECT a FROM t1
12e30 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 72 6f 77  .**.** The arrow
12e40 73 20 69 6e 20 74 68 65 20 64 69 61 67 72 61 6d  s in the diagram
12e50 20 61 62 6f 76 65 20 72 65 70 72 65 73 65 6e 74   above represent
12e60 20 74 68 65 20 53 65 6c 65 63 74 2e 70 50 72 69   the Select.pPri
12e70 6f 72 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 20 53  or pointer..** S
12e80 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  o if this routin
12e90 65 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68  e is called with
12ea0 20 70 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20   p equal to the 
12eb0 74 33 20 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a  t3 query, then.*
12ec0 2a 20 70 50 72 69 6f 72 20 77 69 6c 6c 20 62 65  * pPrior will be
12ed0 20 74 68 65 20 74 32 20 71 75 65 72 79 2e 20 20   the t2 query.  
12ee0 70 2d 3e 6f 70 20 77 69 6c 6c 20 62 65 20 54 4b  p->op will be TK
12ef0 5f 55 4e 49 4f 4e 20 69 6e 20 74 68 69 73 20 63  _UNION in this c
12f00 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69 63  ase..**.** Notic
12f10 65 20 74 68 61 74 20 62 65 63 61 75 73 65 20 6f  e that because o
12f20 66 20 74 68 65 20 77 61 79 20 53 51 4c 69 74 65  f the way SQLite
12f30 20 70 61 72 73 65 73 20 63 6f 6d 70 6f 75 6e 64   parses compound
12f40 20 53 45 4c 45 43 54 73 2c 20 74 68 65 0a 2a 2a   SELECTs, the.**
12f50 20 69 6e 64 69 76 69 64 75 61 6c 20 73 65 6c 65   individual sele
12f60 63 74 73 20 61 6c 77 61 79 73 20 67 72 6f 75 70  cts always group
12f70 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69   from left to ri
12f80 67 68 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ght..*/.static i
12f90 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 0a  nt multiSelect(.
12fa0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
12fb0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
12fc0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
12fd0 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
12fe0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67        /* The rig
12ff0 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43  ht-most of SELEC
13000 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  Ts to be coded *
13010 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
13020 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61  pDest     /* Wha
13030 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65  t to do with que
13040 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b  ry results */.){
13050 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
13060 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20 53 75 63 63  TE_OK;   /* Succ
13070 65 73 73 20 63 6f 64 65 20 66 72 6f 6d 20 61 20  ess code from a 
13080 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
13090 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20  Select *pPrior; 
130a0 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72        /* Another
130b0 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69 61 74   SELECT immediat
130c0 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66 74 20  ely to our left 
130d0 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
130e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65             /* Ge
130f0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74  nerate code to t
13100 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 53 65  his VDBE */.  Se
13110 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 20 20  lectDest dest;  
13120 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74 69      /* Alternati
13130 76 65 20 64 61 74 61 20 64 65 73 74 69 6e 61 74  ve data destinat
13140 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ion */.  Select 
13150 2a 70 44 65 6c 65 74 65 20 3d 20 30 3b 20 20 2f  *pDelete = 0;  /
13160 2a 20 43 68 61 69 6e 20 6f 66 20 73 69 6d 70 6c  * Chain of simpl
13170 65 20 73 65 6c 65 63 74 73 20 74 6f 20 64 65 6c  e selects to del
13180 65 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ete */.  sqlite3
13190 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 2f   *db;          /
131a0 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
131b0 63 74 69 6f 6e 20 2a 2f 0a 23 69 66 6e 64 65 66  ction */.#ifndef
131c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
131d0 4c 41 49 4e 0a 20 20 69 6e 74 20 69 53 75 62 31  LAIN.  int iSub1
131e0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
131f0 45 51 50 20 69 64 20 6f 66 20 6c 65 66 74 2d 68  EQP id of left-h
13200 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  and query */.  i
13210 6e 74 20 69 53 75 62 32 20 3d 20 30 3b 20 20 20  nt iSub2 = 0;   
13220 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f       /* EQP id o
13230 66 20 72 69 67 68 74 2d 68 61 6e 64 20 71 75 65  f right-hand que
13240 72 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20  ry */.#endif..  
13250 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
13260 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42  re is no ORDER B
13270 59 20 6f 72 20 4c 49 4d 49 54 20 63 6c 61 75 73  Y or LIMIT claus
13280 65 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45 43  e on prior SELEC
13290 54 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20 74  Ts.  Only.  ** t
132a0 68 65 20 6c 61 73 74 20 28 72 69 67 68 74 2d 6d  he last (right-m
132b0 6f 73 74 29 20 53 45 4c 45 43 54 20 69 6e 20 74  ost) SELECT in t
132c0 68 65 20 73 65 72 69 65 73 20 6d 61 79 20 68 61  he series may ha
132d0 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f  ve an ORDER BY o
132e0 72 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20 20  r LIMIT..  */.  
132f0 61 73 73 65 72 74 28 20 70 20 26 26 20 70 2d 3e  assert( p && p->
13300 70 50 72 69 6f 72 20 29 3b 20 20 2f 2a 20 43 61  pPrior );  /* Ca
13310 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 67  lling function g
13320 75 61 72 61 6e 74 65 65 73 20 74 68 69 73 20 6d  uarantees this m
13330 75 63 68 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  uch */.  assert(
13340 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
13350 53 46 5f 52 65 63 75 72 73 69 76 65 29 3d 3d 30  SF_Recursive)==0
13360 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c   || p->op==TK_AL
13370 4c 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55  L || p->op==TK_U
13380 4e 49 4f 4e 20 29 3b 0a 20 20 64 62 20 3d 20 70  NION );.  db = p
13390 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 50 72  Parse->db;.  pPr
133a0 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ior = p->pPrior;
133b0 0a 20 20 64 65 73 74 20 3d 20 2a 70 44 65 73 74  .  dest = *pDest
133c0 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e  ;.  if( pPrior->
133d0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
133e0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
133f0 70 50 61 72 73 65 2c 22 4f 52 44 45 52 20 42 59  pParse,"ORDER BY
13400 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63   clause should c
13410 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74  ome after %s not
13420 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20   before",.      
13430 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e  selectOpName(p->
13440 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31  op));.    rc = 1
13450 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69  ;.    goto multi
13460 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d  _select_end;.  }
13470 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70  .  if( pPrior->p
13480 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  Limit ){.    sql
13490 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
134a0 72 73 65 2c 22 4c 49 4d 49 54 20 63 6c 61 75 73  rse,"LIMIT claus
134b0 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66  e should come af
134c0 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72  ter %s not befor
134d0 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74  e",.      select
134e0 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a  OpName(p->op));.
134f0 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
13500 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
13510 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 76 20  t_end;.  }..  v 
13520 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
13530 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65  (pParse);.  asse
13540 72 74 28 20 76 21 3d 30 20 29 3b 20 20 2f 2a 20  rt( v!=0 );  /* 
13550 54 68 65 20 56 44 42 45 20 61 6c 72 65 61 64 79  The VDBE already
13560 20 63 72 65 61 74 65 64 20 62 79 20 63 61 6c 6c   created by call
13570 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ing function */.
13580 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65  .  /* Create the
13590 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 65 6d   destination tem
135a0 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 66 20  porary table if 
135b0 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2f 0a 20  necessary.  */. 
135c0 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d   if( dest.eDest=
135d0 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b  =SRT_EphemTab ){
135e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
135f0 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 73 71  pEList );.    sq
13600 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
13610 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
13620 72 61 6c 2c 20 64 65 73 74 2e 69 53 44 50 61 72  ral, dest.iSDPar
13630 6d 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  m, p->pEList->nE
13640 78 70 72 29 3b 0a 20 20 20 20 64 65 73 74 2e 65  xpr);.    dest.e
13650 44 65 73 74 20 3d 20 53 52 54 5f 54 61 62 6c 65  Dest = SRT_Table
13660 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63  ;.  }..  /* Spec
13670 69 61 6c 20 68 61 6e 64 6c 69 6e 67 20 66 6f 72  ial handling for
13680 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65   a compound-sele
13690 63 74 20 74 68 61 74 20 6f 72 69 67 69 6e 61 74  ct that originat
136a0 65 73 20 61 73 20 61 20 56 41 4c 55 45 53 20 63  es as a VALUES c
136b0 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  lause..  */.  if
136c0 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
136d0 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65 20 29 7b  SF_MultiValue ){
136e0 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 53  .    rc = multiS
136f0 65 6c 65 63 74 56 61 6c 75 65 73 28 70 50 61 72  electValues(pPar
13700 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20  se, p, &dest);. 
13710 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
13720 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20  lect_end;.  }.. 
13730 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c   /* Make sure al
13740 6c 20 53 45 4c 45 43 54 73 20 69 6e 20 74 68 65  l SELECTs in the
13750 20 73 74 61 74 65 6d 65 6e 74 20 68 61 76 65 20   statement have 
13760 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20  the same number 
13770 6f 66 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a  of elements.  **
13780 20 69 6e 20 74 68 65 69 72 20 72 65 73 75 6c 74   in their result
13790 20 73 65 74 73 2e 0a 20 20 2a 2f 0a 20 20 61 73   sets..  */.  as
137a0 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
137b0 26 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73  && pPrior->pELis
137c0 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
137d0 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  ->pEList->nExpr=
137e0 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d  =pPrior->pEList-
137f0 3e 6e 45 78 70 72 20 29 3b 0a 0a 23 69 66 6e 64  >nExpr );..#ifnd
13800 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
13810 54 45 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  TE.  if( p->selF
13820 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73  lags & SF_Recurs
13830 69 76 65 20 29 7b 0a 20 20 20 20 67 65 6e 65 72  ive ){.    gener
13840 61 74 65 57 69 74 68 52 65 63 75 72 73 69 76 65  ateWithRecursive
13850 51 75 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c  Query(pParse, p,
13860 20 26 64 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65   &dest);.  }else
13870 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f  .#endif..  /* Co
13880 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 20 74  mpound SELECTs t
13890 68 61 74 20 68 61 76 65 20 61 6e 20 4f 52 44 45  hat have an ORDE
138a0 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20  R BY clause are 
138b0 68 61 6e 64 6c 65 64 20 73 65 70 61 72 61 74 65  handled separate
138c0 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ly..  */.  if( p
138d0 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
138e0 20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69 53 65    return multiSe
138f0 6c 65 63 74 4f 72 64 65 72 42 79 28 70 50 61 72  lectOrderBy(pPar
13900 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20  se, p, pDest);. 
13910 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20 47 65 6e   }else..  /* Gen
13920 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74  erate code for t
13930 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68  he left and righ
13940 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  t SELECT stateme
13950 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 73 77 69 74  nts..  */.  swit
13960 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20  ch( p->op ){.   
13970 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a   case TK_ALL: {.
13980 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d        int addr =
13990 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c   0;.      int nL
139a0 69 6d 69 74 3b 0a 20 20 20 20 20 20 61 73 73 65  imit;.      asse
139b0 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4c 69  rt( !pPrior->pLi
139c0 6d 69 74 20 29 3b 0a 20 20 20 20 20 20 70 50 72  mit );.      pPr
139d0 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 2d  ior->iLimit = p-
139e0 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70  >iLimit;.      p
139f0 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 20 3d  Prior->iOffset =
13a00 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20   p->iOffset;.   
13a10 20 20 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69     pPrior->pLimi
13a20 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20  t = p->pLimit;. 
13a30 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4f 66       pPrior->pOf
13a40 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65  fset = p->pOffse
13a50 74 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e  t;.      explain
13a60 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 31  SetInteger(iSub1
13a70 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  , pParse->iNextS
13a80 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20  electId);.      
13a90 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
13aa0 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  ct(pParse, pPrio
13ab0 72 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20  r, &dest);.     
13ac0 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
13ad0 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74        p->pOffset
13ae0 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
13af0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  rc ){.        go
13b00 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
13b10 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  end;.      }.   
13b20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30     p->pPrior = 0
13b30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69  ;.      p->iLimi
13b40 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d  t = pPrior->iLim
13b50 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66  it;.      p->iOf
13b60 66 73 65 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69  fset = pPrior->i
13b70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69 66  Offset;.      if
13b80 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20  ( p->iLimit ){. 
13b90 20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71         addr = sq
13ba0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
13bb0 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 70 2d 3e  v, OP_IfNot, p->
13bc0 69 4c 69 6d 69 74 29 3b 20 56 64 62 65 43 6f 76  iLimit); VdbeCov
13bd0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
13be0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
13bf0 2c 20 22 4a 75 6d 70 20 61 68 65 61 64 20 69 66  , "Jump ahead if
13c00 20 4c 49 4d 49 54 20 72 65 61 63 68 65 64 22 29   LIMIT reached")
13c10 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
13c20 2d 3e 69 4f 66 66 73 65 74 20 29 7b 0a 20 20 20  ->iOffset ){.   
13c30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
13c40 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f  beAddOp3(v, OP_O
13c50 66 66 73 65 74 4c 69 6d 69 74 2c 0a 20 20 20 20  ffsetLimit,.    
13c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c70 20 20 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69          p->iLimi
13c80 74 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2b 31 2c  t, p->iOffset+1,
13c90 20 70 2d 3e 69 4f 66 66 73 65 74 29 3b 0a 20 20   p->iOffset);.  
13ca0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
13cb0 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74        explainSet
13cc0 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20 70  Integer(iSub2, p
13cd0 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
13ce0 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20  ctId);.      rc 
13cf0 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
13d00 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74  pParse, p, &dest
13d10 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
13d20 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
13d30 20 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74   );.      pDelet
13d40 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  e = p->pPrior;. 
13d50 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
13d60 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70   pPrior;.      p
13d70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73  ->nSelectRow = s
13d80 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28  qlite3LogEstAdd(
13d90 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 2c 20 70  p->nSelectRow, p
13da0 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f  Prior->nSelectRo
13db0 77 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  w);.      if( pP
13dc0 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 0a 20 20 20  rior->pLimit.   
13dd0 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78      && sqlite3Ex
13de0 70 72 49 73 49 6e 74 65 67 65 72 28 70 50 72 69  prIsInteger(pPri
13df0 6f 72 2d 3e 70 4c 69 6d 69 74 2c 20 26 6e 4c 69  or->pLimit, &nLi
13e00 6d 69 74 29 0a 20 20 20 20 20 20 20 26 26 20 6e  mit).       && n
13e10 4c 69 6d 69 74 3e 30 20 26 26 20 70 2d 3e 6e 53  Limit>0 && p->nS
13e20 65 6c 65 63 74 52 6f 77 20 3e 20 73 71 6c 69 74  electRow > sqlit
13e30 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e 4c  e3LogEst((u64)nL
13e40 69 6d 69 74 29 20 0a 20 20 20 20 20 20 29 7b 0a  imit) .      ){.
13e50 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65          p->nSele
13e60 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c  ctRow = sqlite3L
13e70 6f 67 45 73 74 28 28 75 36 34 29 6e 4c 69 6d 69  ogEst((u64)nLimi
13e80 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
13e90 20 20 69 66 28 20 61 64 64 72 20 29 7b 0a 20 20    if( addr ){.  
13ea0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13eb0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
13ec0 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
13ed0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
13ee0 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50     case TK_EXCEP
13ef0 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55  T:.    case TK_U
13f00 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e  NION: {.      in
13f10 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20 20 20 2f  t unionTab;    /
13f20 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * Cursor number 
13f30 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  of the temporary
13f40 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20 72   table holding r
13f50 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20 75  esult */.      u
13f60 38 20 6f 70 20 3d 20 30 3b 20 20 20 20 20 20 20  8 op = 0;       
13f70 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 53 52  /* One of the SR
13f80 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f  T_ operations to
13f90 20 61 70 70 6c 79 20 74 6f 20 73 65 6c 66 20 2a   apply to self *
13fa0 2f 0a 20 20 20 20 20 20 69 6e 74 20 70 72 69 6f  /.      int prio
13fb0 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  rOp;     /* The 
13fc0 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 20 74  SRT_ operation t
13fd0 6f 20 61 70 70 6c 79 20 74 6f 20 70 72 69 6f 72  o apply to prior
13fe0 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20 20 20 20   selects */.    
13ff0 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20    Expr *pLimit, 
14000 2a 70 4f 66 66 73 65 74 3b 20 2f 2a 20 53 61 76  *pOffset; /* Sav
14010 65 64 20 76 61 6c 75 65 73 20 6f 66 20 70 2d 3e  ed values of p->
14020 6e 4c 69 6d 69 74 20 61 6e 64 20 70 2d 3e 6e 4f  nLimit and p->nO
14030 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 69  ffset */.      i
14040 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 53  nt addr;.      S
14050 65 6c 65 63 74 44 65 73 74 20 75 6e 69 6f 6e 64  electDest uniond
14060 65 73 74 3b 0a 0a 20 20 20 20 20 20 74 65 73 74  est;..      test
14070 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  case( p->op==TK_
14080 45 58 43 45 50 54 20 29 3b 0a 20 20 20 20 20 20  EXCEPT );.      
14090 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d  testcase( p->op=
140a0 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20  =TK_UNION );.   
140b0 20 20 20 70 72 69 6f 72 4f 70 20 3d 20 53 52 54     priorOp = SRT
140c0 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66  _Union;.      if
140d0 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 70 72  ( dest.eDest==pr
140e0 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20 20 20  iorOp ){.       
140f0 20 2f 2a 20 57 65 20 63 61 6e 20 72 65 75 73 65   /* We can reuse
14100 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
14110 6c 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  le generated by 
14120 61 20 53 45 4c 45 43 54 20 74 6f 20 6f 75 72 0a  a SELECT to our.
14130 20 20 20 20 20 20 20 20 2a 2a 20 72 69 67 68 74          ** right
14140 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
14150 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
14160 70 4c 69 6d 69 74 3d 3d 30 20 29 3b 20 20 20 20  pLimit==0 );    
14170 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64    /* Not allowed
14180 20 6f 6e 20 6c 65 66 74 77 61 72 64 20 65 6c 65   on leftward ele
14190 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20  ments */.       
141a0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66   assert( p->pOff
141b0 73 65 74 3d 3d 30 20 29 3b 20 20 20 20 20 2f 2a  set==0 );     /*
141c0 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20   Not allowed on 
141d0 6c 65 66 74 77 61 72 64 20 65 6c 65 6d 65 6e 74  leftward element
141e0 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69  s */.        uni
141f0 6f 6e 54 61 62 20 3d 20 64 65 73 74 2e 69 53 44  onTab = dest.iSD
14200 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Parm;.      }els
14210 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65  e{.        /* We
14220 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 72   will need to cr
14230 65 61 74 65 20 6f 75 72 20 6f 77 6e 20 74 65 6d  eate our own tem
14240 70 6f 72 61 72 79 20 74 61 62 6c 65 20 74 6f 20  porary table to 
14250 68 6f 6c 64 20 74 68 65 0a 20 20 20 20 20 20 20  hold the.       
14260 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65   ** intermediate
14270 20 72 65 73 75 6c 74 73 2e 0a 20 20 20 20 20 20   results..      
14280 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69    */.        uni
14290 6f 6e 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e  onTab = pParse->
142a0 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nTab++;.        
142b0 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65  assert( p->pOrde
142c0 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  rBy==0 );.      
142d0 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
142e0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
142f0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
14300 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20  unionTab, 0);.  
14310 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
14320 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
14330 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20   == -1 );.      
14340 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68    p->addrOpenEph
14350 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20  m[0] = addr;.   
14360 20 20 20 20 20 66 69 6e 64 52 69 67 68 74 6d 6f       findRightmo
14370 73 74 28 70 29 2d 3e 73 65 6c 46 6c 61 67 73 20  st(p)->selFlags 
14380 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65  |= SF_UsesEpheme
14390 72 61 6c 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ral;.        ass
143a0 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
143b0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
143c0 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c   /* Code the SEL
143d0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74  ECT statements t
143e0 6f 20 6f 75 72 20 6c 65 66 74 0a 20 20 20 20 20  o our left.     
143f0 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
14400 28 20 21 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65  ( !pPrior->pOrde
14410 72 42 79 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  rBy );.      sql
14420 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
14430 69 74 28 26 75 6e 69 6f 6e 64 65 73 74 2c 20 70  it(&uniondest, p
14440 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54 61 62  riorOp, unionTab
14450 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e  );.      explain
14460 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 31  SetInteger(iSub1
14470 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  , pParse->iNextS
14480 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20  electId);.      
14490 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
144a0 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  ct(pParse, pPrio
144b0 72 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a  r, &uniondest);.
144c0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
144d0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
144e0 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
144f0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
14500 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e   Code the curren
14510 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  t SELECT stateme
14520 6e 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  nt.      */.    
14530 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
14540 45 58 43 45 50 54 20 29 7b 0a 20 20 20 20 20 20  EXCEPT ){.      
14550 20 20 6f 70 20 3d 20 53 52 54 5f 45 78 63 65 70    op = SRT_Excep
14560 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
14570 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
14580 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  p->op==TK_UNION 
14590 29 3b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20  );.        op = 
145a0 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20  SRT_Union;.     
145b0 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69   }.      p->pPri
145c0 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c  or = 0;.      pL
145d0 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
145e0 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69  ;.      p->pLimi
145f0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 66  t = 0;.      pOf
14600 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65  fset = p->pOffse
14610 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66  t;.      p->pOff
14620 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 75  set = 0;.      u
14630 6e 69 6f 6e 64 65 73 74 2e 65 44 65 73 74 20 3d  niondest.eDest =
14640 20 6f 70 3b 0a 20 20 20 20 20 20 65 78 70 6c 61   op;.      expla
14650 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75  inSetInteger(iSu
14660 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78  b2, pParse->iNex
14670 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20  tSelectId);.    
14680 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
14690 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
146a0 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20  &uniondest);.   
146b0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
146c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
146d0 20 20 20 20 2f 2a 20 51 75 65 72 79 20 66 6c 61      /* Query fla
146e0 74 74 65 6e 69 6e 67 20 69 6e 20 73 71 6c 69 74  ttening in sqlit
146f0 65 33 53 65 6c 65 63 74 28 29 20 6d 69 67 68 74  e3Select() might
14700 20 72 65 66 69 6c 6c 20 70 2d 3e 70 4f 72 64 65   refill p->pOrde
14710 72 42 79 2e 0a 20 20 20 20 20 20 2a 2a 20 42 65  rBy..      ** Be
14720 20 73 75 72 65 20 74 6f 20 64 65 6c 65 74 65 20   sure to delete 
14730 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 74 68 65  p->pOrderBy, the
14740 72 65 66 6f 72 65 2c 20 74 6f 20 61 76 6f 69 64  refore, to avoid
14750 20 61 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 2e 20   a memory leak. 
14760 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
14770 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
14780 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b  b, p->pOrderBy);
14790 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d  .      pDelete =
147a0 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20   p->pPrior;.    
147b0 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
147c0 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  rior;.      p->p
147d0 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
147e0 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b     if( p->op==TK
147f0 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 20 20  _UNION ){.      
14800 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
14810 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
14820 64 64 28 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  dd(p->nSelectRow
14830 2c 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63  , pPrior->nSelec
14840 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20  tRow);.      }. 
14850 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
14860 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c  Delete(db, p->pL
14870 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e  imit);.      p->
14880 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b  pLimit = pLimit;
14890 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65  .      p->pOffse
148a0 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 20  t = pOffset;.   
148b0 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 30     p->iLimit = 0
148c0 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73  ;.      p->iOffs
148d0 65 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f  et = 0;..      /
148e0 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 64 61  * Convert the da
148f0 74 61 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72  ta in the tempor
14900 61 72 79 20 74 61 62 6c 65 20 69 6e 74 6f 20 77  ary table into w
14910 68 61 74 65 76 65 72 20 66 6f 72 6d 0a 20 20 20  hatever form.   
14920 20 20 20 2a 2a 20 69 74 20 69 73 20 74 68 61 74     ** it is that
14930 20 77 65 20 63 75 72 72 65 6e 74 6c 79 20 6e 65   we currently ne
14940 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
14950 20 20 20 61 73 73 65 72 74 28 20 75 6e 69 6f 6e     assert( union
14960 54 61 62 3d 3d 64 65 73 74 2e 69 53 44 50 61 72  Tab==dest.iSDPar
14970 6d 20 7c 7c 20 64 65 73 74 2e 65 44 65 73 74 21  m || dest.eDest!
14980 3d 70 72 69 6f 72 4f 70 20 29 3b 0a 20 20 20 20  =priorOp );.    
14990 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74    if( dest.eDest
149a0 21 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20  !=priorOp ){.   
149b0 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20       int iCont, 
149c0 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a  iBreak, iStart;.
149d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
149e0 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  p->pEList );.   
149f0 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44       if( dest.eD
14a00 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
14a10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 53 65 6c  ){.          Sel
14a20 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70 3b  ect *pFirst = p;
14a30 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
14a40 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72  ( pFirst->pPrior
14a50 20 29 20 70 46 69 72 73 74 20 3d 20 70 46 69 72   ) pFirst = pFir
14a60 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20  st->pPrior;.    
14a70 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f        generateCo
14a80 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
14a90 2c 20 70 46 69 72 73 74 2d 3e 70 53 72 63 2c 20  , pFirst->pSrc, 
14aa0 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b  pFirst->pEList);
14ab0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14ac0 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69     iBreak = sqli
14ad0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
14ae0 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69 43 6f  (v);.        iCo
14af0 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nt = sqlite3Vdbe
14b00 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
14b10 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d        computeLim
14b20 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
14b30 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a  se, p, iBreak);.
14b40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
14b50 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
14b60 52 65 77 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62  Rewind, unionTab
14b70 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43  , iBreak); VdbeC
14b80 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
14b90 20 20 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c      iStart = sql
14ba0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
14bb0 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20  ddr(v);.        
14bc0 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
14bd0 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45  pParse, p, p->pE
14be0 4c 69 73 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 0a  List, unionTab,.
14bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c00 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 26 64          0, 0, &d
14c10 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65  est, iCont, iBre
14c20 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ak);.        sql
14c30 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
14c40 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a  abel(v, iCont);.
14c50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
14c60 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
14c70 4e 65 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  Next, unionTab, 
14c80 69 53 74 61 72 74 29 3b 20 56 64 62 65 43 6f 76  iStart); VdbeCov
14c90 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
14ca0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
14cb0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72  olveLabel(v, iBr
14cc0 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71  eak);.        sq
14cd0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
14ce0 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69  v, OP_Close, uni
14cf0 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20  onTab, 0);.     
14d00 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
14d10 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
14d20 74 3a 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70  t: assert( p->op
14d30 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29  ==TK_INTERSECT )
14d40 3b 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 61  ; {.      int ta
14d50 62 31 2c 20 74 61 62 32 3b 0a 20 20 20 20 20 20  b1, tab2;.      
14d60 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61  int iCont, iBrea
14d70 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20  k, iStart;.     
14d80 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a   Expr *pLimit, *
14d90 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69  pOffset;.      i
14da0 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 53  nt addr;.      S
14db0 65 6c 65 63 74 44 65 73 74 20 69 6e 74 65 72 73  electDest inters
14dc0 65 63 74 64 65 73 74 3b 0a 20 20 20 20 20 20 69  ectdest;.      i
14dd0 6e 74 20 72 31 3b 0a 0a 20 20 20 20 20 20 2f 2a  nt r1;..      /*
14de0 20 49 4e 54 45 52 53 45 43 54 20 69 73 20 64 69   INTERSECT is di
14df0 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65  fferent from the
14e00 20 6f 74 68 65 72 73 20 73 69 6e 63 65 20 69 74   others since it
14e10 20 72 65 71 75 69 72 65 73 0a 20 20 20 20 20 20   requires.      
14e20 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79  ** two temporary
14e30 20 74 61 62 6c 65 73 2e 20 20 48 65 6e 63 65 20   tables.  Hence 
14e40 69 74 20 68 61 73 20 69 74 73 20 6f 77 6e 20 63  it has its own c
14e50 61 73 65 2e 20 20 42 65 67 69 6e 0a 20 20 20 20  ase.  Begin.    
14e60 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69    ** by allocati
14e70 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20 77 65  ng the tables we
14e80 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20   will need..    
14e90 20 20 2a 2f 0a 20 20 20 20 20 20 74 61 62 31 20    */.      tab1 
14ea0 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
14eb0 3b 0a 20 20 20 20 20 20 74 61 62 32 20 3d 20 70  ;.      tab2 = p
14ec0 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
14ed0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
14ee0 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 0a  pOrderBy==0 );..
14ef0 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
14f00 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
14f10 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
14f20 61 6c 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20  al, tab1, 0);.  
14f30 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
14f40 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
14f50 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d  = -1 );.      p-
14f60 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
14f70 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 66   = addr;.      f
14f80 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29 2d  indRightmost(p)-
14f90 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
14fa0 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20  UsesEphemeral;. 
14fb0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
14fc0 70 45 4c 69 73 74 20 29 3b 0a 0a 20 20 20 20 20  pEList );..     
14fd0 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c   /* Code the SEL
14fe0 45 43 54 73 20 74 6f 20 6f 75 72 20 6c 65 66 74  ECTs to our left
14ff0 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20   into temporary 
15000 74 61 62 6c 65 20 22 74 61 62 31 22 2e 0a 20 20  table "tab1"..  
15010 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
15020 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
15030 69 74 28 26 69 6e 74 65 72 73 65 63 74 64 65 73  it(&intersectdes
15040 74 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61  t, SRT_Union, ta
15050 62 31 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61  b1);.      expla
15060 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75  inSetInteger(iSu
15070 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78  b1, pParse->iNex
15080 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20  tSelectId);.    
15090 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
150a0 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72  lect(pParse, pPr
150b0 69 6f 72 2c 20 26 69 6e 74 65 72 73 65 63 74 64  ior, &intersectd
150c0 65 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  est);.      if( 
150d0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  rc ){.        go
150e0 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
150f0 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  end;.      }..  
15100 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20      /* Code the 
15110 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69  current SELECT i
15120 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61  nto temporary ta
15130 62 6c 65 20 22 74 61 62 32 22 0a 20 20 20 20 20  ble "tab2".     
15140 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 20 3d   */.      addr =
15150 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15160 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
15170 65 6d 65 72 61 6c 2c 20 74 61 62 32 2c 20 30 29  emeral, tab2, 0)
15180 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
15190 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
151a0 31 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20  1] == -1 );.    
151b0 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68    p->addrOpenEph
151c0 6d 5b 31 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20  m[1] = addr;.   
151d0 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30     p->pPrior = 0
151e0 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d  ;.      pLimit =
151f0 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20   p->pLimit;.    
15200 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b    p->pLimit = 0;
15210 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d  .      pOffset =
15220 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20   p->pOffset;.   
15230 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
15240 30 3b 0a 20 20 20 20 20 20 69 6e 74 65 72 73 65  0;.      interse
15250 63 74 64 65 73 74 2e 69 53 44 50 61 72 6d 20 3d  ctdest.iSDParm =
15260 20 74 61 62 32 3b 0a 20 20 20 20 20 20 65 78 70   tab2;.      exp
15270 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69  lainSetInteger(i
15280 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e  Sub2, pParse->iN
15290 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
152a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
152b0 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
152c0 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65 73 74  , &intersectdest
152d0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
152e0 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
152f0 20 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74   );.      pDelet
15300 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  e = p->pPrior;. 
15310 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
15320 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 69   pPrior;.      i
15330 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  f( p->nSelectRow
15340 3e 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74  >pPrior->nSelect
15350 52 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74  Row ) p->nSelect
15360 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e 6e 53  Row = pPrior->nS
15370 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20  electRow;.      
15380 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
15390 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  e(db, p->pLimit)
153a0 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69  ;.      p->pLimi
153b0 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20  t = pLimit;.    
153c0 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70    p->pOffset = p
153d0 4f 66 66 73 65 74 3b 0a 0a 20 20 20 20 20 20 2f  Offset;..      /
153e0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
153f0 74 6f 20 74 61 6b 65 20 74 68 65 20 69 6e 74 65  to take the inte
15400 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20  rsection of the 
15410 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a 20 20  two temporary.  
15420 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 2e 0a 20      ** tables.. 
15430 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
15440 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
15450 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 65 73  );.      if( des
15460 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  t.eDest==SRT_Out
15470 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 53  put ){.        S
15480 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20  elect *pFirst = 
15490 70 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  p;.        while
154a0 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72  ( pFirst->pPrior
154b0 20 29 20 70 46 69 72 73 74 20 3d 20 70 46 69 72   ) pFirst = pFir
154c0 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20  st->pPrior;.    
154d0 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75      generateColu
154e0 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
154f0 70 46 69 72 73 74 2d 3e 70 53 72 63 2c 20 70 46  pFirst->pSrc, pF
15500 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  irst->pEList);. 
15510 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 42 72       }.      iBr
15520 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  eak = sqlite3Vdb
15530 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
15540 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c       iCont = sql
15550 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
15560 6c 28 76 29 3b 0a 20 20 20 20 20 20 63 6f 6d 70  l(v);.      comp
15570 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
15580 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72  s(pParse, p, iBr
15590 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eak);.      sqli
155a0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
155b0 20 4f 50 5f 52 65 77 69 6e 64 2c 20 74 61 62 31   OP_Rewind, tab1
155c0 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43  , iBreak); VdbeC
155d0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
155e0 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
155f0 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
15600 3b 0a 20 20 20 20 20 20 69 53 74 61 72 74 20 3d  ;.      iStart =
15610 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15620 70 32 28 76 2c 20 4f 50 5f 52 6f 77 4b 65 79 2c  p2(v, OP_RowKey,
15630 20 74 61 62 31 2c 20 72 31 29 3b 0a 20 20 20 20   tab1, r1);.    
15640 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15650 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74  Op4Int(v, OP_Not
15660 46 6f 75 6e 64 2c 20 74 61 62 32 2c 20 69 43 6f  Found, tab2, iCo
15670 6e 74 2c 20 72 31 2c 20 30 29 3b 20 56 64 62 65  nt, r1, 0); Vdbe
15680 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
15690 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
156a0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
156b0 20 72 31 29 3b 0a 20 20 20 20 20 20 73 65 6c 65   r1);.      sele
156c0 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
156d0 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74  se, p, p->pEList
156e0 2c 20 74 61 62 31 2c 0a 20 20 20 20 20 20 20 20  , tab1,.        
156f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
15700 20 30 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74   0, &dest, iCont
15710 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
15720 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
15730 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e  lveLabel(v, iCon
15740 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
15750 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
15760 50 5f 4e 65 78 74 2c 20 74 61 62 31 2c 20 69 53  P_Next, tab1, iS
15770 74 61 72 74 29 3b 20 56 64 62 65 43 6f 76 65 72  tart); VdbeCover
15780 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71  age(v);.      sq
15790 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
157a0 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29  Label(v, iBreak)
157b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
157c0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
157d0 43 6c 6f 73 65 2c 20 74 61 62 32 2c 20 30 29 3b  Close, tab2, 0);
157e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
157f0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
15800 6c 6f 73 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a  lose, tab1, 0);.
15810 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15820 20 7d 0a 20 20 7d 0a 0a 20 20 65 78 70 6c 61 69   }.  }..  explai
15830 6e 43 6f 6d 70 6f 73 69 74 65 28 70 50 61 72 73  nComposite(pPars
15840 65 2c 20 70 2d 3e 6f 70 2c 20 69 53 75 62 31 2c  e, p->op, iSub1,
15850 20 69 53 75 62 32 2c 20 70 2d 3e 6f 70 21 3d 54   iSub2, p->op!=T
15860 4b 5f 41 4c 4c 29 3b 0a 0a 20 20 2f 2a 20 43 6f  K_ALL);..  /* Co
15870 6d 70 75 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20  mpute collating 
15880 73 65 71 75 65 6e 63 65 73 20 75 73 65 64 20 62  sequences used b
15890 79 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72  y .  ** temporar
158a0 79 20 74 61 62 6c 65 73 20 6e 65 65 64 65 64 20  y tables needed 
158b0 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
158c0 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
158d0 2e 0a 20 20 2a 2a 20 41 74 74 61 63 68 20 74 68  ..  ** Attach th
158e0 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  e KeyInfo struct
158f0 75 72 65 20 74 6f 20 61 6c 6c 20 74 65 6d 70 6f  ure to all tempo
15900 72 61 72 79 20 74 61 62 6c 65 73 2e 0a 20 20 2a  rary tables..  *
15910 2a 0a 20 20 2a 2a 20 54 68 69 73 20 73 65 63 74  *.  ** This sect
15920 69 6f 6e 20 69 73 20 72 75 6e 20 62 79 20 74 68  ion is run by th
15930 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c  e right-most SEL
15940 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e  ECT statement on
15950 6c 79 2e 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20  ly..  ** SELECT 
15960 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 74 68  statements to th
15970 65 20 6c 65 66 74 20 61 6c 77 61 79 73 20 73 6b  e left always sk
15980 69 70 20 74 68 69 73 20 70 61 72 74 2e 20 20 54  ip this part.  T
15990 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20  he right-most.  
159a0 2a 2a 20 53 45 4c 45 43 54 20 6d 69 67 68 74 20  ** SELECT might 
159b0 61 6c 73 6f 20 73 6b 69 70 20 74 68 69 73 20 70  also skip this p
159c0 61 72 74 20 69 66 20 69 74 20 68 61 73 20 6e 6f  art if it has no
159d0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
159e0 20 61 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d   and.  ** no tem
159f0 70 20 74 61 62 6c 65 73 20 61 72 65 20 72 65 71  p tables are req
15a00 75 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  uired..  */.  if
15a10 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
15a20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c  SF_UsesEphemeral
15a30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20 20   ){.    int i;  
15a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a50 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
15a60 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 4b 65 79  unter */.    Key
15a70 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20  Info *pKeyInfo; 
15a80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
15a90 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
15aa0 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20   for the result 
15ab0 73 65 74 20 2a 2f 0a 20 20 20 20 53 65 6c 65 63  set */.    Selec
15ac0 74 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20  t *pLoop;       
15ad0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
15ae0 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20  looping through 
15af0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
15b00 73 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71  s */.    CollSeq
15b10 20 2a 2a 61 70 43 6f 6c 6c 3b 20 20 20 20 20 20   **apColl;      
15b20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
15b30 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20 70 4b  oping through pK
15b40 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20  eyInfo->aColl[] 
15b50 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b  */.    int nCol;
15b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b70 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
15b80 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73  f columns in res
15b90 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20 20 20  ult set */..    
15ba0 61 73 73 65 72 74 28 20 70 2d 3e 70 4e 65 78 74  assert( p->pNext
15bb0 3d 3d 30 20 29 3b 0a 20 20 20 20 6e 43 6f 6c 20  ==0 );.    nCol 
15bc0 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  = p->pEList->nEx
15bd0 70 72 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f  pr;.    pKeyInfo
15be0 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   = sqlite3KeyInf
15bf0 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 43 6f 6c 2c  oAlloc(db, nCol,
15c00 20 31 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4b   1);.    if( !pK
15c10 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20  eyInfo ){.      
15c20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
15c30 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f  M_BKPT;.      go
15c40 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
15c50 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  end;.    }.    f
15c60 6f 72 28 69 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70  or(i=0, apColl=p
15c70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20  KeyInfo->aColl; 
15c80 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43  i<nCol; i++, apC
15c90 6f 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 2a 61  oll++){.      *a
15ca0 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c  pColl = multiSel
15cb0 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ectCollSeq(pPars
15cc0 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20  e, p, i);.      
15cd0 69 66 28 20 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29  if( 0==*apColl )
15ce0 7b 0a 20 20 20 20 20 20 20 20 2a 61 70 43 6f 6c  {.        *apCol
15cf0 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
15d00 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  l;.      }.    }
15d10 0a 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d  ..    for(pLoop=
15d20 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d  p; pLoop; pLoop=
15d30 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 29 7b 0a  pLoop->pPrior){.
15d40 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
15d50 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <2; i++){.      
15d60 20 20 69 6e 74 20 61 64 64 72 20 3d 20 70 4c 6f    int addr = pLo
15d70 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  op->addrOpenEphm
15d80 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [i];.        if(
15d90 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 20   addr<0 ){.     
15da0 20 20 20 20 20 2f 2a 20 49 66 20 5b 30 5d 20 69       /* If [0] i
15db0 73 20 75 6e 75 73 65 64 20 74 68 65 6e 20 5b 31  s unused then [1
15dc0 5d 20 69 73 20 61 6c 73 6f 20 75 6e 75 73 65 64  ] is also unused
15dd0 2e 20 20 53 6f 20 77 65 20 63 61 6e 0a 20 20 20  .  So we can.   
15de0 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73         ** always
15df0 20 73 61 66 65 6c 79 20 61 62 6f 72 74 20 61 73   safely abort as
15e00 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 66 69 72   soon as the fir
15e10 73 74 20 75 6e 75 73 65 64 20 73 6c 6f 74 20 69  st unused slot i
15e20 73 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20  s found */.     
15e30 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
15e40 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  op->addrOpenEphm
15e50 5b 31 5d 3c 30 20 29 3b 0a 20 20 20 20 20 20 20  [1]<0 );.       
15e60 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
15e70 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
15e80 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
15e90 76 2c 20 61 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a  v, addr, nCol);.
15ea0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
15eb0 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61  dbeChangeP4(v, a
15ec0 64 64 72 2c 20 28 63 68 61 72 2a 29 73 71 6c 69  ddr, (char*)sqli
15ed0 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b  te3KeyInfoRef(pK
15ee0 65 79 49 6e 66 6f 29 2c 0a 20 20 20 20 20 20 20  eyInfo),.       
15ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f00 20 20 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29       P4_KEYINFO)
15f10 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d  ;.        pLoop-
15f20 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d  >addrOpenEphm[i]
15f30 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20   = -1;.      }. 
15f40 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
15f50 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65  KeyInfoUnref(pKe
15f60 79 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c  yInfo);.  }..mul
15f70 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20  ti_select_end:. 
15f80 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20   pDest->iSdst = 
15f90 64 65 73 74 2e 69 53 64 73 74 3b 0a 20 20 70 44  dest.iSdst;.  pD
15fa0 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 64 65 73  est->nSdst = des
15fb0 74 2e 6e 53 64 73 74 3b 0a 20 20 73 71 6c 69 74  t.nSdst;.  sqlit
15fc0 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
15fd0 62 2c 20 70 44 65 6c 65 74 65 29 3b 0a 20 20 72  b, pDelete);.  r
15fe0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
15ff0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
16000 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
16010 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 45 72 72 6f  T */../*.** Erro
16020 72 20 6d 65 73 73 61 67 65 20 66 6f 72 20 77 68  r message for wh
16030 65 6e 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 74  en two or more t
16040 65 72 6d 73 20 6f 66 20 61 20 63 6f 6d 70 6f 75  erms of a compou
16050 6e 64 20 73 65 6c 65 63 74 20 68 61 76 65 20 64  nd select have d
16060 69 66 66 65 72 65 6e 74 0a 2a 2a 20 73 69 7a 65  ifferent.** size
16070 20 72 65 73 75 6c 74 20 73 65 74 73 2e 0a 2a 2f   result sets..*/
16080 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c  .void sqlite3Sel
16090 65 63 74 57 72 6f 6e 67 4e 75 6d 54 65 72 6d 73  ectWrongNumTerms
160a0 45 72 72 6f 72 28 50 61 72 73 65 20 2a 70 50 61  Error(Parse *pPa
160b0 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  rse, Select *p){
160c0 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
160d0 67 73 20 26 20 53 46 5f 56 61 6c 75 65 73 20 29  gs & SF_Values )
160e0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
160f0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61  orMsg(pParse, "a
16100 6c 6c 20 56 41 4c 55 45 53 20 6d 75 73 74 20 68  ll VALUES must h
16110 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  ave the same num
16120 62 65 72 20 6f 66 20 74 65 72 6d 73 22 29 3b 0a  ber of terms");.
16130 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
16140 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
16150 72 73 65 2c 20 22 53 45 4c 45 43 54 73 20 74 6f  rse, "SELECTs to
16160 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69   the left and ri
16170 67 68 74 20 6f 66 20 25 73 22 0a 20 20 20 20 20  ght of %s".     
16180 20 22 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74   " do not have t
16190 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f  he same number o
161a0 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
161b0 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28  ", selectOpName(
161c0 70 2d 3e 6f 70 29 29 3b 0a 20 20 7d 0a 7d 0a 0a  p->op));.  }.}..
161d0 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 6f 75  /*.** Code an ou
161e0 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 20  tput subroutine 
161f0 66 6f 72 20 61 20 63 6f 72 6f 75 74 69 6e 65 20  for a coroutine 
16200 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
16210 66 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74  f a.** SELECT st
16220 61 74 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  atment..**.** Th
16230 65 20 64 61 74 61 20 74 6f 20 62 65 20 6f 75 74  e data to be out
16240 70 75 74 20 69 73 20 63 6f 6e 74 61 69 6e 65 64  put is contained
16250 20 69 6e 20 70 49 6e 2d 3e 69 53 64 73 74 2e 20   in pIn->iSdst. 
16260 20 54 68 65 72 65 20 61 72 65 0a 2a 2a 20 70 49   There are.** pI
16270 6e 2d 3e 6e 53 64 73 74 20 63 6f 6c 75 6d 6e 73  n->nSdst columns
16280 20 74 6f 20 62 65 20 6f 75 74 70 75 74 2e 20 20   to be output.  
16290 70 44 65 73 74 20 69 73 20 77 68 65 72 65 20 74  pDest is where t
162a0 68 65 20 6f 75 74 70 75 74 20 73 68 6f 75 6c 64  he output should
162b0 0a 2a 2a 20 62 65 20 73 65 6e 74 2e 0a 2a 2a 0a  .** be sent..**.
162c0 2a 2a 20 72 65 67 52 65 74 75 72 6e 20 69 73 20  ** regReturn is 
162d0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  the number of th
162e0 65 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64 69  e register holdi
162f0 6e 67 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  ng the subroutin
16300 65 0a 2a 2a 20 72 65 74 75 72 6e 20 61 64 64 72  e.** return addr
16310 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65  ess..**.** If re
16320 67 50 72 65 76 3e 30 20 74 68 65 6e 20 69 74 20  gPrev>0 then it 
16330 69 73 20 74 68 65 20 66 69 72 73 74 20 72 65 67  is the first reg
16340 69 73 74 65 72 20 69 6e 20 61 20 76 65 63 74 6f  ister in a vecto
16350 72 20 74 68 61 74 0a 2a 2a 20 72 65 63 6f 72 64  r that.** record
16360 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6f  s the previous o
16370 75 74 70 75 74 2e 20 20 6d 65 6d 5b 72 65 67 50  utput.  mem[regP
16380 72 65 76 5d 20 69 73 20 61 20 66 6c 61 67 20 74  rev] is a flag t
16390 68 61 74 20 69 73 20 66 61 6c 73 65 0a 2a 2a 20  hat is false.** 
163a0 69 66 20 74 68 65 72 65 20 68 61 73 20 62 65 65  if there has bee
163b0 6e 20 6e 6f 20 70 72 65 76 69 6f 75 73 20 6f 75  n no previous ou
163c0 74 70 75 74 2e 20 20 49 66 20 72 65 67 50 72 65  tput.  If regPre
163d0 76 3e 30 20 74 68 65 6e 20 63 6f 64 65 20 69 73  v>0 then code is
163e0 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64 20 74 6f  .** generated to
163f0 20 73 75 70 70 72 65 73 73 20 64 75 70 6c 69 63   suppress duplic
16400 61 74 65 73 2e 20 20 70 4b 65 79 49 6e 66 6f 20  ates.  pKeyInfo 
16410 69 73 20 75 73 65 64 20 66 6f 72 20 63 6f 6d 70  is used for comp
16420 61 72 69 6e 67 0a 2a 2a 20 6b 65 79 73 2e 0a 2a  aring.** keys..*
16430 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4c 49 4d 49  *.** If the LIMI
16440 54 20 66 6f 75 6e 64 20 69 6e 20 70 2d 3e 69 4c  T found in p->iL
16450 69 6d 69 74 20 69 73 20 72 65 61 63 68 65 64 2c  imit is reached,
16460 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c   jump immediatel
16470 79 20 74 6f 0a 2a 2a 20 69 42 72 65 61 6b 2e 0a  y to.** iBreak..
16480 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
16490 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75 62 72  nerateOutputSubr
164a0 6f 75 74 69 6e 65 28 0a 20 20 50 61 72 73 65 20  outine(.  Parse 
164b0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
164c0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
164d0 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
164e0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
164f0 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
16500 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53  statement */.  S
16510 65 6c 65 63 74 44 65 73 74 20 2a 70 49 6e 2c 20  electDest *pIn, 
16520 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 6f 75 74         /* Corout
16530 69 6e 65 20 73 75 70 70 6c 79 69 6e 67 20 64 61  ine supplying da
16540 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ta */.  SelectDe
16550 73 74 20 2a 70 44 65 73 74 2c 20 20 20 20 20 20  st *pDest,      
16560 2f 2a 20 57 68 65 72 65 20 74 6f 20 73 65 6e 64  /* Where to send
16570 20 74 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69   the data */.  i
16580 6e 74 20 72 65 67 52 65 74 75 72 6e 2c 20 20 20  nt regReturn,   
16590 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
165a0 74 75 72 6e 20 61 64 64 72 65 73 73 20 72 65 67  turn address reg
165b0 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  ister */.  int r
165c0 65 67 50 72 65 76 2c 20 20 20 20 20 20 20 20 20  egPrev,         
165d0 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72     /* Previous r
165e0 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 2e 20  esult register. 
165f0 20 4e 6f 20 75 6e 69 71 75 65 6e 65 73 73 20 69   No uniqueness i
16600 66 20 30 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f  f 0 */.  KeyInfo
16610 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20   *pKeyInfo,     
16620 20 2f 2a 20 46 6f 72 20 63 6f 6d 70 61 72 69 6e   /* For comparin
16630 67 20 77 69 74 68 20 70 72 65 76 69 6f 75 73 20  g with previous 
16640 65 6e 74 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69  entry */.  int i
16650 42 72 65 61 6b 20 20 20 20 20 20 20 20 20 20 20  Break           
16660 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
16670 69 66 20 77 65 20 68 69 74 20 74 68 65 20 4c 49  if we hit the LI
16680 4d 49 54 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  MIT */.){.  Vdbe
16690 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
166a0 64 62 65 3b 0a 20 20 69 6e 74 20 69 43 6f 6e 74  dbe;.  int iCont
166b0 69 6e 75 65 3b 0a 20 20 69 6e 74 20 61 64 64 72  inue;.  int addr
166c0 3b 0a 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69  ;..  addr = sqli
166d0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
166e0 64 72 28 76 29 3b 0a 20 20 69 43 6f 6e 74 69 6e  dr(v);.  iContin
166f0 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ue = sqlite3Vdbe
16700 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20  MakeLabel(v);.. 
16710 20 2f 2a 20 53 75 70 70 72 65 73 73 20 64 75 70   /* Suppress dup
16720 6c 69 63 61 74 65 73 20 66 6f 72 20 55 4e 49 4f  licates for UNIO
16730 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e 64 20 49  N, EXCEPT, and I
16740 4e 54 45 52 53 45 43 54 20 0a 20 20 2a 2f 0a 20  NTERSECT .  */. 
16750 20 69 66 28 20 72 65 67 50 72 65 76 20 29 7b 0a   if( regPrev ){.
16760 20 20 20 20 69 6e 74 20 61 64 64 72 31 2c 20 61      int addr1, a
16770 64 64 72 32 3b 0a 20 20 20 20 61 64 64 72 31 20  ddr2;.    addr1 
16780 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
16790 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c  Op1(v, OP_IfNot,
167a0 20 72 65 67 50 72 65 76 29 3b 20 56 64 62 65 43   regPrev); VdbeC
167b0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
167c0 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56  addr2 = sqlite3V
167d0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
167e0 43 6f 6d 70 61 72 65 2c 20 70 49 6e 2d 3e 69 53  Compare, pIn->iS
167f0 64 73 74 2c 20 72 65 67 50 72 65 76 2b 31 2c 20  dst, regPrev+1, 
16800 70 49 6e 2d 3e 6e 53 64 73 74 2c 0a 20 20 20 20  pIn->nSdst,.    
16810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16820 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
16830 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52  )sqlite3KeyInfoR
16840 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c 20 50 34  ef(pKeyInfo), P4
16850 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 73  _KEYINFO);.    s
16860 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
16870 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64  (v, OP_Jump, add
16880 72 32 2b 32 2c 20 69 43 6f 6e 74 69 6e 75 65 2c  r2+2, iContinue,
16890 20 61 64 64 72 32 2b 32 29 3b 20 56 64 62 65 43   addr2+2); VdbeC
168a0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
168b0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
168c0 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20  ere(v, addr1);. 
168d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
168e0 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp3(v, OP_Copy,
168f0 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 72 65 67   pIn->iSdst, reg
16900 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64  Prev+1, pIn->nSd
16910 73 74 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  st-1);.    sqlit
16920 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
16930 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 72  OP_Integer, 1, r
16940 65 67 50 72 65 76 29 3b 0a 20 20 7d 0a 20 20 69  egPrev);.  }.  i
16950 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  f( pParse->db->m
16960 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
16970 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 53 75  turn 0;..  /* Su
16980 70 70 72 65 73 73 20 74 68 65 20 66 69 72 73 74  ppress the first
16990 20 4f 46 46 53 45 54 20 65 6e 74 72 69 65 73 20   OFFSET entries 
169a0 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  if there is an O
169b0 46 46 53 45 54 20 63 6c 61 75 73 65 0a 20 20 2a  FFSET clause.  *
169c0 2f 0a 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76  /.  codeOffset(v
169d0 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43  , p->iOffset, iC
169e0 6f 6e 74 69 6e 75 65 29 3b 0a 0a 20 20 61 73 73  ontinue);..  ass
169f0 65 72 74 28 20 70 44 65 73 74 2d 3e 65 44 65 73  ert( pDest->eDes
16a00 74 21 3d 53 52 54 5f 45 78 69 73 74 73 20 29 3b  t!=SRT_Exists );
16a10 0a 20 20 61 73 73 65 72 74 28 20 70 44 65 73 74  .  assert( pDest
16a20 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 54 61 62  ->eDest!=SRT_Tab
16a30 6c 65 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20  le );.  switch( 
16a40 70 44 65 73 74 2d 3e 65 44 65 73 74 20 29 7b 0a  pDest->eDest ){.
16a50 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65      /* Store the
16a60 20 72 65 73 75 6c 74 20 61 73 20 64 61 74 61 20   result as data 
16a70 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b  using a unique k
16a80 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ey..    */.    c
16a90 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62  ase SRT_EphemTab
16aa0 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  : {.      int r1
16ab0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
16ac0 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
16ad0 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c      int r2 = sql
16ae0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
16af0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
16b00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
16b10 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
16b20 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49  , pIn->iSdst, pI
16b30 6e 2d 3e 6e 53 64 73 74 2c 20 72 31 29 3b 0a 20  n->nSdst, r1);. 
16b40 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
16b50 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77  AddOp2(v, OP_New
16b60 52 6f 77 69 64 2c 20 70 44 65 73 74 2d 3e 69 53  Rowid, pDest->iS
16b70 44 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20  DParm, r2);.    
16b80 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16b90 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
16ba0 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
16bb0 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20 20  , r1, r2);.     
16bc0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
16bd0 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41  geP5(v, OPFLAG_A
16be0 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 73 71  PPEND);.      sq
16bf0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
16c00 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b  Reg(pParse, r2);
16c10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
16c20 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
16c30 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
16c40 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69  break;.    }..#i
16c50 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
16c60 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f  T_SUBQUERY.    /
16c70 2a 20 49 66 20 77 65 20 61 72 65 20 63 72 65 61  * If we are crea
16c80 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61  ting a set for a
16c90 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45  n "expr IN (SELE
16ca0 43 54 20 2e 2e 2e 29 22 2e 0a 20 20 20 20 2a 2f  CT ...)"..    */
16cb0 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65  .    case SRT_Se
16cc0 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  t: {.      int r
16cd0 31 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  1;.      testcas
16ce0 65 28 20 70 49 6e 2d 3e 6e 53 64 73 74 3e 31 20  e( pIn->nSdst>1 
16cf0 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
16d00 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
16d10 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
16d20 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
16d30 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
16d40 64 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70  d, pIn->iSdst, p
16d50 49 6e 2d 3e 6e 53 64 73 74 2c 20 0a 20 20 20 20  In->nSdst, .    
16d60 20 20 20 20 20 20 72 31 2c 20 70 44 65 73 74 2d        r1, pDest-
16d70 3e 7a 41 66 66 53 64 73 74 2c 20 70 49 6e 2d 3e  >zAffSdst, pIn->
16d80 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71  nSdst);.      sq
16d90 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
16da0 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
16db0 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c  rse, pIn->iSdst,
16dc0 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20   pIn->nSdst);.  
16dd0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16de0 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49  ddOp4Int(v, OP_I
16df0 64 78 49 6e 73 65 72 74 2c 20 70 44 65 73 74 2d  dxInsert, pDest-
16e00 3e 69 53 44 50 61 72 6d 2c 20 72 31 2c 0a 20 20  >iSDParm, r1,.  
16e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e20 20 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 69 53           pIn->iS
16e30 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29  dst, pIn->nSdst)
16e40 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
16e50 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
16e60 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
16e70 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
16e80 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
16e90 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74   a scalar select
16ea0 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66   that is part of
16eb0 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20   an expression, 
16ec0 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72  then.    ** stor
16ed0 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
16ee0 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
16ef0 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64   memory cell and
16f00 20 62 72 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a   break out.    *
16f10 2a 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f  * of the scan lo
16f20 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  op..    */.    c
16f30 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20  ase SRT_Mem: {. 
16f40 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e       assert( pIn
16f50 2d 3e 6e 53 64 73 74 3d 3d 31 20 7c 7c 20 70 50  ->nSdst==1 || pP
16f60 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 3b 20  arse->nErr>0 ); 
16f70 20 74 65 73 74 63 61 73 65 28 20 70 49 6e 2d 3e   testcase( pIn->
16f80 6e 53 64 73 74 21 3d 31 20 29 3b 0a 20 20 20 20  nSdst!=1 );.    
16f90 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
16fa0 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49  eMove(pParse, pI
16fb0 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74 2d  n->iSdst, pDest-
16fc0 3e 69 53 44 50 61 72 6d 2c 20 31 29 3b 0a 20 20  >iSDParm, 1);.  
16fd0 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54      /* The LIMIT
16fe0 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d   clause will jum
16ff0 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f  p out of the loo
17000 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
17010 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
17020 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66  endif /* #ifndef
17030 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
17040 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a  QUERY */..    /*
17050 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65   The results are
17060 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73 65 71   stored in a seq
17070 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65  uence of registe
17080 72 73 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69  rs.    ** starti
17090 6e 67 20 61 74 20 70 44 65 73 74 2d 3e 69 53 64  ng at pDest->iSd
170a0 73 74 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f  st.  Then the co
170b0 2d 72 6f 75 74 69 6e 65 20 79 69 65 6c 64 73 2e  -routine yields.
170c0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
170d0 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20   SRT_Coroutine: 
170e0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 73  {.      if( pDes
170f0 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29 7b 0a 20  t->iSdst==0 ){. 
17100 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 69 53         pDest->iS
17110 64 73 74 20 3d 20 73 71 6c 69 74 65 33 47 65 74  dst = sqlite3Get
17120 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
17130 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20  , pIn->nSdst);. 
17140 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 6e 53         pDest->nS
17150 64 73 74 20 3d 20 70 49 6e 2d 3e 6e 53 64 73 74  dst = pIn->nSdst
17160 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
17170 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
17180 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d  ove(pParse, pIn-
17190 3e 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e 69  >iSdst, pDest->i
171a0 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74  Sdst, pIn->nSdst
171b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
171c0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
171d0 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69  _Yield, pDest->i
171e0 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 62  SDParm);.      b
171f0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
17200 20 2f 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74   /* If none of t
17210 68 65 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 74  he above, then t
17220 68 65 20 72 65 73 75 6c 74 20 64 65 73 74 69 6e  he result destin
17230 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 0a 20 20  ation must be.  
17240 20 20 2a 2a 20 53 52 54 5f 4f 75 74 70 75 74 2e    ** SRT_Output.
17250 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69    This routine i
17260 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 77  s never called w
17270 69 74 68 20 61 6e 79 20 6f 74 68 65 72 0a 20 20  ith any other.  
17280 20 20 2a 2a 20 64 65 73 74 69 6e 61 74 69 6f 6e    ** destination
17290 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20   other than the 
172a0 6f 6e 65 73 20 68 61 6e 64 6c 65 64 20 61 62 6f  ones handled abo
172b0 76 65 20 6f 72 20 53 52 54 5f 4f 75 74 70 75 74  ve or SRT_Output
172c0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
172d0 46 6f 72 20 53 52 54 5f 4f 75 74 70 75 74 2c 20  For SRT_Output, 
172e0 72 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72  results are stor
172f0 65 64 20 69 6e 20 61 20 73 65 71 75 65 6e 63 65  ed in a sequence
17300 20 6f 66 20 72 65 67 69 73 74 65 72 73 2e 20 20   of registers.  
17310 0a 20 20 20 20 2a 2a 20 54 68 65 6e 20 74 68 65  .    ** Then the
17320 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20 6f 70   OP_ResultRow op
17330 63 6f 64 65 20 69 73 20 75 73 65 64 20 74 6f 20  code is used to 
17340 63 61 75 73 65 20 73 71 6c 69 74 65 33 5f 73 74  cause sqlite3_st
17350 65 70 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20 72  ep() to.    ** r
17360 65 74 75 72 6e 20 74 68 65 20 6e 65 78 74 20 72  eturn the next r
17370 6f 77 20 6f 66 20 72 65 73 75 6c 74 2e 0a 20 20  ow of result..  
17380 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74    */.    default
17390 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
173a0 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  ( pDest->eDest==
173b0 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20  SRT_Output );.  
173c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
173d0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75  ddOp2(v, OP_Resu
173e0 6c 74 52 6f 77 2c 20 70 49 6e 2d 3e 69 53 64 73  ltRow, pIn->iSds
173f0 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a  t, pIn->nSdst);.
17400 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
17410 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
17420 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e  ange(pParse, pIn
17430 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53  ->iSdst, pIn->nS
17440 64 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  dst);.      brea
17450 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
17460 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 65  /* Jump to the e
17470 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69  nd of the loop i
17480 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20 72  f the LIMIT is r
17490 65 61 63 68 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  eached..  */.  i
174a0 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a  f( p->iLimit ){.
174b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
174c0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63 72  ddOp2(v, OP_Decr
174d0 4a 75 6d 70 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69  JumpZero, p->iLi
174e0 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 20 56 64  mit, iBreak); Vd
174f0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
17500 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
17510 65 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  e the subroutine
17520 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20 20 73   return.  */.  s
17530 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
17540 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 69  eLabel(v, iConti
17550 6e 75 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  nue);.  sqlite3V
17560 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
17570 52 65 74 75 72 6e 2c 20 72 65 67 52 65 74 75 72  Return, regRetur
17580 6e 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 61 64  n);..  return ad
17590 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 74  dr;.}../*.** Alt
175a0 65 72 6e 61 74 69 76 65 20 63 6f 6d 70 6f 75 6e  ernative compoun
175b0 64 20 73 65 6c 65 63 74 20 63 6f 64 65 20 67 65  d select code ge
175c0 6e 65 72 61 74 6f 72 20 66 6f 72 20 63 61 73 65  nerator for case
175d0 73 20 77 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20  s when there.** 
175e0 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
175f0 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 65 20  lause..**.** We 
17600 61 73 73 75 6d 65 20 61 20 71 75 65 72 79 20 6f  assume a query o
17610 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
17620 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  form:.**.**     
17630 20 3c 73 65 6c 65 63 74 41 3e 20 20 3c 6f 70 65   <selectA>  <ope
17640 72 61 74 6f 72 3e 20 20 3c 73 65 6c 65 63 74 42  rator>  <selectB
17650 3e 20 20 4f 52 44 45 52 20 42 59 20 3c 6f 72 64  >  ORDER BY <ord
17660 65 72 62 79 6c 69 73 74 3e 0a 2a 2a 0a 2a 2a 20  erbylist>.**.** 
17670 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73 20 6f 6e  <operator> is on
17680 65 20 6f 66 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20  e of UNION ALL, 
17690 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f  UNION, EXCEPT, o
176a0 72 20 49 4e 54 45 52 53 45 43 54 2e 20 20 54 68  r INTERSECT.  Th
176b0 65 20 69 64 65 61 0a 2a 2a 20 69 73 20 74 6f 20  e idea.** is to 
176c0 63 6f 64 65 20 62 6f 74 68 20 3c 73 65 6c 65 63  code both <selec
176d0 74 41 3e 20 61 6e 64 20 3c 73 65 6c 65 63 74 42  tA> and <selectB
176e0 3e 20 77 69 74 68 20 74 68 65 20 4f 52 44 45 52  > with the ORDER
176f0 20 42 59 20 63 6c 61 75 73 65 20 61 73 0a 2a 2a   BY clause as.**
17700 20 63 6f 2d 72 6f 75 74 69 6e 65 73 2e 20 20 54   co-routines.  T
17710 68 65 6e 20 72 75 6e 20 74 68 65 20 63 6f 2d 72  hen run the co-r
17720 6f 75 74 69 6e 65 73 20 69 6e 20 70 61 72 61 6c  outines in paral
17730 6c 65 6c 20 61 6e 64 20 6d 65 72 67 65 20 74 68  lel and merge th
17740 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74  e results.** int
17750 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 20 20 49  o the output.  I
17760 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 74 68  n addition to th
17770 65 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73  e two coroutines
17780 20 28 63 61 6c 6c 65 64 20 73 65 6c 65 63 74 41   (called selectA
17790 20 61 6e 64 0a 2a 2a 20 73 65 6c 65 63 74 42 29   and.** selectB)
177a0 20 74 68 65 72 65 20 61 72 65 20 37 20 73 75 62   there are 7 sub
177b0 72 6f 75 74 69 6e 65 73 3a 0a 2a 2a 0a 2a 2a 20  routines:.**.** 
177c0 20 20 20 6f 75 74 41 3a 20 20 20 20 4d 6f 76 65     outA:    Move
177d0 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74   the output of t
177e0 68 65 20 73 65 6c 65 63 74 41 20 63 6f 72 6f 75  he selectA corou
177f0 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f 75  tine into the ou
17800 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  tput.**         
17810 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f      of the compo
17820 75 6e 64 20 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a  und query..**.**
17830 20 20 20 20 6f 75 74 42 3a 20 20 20 20 4d 6f 76      outB:    Mov
17840 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20  e the output of 
17850 74 68 65 20 73 65 6c 65 63 74 42 20 63 6f 72 6f  the selectB coro
17860 75 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f  utine into the o
17870 75 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20  utput.**        
17880 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70       of the comp
17890 6f 75 6e 64 20 71 75 65 72 79 2e 20 20 28 4f 6e  ound query.  (On
178a0 6c 79 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72  ly generated for
178b0 20 55 4e 49 4f 4e 20 61 6e 64 0a 2a 2a 20 20 20   UNION and.**   
178c0 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20            UNION 
178d0 41 4c 4c 2e 20 20 45 58 43 45 50 54 20 61 6e 64  ALL.  EXCEPT and
178e0 20 49 4e 53 45 52 54 53 45 43 54 20 6e 65 76 65   INSERTSECT neve
178f0 72 20 6f 75 74 70 75 74 20 61 20 72 6f 77 20 74  r output a row t
17900 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
17910 20 20 20 61 70 70 65 61 72 73 20 6f 6e 6c 79 20     appears only 
17920 69 6e 20 42 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20  in B.).**.**    
17930 41 6c 74 42 3a 20 20 20 20 43 61 6c 6c 65 64 20  AltB:    Called 
17940 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 64 61  when there is da
17950 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72  ta from both cor
17960 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3c 42 2e  outines and A<B.
17970 0a 2a 2a 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20  .**.**    AeqB: 
17980 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74     Called when t
17990 68 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f  here is data fro
179a0 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65  m both coroutine
179b0 73 20 61 6e 64 20 41 3d 3d 42 2e 0a 2a 2a 0a 2a  s and A==B..**.*
179c0 2a 20 20 20 20 41 67 74 42 3a 20 20 20 20 43 61  *    AgtB:    Ca
179d0 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20  lled when there 
179e0 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74  is data from bot
179f0 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64  h coroutines and
17a00 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45   A>B..**.**    E
17a10 6f 66 41 3a 20 20 20 20 43 61 6c 6c 65 64 20 77  ofA:    Called w
17a20 68 65 6e 20 64 61 74 61 20 69 73 20 65 78 68 61  hen data is exha
17a30 75 73 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63  usted from selec
17a40 74 41 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66  tA..**.**    Eof
17a50 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65  B:    Called whe
17a60 6e 20 64 61 74 61 20 69 73 20 65 78 68 61 75 73  n data is exhaus
17a70 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63 74 42  ted from selectB
17a80 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c  ..**.** The impl
17a90 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
17aa0 65 20 6c 61 74 74 65 72 20 66 69 76 65 20 73 75  e latter five su
17ab0 62 72 6f 75 74 69 6e 65 73 20 64 65 70 65 6e 64  broutines depend
17ac0 20 6f 6e 20 77 68 69 63 68 20 0a 2a 2a 20 3c 6f   on which .** <o
17ad0 70 65 72 61 74 6f 72 3e 20 69 73 20 75 73 65 64  perator> is used
17ae0 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  :.**.**.**      
17af0 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c         UNION ALL
17b00 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 20           UNION  
17b10 20 20 20 20 20 20 20 20 20 20 45 58 43 45 50 54            EXCEPT
17b20 20 20 20 20 20 20 20 20 20 20 49 4e 54 45 52 53            INTERS
17b30 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ECT.**          
17b40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d  -------------  -
17b50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17b60 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
17b70 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
17b80 2d 2d 2d 0a 2a 2a 20 20 20 41 6c 74 42 3a 20 20  ---.**   AltB:  
17b90 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
17ba0 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
17bb0 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20      outA, nextA 
17bc0 20 20 20 20 20 20 20 20 6e 65 78 74 41 0a 2a 2a          nextA.**
17bd0 0a 2a 2a 20 20 20 41 65 71 42 3a 20 20 20 6f 75  .**   AeqB:   ou
17be0 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20  tA, nextA       
17bf0 20 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20    nextA         
17c00 20 20 20 20 6e 65 78 74 41 20 20 20 20 20 20 20      nextA       
17c10 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 0a 2a 2a    outA, nextA.**
17c20 0a 2a 2a 20 20 20 41 67 74 42 3a 20 20 20 6f 75  .**   AgtB:   ou
17c30 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 6f  tB, nextB      o
17c40 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20  utB, nextB      
17c50 20 20 20 20 6e 65 78 74 42 20 20 20 20 20 20 20      nextB       
17c60 20 20 20 20 20 6e 65 78 74 42 0a 2a 2a 0a 2a 2a       nextB.**.**
17c70 20 20 20 45 6f 66 41 3a 20 20 20 6f 75 74 42 2c     EofA:   outB,
17c80 20 6e 65 78 74 42 20 20 20 20 20 20 6f 75 74 42   nextB      outB
17c90 2c 20 6e 65 78 74 42 20 20 20 20 20 20 20 20 20  , nextB         
17ca0 20 68 61 6c 74 20 20 20 20 20 20 20 20 20 20 20   halt           
17cb0 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 20 20 45    halt.**.**   E
17cc0 6f 66 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78  ofB:   outA, nex
17cd0 74 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65  tA      outA, ne
17ce0 78 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c 20  xtA       outA, 
17cf0 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 68 61  nextA         ha
17d00 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  lt.**.** In the 
17d10 41 6c 74 42 2c 20 41 65 71 42 2c 20 61 6e 64 20  AltB, AeqB, and 
17d20 41 67 74 42 20 73 75 62 72 6f 75 74 69 6e 65 73  AgtB subroutines
17d30 2c 20 61 6e 20 45 4f 46 20 6f 6e 20 41 20 66 6f  , an EOF on A fo
17d40 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 41 0a 2a 2a  llowing nextA.**
17d50 20 63 61 75 73 65 73 20 61 6e 20 69 6d 6d 65 64   causes an immed
17d60 69 61 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66  iate jump to Eof
17d70 41 20 61 6e 64 20 61 6e 20 45 4f 46 20 6f 6e 20  A and an EOF on 
17d80 42 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74  B following next
17d90 42 20 63 61 75 73 65 73 0a 2a 2a 20 61 6e 20 69  B causes.** an i
17da0 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74 6f  mmediate jump to
17db0 20 45 6f 66 42 2e 20 20 57 69 74 68 69 6e 20 45   EofB.  Within E
17dc0 6f 66 41 20 61 6e 64 20 45 6f 66 42 2c 20 61 6e  ofA and EofB, an
17dd0 64 20 45 4f 46 20 6f 6e 20 65 6e 74 72 79 20 6f  d EOF on entry o
17de0 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e  r.** following n
17df0 65 78 74 58 20 63 61 75 73 65 73 20 61 20 6a 75  extX causes a ju
17e00 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  mp to the end of
17e10 20 74 68 65 20 73 65 6c 65 63 74 20 70 72 6f 63   the select proc
17e20 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 44 75  essing..**.** Du
17e30 70 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c 20  plicate removal 
17e40 69 6e 20 74 68 65 20 55 4e 49 4f 4e 2c 20 45 58  in the UNION, EX
17e50 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52 53  CEPT, and INTERS
17e60 45 43 54 20 63 61 73 65 73 20 69 73 20 68 61 6e  ECT cases is han
17e70 64 6c 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74  dled.** within t
17e80 68 65 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75  he output subrou
17e90 74 69 6e 65 2e 20 20 54 68 65 20 72 65 67 50 72  tine.  The regPr
17ea0 65 76 20 72 65 67 69 73 74 65 72 20 73 65 74 20  ev register set 
17eb0 68 6f 6c 64 73 20 74 68 65 20 70 72 65 76 69 6f  holds the previo
17ec0 75 73 6c 79 0a 2a 2a 20 6f 75 74 70 75 74 20 76  usly.** output v
17ed0 61 6c 75 65 2e 20 20 41 20 63 6f 6d 70 61 72 69  alue.  A compari
17ee0 73 6f 6e 20 69 73 20 6d 61 64 65 20 61 67 61 69  son is made agai
17ef0 6e 73 74 20 74 68 69 73 20 76 61 6c 75 65 20 61  nst this value a
17f00 6e 64 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a  nd the output.**
17f10 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 74   is skipped if t
17f20 68 65 20 6e 65 78 74 20 72 65 73 75 6c 74 73 20  he next results 
17f30 77 6f 75 6c 64 20 62 65 20 74 68 65 20 73 61 6d  would be the sam
17f40 65 20 61 73 20 74 68 65 20 70 72 65 76 69 6f 75  e as the previou
17f50 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70  s..**.** The imp
17f60 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 70 6c 61 6e  lementation plan
17f70 20 69 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74   is to implement
17f80 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75 74 69   the two corouti
17f90 6e 65 73 20 61 6e 64 20 73 65 76 65 6e 0a 2a 2a  nes and seven.**
17fa0 20 73 75 62 72 6f 75 74 69 6e 65 73 20 66 69 72   subroutines fir
17fb0 73 74 2c 20 74 68 65 6e 20 70 75 74 20 74 68 65  st, then put the
17fc0 20 63 6f 6e 74 72 6f 6c 20 6c 6f 67 69 63 20 61   control logic a
17fd0 74 20 74 68 65 20 62 6f 74 74 6f 6d 2e 20 20 4c  t the bottom.  L
17fe0 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
17ff0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 49 6e           goto In
18000 69 74 0a 2a 2a 20 20 20 20 20 63 6f 41 3a 20 63  it.**     coA: c
18010 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65 66  oroutine for lef
18020 74 20 71 75 65 72 79 20 28 41 29 0a 2a 2a 20 20  t query (A).**  
18030 20 20 20 63 6f 42 3a 20 63 6f 72 6f 75 74 69 6e     coB: coroutin
18040 65 20 66 6f 72 20 72 69 67 68 74 20 71 75 65 72  e for right quer
18050 79 20 28 42 29 0a 2a 2a 20 20 20 20 6f 75 74 41  y (B).**    outA
18060 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77  : output one row
18070 20 6f 66 20 41 0a 2a 2a 20 20 20 20 6f 75 74 42   of A.**    outB
18080 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77  : output one row
18090 20 6f 66 20 42 20 28 55 4e 49 4f 4e 20 61 6e 64   of B (UNION and
180a0 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 6e 6c 79 29   UNION ALL only)
180b0 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20 2e 2e 2e  .**    EofA: ...
180c0 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20 2e 2e 2e  .**    EofB: ...
180d0 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20 2e 2e 2e  .**    AltB: ...
180e0 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20 2e 2e 2e  .**    AeqB: ...
180f0 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20 2e 2e 2e  .**    AgtB: ...
18100 0a 2a 2a 20 20 20 20 49 6e 69 74 3a 20 69 6e 69  .**    Init: ini
18110 74 69 61 6c 69 7a 65 20 63 6f 72 6f 75 74 69 6e  tialize coroutin
18120 65 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 20  e registers.**  
18130 20 20 20 20 20 20 20 20 79 69 65 6c 64 20 63 6f          yield co
18140 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 66  A.**          if
18150 20 65 6f 66 28 41 29 20 67 6f 74 6f 20 45 6f 66   eof(A) goto Eof
18160 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69  A.**          yi
18170 65 6c 64 20 63 6f 42 0a 2a 2a 20 20 20 20 20 20  eld coB.**      
18180 20 20 20 20 69 66 20 65 6f 66 28 42 29 20 67 6f      if eof(B) go
18190 74 6f 20 45 6f 66 42 0a 2a 2a 20 20 20 20 43 6d  to EofB.**    Cm
181a0 70 72 3a 20 43 6f 6d 70 61 72 65 20 41 2c 20 42  pr: Compare A, B
181b0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 4a 75 6d  .**          Jum
181c0 70 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67  p AltB, AeqB, Ag
181d0 74 42 0a 2a 2a 20 20 20 20 20 45 6e 64 3a 20 2e  tB.**     End: .
181e0 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 63 61 6c 6c  ...**.** We call
181f0 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67 74   AltB, AeqB, Agt
18200 42 2c 20 45 6f 66 41 2c 20 61 6e 64 20 45 6f 66  B, EofA, and Eof
18210 42 20 22 73 75 62 72 6f 75 74 69 6e 65 73 22 20  B "subroutines" 
18220 62 75 74 20 74 68 65 79 20 61 72 65 20 6e 6f 74  but they are not
18230 0a 2a 2a 20 61 63 74 75 61 6c 6c 79 20 63 61 6c  .** actually cal
18240 6c 65 64 20 75 73 69 6e 67 20 47 6f 73 75 62 20  led using Gosub 
18250 61 6e 64 20 74 68 65 79 20 64 6f 20 6e 6f 74 20  and they do not 
18260 52 65 74 75 72 6e 2e 20 20 45 6f 66 41 20 61 6e  Return.  EofA an
18270 64 20 45 6f 66 42 20 6c 6f 6f 70 0a 2a 2a 20 75  d EofB loop.** u
18280 6e 74 69 6c 20 61 6c 6c 20 64 61 74 61 20 69 73  ntil all data is
18290 20 65 78 68 61 75 73 74 65 64 20 74 68 65 6e 20   exhausted then 
182a0 6a 75 6d 70 20 74 6f 20 74 68 65 20 22 65 6e 64  jump to the "end
182b0 22 20 6c 61 62 65 2e 20 20 41 6c 74 42 2c 20 41  " labe.  AltB, A
182c0 65 71 42 2c 0a 2a 2a 20 61 6e 64 20 41 67 74 42  eqB,.** and AgtB
182d0 20 6a 75 6d 70 20 74 6f 20 65 69 74 68 65 72 20   jump to either 
182e0 4c 32 20 6f 72 20 74 6f 20 6f 6e 65 20 6f 66 20  L2 or to one of 
182f0 45 6f 66 41 20 6f 72 20 45 6f 66 42 2e 0a 2a 2f  EofA or EofB..*/
18300 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
18310 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
18320 4c 45 43 54 0a 73 74 61 74 69 63 20 69 6e 74 20  LECT.static int 
18330 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72  multiSelectOrder
18340 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  By(.  Parse *pPa
18350 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
18360 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
18370 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
18380 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
18390 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53   right-most of S
183a0 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64  ELECTs to be cod
183b0 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ed */.  SelectDe
183c0 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a  st *pDest     /*
183d0 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
183e0 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
183f0 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  /.){.  int i, j;
18400 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18410 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
18420 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f  .  Select *pPrio
18430 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74  r;       /* Anot
18440 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64  her SELECT immed
18450 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65  iately to our le
18460 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  ft */.  Vdbe *v;
18470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18480 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
18490 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20  o this VDBE */. 
184a0 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
184b0 41 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e  A;     /* Destin
184c0 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74  ation for corout
184d0 69 6e 65 20 41 20 2a 2f 0a 20 20 53 65 6c 65 63  ine A */.  Selec
184e0 74 44 65 73 74 20 64 65 73 74 42 3b 20 20 20 20  tDest destB;    
184f0 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20   /* Destination 
18500 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20 42 20  for coroutine B 
18510 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 64 64 72  */.  int regAddr
18520 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  A;         /* Ad
18530 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
18540 6f 72 20 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f  or select-A coro
18550 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72  utine */.  int r
18560 65 67 41 64 64 72 42 3b 20 20 20 20 20 20 20 20  egAddrB;        
18570 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69   /* Address regi
18580 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d  ster for select-
18590 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  B coroutine */. 
185a0 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74 41   int addrSelectA
185b0 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  ;      /* Addres
185c0 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d  s of the select-
185d0 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  A coroutine */. 
185e0 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74 42   int addrSelectB
185f0 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  ;      /* Addres
18600 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d  s of the select-
18610 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  B coroutine */. 
18620 20 69 6e 74 20 72 65 67 4f 75 74 41 3b 20 20 20   int regOutA;   
18630 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
18640 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 74  s register for t
18650 68 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62 72  he output-A subr
18660 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
18670 72 65 67 4f 75 74 42 3b 20 20 20 20 20 20 20 20  regOutB;        
18680 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67    /* Address reg
18690 69 73 74 65 72 20 66 6f 72 20 74 68 65 20 6f 75  ister for the ou
186a0 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69 6e  tput-B subroutin
186b0 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f  e */.  int addrO
186c0 75 74 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  utA;         /* 
186d0 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6f  Address of the o
186e0 75 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74 69  utput-A subrouti
186f0 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
18700 4f 75 74 42 20 3d 20 30 3b 20 20 20 20 20 2f 2a  OutB = 0;     /*
18710 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
18720 6f 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74  output-B subrout
18730 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
18740 72 45 6f 66 41 3b 20 20 20 20 20 20 20 20 20 2f  rEofA;         /
18750 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
18760 20 73 65 6c 65 63 74 2d 41 2d 65 78 68 61 75 73   select-A-exhaus
18770 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  ted subroutine *
18780 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66 41  /.  int addrEofA
18790 5f 6e 6f 42 3b 20 20 20 20 20 2f 2a 20 41 6c 74  _noB;     /* Alt
187a0 65 72 6e 61 74 65 20 61 64 64 72 45 6f 66 41 20  ernate addrEofA 
187b0 69 66 20 42 20 69 73 20 75 6e 69 6e 69 74 69 61  if B is uninitia
187c0 6c 69 7a 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61  lized */.  int a
187d0 64 64 72 45 6f 66 42 3b 20 20 20 20 20 20 20 20  ddrEofB;        
187e0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
187f0 68 65 20 73 65 6c 65 63 74 2d 42 2d 65 78 68 61  he select-B-exha
18800 75 73 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65  usted subroutine
18810 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 6c   */.  int addrAl
18820 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  tB;         /* A
18830 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41 3c  ddress of the A<
18840 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  B subroutine */.
18850 20 20 69 6e 74 20 61 64 64 72 41 65 71 42 3b 20    int addrAeqB; 
18860 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
18870 73 73 20 6f 66 20 74 68 65 20 41 3d 3d 42 20 73  ss of the A==B s
18880 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
18890 6e 74 20 61 64 64 72 41 67 74 42 3b 20 20 20 20  nt addrAgtB;    
188a0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
188b0 6f 66 20 74 68 65 20 41 3e 42 20 73 75 62 72 6f  of the A>B subro
188c0 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72  utine */.  int r
188d0 65 67 4c 69 6d 69 74 41 3b 20 20 20 20 20 20 20  egLimitA;       
188e0 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69 73 74   /* Limit regist
188f0 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20  er for select-A 
18900 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69  */.  int regLimi
18910 74 42 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  tB;        /* Li
18920 6d 69 74 20 72 65 67 69 73 74 65 72 20 66 6f 72  mit register for
18930 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69   select-A */.  i
18940 6e 74 20 72 65 67 50 72 65 76 3b 20 20 20 20 20  nt regPrev;     
18950 20 20 20 20 20 2f 2a 20 41 20 72 61 6e 67 65 20       /* A range 
18960 6f 66 20 72 65 67 69 73 74 65 72 73 20 74 6f 20  of registers to 
18970 68 6f 6c 64 20 70 72 65 76 69 6f 75 73 20 6f 75  hold previous ou
18980 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61  tput */.  int sa
18990 76 65 64 4c 69 6d 69 74 3b 20 20 20 20 20 20 20  vedLimit;       
189a0 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f  /* Saved value o
189b0 66 20 70 2d 3e 69 4c 69 6d 69 74 20 2a 2f 0a 20  f p->iLimit */. 
189c0 20 69 6e 74 20 73 61 76 65 64 4f 66 66 73 65 74   int savedOffset
189d0 3b 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20  ;      /* Saved 
189e0 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4f 66 66  value of p->iOff
189f0 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62  set */.  int lab
18a00 65 6c 43 6d 70 72 3b 20 20 20 20 20 20 20 20 2f  elCmpr;        /
18a10 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 65 20  * Label for the 
18a20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6d 65 72  start of the mer
18a30 67 65 20 61 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a  ge algorithm */.
18a40 20 20 69 6e 74 20 6c 61 62 65 6c 45 6e 64 3b 20    int labelEnd; 
18a50 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c          /* Label
18a60 20 66 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20   for the end of 
18a70 74 68 65 20 6f 76 65 72 61 6c 6c 20 53 45 4c 45  the overall SELE
18a80 43 54 20 73 74 6d 74 20 2a 2f 0a 20 20 69 6e 74  CT stmt */.  int
18a90 20 61 64 64 72 31 3b 20 20 20 20 20 20 20 20 20   addr1;         
18aa0 20 20 20 2f 2a 20 4a 75 6d 70 20 69 6e 73 74 72     /* Jump instr
18ab0 75 63 74 69 6f 6e 73 20 74 68 61 74 20 67 65 74  uctions that get
18ac0 20 72 65 74 61 72 67 65 74 74 65 64 20 2a 2f 0a   retargetted */.
18ad0 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20    int op;       
18ae0 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
18af0 66 20 54 4b 5f 41 4c 4c 2c 20 54 4b 5f 55 4e 49  f TK_ALL, TK_UNI
18b00 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c 20 54  ON, TK_EXCEPT, T
18b10 4b 5f 49 4e 54 45 52 53 45 43 54 20 2a 2f 0a 20  K_INTERSECT */. 
18b20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 44 75   KeyInfo *pKeyDu
18b30 70 20 3d 20 30 3b 20 2f 2a 20 43 6f 6d 70 61 72  p = 0; /* Compar
18b40 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ison information
18b50 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20 72   for duplicate r
18b60 65 6d 6f 76 61 6c 20 2a 2f 0a 20 20 4b 65 79 49  emoval */.  KeyI
18b70 6e 66 6f 20 2a 70 4b 65 79 4d 65 72 67 65 3b 20  nfo *pKeyMerge; 
18b80 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20    /* Comparison 
18b90 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
18ba0 6d 65 72 67 69 6e 67 20 72 6f 77 73 20 2a 2f 0a  merging rows */.
18bb0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
18bc0 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
18bd0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
18be0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
18bf0 72 64 65 72 42 79 3b 20 20 20 2f 2a 20 54 68 65  rderBy;   /* The
18c00 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
18c10 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72   */.  int nOrder
18c20 42 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  By;         /* N
18c30 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69  umber of terms i
18c40 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  n the ORDER BY c
18c50 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a  lause */.  int *
18c60 61 50 65 72 6d 75 74 65 3b 20 20 20 20 20 20 20  aPermute;       
18c70 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d   /* Mapping from
18c80 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
18c90 74 6f 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f  to result set co
18ca0 6c 75 6d 6e 73 20 2a 2f 0a 23 69 66 6e 64 65 66  lumns */.#ifndef
18cb0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
18cc0 4c 41 49 4e 0a 20 20 69 6e 74 20 69 53 75 62 31  LAIN.  int iSub1
18cd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
18ce0 45 51 50 20 69 64 20 6f 66 20 6c 65 66 74 2d 68  EQP id of left-h
18cf0 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  and query */.  i
18d00 6e 74 20 69 53 75 62 32 3b 20 20 20 20 20 20 20  nt iSub2;       
18d10 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f       /* EQP id o
18d20 66 20 72 69 67 68 74 2d 68 61 6e 64 20 71 75 65  f right-hand que
18d30 72 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20  ry */.#endif..  
18d40 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65  assert( p->pOrde
18d50 72 42 79 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  rBy!=0 );.  asse
18d60 72 74 28 20 70 4b 65 79 44 75 70 3d 3d 30 20 29  rt( pKeyDup==0 )
18d70 3b 20 2f 2a 20 22 4d 61 6e 61 67 65 64 22 20 63  ; /* "Managed" c
18d80 6f 64 65 20 6e 65 65 64 73 20 74 68 69 73 2e 20  ode needs this. 
18d90 20 54 69 63 6b 65 74 20 23 33 33 38 32 2e 20 2a   Ticket #3382. *
18da0 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  /.  db = pParse-
18db0 3e 64 62 3b 0a 20 20 76 20 3d 20 70 50 61 72 73  >db;.  v = pPars
18dc0 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65  e->pVdbe;.  asse
18dd0 72 74 28 20 76 21 3d 30 20 29 3b 20 20 20 20 20  rt( v!=0 );     
18de0 20 20 2f 2a 20 41 6c 72 65 61 64 79 20 74 68 72    /* Already thr
18df0 6f 77 6e 20 74 68 65 20 65 72 72 6f 72 20 69 66  own the error if
18e00 20 56 44 42 45 20 61 6c 6c 6f 63 20 66 61 69 6c   VDBE alloc fail
18e10 65 64 20 2a 2f 0a 20 20 6c 61 62 65 6c 45 6e 64  ed */.  labelEnd
18e20 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
18e30 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 6c 61  keLabel(v);.  la
18e40 62 65 6c 43 6d 70 72 20 3d 20 73 71 6c 69 74 65  belCmpr = sqlite
18e50 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
18e60 29 3b 0a 0a 0a 20 20 2f 2a 20 50 61 74 63 68 20  );...  /* Patch 
18e70 75 70 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  up the ORDER BY 
18e80 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 6f 70  clause.  */.  op
18e90 20 3d 20 70 2d 3e 6f 70 3b 20 20 0a 20 20 70 50   = p->op;  .  pP
18ea0 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72  rior = p->pPrior
18eb0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 72 69  ;.  assert( pPri
18ec0 6f 72 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20  or->pOrderBy==0 
18ed0 29 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20  );.  pOrderBy = 
18ee0 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 61  p->pOrderBy;.  a
18ef0 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 20  ssert( pOrderBy 
18f00 29 3b 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20  );.  nOrderBy = 
18f10 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
18f20 0a 0a 20 20 2f 2a 20 46 6f 72 20 6f 70 65 72 61  ..  /* For opera
18f30 74 6f 72 73 20 6f 74 68 65 72 20 74 68 61 6e 20  tors other than 
18f40 55 4e 49 4f 4e 20 41 4c 4c 20 77 65 20 68 61 76  UNION ALL we hav
18f50 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  e to make sure t
18f60 68 61 74 0a 20 20 2a 2a 20 74 68 65 20 4f 52 44  hat.  ** the ORD
18f70 45 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f 76  ER BY clause cov
18f80 65 72 73 20 65 76 65 72 79 20 74 65 72 6d 20 6f  ers every term o
18f90 66 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  f the result set
18fa0 2e 20 20 41 64 64 0a 20 20 2a 2a 20 74 65 72 6d  .  Add.  ** term
18fb0 73 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42  s to the ORDER B
18fc0 59 20 63 6c 61 75 73 65 20 61 73 20 6e 65 63 65  Y clause as nece
18fd0 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  ssary..  */.  if
18fe0 28 20 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a  ( op!=TK_ALL ){.
18ff0 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 64 62 2d      for(i=1; db-
19000 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30  >mallocFailed==0
19010 20 26 26 20 69 3c 3d 70 2d 3e 70 45 4c 69 73 74   && i<=p->pEList
19020 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
19030 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
19040 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
19050 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c  ;.      for(j=0,
19060 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d   pItem=pOrderBy-
19070 3e 61 3b 20 6a 3c 6e 4f 72 64 65 72 42 79 3b 20  >a; j<nOrderBy; 
19080 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  j++, pItem++){. 
19090 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
190a0 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72  Item->u.x.iOrder
190b0 42 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20  ByCol>0 );.     
190c0 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 75 2e     if( pItem->u.
190d0 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 69  x.iOrderByCol==i
190e0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
190f0 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e  }.      if( j==n
19100 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
19110 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20     Expr *pNew = 
19120 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20  sqlite3Expr(db, 
19130 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 29 3b 0a  TK_INTEGER, 0);.
19140 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
19150 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
19160 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
19170 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c          pNew->fl
19180 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c  ags |= EP_IntVal
19190 75 65 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  ue;.        pNew
191a0 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69 3b 0a  ->u.iValue = i;.
191b0 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79          pOrderBy
191c0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
191d0 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
191e0 20 70 4f 72 64 65 72 42 79 2c 20 70 4e 65 77 29   pOrderBy, pNew)
191f0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  ;.        if( pO
19200 72 64 65 72 42 79 20 29 20 70 4f 72 64 65 72 42  rderBy ) pOrderB
19210 79 2d 3e 61 5b 6e 4f 72 64 65 72 42 79 2b 2b 5d  y->a[nOrderBy++]
19220 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  .u.x.iOrderByCol
19230 20 3d 20 28 75 31 36 29 69 3b 0a 20 20 20 20 20   = (u16)i;.     
19240 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
19250 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63  /* Compute the c
19260 6f 6d 70 61 72 69 73 6f 6e 20 70 65 72 6d 75 74  omparison permut
19270 61 74 69 6f 6e 20 61 6e 64 20 6b 65 79 69 6e 66  ation and keyinf
19280 6f 20 74 68 61 74 20 69 73 20 75 73 65 64 20 77  o that is used w
19290 69 74 68 0a 20 20 2a 2a 20 74 68 65 20 70 65 72  ith.  ** the per
192a0 6d 75 74 61 74 69 6f 6e 20 75 73 65 64 20 74 6f  mutation used to
192b0 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68   determine if th
192c0 65 20 6e 65 78 74 0a 20 20 2a 2a 20 72 6f 77 20  e next.  ** row 
192d0 6f 66 20 72 65 73 75 6c 74 73 20 63 6f 6d 65 73  of results comes
192e0 20 66 72 6f 6d 20 73 65 6c 65 63 74 41 20 6f 72   from selectA or
192f0 20 73 65 6c 65 63 74 42 2e 20 20 41 6c 73 6f 20   selectB.  Also 
19300 61 64 64 20 65 78 70 6c 69 63 69 74 0a 20 20 2a  add explicit.  *
19310 2a 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 74 6f 20  * collations to 
19320 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
19330 75 73 65 20 74 65 72 6d 73 20 73 6f 20 74 68 61  use terms so tha
19340 74 20 77 68 65 6e 20 74 68 65 20 73 75 62 71 75  t when the subqu
19350 65 72 69 65 73 0a 20 20 2a 2a 20 74 6f 20 74 68  eries.  ** to th
19360 65 20 72 69 67 68 74 20 61 6e 64 20 74 68 65 20  e right and the 
19370 6c 65 66 74 20 61 72 65 20 65 76 61 6c 75 61 74  left are evaluat
19380 65 64 2c 20 74 68 65 79 20 75 73 65 20 74 68 65  ed, they use the
19390 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20 63 6f   correct.  ** co
193a0 6c 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  llation..  */.  
193b0 61 50 65 72 6d 75 74 65 20 3d 20 73 71 6c 69 74  aPermute = sqlit
193c0 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
193d0 64 62 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a  db, sizeof(int)*
193e0 28 6e 4f 72 64 65 72 42 79 20 2b 20 31 29 29 3b  (nOrderBy + 1));
193f0 0a 20 20 69 66 28 20 61 50 65 72 6d 75 74 65 20  .  if( aPermute 
19400 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
19410 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
19420 65 6d 3b 0a 20 20 20 20 61 50 65 72 6d 75 74 65  em;.    aPermute
19430 5b 30 5d 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a  [0] = nOrderBy;.
19440 20 20 20 20 66 6f 72 28 69 3d 31 2c 20 70 49 74      for(i=1, pIt
19450 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20  em=pOrderBy->a; 
19460 69 3c 3d 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b  i<=nOrderBy; i++
19470 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
19480 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
19490 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  >u.x.iOrderByCol
194a0 3e 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  >0 );.      asse
194b0 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69  rt( pItem->u.x.i
194c0 4f 72 64 65 72 42 79 43 6f 6c 3c 3d 70 2d 3e 70  OrderByCol<=p->p
194d0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a  EList->nExpr );.
194e0 20 20 20 20 20 20 61 50 65 72 6d 75 74 65 5b 69        aPermute[i
194f0 5d 20 3d 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69  ] = pItem->u.x.i
19500 4f 72 64 65 72 42 79 43 6f 6c 20 2d 20 31 3b 0a  OrderByCol - 1;.
19510 20 20 20 20 7d 0a 20 20 20 20 70 4b 65 79 4d 65      }.    pKeyMe
19520 72 67 65 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63  rge = multiSelec
19530 74 4f 72 64 65 72 42 79 4b 65 79 49 6e 66 6f 28  tOrderByKeyInfo(
19540 70 50 61 72 73 65 2c 20 70 2c 20 31 29 3b 0a 20  pParse, p, 1);. 
19550 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4b 65 79   }else{.    pKey
19560 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a  Merge = 0;.  }..
19570 20 20 2f 2a 20 52 65 61 74 74 61 63 68 20 74 68    /* Reattach th
19580 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
19590 65 20 74 6f 20 74 68 65 20 71 75 65 72 79 2e 0a  e to the query..
195a0 20 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65 72    */.  p->pOrder
195b0 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20  By = pOrderBy;. 
195c0 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42   pPrior->pOrderB
195d0 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
195e0 69 73 74 44 75 70 28 70 50 61 72 73 65 2d 3e 64  istDup(pParse->d
195f0 62 2c 20 70 4f 72 64 65 72 42 79 2c 20 30 29 3b  b, pOrderBy, 0);
19600 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
19610 61 20 72 61 6e 67 65 20 6f 66 20 74 65 6d 70 6f  a range of tempo
19620 72 61 72 79 20 72 65 67 69 73 74 65 72 73 20 61  rary registers a
19630 6e 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6e  nd the KeyInfo n
19640 65 65 64 65 64 0a 20 20 2a 2a 20 66 6f 72 20 74  eeded.  ** for t
19650 68 65 20 6c 6f 67 69 63 20 74 68 61 74 20 72 65  he logic that re
19660 6d 6f 76 65 73 20 64 75 70 6c 69 63 61 74 65 20  moves duplicate 
19670 72 65 73 75 6c 74 20 72 6f 77 73 20 77 68 65 6e  result rows when
19680 20 74 68 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74   the.  ** operat
19690 6f 72 20 69 73 20 55 4e 49 4f 4e 2c 20 45 58 43  or is UNION, EXC
196a0 45 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43  EPT, or INTERSEC
196b0 54 20 28 62 75 74 20 6e 6f 74 20 55 4e 49 4f 4e  T (but not UNION
196c0 20 41 4c 4c 29 2e 0a 20 20 2a 2f 0a 20 20 69 66   ALL)..  */.  if
196d0 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a  ( op==TK_ALL ){.
196e0 20 20 20 20 72 65 67 50 72 65 76 20 3d 20 30 3b      regPrev = 0;
196f0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
19700 74 20 6e 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c  t nExpr = p->pEL
19710 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  ist->nExpr;.    
19720 61 73 73 65 72 74 28 20 6e 4f 72 64 65 72 42 79  assert( nOrderBy
19730 3e 3d 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e 6d  >=nExpr || db->m
19740 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
19750 20 20 20 72 65 67 50 72 65 76 20 3d 20 70 50 61     regPrev = pPa
19760 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20  rse->nMem+1;.   
19770 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
19780 20 6e 45 78 70 72 2b 31 3b 0a 20 20 20 20 73 71   nExpr+1;.    sq
19790 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
197a0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
197b0 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20 20 20  , regPrev);.    
197c0 70 4b 65 79 44 75 70 20 3d 20 73 71 6c 69 74 65  pKeyDup = sqlite
197d0 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62  3KeyInfoAlloc(db
197e0 2c 20 6e 45 78 70 72 2c 20 31 29 3b 0a 20 20 20  , nExpr, 1);.   
197f0 20 69 66 28 20 70 4b 65 79 44 75 70 20 29 7b 0a   if( pKeyDup ){.
19800 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
19810 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72  lite3KeyInfoIsWr
19820 69 74 65 61 62 6c 65 28 70 4b 65 79 44 75 70 29  iteable(pKeyDup)
19830 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   );.      for(i=
19840 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 29  0; i<nExpr; i++)
19850 7b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44 75  {.        pKeyDu
19860 70 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 6d 75  p->aColl[i] = mu
19870 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71  ltiSelectCollSeq
19880 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a  (pParse, p, i);.
19890 20 20 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d          pKeyDup-
198a0 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d  >aSortOrder[i] =
198b0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
198c0 7d 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 53 65 70  }.  }. .  /* Sep
198d0 61 72 61 74 65 20 74 68 65 20 6c 65 66 74 20 61  arate the left a
198e0 6e 64 20 74 68 65 20 72 69 67 68 74 20 71 75 65  nd the right que
198f0 72 79 20 66 72 6f 6d 20 6f 6e 65 20 61 6e 6f 74  ry from one anot
19900 68 65 72 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 50  her.  */.  p->pP
19910 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70 50 72 69  rior = 0;.  pPri
19920 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20  or->pNext = 0;. 
19930 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f   sqlite3ResolveO
19940 72 64 65 72 47 72 6f 75 70 42 79 28 70 50 61 72  rderGroupBy(pPar
19950 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65 72  se, p, p->pOrder
19960 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20 20  By, "ORDER");.  
19970 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 50 72 69  if( pPrior->pPri
19980 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  or==0 ){.    sql
19990 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72  ite3ResolveOrder
199a0 47 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20  GroupBy(pParse, 
199b0 70 50 72 69 6f 72 2c 20 70 50 72 69 6f 72 2d 3e  pPrior, pPrior->
199c0 70 4f 72 64 65 72 42 79 2c 20 22 4f 52 44 45 52  pOrderBy, "ORDER
199d0 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f  ");.  }..  /* Co
199e0 6d 70 75 74 65 20 74 68 65 20 6c 69 6d 69 74 20  mpute the limit 
199f0 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 63  registers */.  c
19a00 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
19a10 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20  ters(pParse, p, 
19a20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 69 66 28  labelEnd);.  if(
19a30 20 70 2d 3e 69 4c 69 6d 69 74 20 26 26 20 6f 70   p->iLimit && op
19a40 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20  ==TK_ALL ){.    
19a50 72 65 67 4c 69 6d 69 74 41 20 3d 20 2b 2b 70 50  regLimitA = ++pP
19a60 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
19a70 72 65 67 4c 69 6d 69 74 42 20 3d 20 2b 2b 70 50  regLimitB = ++pP
19a80 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
19a90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19aa0 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 2d  2(v, OP_Copy, p-
19ab0 3e 69 4f 66 66 73 65 74 20 3f 20 70 2d 3e 69 4f  >iOffset ? p->iO
19ac0 66 66 73 65 74 2b 31 20 3a 20 70 2d 3e 69 4c 69  ffset+1 : p->iLi
19ad0 6d 69 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  mit,.           
19ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19af0 20 20 20 20 20 20 20 72 65 67 4c 69 6d 69 74 41         regLimitA
19b00 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
19b10 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
19b20 6f 70 79 2c 20 72 65 67 4c 69 6d 69 74 41 2c 20  opy, regLimitA, 
19b30 72 65 67 4c 69 6d 69 74 42 29 3b 0a 20 20 7d 65  regLimitB);.  }e
19b40 6c 73 65 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69  lse{.    regLimi
19b50 74 41 20 3d 20 72 65 67 4c 69 6d 69 74 42 20 3d  tA = regLimitB =
19b60 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
19b70 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
19b80 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 70 2d  p->pLimit);.  p-
19b90 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 73  >pLimit = 0;.  s
19ba0 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
19bb0 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29  (db, p->pOffset)
19bc0 3b 0a 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d  ;.  p->pOffset =
19bd0 20 30 3b 0a 0a 20 20 72 65 67 41 64 64 72 41 20   0;..  regAddrA 
19be0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
19bf0 3b 0a 20 20 72 65 67 41 64 64 72 42 20 3d 20 2b  ;.  regAddrB = +
19c00 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
19c10 20 72 65 67 4f 75 74 41 20 3d 20 2b 2b 70 50 61   regOutA = ++pPa
19c20 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67  rse->nMem;.  reg
19c30 4f 75 74 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d  OutB = ++pParse-
19c40 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33  >nMem;.  sqlite3
19c50 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
19c60 64 65 73 74 41 2c 20 53 52 54 5f 43 6f 72 6f 75  destA, SRT_Corou
19c70 74 69 6e 65 2c 20 72 65 67 41 64 64 72 41 29 3b  tine, regAddrA);
19c80 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
19c90 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 42 2c  DestInit(&destB,
19ca0 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20   SRT_Coroutine, 
19cb0 72 65 67 41 64 64 72 42 29 3b 0a 0a 20 20 2f 2a  regAddrB);..  /*
19cc0 20 47 65 6e 65 72 61 74 65 20 61 20 63 6f 72 6f   Generate a coro
19cd0 75 74 69 6e 65 20 74 6f 20 65 76 61 6c 75 61 74  utine to evaluat
19ce0 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  e the SELECT sta
19cf0 74 65 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20 20  tement to the.  
19d00 2a 2a 20 6c 65 66 74 20 6f 66 20 74 68 65 20 63  ** left of the c
19d10 6f 6d 70 6f 75 6e 64 20 6f 70 65 72 61 74 6f 72  ompound operator
19d20 20 2d 20 74 68 65 20 22 41 22 20 73 65 6c 65 63   - the "A" selec
19d30 74 2e 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53 65  t..  */.  addrSe
19d40 6c 65 63 74 41 20 3d 20 73 71 6c 69 74 65 33 56  lectA = sqlite3V
19d50 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
19d60 29 20 2b 20 31 3b 0a 20 20 61 64 64 72 31 20 3d  ) + 1;.  addr1 =
19d70 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19d80 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72  p3(v, OP_InitCor
19d90 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 41  outine, regAddrA
19da0 2c 20 30 2c 20 61 64 64 72 53 65 6c 65 63 74 41  , 0, addrSelectA
19db0 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  );.  VdbeComment
19dc0 28 28 76 2c 20 22 6c 65 66 74 20 53 45 4c 45 43  ((v, "left SELEC
19dd0 54 22 29 29 3b 0a 20 20 70 50 72 69 6f 72 2d 3e  T"));.  pPrior->
19de0 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69  iLimit = regLimi
19df0 74 41 3b 0a 20 20 65 78 70 6c 61 69 6e 53 65 74  tA;.  explainSet
19e00 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70  Integer(iSub1, p
19e10 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
19e20 63 74 49 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  ctId);.  sqlite3
19e30 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
19e40 50 72 69 6f 72 2c 20 26 64 65 73 74 41 29 3b 0a  Prior, &destA);.
19e50 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 64    sqlite3VdbeEnd
19e60 43 6f 72 6f 75 74 69 6e 65 28 76 2c 20 72 65 67  Coroutine(v, reg
19e70 41 64 64 72 41 29 3b 0a 20 20 73 71 6c 69 74 65  AddrA);.  sqlite
19e80 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
19e90 20 61 64 64 72 31 29 3b 0a 0a 20 20 2f 2a 20 47   addr1);..  /* G
19ea0 65 6e 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74  enerate a corout
19eb0 69 6e 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20  ine to evaluate 
19ec0 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
19ed0 6d 65 6e 74 20 6f 6e 20 0a 20 20 2a 2a 20 74 68  ment on .  ** th
19ee0 65 20 72 69 67 68 74 20 2d 20 74 68 65 20 22 42  e right - the "B
19ef0 22 20 73 65 6c 65 63 74 0a 20 20 2a 2f 0a 20 20  " select.  */.  
19f00 61 64 64 72 53 65 6c 65 63 74 42 20 3d 20 73 71  addrSelectB = sq
19f10 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
19f20 41 64 64 72 28 76 29 20 2b 20 31 3b 0a 20 20 61  Addr(v) + 1;.  a
19f30 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
19f40 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
19f50 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65  nitCoroutine, re
19f60 67 41 64 64 72 42 2c 20 30 2c 20 61 64 64 72 53  gAddrB, 0, addrS
19f70 65 6c 65 63 74 42 29 3b 0a 20 20 56 64 62 65 43  electB);.  VdbeC
19f80 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 69 67 68  omment((v, "righ
19f90 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 20 20 73  t SELECT"));.  s
19fa0 61 76 65 64 4c 69 6d 69 74 20 3d 20 70 2d 3e 69  avedLimit = p->i
19fb0 4c 69 6d 69 74 3b 0a 20 20 73 61 76 65 64 4f 66  Limit;.  savedOf
19fc0 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65  fset = p->iOffse
19fd0 74 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d  t;.  p->iLimit =
19fe0 20 72 65 67 4c 69 6d 69 74 42 3b 0a 20 20 70 2d   regLimitB;.  p-
19ff0 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 20 20 0a  >iOffset = 0;  .
1a000 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
1a010 67 65 72 28 69 53 75 62 32 2c 20 70 50 61 72 73  ger(iSub2, pPars
1a020 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
1a030 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
1a040 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64  ct(pParse, p, &d
1a050 65 73 74 42 29 3b 0a 20 20 70 2d 3e 69 4c 69 6d  estB);.  p->iLim
1a060 69 74 20 3d 20 73 61 76 65 64 4c 69 6d 69 74 3b  it = savedLimit;
1a070 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20  .  p->iOffset = 
1a080 73 61 76 65 64 4f 66 66 73 65 74 3b 0a 20 20 73  savedOffset;.  s
1a090 71 6c 69 74 65 33 56 64 62 65 45 6e 64 43 6f 72  qlite3VdbeEndCor
1a0a0 6f 75 74 69 6e 65 28 76 2c 20 72 65 67 41 64 64  outine(v, regAdd
1a0b0 72 42 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  rB);..  /* Gener
1a0c0 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
1a0d0 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 74 68   that outputs th
1a0e0 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66  e current row of
1a0f0 20 74 68 65 20 41 0a 20 20 2a 2a 20 73 65 6c 65   the A.  ** sele
1a100 63 74 20 61 73 20 74 68 65 20 6e 65 78 74 20 6f  ct as the next o
1a110 75 74 70 75 74 20 72 6f 77 20 6f 66 20 74 68 65  utput row of the
1a120 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
1a130 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f  ..  */.  VdbeNoo
1a140 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75  pComment((v, "Ou
1a150 74 70 75 74 20 72 6f 75 74 69 6e 65 20 66 6f 72  tput routine for
1a160 20 41 22 29 29 3b 0a 20 20 61 64 64 72 4f 75 74   A"));.  addrOut
1a170 41 20 3d 20 67 65 6e 65 72 61 74 65 4f 75 74 70  A = generateOutp
1a180 75 74 53 75 62 72 6f 75 74 69 6e 65 28 70 50 61  utSubroutine(pPa
1a190 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rse,.           
1a1a0 20 20 20 20 20 20 70 2c 20 26 64 65 73 74 41 2c        p, &destA,
1a1b0 20 70 44 65 73 74 2c 20 72 65 67 4f 75 74 41 2c   pDest, regOutA,
1a1c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a1d0 20 20 72 65 67 50 72 65 76 2c 20 70 4b 65 79 44    regPrev, pKeyD
1a1e0 75 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20  up, labelEnd);. 
1a1f0 20 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20   .  /* Generate 
1a200 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  a subroutine tha
1a210 74 20 6f 75 74 70 75 74 73 20 74 68 65 20 63 75  t outputs the cu
1a220 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65  rrent row of the
1a230 20 42 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61   B.  ** select a
1a240 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75  s the next outpu
1a250 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d  t row of the com
1a260 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20  pound select..  
1a270 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  */.  if( op==TK_
1a280 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e  ALL || op==TK_UN
1a290 49 4f 4e 20 29 7b 0a 20 20 20 20 56 64 62 65 4e  ION ){.    VdbeN
1a2a0 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
1a2b0 4f 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20 66  Output routine f
1a2c0 6f 72 20 42 22 29 29 3b 0a 20 20 20 20 61 64 64  or B"));.    add
1a2d0 72 4f 75 74 42 20 3d 20 67 65 6e 65 72 61 74 65  rOutB = generate
1a2e0 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65  OutputSubroutine
1a2f0 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
1a300 20 20 20 20 20 20 20 20 20 20 70 2c 20 26 64 65            p, &de
1a310 73 74 42 2c 20 70 44 65 73 74 2c 20 72 65 67 4f  stB, pDest, regO
1a320 75 74 42 2c 0a 20 20 20 20 20 20 20 20 20 20 20  utB,.           
1a330 20 20 20 20 20 20 72 65 67 50 72 65 76 2c 20 70        regPrev, p
1a340 4b 65 79 44 75 70 2c 20 6c 61 62 65 6c 45 6e 64  KeyDup, labelEnd
1a350 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
1a360 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65  KeyInfoUnref(pKe
1a370 79 44 75 70 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  yDup);..  /* Gen
1a380 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
1a390 6e 65 20 74 6f 20 72 75 6e 20 77 68 65 6e 20 74  ne to run when t
1a3a0 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20  he results from 
1a3b0 73 65 6c 65 63 74 20 41 0a 20 20 2a 2a 20 61 72  select A.  ** ar
1a3c0 65 20 65 78 68 61 75 73 74 65 64 20 61 6e 64 20  e exhausted and 
1a3d0 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20 73 65 6c  only data in sel
1a3e0 65 63 74 20 42 20 72 65 6d 61 69 6e 73 2e 0a 20  ect B remains.. 
1a3f0 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b   */.  if( op==TK
1a400 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54  _EXCEPT || op==T
1a410 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20  K_INTERSECT ){. 
1a420 20 20 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 20     addrEofA_noB 
1a430 3d 20 61 64 64 72 45 6f 66 41 20 3d 20 6c 61 62  = addrEofA = lab
1a440 65 6c 45 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 20  elEnd;.  }else{ 
1a450 20 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f   .    VdbeNoopCo
1a460 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 41  mment((v, "eof-A
1a470 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a   subroutine"));.
1a480 20 20 20 20 61 64 64 72 45 6f 66 41 20 3d 20 73      addrEofA = s
1a490 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1a4a0 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
1a4b0 67 4f 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29  gOutB, addrOutB)
1a4c0 3b 0a 20 20 20 20 61 64 64 72 45 6f 66 41 5f 6e  ;.    addrEofA_n
1a4d0 6f 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  oB = sqlite3Vdbe
1a4e0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65  AddOp2(v, OP_Yie
1a4f0 6c 64 2c 20 72 65 67 41 64 64 72 42 2c 20 6c 61  ld, regAddrB, la
1a500 62 65 6c 45 6e 64 29 3b 0a 20 20 20 20 20 20 20  belEnd);.       
1a510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 64                Vd
1a530 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
1a540 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
1a550 74 6f 28 76 2c 20 61 64 64 72 45 6f 66 41 29 3b  to(v, addrEofA);
1a560 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52  .    p->nSelectR
1a570 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ow = sqlite3LogE
1a580 73 74 41 64 64 28 70 2d 3e 6e 53 65 6c 65 63 74  stAdd(p->nSelect
1a590 52 6f 77 2c 20 70 50 72 69 6f 72 2d 3e 6e 53 65  Row, pPrior->nSe
1a5a0 6c 65 63 74 52 6f 77 29 3b 0a 20 20 7d 0a 0a 20  lectRow);.  }.. 
1a5b0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
1a5c0 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e  ubroutine to run
1a5d0 20 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   when the result
1a5e0 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 20 42 0a  s from select B.
1a5f0 20 20 2a 2a 20 61 72 65 20 65 78 68 61 75 73 74    ** are exhaust
1a600 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61  ed and only data
1a610 20 69 6e 20 73 65 6c 65 63 74 20 41 20 72 65 6d   in select A rem
1a620 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ains..  */.  if(
1a630 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43   op==TK_INTERSEC
1a640 54 20 29 7b 0a 20 20 20 20 61 64 64 72 45 6f 66  T ){.    addrEof
1a650 42 20 3d 20 61 64 64 72 45 6f 66 41 3b 0a 20 20  B = addrEofA;.  
1a660 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74    if( p->nSelect
1a670 52 6f 77 20 3e 20 70 50 72 69 6f 72 2d 3e 6e 53  Row > pPrior->nS
1a680 65 6c 65 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53  electRow ) p->nS
1a690 65 6c 65 63 74 52 6f 77 20 3d 20 70 50 72 69 6f  electRow = pPrio
1a6a0 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20  r->nSelectRow;. 
1a6b0 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20 56 64   }else{  .    Vd
1a6c0 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
1a6d0 2c 20 22 65 6f 66 2d 42 20 73 75 62 72 6f 75 74  , "eof-B subrout
1a6e0 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72  ine"));.    addr
1a6f0 45 6f 66 42 20 3d 20 73 71 6c 69 74 65 33 56 64  EofB = sqlite3Vd
1a700 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
1a710 6f 73 75 62 2c 20 72 65 67 4f 75 74 41 2c 20 61  osub, regOutA, a
1a720 64 64 72 4f 75 74 41 29 3b 0a 20 20 20 20 73 71  ddrOutA);.    sq
1a730 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1a740 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
1a750 41 64 64 72 41 2c 20 6c 61 62 65 6c 45 6e 64 29  AddrA, labelEnd)
1a760 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
1a770 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1a780 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 45 6f  beGoto(v, addrEo
1a790 66 42 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47  fB);.  }..  /* G
1a7a0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
1a7b0 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20  handle the case 
1a7c0 6f 66 20 41 3c 42 0a 20 20 2a 2f 0a 20 20 56 64  of A<B.  */.  Vd
1a7d0 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
1a7e0 2c 20 22 41 2d 6c 74 2d 42 20 73 75 62 72 6f 75  , "A-lt-B subrou
1a7f0 74 69 6e 65 22 29 29 3b 0a 20 20 61 64 64 72 41  tine"));.  addrA
1a800 6c 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ltB = sqlite3Vdb
1a810 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
1a820 73 75 62 2c 20 72 65 67 4f 75 74 41 2c 20 61 64  sub, regOutA, ad
1a830 64 72 4f 75 74 41 29 3b 0a 20 20 73 71 6c 69 74  drOutA);.  sqlit
1a840 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1a850 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
1a860 72 41 2c 20 61 64 64 72 45 6f 66 41 29 3b 20 56  rA, addrEofA); V
1a870 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1a880 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
1a890 6f 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b  o(v, labelCmpr);
1a8a0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1a8b0 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74  code to handle t
1a8c0 68 65 20 63 61 73 65 20 6f 66 20 41 3d 3d 42 0a  he case of A==B.
1a8d0 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54    */.  if( op==T
1a8e0 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 61 64 64  K_ALL ){.    add
1a8f0 72 41 65 71 42 20 3d 20 61 64 64 72 41 6c 74 42  rAeqB = addrAltB
1a900 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70  ;.  }else if( op
1a910 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29  ==TK_INTERSECT )
1a920 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42 20 3d  {.    addrAeqB =
1a930 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 20 20 61   addrAltB;.    a
1a940 64 64 72 41 6c 74 42 2b 2b 3b 0a 20 20 7d 65 6c  ddrAltB++;.  }el
1a950 73 65 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70  se{.    VdbeNoop
1a960 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 65  Comment((v, "A-e
1a970 71 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29  q-B subroutine")
1a980 29 3b 0a 20 20 20 20 61 64 64 72 41 65 71 42 20  );.    addrAeqB 
1a990 3d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  =.    sqlite3Vdb
1a9a0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69  eAddOp2(v, OP_Yi
1a9b0 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20 61  eld, regAddrA, a
1a9c0 64 64 72 45 6f 66 41 29 3b 20 56 64 62 65 43 6f  ddrEofA); VdbeCo
1a9d0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73  verage(v);.    s
1a9e0 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
1a9f0 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20  , labelCmpr);.  
1aa00 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  }..  /* Generate
1aa10 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20   code to handle 
1aa20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3e 42 0a  the case of A>B.
1aa30 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43    */.  VdbeNoopC
1aa40 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 67 74  omment((v, "A-gt
1aa50 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29  -B subroutine"))
1aa60 3b 0a 20 20 61 64 64 72 41 67 74 42 20 3d 20 73  ;.  addrAgtB = s
1aa70 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
1aa80 74 41 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20  tAddr(v);.  if( 
1aa90 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70  op==TK_ALL || op
1aaa0 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20  ==TK_UNION ){.  
1aab0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1aac0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
1aad0 20 72 65 67 4f 75 74 42 2c 20 61 64 64 72 4f 75   regOutB, addrOu
1aae0 74 42 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  tB);.  }.  sqlit
1aaf0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1ab00 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
1ab10 72 42 2c 20 61 64 64 72 45 6f 66 42 29 3b 20 56  rB, addrEofB); V
1ab20 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1ab30 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
1ab40 6f 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b  o(v, labelCmpr);
1ab50 0a 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f 64 65  ..  /* This code
1ab60 20 72 75 6e 73 20 6f 6e 63 65 20 74 6f 20 69 6e   runs once to in
1ab70 69 74 69 61 6c 69 7a 65 20 65 76 65 72 79 74 68  itialize everyth
1ab80 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ing..  */.  sqli
1ab90 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
1aba0 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 73 71 6c  v, addr1);.  sql
1abb0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1abc0 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
1abd0 64 64 72 41 2c 20 61 64 64 72 45 6f 66 41 5f 6e  ddrA, addrEofA_n
1abe0 6f 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  oB); VdbeCoverag
1abf0 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  e(v);.  sqlite3V
1ac00 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1ac10 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42 2c  Yield, regAddrB,
1ac20 20 61 64 64 72 45 6f 66 42 29 3b 20 56 64 62 65   addrEofB); Vdbe
1ac30 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20  Coverage(v);..  
1ac40 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 74 68 65  /* Implement the
1ac50 20 6d 61 69 6e 20 6d 65 72 67 65 20 6c 6f 6f 70   main merge loop
1ac60 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
1ac70 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
1ac80 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20  v, labelCmpr);. 
1ac90 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1aca0 70 34 28 76 2c 20 4f 50 5f 50 65 72 6d 75 74 61  p4(v, OP_Permuta
1acb0 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 28  tion, 0, 0, 0, (
1acc0 63 68 61 72 2a 29 61 50 65 72 6d 75 74 65 2c 20  char*)aPermute, 
1acd0 50 34 5f 49 4e 54 41 52 52 41 59 29 3b 0a 20 20  P4_INTARRAY);.  
1ace0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1acf0 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c  4(v, OP_Compare,
1ad00 20 64 65 73 74 41 2e 69 53 64 73 74 2c 20 64 65   destA.iSdst, de
1ad10 73 74 42 2e 69 53 64 73 74 2c 20 6e 4f 72 64 65  stB.iSdst, nOrde
1ad20 72 42 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rBy,.           
1ad30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
1ad40 68 61 72 2a 29 70 4b 65 79 4d 65 72 67 65 2c 20  har*)pKeyMerge, 
1ad50 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 73  P4_KEYINFO);.  s
1ad60 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
1ad70 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 50 45 52  P5(v, OPFLAG_PER
1ad80 4d 55 54 45 29 3b 0a 20 20 73 71 6c 69 74 65 33  MUTE);.  sqlite3
1ad90 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
1ada0 5f 4a 75 6d 70 2c 20 61 64 64 72 41 6c 74 42 2c  _Jump, addrAltB,
1adb0 20 61 64 64 72 41 65 71 42 2c 20 61 64 64 72 41   addrAeqB, addrA
1adc0 67 74 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61  gtB); VdbeCovera
1add0 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d  ge(v);..  /* Jum
1ade0 70 20 74 6f 20 74 68 65 20 74 68 69 73 20 70 6f  p to the this po
1adf0 69 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  int in order to 
1ae00 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 71 75  terminate the qu
1ae10 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ery..  */.  sqli
1ae20 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
1ae30 62 65 6c 28 76 2c 20 6c 61 62 65 6c 45 6e 64 29  bel(v, labelEnd)
1ae40 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  ;..  /* Set the 
1ae50 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74  number of output
1ae60 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20   columns.  */.  
1ae70 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74  if( pDest->eDest
1ae80 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a  ==SRT_Output ){.
1ae90 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72      Select *pFir
1aea0 73 74 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  st = pPrior;.   
1aeb0 20 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e   while( pFirst->
1aec0 70 50 72 69 6f 72 20 29 20 70 46 69 72 73 74 20  pPrior ) pFirst 
1aed0 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72  = pFirst->pPrior
1aee0 3b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f  ;.    generateCo
1aef0 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
1af00 2c 20 70 46 69 72 73 74 2d 3e 70 53 72 63 2c 20  , pFirst->pSrc, 
1af10 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b  pFirst->pEList);
1af20 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 73 73  .  }..  /* Reass
1af30 65 6d 62 6c 79 20 74 68 65 20 63 6f 6d 70 6f 75  embly the compou
1af40 6e 64 20 71 75 65 72 79 20 73 6f 20 74 68 61 74  nd query so that
1af50 20 69 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65   it will be free
1af60 64 20 63 6f 72 72 65 63 74 6c 79 0a 20 20 2a 2a  d correctly.  **
1af70 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   by the calling 
1af80 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 66  function */.  if
1af90 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  ( p->pPrior ){. 
1afa0 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
1afb0 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 50  Delete(db, p->pP
1afc0 72 69 6f 72 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e  rior);.  }.  p->
1afd0 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
1afe0 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74  .  pPrior->pNext
1aff0 20 3d 20 70 3b 0a 0a 20 20 2f 2a 2a 2a 20 54 42   = p;..  /*** TB
1b000 44 3a 20 20 49 6e 73 65 72 74 20 73 75 62 72 6f  D:  Insert subro
1b010 75 74 69 6e 65 20 63 61 6c 6c 73 20 74 6f 20 63  utine calls to c
1b020 6c 6f 73 65 20 63 75 72 73 6f 72 73 20 6f 6e 20  lose cursors on 
1b030 69 6e 63 6f 6d 70 6c 65 74 65 0a 20 20 2a 2a 2a  incomplete.  ***
1b040 2a 20 73 75 62 71 75 65 72 69 65 73 20 2a 2a 2a  * subqueries ***
1b050 2a 2f 0a 20 20 65 78 70 6c 61 69 6e 43 6f 6d 70  */.  explainComp
1b060 6f 73 69 74 65 28 70 50 61 72 73 65 2c 20 70 2d  osite(pParse, p-
1b070 3e 6f 70 2c 20 69 53 75 62 31 2c 20 69 53 75 62  >op, iSub1, iSub
1b080 32 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  2, 0);.  return 
1b090 70 50 61 72 73 65 2d 3e 6e 45 72 72 21 3d 30 3b  pParse->nErr!=0;
1b0a0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21  .}.#endif..#if !
1b0b0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1b0c0 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
1b0d0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1b0e0 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 20 46  _OMIT_VIEW)./* F
1b0f0 6f 72 77 61 72 64 20 44 65 63 6c 61 72 61 74 69  orward Declarati
1b100 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ons */.static vo
1b110 69 64 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  id substExprList
1b120 28 73 71 6c 69 74 65 33 2a 2c 20 45 78 70 72 4c  (sqlite3*, ExprL
1b130 69 73 74 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c  ist*, int, ExprL
1b140 69 73 74 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f  ist*);.static vo
1b150 69 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 73  id substSelect(s
1b160 71 6c 69 74 65 33 2a 2c 20 53 65 6c 65 63 74 20  qlite3*, Select 
1b170 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69 73 74  *, int, ExprList
1b180 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20  *, int);../*.** 
1b190 53 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65  Scan through the
1b1a0 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
1b1b0 72 2e 20 20 52 65 70 6c 61 63 65 20 65 76 65 72  r.  Replace ever
1b1c0 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a  y reference to.*
1b1d0 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61  * a column in ta
1b1e0 62 6c 65 20 6e 75 6d 62 65 72 20 69 54 61 62 6c  ble number iTabl
1b1f0 65 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66  e with a copy of
1b200 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a   the iColumn-th.
1b210 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70 45 4c 69  ** entry in pELi
1b220 73 74 2e 20 20 28 42 75 74 20 6c 65 61 76 65 20  st.  (But leave 
1b230 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
1b240 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a  e ROWID column .
1b250 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 29 0a 2a  ** unchanged.).*
1b260 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1b270 65 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  e is part of the
1b280 20 66 6c 61 74 74 65 6e 69 6e 67 20 70 72 6f 63   flattening proc
1b290 65 64 75 72 65 2e 20 20 41 20 73 75 62 71 75 65  edure.  A subque
1b2a0 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72 65 73 75  ry.** whose resu
1b2b0 6c 74 20 73 65 74 20 69 73 20 64 65 66 69 6e 65  lt set is define
1b2c0 64 20 62 79 20 70 45 4c 69 73 74 20 61 70 70 65  d by pEList appe
1b2d0 61 72 73 20 61 73 20 65 6e 74 72 79 20 69 6e 20  ars as entry in 
1b2e0 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75  the.** FROM clau
1b2f0 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73  se of a SELECT s
1b300 75 63 68 20 74 68 61 74 20 74 68 65 20 56 44 42  uch that the VDB
1b310 45 20 63 75 72 73 6f 72 20 61 73 73 69 67 6e 65  E cursor assigne
1b320 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52  d to that.** FOR
1b330 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 79 20 69  M clause entry i
1b340 73 20 69 54 61 62 6c 65 2e 20 20 54 68 69 73 20  s iTable.  This 
1b350 72 6f 75 74 69 6e 65 20 6d 61 6b 65 20 74 68 65  routine make the
1b360 20 6e 65 63 65 73 73 61 72 79 20 0a 2a 2a 20 63   necessary .** c
1b370 68 61 6e 67 65 73 20 74 6f 20 70 45 78 70 72 20  hanges to pExpr 
1b380 73 6f 20 74 68 61 74 20 69 74 20 72 65 66 65 72  so that it refer
1b390 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68  s directly to th
1b3a0 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65 0a 2a  e source table.*
1b3b0 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  * of the subquer
1b3c0 79 20 72 61 74 68 65 72 20 74 68 65 20 72 65 73  y rather the res
1b3d0 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 73  ult set of the s
1b3e0 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74  ubquery..*/.stat
1b3f0 69 63 20 45 78 70 72 20 2a 73 75 62 73 74 45 78  ic Expr *substEx
1b400 70 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  pr(.  sqlite3 *d
1b410 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70  b,        /* Rep
1b420 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72  ort malloc error
1b430 73 20 74 6f 20 74 68 69 73 20 63 6f 6e 6e 65 63  s to this connec
1b440 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a  tion */.  Expr *
1b450 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 2f 2a  pExpr,        /*
1b460 20 45 78 70 72 20 69 6e 20 77 68 69 63 68 20 73   Expr in which s
1b470 75 62 73 74 69 74 75 74 69 6f 6e 20 6f 63 63 75  ubstitution occu
1b480 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  rs */.  int iTab
1b490 6c 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  le,         /* T
1b4a0 61 62 6c 65 20 74 6f 20 62 65 20 73 75 62 73 74  able to be subst
1b4b0 69 74 75 74 65 64 20 2a 2f 0a 20 20 45 78 70 72  ituted */.  Expr
1b4c0 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20  List *pEList    
1b4d0 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 65 78  /* Substitute ex
1b4e0 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a 29 7b 0a  pressions */.){.
1b4f0 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
1b500 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
1b510 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
1b520 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e  OLUMN && pExpr->
1b530 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 29  iTable==iTable )
1b540 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d  {.    if( pExpr-
1b550 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20  >iColumn<0 ){.  
1b560 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
1b570 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c  TK_NULL;.    }el
1b580 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  se{.      Expr *
1b590 70 4e 65 77 3b 0a 20 20 20 20 20 20 61 73 73 65  pNew;.      asse
1b5a0 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 26 26  rt( pEList!=0 &&
1b5b0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c   pExpr->iColumn<
1b5c0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b  pEList->nExpr );
1b5d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1b5e0 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26  Expr->pLeft==0 &
1b5f0 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d  & pExpr->pRight=
1b600 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  =0 );.      pNew
1b610 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
1b620 70 28 64 62 2c 20 70 45 4c 69 73 74 2d 3e 61 5b  p(db, pEList->a[
1b630 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e  pExpr->iColumn].
1b640 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20  pExpr, 0);.     
1b650 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
1b660 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20  te(db, pExpr);. 
1b670 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 4e 65       pExpr = pNe
1b680 77 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  w;.    }.  }else
1b690 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65  {.    pExpr->pLe
1b6a0 66 74 20 3d 20 73 75 62 73 74 45 78 70 72 28 64  ft = substExpr(d
1b6b0 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  b, pExpr->pLeft,
1b6c0 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
1b6d0 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69  ;.    pExpr->pRi
1b6e0 67 68 74 20 3d 20 73 75 62 73 74 45 78 70 72 28  ght = substExpr(
1b6f0 64 62 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  db, pExpr->pRigh
1b700 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  t, iTable, pELis
1b710 74 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72  t);.    if( Expr
1b720 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1b730 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
1b740 20 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 53   ){.      substS
1b750 65 6c 65 63 74 28 64 62 2c 20 70 45 78 70 72 2d  elect(db, pExpr-
1b760 3e 78 2e 70 53 65 6c 65 63 74 2c 20 69 54 61 62  >x.pSelect, iTab
1b770 6c 65 2c 20 70 45 4c 69 73 74 2c 20 31 29 3b 0a  le, pEList, 1);.
1b780 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b790 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64   substExprList(d
1b7a0 62 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  b, pExpr->x.pLis
1b7b0 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  t, iTable, pELis
1b7c0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  t);.    }.  }.  
1b7d0 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a  return pExpr;.}.
1b7e0 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73  static void subs
1b7f0 74 45 78 70 72 4c 69 73 74 28 0a 20 20 73 71 6c  tExprList(.  sql
1b800 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
1b810 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c    /* Report mall
1b820 6f 63 20 65 72 72 6f 72 73 20 68 65 72 65 20 2a  oc errors here *
1b830 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
1b840 69 73 74 2c 20 20 20 20 20 2f 2a 20 4c 69 73 74  ist,     /* List
1b850 20 74 6f 20 73 63 61 6e 20 61 6e 64 20 69 6e 20   to scan and in 
1b860 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75  which to make su
1b870 62 73 74 69 74 75 74 65 73 20 2a 2f 0a 20 20 69  bstitutes */.  i
1b880 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
1b890 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20      /* Table to 
1b8a0 62 65 20 73 75 62 73 74 69 74 75 74 65 64 20 2a  be substituted *
1b8b0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
1b8c0 4c 69 73 74 20 20 20 20 20 2f 2a 20 53 75 62 73  List     /* Subs
1b8d0 74 69 74 75 74 65 20 76 61 6c 75 65 73 20 2a 2f  titute values */
1b8e0 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  .){.  int i;.  i
1b8f0 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
1b900 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
1b910 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
1b920 20 69 2b 2b 29 7b 0a 20 20 20 20 70 4c 69 73 74   i++){.    pList
1b930 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73  ->a[i].pExpr = s
1b940 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 4c 69  ubstExpr(db, pLi
1b950 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
1b960 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
1b970 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
1b980 69 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 0a  id substSelect(.
1b990 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
1b9a0 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74         /* Report
1b9b0 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 68   malloc errors h
1b9c0 65 72 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ere */.  Select 
1b9d0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  *p,           /*
1b9e0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1b9f0 74 20 69 6e 20 77 68 69 63 68 20 74 6f 20 6d 61  t in which to ma
1ba00 6b 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73  ke substitutions
1ba10 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
1ba20 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61  ,          /* Ta
1ba30 62 6c 65 20 74 6f 20 62 65 20 72 65 70 6c 61 63  ble to be replac
1ba40 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  ed */.  ExprList
1ba50 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 2f 2a 20   *pEList,    /* 
1ba60 53 75 62 73 74 69 74 75 74 65 20 76 61 6c 75 65  Substitute value
1ba70 73 20 2a 2f 0a 20 20 69 6e 74 20 64 6f 50 72 69  s */.  int doPri
1ba80 6f 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  or          /* D
1ba90 6f 20 73 75 62 73 74 69 74 75 74 65 73 20 6f 6e  o substitutes on
1baa0 20 70 2d 3e 70 50 72 69 6f 72 20 74 6f 6f 20 2a   p->pPrior too *
1bab0 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a  /.){.  SrcList *
1bac0 70 53 72 63 3b 0a 20 20 73 74 72 75 63 74 20 53  pSrc;.  struct S
1bad0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
1bae0 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  em;.  int i;.  i
1baf0 66 28 20 21 70 20 29 20 72 65 74 75 72 6e 3b 0a  f( !p ) return;.
1bb00 20 20 64 6f 7b 0a 20 20 20 20 73 75 62 73 74 45    do{.    substE
1bb10 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70  xprList(db, p->p
1bb20 45 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70  EList, iTable, p
1bb30 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73  EList);.    subs
1bb40 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d  tExprList(db, p-
1bb50 3e 70 47 72 6f 75 70 42 79 2c 20 69 54 61 62 6c  >pGroupBy, iTabl
1bb60 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  e, pEList);.    
1bb70 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62  substExprList(db
1bb80 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69  , p->pOrderBy, i
1bb90 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
1bba0 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d      p->pHaving =
1bbb0 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70   substExpr(db, p
1bbc0 2d 3e 70 48 61 76 69 6e 67 2c 20 69 54 61 62 6c  ->pHaving, iTabl
1bbd0 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  e, pEList);.    
1bbe0 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 75 62 73  p->pWhere = subs
1bbf0 74 45 78 70 72 28 64 62 2c 20 70 2d 3e 70 57 68  tExpr(db, p->pWh
1bc00 65 72 65 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ere, iTable, pEL
1bc10 69 73 74 29 3b 0a 20 20 20 20 70 53 72 63 20 3d  ist);.    pSrc =
1bc20 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 61 73   p->pSrc;.    as
1bc30 73 65 72 74 28 20 70 53 72 63 21 3d 30 20 29 3b  sert( pSrc!=0 );
1bc40 0a 20 20 20 20 66 6f 72 28 69 3d 70 53 72 63 2d  .    for(i=pSrc-
1bc50 3e 6e 53 72 63 2c 20 70 49 74 65 6d 3d 70 53 72  >nSrc, pItem=pSr
1bc60 63 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  c->a; i>0; i--, 
1bc70 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
1bc80 73 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20  substSelect(db, 
1bc90 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20  pItem->pSelect, 
1bca0 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 2c 20  iTable, pEList, 
1bcb0 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  1);.      if( pI
1bcc0 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e  tem->fg.isTabFun
1bcd0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 73 75 62  c ){.        sub
1bce0 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70  stExprList(db, p
1bcf0 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72  Item->u1.pFuncAr
1bd00 67 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  g, iTable, pELis
1bd10 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
1bd20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 64 6f 50 72  }.  }while( doPr
1bd30 69 6f 72 20 26 26 20 28 70 20 3d 20 70 2d 3e 70  ior && (p = p->p
1bd40 50 72 69 6f 72 29 21 3d 30 20 29 3b 0a 7d 0a 23  Prior)!=0 );.}.#
1bd50 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
1bd60 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
1bd70 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69  BQUERY) || !defi
1bd80 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
1bd90 56 49 45 57 29 20 2a 2f 0a 0a 23 69 66 20 21 64  VIEW) */..#if !d
1bda0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1bdb0 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
1bdc0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1bdd0 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a  OMIT_VIEW)./*.**
1bde0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74   This routine at
1bdf0 74 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65  tempts to flatte
1be00 6e 20 73 75 62 71 75 65 72 69 65 73 20 61 73 20  n subqueries as 
1be10 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 70  a performance op
1be20 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 20 54  timization..** T
1be30 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
1be40 72 6e 73 20 31 20 69 66 20 69 74 20 6d 61 6b 65  rns 1 if it make
1be50 73 20 63 68 61 6e 67 65 73 20 61 6e 64 20 30 20  s changes and 0 
1be60 69 66 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67  if no flattening
1be70 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54   occurs..**.** T
1be80 6f 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65  o understand the
1be90 20 63 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61 74   concept of flat
1bea0 74 65 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72  tening, consider
1beb0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   the following.*
1bec0 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20  * query:.**.**  
1bed0 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d     SELECT a FROM
1bee0 20 28 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20   (SELECT x+y AS 
1bef0 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  a FROM t1 WHERE 
1bf00 7a 3c 31 30 30 29 20 57 48 45 52 45 20 61 3e 35  z<100) WHERE a>5
1bf10 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75  .**.** The defau
1bf20 6c 74 20 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d  lt way of implem
1bf30 65 6e 74 69 6e 67 20 74 68 69 73 20 71 75 65 72  enting this quer
1bf40 79 20 69 73 20 74 6f 20 65 78 65 63 75 74 65 20  y is to execute 
1bf50 74 68 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20  the.** subquery 
1bf60 66 69 72 73 74 20 61 6e 64 20 73 74 6f 72 65 20  first and store 
1bf70 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61  the results in a
1bf80 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
1bf90 2c 20 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68  , then.** run th
1bfa0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6f 6e  e outer query on
1bfb0 20 74 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20   that temporary 
1bfc0 74 61 62 6c 65 2e 20 20 54 68 69 73 20 72 65 71  table.  This req
1bfd0 75 69 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73  uires two.** pas
1bfe0 73 65 73 20 6f 76 65 72 20 74 68 65 20 64 61 74  ses over the dat
1bff0 61 2e 20 20 46 75 72 74 68 65 72 6d 6f 72 65 2c  a.  Furthermore,
1c000 20 62 65 63 61 75 73 65 20 74 68 65 20 74 65 6d   because the tem
1c010 70 6f 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20  porary table.** 
1c020 68 61 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20  has no indices, 
1c030 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
1c040 20 6f 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   on the outer qu
1c050 65 72 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a  ery cannot be.**
1c060 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a   optimized..**.*
1c070 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
1c080 74 74 65 6d 70 74 73 20 74 6f 20 72 65 77 72 69  ttempts to rewri
1c090 74 65 20 71 75 65 72 69 65 73 20 73 75 63 68 20  te queries such 
1c0a0 61 73 20 74 68 65 20 61 62 6f 76 65 20 69 6e 74  as the above int
1c0b0 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c  o.** a single fl
1c0c0 61 74 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20  at select, like 
1c0d0 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
1c0e0 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20  SELECT x+y AS a 
1c0f0 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c  FROM t1 WHERE z<
1c100 31 30 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a  100 AND a>5.**.*
1c110 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72  * The code gener
1c120 61 74 65 64 20 66 6f 72 20 74 68 69 73 20 73 69  ated for this si
1c130 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 67 69 76  mplification giv
1c140 65 73 20 74 68 65 20 73 61 6d 65 20 72 65 73 75  es the same resu
1c150 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68  lt.** but only h
1c160 61 73 20 74 6f 20 73 63 61 6e 20 74 68 65 20 64  as to scan the d
1c170 61 74 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62  ata once.  And b
1c180 65 63 61 75 73 65 20 69 6e 64 69 63 65 73 20 6d  ecause indices m
1c190 69 67 68 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f  ight .** exist o
1c1a0 6e 20 74 68 65 20 74 61 62 6c 65 20 74 31 2c 20  n the table t1, 
1c1b0 61 20 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20  a complete scan 
1c1c0 6f 66 20 74 68 65 20 64 61 74 61 20 6d 69 67 68  of the data migh
1c1d0 74 20 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e  t be.** avoided.
1c1e0 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e  .**.** Flattenin
1c1f0 67 20 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70  g is only attemp
1c200 74 65 64 20 69 66 20 61 6c 6c 20 6f 66 20 74 68  ted if all of th
1c210 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
1c220 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31  true:.**.**   (1
1c230 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
1c240 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75  and the outer qu
1c250 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20  ery do not both 
1c260 75 73 65 20 61 67 67 72 65 67 61 74 65 73 2e 0a  use aggregates..
1c270 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 20 54 68 65  **.**   (2)  The
1c280 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
1c290 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72   an aggregate or
1c2a0 20 28 32 61 29 20 74 68 65 20 6f 75 74 65 72 20   (2a) the outer 
1c2b0 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a  query is not a j
1c2c0 6f 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20 61 6e  oin.**        an
1c2d0 64 20 28 32 62 29 20 74 68 65 20 6f 75 74 65 72  d (2b) the outer
1c2e0 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20   query does not 
1c2f0 75 73 65 20 73 75 62 71 75 65 72 69 65 73 20 6f  use subqueries o
1c300 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 6f 6e  ther than the on
1c310 65 0a 2a 2a 20 20 20 20 20 20 20 20 46 52 4f 4d  e.**        FROM
1c320 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 79  -clause subquery
1c330 20 74 68 61 74 20 69 73 20 61 20 63 61 6e 64 69   that is a candi
1c340 64 61 74 65 20 66 6f 72 20 66 6c 61 74 74 65 6e  date for flatten
1c350 69 6e 67 2e 20 20 28 32 62 20 69 73 0a 2a 2a 20  ing.  (2b is.** 
1c360 20 20 20 20 20 20 20 64 75 65 20 74 6f 20 74 69         due to ti
1c370 63 6b 65 74 20 5b 32 66 37 31 37 30 64 37 33 62  cket [2f7170d73b
1c380 66 39 61 62 66 38 30 5d 20 66 72 6f 6d 20 32 30  f9abf80] from 20
1c390 31 35 2d 30 32 2d 30 39 2e 29 0a 2a 2a 0a 2a 2a  15-02-09.).**.**
1c3a0 20 20 20 28 33 29 20 20 54 68 65 20 73 75 62 71     (3)  The subq
1c3b0 75 65 72 79 20 69 73 20 6e 6f 74 20 74 68 65 20  uery is not the 
1c3c0 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66  right operand of
1c3d0 20 61 20 6c 65 66 74 20 6f 75 74 65 72 20 6a 6f   a left outer jo
1c3e0 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28 4f 72  in.**        (Or
1c3f0 69 67 69 6e 61 6c 6c 79 20 74 69 63 6b 65 74 20  iginally ticket 
1c400 23 33 30 36 2e 20 20 53 74 72 65 6e 67 74 68 65  #306.  Strengthe
1c410 6e 65 64 20 62 79 20 74 69 63 6b 65 74 20 23 33  ned by ticket #3
1c420 33 30 30 29 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29  300).**.**   (4)
1c430 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
1c440 73 20 6e 6f 74 20 44 49 53 54 49 4e 43 54 2e 0a  s not DISTINCT..
1c450 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 41 74 20  **.**  (**)  At 
1c460 6f 6e 65 20 70 6f 69 6e 74 20 72 65 73 74 72 69  one point restri
1c470 63 74 69 6f 6e 73 20 28 34 29 20 61 6e 64 20 28  ctions (4) and (
1c480 35 29 20 64 65 66 69 6e 65 64 20 61 20 73 75 62  5) defined a sub
1c490 73 65 74 20 6f 66 20 44 49 53 54 49 4e 43 54 0a  set of DISTINCT.
1c4a0 2a 2a 20 20 20 20 20 20 20 20 73 75 62 2d 71 75  **        sub-qu
1c4b0 65 72 69 65 73 20 74 68 61 74 20 77 65 72 65 20  eries that were 
1c4c0 65 78 63 6c 75 64 65 64 20 66 72 6f 6d 20 74 68  excluded from th
1c4d0 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  is optimization.
1c4e0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 0a 2a 2a   Restriction .**
1c4f0 20 20 20 20 20 20 20 20 28 34 29 20 68 61 73 20          (4) has 
1c500 73 69 6e 63 65 20 62 65 65 6e 20 65 78 70 61 6e  since been expan
1c510 64 65 64 20 74 6f 20 65 78 63 6c 75 64 65 20 61  ded to exclude a
1c520 6c 6c 20 44 49 53 54 49 4e 43 54 20 73 75 62 71  ll DISTINCT subq
1c530 75 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  ueries..**.**   
1c540 28 36 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (6)  The subquer
1c550 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61  y does not use a
1c560 67 67 72 65 67 61 74 65 73 20 6f 72 20 74 68 65  ggregates or the
1c570 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
1c580 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 44 49  not.**        DI
1c590 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20  STINCT..**.**   
1c5a0 28 37 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (7)  The subquer
1c5b0 79 20 68 61 73 20 61 20 46 52 4f 4d 20 63 6c 61  y has a FROM cla
1c5c0 75 73 65 2e 20 20 54 4f 44 4f 3a 20 20 46 6f 72  use.  TODO:  For
1c5d0 20 73 75 62 71 75 65 72 69 65 73 20 77 69 74 68   subqueries with
1c5e0 6f 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 41 20  out.**        A 
1c5f0 46 52 4f 4d 20 63 6c 61 75 73 65 2c 20 63 6f 6e  FROM clause, con
1c600 73 69 64 65 72 20 61 64 64 69 6e 67 20 61 20 46  sider adding a F
1c610 52 4f 4d 20 63 6c 6f 73 65 20 77 69 74 68 20 74  ROM close with t
1c620 68 65 20 73 70 65 63 69 61 6c 0a 2a 2a 20 20 20  he special.**   
1c630 20 20 20 20 20 74 61 62 6c 65 20 73 71 6c 69 74       table sqlit
1c640 65 5f 6f 6e 63 65 20 74 68 61 74 20 63 6f 6e 73  e_once that cons
1c650 69 73 74 73 20 6f 66 20 61 20 73 69 6e 67 6c 65  ists of a single
1c660 20 72 6f 77 20 63 6f 6e 74 61 69 6e 69 6e 67 20   row containing 
1c670 61 0a 2a 2a 20 20 20 20 20 20 20 20 73 69 6e 67  a.**        sing
1c680 6c 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 20  le NULL..**.**  
1c690 20 28 38 29 20 20 54 68 65 20 73 75 62 71 75 65   (8)  The subque
1c6a0 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
1c6b0 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74  LIMIT or the out
1c6c0 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20  er query is not 
1c6d0 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  a join..**.**   
1c6e0 28 39 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (9)  The subquer
1c6f0 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c  y does not use L
1c700 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65  IMIT or the oute
1c710 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  r query does not
1c720 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61   use.**        a
1c730 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  ggregates..**.**
1c740 20 20 28 2a 2a 29 20 20 52 65 73 74 72 69 63 74    (**)  Restrict
1c750 69 6f 6e 20 28 31 30 29 20 77 61 73 20 72 65 6d  ion (10) was rem
1c760 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 63 6f  oved from the co
1c770 64 65 20 6f 6e 20 32 30 30 35 2d 30 32 2d 30 35  de on 2005-02-05
1c780 20 62 75 74 20 77 65 0a 2a 2a 20 20 20 20 20 20   but we.**      
1c790 20 20 61 63 63 69 64 65 6e 74 6c 79 20 63 61 72    accidently car
1c7a0 72 69 65 64 20 74 68 65 20 63 6f 6d 6d 65 6e 74  ried the comment
1c7b0 20 66 6f 72 77 61 72 64 20 75 6e 74 69 6c 20 32   forward until 2
1c7c0 30 31 34 2d 30 39 2d 31 35 2e 20 20 4f 72 69 67  014-09-15.  Orig
1c7d0 69 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 74  inal.**        t
1c7e0 65 78 74 3a 20 22 54 68 65 20 73 75 62 71 75 65  ext: "The subque
1c7f0 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
1c800 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 74 68  aggregates or th
1c810 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 0a 2a  e outer query .*
1c820 2a 20 20 20 20 20 20 20 20 64 6f 65 73 20 6e 6f  *        does no
1c830 74 20 75 73 65 20 4c 49 4d 49 54 2e 22 0a 2a 2a  t use LIMIT.".**
1c840 0a 2a 2a 20 20 28 31 31 29 20 20 54 68 65 20 73  .**  (11)  The s
1c850 75 62 71 75 65 72 79 20 61 6e 64 20 74 68 65 20  ubquery and the 
1c860 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e  outer query do n
1c870 6f 74 20 62 6f 74 68 20 68 61 76 65 20 4f 52 44  ot both have ORD
1c880 45 52 20 42 59 20 63 6c 61 75 73 65 73 2e 0a 2a  ER BY clauses..*
1c890 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 4e 6f 74 20  *.**  (**)  Not 
1c8a0 69 6d 70 6c 65 6d 65 6e 74 65 64 2e 20 20 53 75  implemented.  Su
1c8b0 62 73 75 6d 65 64 20 69 6e 74 6f 20 72 65 73 74  bsumed into rest
1c8c0 72 69 63 74 69 6f 6e 20 28 33 29 2e 20 20 57 61  riction (3).  Wa
1c8d0 73 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20  s previously.** 
1c8e0 20 20 20 20 20 20 20 61 20 73 65 70 61 72 61 74         a separat
1c8f0 65 20 72 65 73 74 72 69 63 74 69 6f 6e 20 64 65  e restriction de
1c900 72 69 76 69 6e 67 20 66 72 6f 6d 20 74 69 63 6b  riving from tick
1c910 65 74 20 23 33 35 30 2e 0a 2a 2a 0a 2a 2a 20 20  et #350..**.**  
1c920 28 31 33 29 20 20 54 68 65 20 73 75 62 71 75 65  (13)  The subque
1c930 72 79 20 61 6e 64 20 6f 75 74 65 72 20 71 75 65  ry and outer que
1c940 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75  ry do not both u
1c950 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20  se LIMIT..**.** 
1c960 20 28 31 34 29 20 20 54 68 65 20 73 75 62 71 75   (14)  The subqu
1c970 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
1c980 20 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 20   OFFSET..**.**  
1c990 28 31 35 29 20 20 54 68 65 20 6f 75 74 65 72 20  (15)  The outer 
1c9a0 71 75 65 72 79 20 69 73 20 6e 6f 74 20 70 61 72  query is not par
1c9b0 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20  t of a compound 
1c9c0 73 65 6c 65 63 74 20 6f 72 20 74 68 65 0a 2a 2a  select or the.**
1c9d0 20 20 20 20 20 20 20 20 73 75 62 71 75 65 72 79          subquery
1c9e0 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61   does not have a
1c9f0 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2e 0a 2a   LIMIT clause..*
1ca00 2a 20 20 20 20 20 20 20 20 28 53 65 65 20 74 69  *        (See ti
1ca10 63 6b 65 74 20 23 32 33 33 39 20 61 6e 64 20 74  cket #2339 and t
1ca20 69 63 6b 65 74 20 5b 30 32 61 38 65 38 31 64 34  icket [02a8e81d4
1ca30 34 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 36 29  4])..**.**  (16)
1ca40 20 20 54 68 65 20 6f 75 74 65 72 20 71 75 65 72    The outer quer
1ca50 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72  y is not an aggr
1ca60 65 67 61 74 65 20 6f 72 20 74 68 65 20 73 75 62  egate or the sub
1ca70 71 75 65 72 79 20 64 6f 65 73 0a 2a 2a 20 20 20  query does.**   
1ca80 20 20 20 20 20 6e 6f 74 20 63 6f 6e 74 61 69 6e       not contain
1ca90 20 4f 52 44 45 52 20 42 59 2e 20 20 28 54 69 63   ORDER BY.  (Tic
1caa0 6b 65 74 20 23 32 39 34 32 29 20 20 54 68 69 73  ket #2942)  This
1cab0 20 75 73 65 64 20 74 6f 20 6e 6f 74 20 6d 61 74   used to not mat
1cac0 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 75 6e  ter.**        un
1cad0 74 69 6c 20 77 65 20 69 6e 74 72 6f 64 75 63 65  til we introduce
1cae0 64 20 74 68 65 20 67 72 6f 75 70 5f 63 6f 6e 63  d the group_conc
1caf0 61 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20  at() function.  
1cb00 0a 2a 2a 0a 2a 2a 20 20 28 31 37 29 20 20 54 68  .**.**  (17)  Th
1cb10 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 6e  e sub-query is n
1cb20 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65  ot a compound se
1cb30 6c 65 63 74 2c 20 6f 72 20 69 74 20 69 73 20 61  lect, or it is a
1cb40 20 55 4e 49 4f 4e 20 41 4c 4c 20 0a 2a 2a 20 20   UNION ALL .**  
1cb50 20 20 20 20 20 20 63 6f 6d 70 6f 75 6e 64 20 63        compound c
1cb60 6c 61 75 73 65 20 6d 61 64 65 20 75 70 20 65 6e  lause made up en
1cb70 74 69 72 65 6c 79 20 6f 66 20 6e 6f 6e 2d 61 67  tirely of non-ag
1cb80 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73 2c  gregate queries,
1cb90 20 61 6e 64 20 0a 2a 2a 20 20 20 20 20 20 20 20   and .**        
1cba0 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79  the parent query
1cbb0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
1cbc0 20 2a 20 69 73 20 6e 6f 74 20 69 74 73 65 6c 66   * is not itself
1cbd0 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f   part of a compo
1cbe0 75 6e 64 20 73 65 6c 65 63 74 2c 0a 2a 2a 20 20  und select,.**  
1cbf0 20 20 20 20 20 20 20 20 2a 20 69 73 20 6e 6f 74          * is not
1cc00 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72   an aggregate or
1cc10 20 44 49 53 54 49 4e 43 54 20 71 75 65 72 79 2c   DISTINCT query,
1cc20 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20   and.**         
1cc30 20 2a 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e   * is not a join
1cc40 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 54 68  .**.**        Th
1cc50 65 20 70 61 72 65 6e 74 20 61 6e 64 20 73 75 62  e parent and sub
1cc60 2d 71 75 65 72 79 20 6d 61 79 20 63 6f 6e 74 61  -query may conta
1cc70 69 6e 20 57 48 45 52 45 20 63 6c 61 75 73 65 73  in WHERE clauses
1cc80 2e 20 53 75 62 6a 65 63 74 20 74 6f 0a 2a 2a 20  . Subject to.** 
1cc90 20 20 20 20 20 20 20 72 75 6c 65 73 20 28 31 31         rules (11
1cca0 29 2c 20 28 31 33 29 20 61 6e 64 20 28 31 34 29  ), (13) and (14)
1ccb0 2c 20 74 68 65 79 20 6d 61 79 20 61 6c 73 6f 20  , they may also 
1ccc0 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20 42 59  contain ORDER BY
1ccd0 2c 0a 2a 2a 20 20 20 20 20 20 20 20 4c 49 4d 49  ,.**        LIMI
1cce0 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61  T and OFFSET cla
1ccf0 75 73 65 73 2e 20 20 54 68 65 20 73 75 62 71 75  uses.  The subqu
1cd00 65 72 79 20 63 61 6e 6e 6f 74 20 75 73 65 20 61  ery cannot use a
1cd10 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20  ny compound.**  
1cd20 20 20 20 20 20 20 6f 70 65 72 61 74 6f 72 20 6f        operator o
1cd30 74 68 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20  ther than UNION 
1cd40 41 4c 4c 20 62 65 63 61 75 73 65 20 61 6c 6c 20  ALL because all 
1cd50 74 68 65 20 6f 74 68 65 72 20 63 6f 6d 70 6f 75  the other compou
1cd60 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 6f 70 65  nd.**        ope
1cd70 72 61 74 6f 72 73 20 68 61 76 65 20 61 6e 20 69  rators have an i
1cd80 6d 70 6c 69 65 64 20 44 49 53 54 49 4e 43 54 20  mplied DISTINCT 
1cd90 77 68 69 63 68 20 69 73 20 64 69 73 61 6c 6c 6f  which is disallo
1cda0 77 65 64 20 62 79 0a 2a 2a 20 20 20 20 20 20 20  wed by.**       
1cdb0 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 34 29   restriction (4)
1cdc0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 41  ..**.**        A
1cdd0 6c 73 6f 2c 20 65 61 63 68 20 63 6f 6d 70 6f 6e  lso, each compon
1cde0 65 6e 74 20 6f 66 20 74 68 65 20 73 75 62 2d 71  ent of the sub-q
1cdf0 75 65 72 79 20 6d 75 73 74 20 72 65 74 75 72 6e  uery must return
1ce00 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
1ce10 0a 2a 2a 20 20 20 20 20 20 20 20 6f 66 20 72 65  .**        of re
1ce20 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e 20 54 68  sult columns. Th
1ce30 69 73 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61  is is actually a
1ce40 20 72 65 71 75 69 72 65 6d 65 6e 74 20 66 6f 72   requirement for
1ce50 20 61 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a   any compound.**
1ce60 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 73          SELECT s
1ce70 74 61 74 65 6d 65 6e 74 2c 20 62 75 74 20 61 6c  tatement, but al
1ce80 6c 20 74 68 65 20 63 6f 64 65 20 68 65 72 65 20  l the code here 
1ce90 64 6f 65 73 20 69 73 20 6d 61 6b 65 20 73 75 72  does is make sur
1cea0 65 20 74 68 61 74 20 6e 6f 0a 2a 2a 20 20 20 20  e that no.**    
1ceb0 20 20 20 20 73 75 63 68 20 28 69 6c 6c 65 67 61      such (illega
1cec0 6c 29 20 73 75 62 2d 71 75 65 72 79 20 69 73 20  l) sub-query is 
1ced0 66 6c 61 74 74 65 6e 65 64 2e 20 54 68 65 20 63  flattened. The c
1cee0 61 6c 6c 65 72 20 77 69 6c 6c 20 64 65 74 65 63  aller will detec
1cef0 74 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  t the.**        
1cf00 73 79 6e 74 61 78 20 65 72 72 6f 72 20 61 6e 64  syntax error and
1cf10 20 72 65 74 75 72 6e 20 61 20 64 65 74 61 69 6c   return a detail
1cf20 65 64 20 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a  ed message..**.*
1cf30 2a 20 20 28 31 38 29 20 20 49 66 20 74 68 65 20  *  (18)  If the 
1cf40 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63  sub-query is a c
1cf50 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20  ompound select, 
1cf60 74 68 65 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f  then all terms o
1cf70 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  f the.**        
1cf80 4f 52 44 45 52 20 62 79 20 63 6c 61 75 73 65 20  ORDER by clause 
1cf90 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 6d 75  of the parent mu
1cfa0 73 74 20 62 65 20 73 69 6d 70 6c 65 20 72 65 66  st be simple ref
1cfb0 65 72 65 6e 63 65 73 20 74 6f 20 0a 2a 2a 20 20  erences to .**  
1cfc0 20 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20 6f 66        columns of
1cfd0 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 2e 0a   the sub-query..
1cfe0 2a 2a 0a 2a 2a 20 20 28 31 39 29 20 20 54 68 65  **.**  (19)  The
1cff0 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
1d000 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20  ot use LIMIT or 
1d010 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1d020 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20  does not.**     
1d030 20 20 20 68 61 76 65 20 61 20 57 48 45 52 45 20     have a WHERE 
1d040 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28  clause..**.**  (
1d050 32 30 29 20 20 49 66 20 74 68 65 20 73 75 62 2d  20)  If the sub-
1d060 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f  query is a compo
1d070 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e  und select, then
1d080 20 69 74 20 6d 75 73 74 20 6e 6f 74 20 75 73 65   it must not use
1d090 0a 2a 2a 20 20 20 20 20 20 20 20 61 6e 20 4f 52  .**        an OR
1d0a0 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20  DER BY clause.  
1d0b0 54 69 63 6b 65 74 20 23 33 37 37 33 2e 20 20 57  Ticket #3773.  W
1d0c0 65 20 63 6f 75 6c 64 20 72 65 6c 61 78 20 74 68  e could relax th
1d0d0 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a  is constraint.**
1d0e0 20 20 20 20 20 20 20 20 73 6f 6d 65 77 68 61 74          somewhat
1d0f0 20 62 79 20 73 61 79 69 6e 67 20 74 68 61 74 20   by saying that 
1d100 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  the terms of the
1d110 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1d120 20 6d 75 73 74 0a 2a 2a 20 20 20 20 20 20 20 20   must.**        
1d130 61 70 70 65 61 72 20 61 73 20 75 6e 6d 6f 64 69  appear as unmodi
1d140 66 69 65 64 20 72 65 73 75 6c 74 20 63 6f 6c 75  fied result colu
1d150 6d 6e 73 20 69 6e 20 74 68 65 20 6f 75 74 65 72  mns in the outer
1d160 20 71 75 65 72 79 2e 20 20 42 75 74 20 77 65 0a   query.  But we.
1d170 2a 2a 20 20 20 20 20 20 20 20 68 61 76 65 20 6f  **        have o
1d180 74 68 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ther optimizatio
1d190 6e 73 20 69 6e 20 6d 69 6e 64 20 74 6f 20 64 65  ns in mind to de
1d1a0 61 6c 20 77 69 74 68 20 74 68 61 74 20 63 61 73  al with that cas
1d1b0 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 31 29 20 20  e..**.**  (21)  
1d1c0 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
1d1d0 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20  s not use LIMIT 
1d1e0 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
1d1f0 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20  ry is not.**    
1d200 20 20 20 20 44 49 53 54 49 4e 43 54 2e 20 20 28      DISTINCT.  (
1d210 53 65 65 20 74 69 63 6b 65 74 20 5b 37 35 32 65  See ticket [752e
1d220 31 36 34 36 66 63 5d 29 2e 0a 2a 2a 0a 2a 2a 20  1646fc])..**.** 
1d230 20 28 32 32 29 20 20 54 68 65 20 73 75 62 71 75   (22)  The subqu
1d240 65 72 79 20 69 73 20 6e 6f 74 20 61 20 72 65 63  ery is not a rec
1d250 75 72 73 69 76 65 20 43 54 45 2e 0a 2a 2a 0a 2a  ursive CTE..**.*
1d260 2a 20 20 28 32 33 29 20 20 54 68 65 20 70 61 72  *  (23)  The par
1d270 65 6e 74 20 69 73 20 6e 6f 74 20 61 20 72 65 63  ent is not a rec
1d280 75 72 73 69 76 65 20 43 54 45 2c 20 6f 72 20 74  ursive CTE, or t
1d290 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20  he sub-query is 
1d2a0 6e 6f 74 20 61 0a 2a 2a 20 20 20 20 20 20 20 20  not a.**        
1d2b0 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 20  compound query. 
1d2c0 54 68 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e  This restriction
1d2d0 20 69 73 20 62 65 63 61 75 73 65 20 74 72 61 6e   is because tran
1d2e0 73 66 6f 72 6d 69 6e 67 20 74 68 65 0a 2a 2a 20  sforming the.** 
1d2f0 20 20 20 20 20 20 20 70 61 72 65 6e 74 20 74 6f         parent to
1d300 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72   a compound quer
1d310 79 20 63 6f 6e 66 75 73 65 73 20 74 68 65 20 63  y confuses the c
1d320 6f 64 65 20 74 68 61 74 20 68 61 6e 64 6c 65 73  ode that handles
1d330 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 63 75 72  .**        recur
1d340 73 69 76 65 20 71 75 65 72 69 65 73 20 69 6e 20  sive queries in 
1d350 6d 75 6c 74 69 53 65 6c 65 63 74 28 29 2e 0a 2a  multiSelect()..*
1d360 2a 0a 2a 2a 20 20 28 32 34 29 20 20 54 68 65 20  *.**  (24)  The 
1d370 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
1d380 61 6e 20 61 67 67 72 65 67 61 74 65 20 74 68 61  an aggregate tha
1d390 74 20 75 73 65 73 20 74 68 65 20 62 75 69 6c 74  t uses the built
1d3a0 2d 69 6e 20 6d 69 6e 28 29 20 6f 72 20 0a 2a 2a  -in min() or .**
1d3b0 20 20 20 20 20 20 20 20 6f 72 20 6d 61 78 28 29          or max()
1d3c0 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 28 57 69   functions.  (Wi
1d3d0 74 68 6f 75 74 20 74 68 69 73 20 72 65 73 74 72  thout this restr
1d3e0 69 63 74 69 6f 6e 2c 20 61 20 71 75 65 72 79 20  iction, a query 
1d3f0 6c 69 6b 65 3a 0a 2a 2a 20 20 20 20 20 20 20 20  like:.**        
1d400 22 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 28  "SELECT x FROM (
1d410 53 45 4c 45 43 54 20 6d 61 78 28 79 29 2c 20 78  SELECT max(y), x
1d420 20 46 52 4f 4d 20 74 31 29 22 20 77 6f 75 6c 64   FROM t1)" would
1d430 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
1d440 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 74 75 72  .**        retur
1d450 6e 20 74 68 65 20 76 61 6c 75 65 20 58 20 66 6f  n the value X fo
1d460 72 20 77 68 69 63 68 20 59 20 77 61 73 20 6d 61  r which Y was ma
1d470 78 69 6d 61 6c 2e 29 0a 2a 2a 0a 2a 2a 0a 2a 2a  ximal.).**.**.**
1d480 20 49 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65   In this routine
1d490 2c 20 74 68 65 20 22 70 22 20 70 61 72 61 6d 65  , the "p" parame
1d4a0 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ter is a pointer
1d4b0 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20 71 75   to the outer qu
1d4c0 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 75 62 71  ery..** The subq
1d4d0 75 65 72 79 20 69 73 20 70 2d 3e 70 53 72 63 2d  uery is p->pSrc-
1d4e0 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69 73 41 67  >a[iFrom].  isAg
1d4f0 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65  g is true if the
1d500 20 6f 75 74 65 72 20 71 75 65 72 79 0a 2a 2a 20   outer query.** 
1d510 75 73 65 73 20 61 67 67 72 65 67 61 74 65 73 20  uses aggregates 
1d520 61 6e 64 20 73 75 62 71 75 65 72 79 49 73 41 67  and subqueryIsAg
1d530 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65  g is true if the
1d540 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20 61   subquery uses a
1d550 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  ggregates..**.**
1d560 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69   If flattening i
1d570 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2c  s not attempted,
1d580 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1d590 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74   a no-op and ret
1d5a0 75 72 6e 73 20 30 2e 0a 2a 2a 20 49 66 20 66 6c  urns 0..** If fl
1d5b0 61 74 74 65 6e 69 6e 67 20 69 73 20 61 74 74 65  attening is atte
1d5c0 6d 70 74 65 64 20 74 68 69 73 20 72 6f 75 74 69  mpted this routi
1d5d0 6e 65 20 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a  ne returns 1..**
1d5e0 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20 65  .** All of the e
1d5f0 78 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73  xpression analys
1d600 69 73 20 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e  is must occur on
1d610 20 62 6f 74 68 20 74 68 65 20 6f 75 74 65 72 20   both the outer 
1d620 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65  query and.** the
1d630 20 73 75 62 71 75 65 72 79 20 62 65 66 6f 72 65   subquery before
1d640 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75   this routine ru
1d650 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ns..*/.static in
1d660 74 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72  t flattenSubquer
1d670 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
1d680 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
1d690 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
1d6a0 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
1d6b0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
1d6c0 72 65 6e 74 20 6f 72 20 6f 75 74 65 72 20 53 45  rent or outer SE
1d6d0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
1d6e0 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20  /.  int iFrom,  
1d6f0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
1d700 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  x in p->pSrc->a[
1d710 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 73  ] of the inner s
1d720 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  ubquery */.  int
1d730 20 69 73 41 67 67 2c 20 20 20 20 20 20 20 20 20   isAgg,         
1d740 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 75 74    /* True if out
1d750 65 72 20 53 45 4c 45 43 54 20 75 73 65 73 20 61  er SELECT uses a
1d760 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
1d770 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 71  ns */.  int subq
1d780 75 65 72 79 49 73 41 67 67 20 20 20 20 2f 2a 20  ueryIsAgg    /* 
1d790 54 72 75 65 20 69 66 20 74 68 65 20 73 75 62 71  True if the subq
1d7a0 75 65 72 79 20 75 73 65 73 20 61 67 67 72 65 67  uery uses aggreg
1d7b0 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f  ate functions */
1d7c0 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
1d7d0 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74   *zSavedAuthCont
1d7e0 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41  ext = pParse->zA
1d7f0 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 53 65  uthContext;.  Se
1d800 6c 65 63 74 20 2a 70 50 61 72 65 6e 74 3b 20 20  lect *pParent;  
1d810 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 55 4e 49    /* Current UNI
1d820 4f 4e 20 41 4c 4c 20 74 65 72 6d 20 6f 66 20 74  ON ALL term of t
1d830 68 65 20 6f 74 68 65 72 20 71 75 65 72 79 20 2a  he other query *
1d840 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62  /.  Select *pSub
1d850 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69  ;       /* The i
1d860 6e 6e 65 72 20 71 75 65 72 79 20 6f 72 20 22 73  nner query or "s
1d870 75 62 71 75 65 72 79 22 20 2a 2f 0a 20 20 53 65  ubquery" */.  Se
1d880 6c 65 63 74 20 2a 70 53 75 62 31 3b 20 20 20 20  lect *pSub1;    
1d890 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
1d8a0 74 68 65 20 72 69 67 68 74 6d 6f 73 74 20 73 65  the rightmost se
1d8b0 6c 65 63 74 20 69 6e 20 73 75 62 2d 71 75 65 72  lect in sub-quer
1d8c0 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  y */.  SrcList *
1d8d0 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68  pSrc;      /* Th
1d8e0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
1d8f0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1d900 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
1d910 53 75 62 53 72 63 3b 20 20 20 2f 2a 20 54 68 65  SubSrc;   /* The
1d920 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
1d930 74 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  the subquery */.
1d940 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
1d950 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73  t;    /* The res
1d960 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 6f  ult set of the o
1d970 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20  uter query */.  
1d980 69 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20  int iParent;    
1d990 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73      /* VDBE curs
1d9a0 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  or number of the
1d9b0 20 70 53 75 62 20 72 65 73 75 6c 74 20 73 65 74   pSub result set
1d9c0 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20   temp table */. 
1d9d0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
1d9e0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
1d9f0 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a  nter */.  Expr *
1da00 70 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20  pWhere;         
1da10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1da20 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
1da30 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
1da40 73 74 5f 69 74 65 6d 20 2a 70 53 75 62 69 74 65  st_item *pSubite
1da50 6d 3b 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71  m;   /* The subq
1da60 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65  uery */.  sqlite
1da70 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
1da80 64 62 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  db;..  /* Check 
1da90 74 6f 20 73 65 65 20 69 66 20 66 6c 61 74 74 65  to see if flatte
1daa0 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65  ning is permitte
1dab0 64 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20  d.  Return 0 if 
1dac0 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  not..  */.  asse
1dad0 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73  rt( p!=0 );.  as
1dae0 73 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d  sert( p->pPrior=
1daf0 3d 30 20 29 3b 20 20 2f 2a 20 55 6e 61 62 6c 65  =0 );  /* Unable
1db00 20 74 6f 20 66 6c 61 74 74 65 6e 20 63 6f 6d 70   to flatten comp
1db10 6f 75 6e 64 20 71 75 65 72 69 65 73 20 2a 2f 0a  ound queries */.
1db20 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69    if( Optimizati
1db30 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53  onDisabled(db, S
1db40 51 4c 49 54 45 5f 51 75 65 72 79 46 6c 61 74 74  QLITE_QueryFlatt
1db50 65 6e 65 72 29 20 29 20 72 65 74 75 72 6e 20 30  ener) ) return 0
1db60 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53  ;.  pSrc = p->pS
1db70 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  rc;.  assert( pS
1db80 72 63 20 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26  rc && iFrom>=0 &
1db90 26 20 69 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53  & iFrom<pSrc->nS
1dba0 72 63 20 29 3b 0a 20 20 70 53 75 62 69 74 65 6d  rc );.  pSubitem
1dbb0 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69 46 72 6f   = &pSrc->a[iFro
1dbc0 6d 5d 3b 0a 20 20 69 50 61 72 65 6e 74 20 3d 20  m];.  iParent = 
1dbd0 70 53 75 62 69 74 65 6d 2d 3e 69 43 75 72 73 6f  pSubitem->iCurso
1dbe0 72 3b 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62  r;.  pSub = pSub
1dbf0 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  item->pSelect;. 
1dc00 20 61 73 73 65 72 74 28 20 70 53 75 62 21 3d 30   assert( pSub!=0
1dc10 20 29 3b 0a 20 20 69 66 28 20 73 75 62 71 75 65   );.  if( subque
1dc20 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20 69  ryIsAgg ){.    i
1dc30 66 28 20 69 73 41 67 67 20 29 20 72 65 74 75 72  f( isAgg ) retur
1dc40 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
1dc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc60 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1dc70 6f 6e 20 28 31 29 20 20 20 2a 2f 0a 20 20 20 20  on (1)   */.    
1dc80 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63 3e 31  if( pSrc->nSrc>1
1dc90 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
1dca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dcb0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1dcc0 69 6f 6e 20 28 32 61 29 20 20 2a 2f 0a 20 20 20  ion (2a)  */.   
1dcd0 20 69 66 28 20 28 70 2d 3e 70 57 68 65 72 65 20   if( (p->pWhere 
1dce0 26 26 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  && ExprHasProper
1dcf0 74 79 28 70 2d 3e 70 57 68 65 72 65 2c 45 50 5f  ty(p->pWhere,EP_
1dd00 53 75 62 71 75 65 72 79 29 29 0a 20 20 20 20 20  Subquery)).     
1dd10 7c 7c 20 28 73 71 6c 69 74 65 33 45 78 70 72 4c  || (sqlite3ExprL
1dd20 69 73 74 46 6c 61 67 73 28 70 2d 3e 70 45 4c 69  istFlags(p->pELi
1dd30 73 74 29 20 26 20 45 50 5f 53 75 62 71 75 65 72  st) & EP_Subquer
1dd40 79 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20 28 73  y)!=0.     || (s
1dd50 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 46 6c  qlite3ExprListFl
1dd60 61 67 73 28 70 2d 3e 70 4f 72 64 65 72 42 79 29  ags(p->pOrderBy)
1dd70 20 26 20 45 50 5f 53 75 62 71 75 65 72 79 29 21   & EP_Subquery)!
1dd80 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  =0.    ){.      
1dd90 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1dda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ddb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ddc0 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1ddd0 6e 20 28 32 62 29 20 20 2a 2f 0a 20 20 20 20 7d  n (2b)  */.    }
1dde0 0a 20 20 7d 0a 20 20 20 20 0a 20 20 70 53 75 62  .  }.    .  pSub
1ddf0 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63  Src = pSub->pSrc
1de00 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62  ;.  assert( pSub
1de10 53 72 63 20 29 3b 0a 20 20 2f 2a 20 50 72 69 6f  Src );.  /* Prio
1de20 72 20 74 6f 20 76 65 72 73 69 6f 6e 20 33 2e 31  r to version 3.1
1de30 2e 32 2c 20 77 68 65 6e 20 4c 49 4d 49 54 20 61  .2, when LIMIT a
1de40 6e 64 20 4f 46 46 53 45 54 20 68 61 64 20 74 6f  nd OFFSET had to
1de50 20 62 65 20 73 69 6d 70 6c 65 20 63 6f 6e 73 74   be simple const
1de60 61 6e 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20 61  ants,.  ** not a
1de70 72 62 69 74 72 61 72 79 20 65 78 70 72 65 73 73  rbitrary express
1de80 69 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f 77 65 64  ions, we allowed
1de90 20 73 6f 6d 65 20 63 6f 6d 62 69 6e 69 6e 67 20   some combining 
1dea0 6f 66 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  of LIMIT and OFF
1deb0 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 75 73 65  SET.  ** because
1dec0 20 74 68 65 79 20 63 6f 75 6c 64 20 62 65 20 63   they could be c
1ded0 6f 6d 70 75 74 65 64 20 61 74 20 63 6f 6d 70 69  omputed at compi
1dee0 6c 65 2d 74 69 6d 65 2e 20 20 42 75 74 20 77 68  le-time.  But wh
1def0 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  en LIMIT and OFF
1df00 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 6d 65 20  SET.  ** became 
1df10 61 72 62 69 74 72 61 72 79 20 65 78 70 72 65 73  arbitrary expres
1df20 73 69 6f 6e 73 2c 20 77 65 20 77 65 72 65 20 66  sions, we were f
1df30 6f 72 63 65 64 20 74 6f 20 61 64 64 20 72 65 73  orced to add res
1df40 74 72 69 63 74 69 6f 6e 73 20 28 31 33 29 0a 20  trictions (13). 
1df50 20 2a 2a 20 61 6e 64 20 28 31 34 29 2e 20 2a 2f   ** and (14). */
1df60 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69  .  if( pSub->pLi
1df70 6d 69 74 20 26 26 20 70 2d 3e 70 4c 69 6d 69 74  mit && p->pLimit
1df80 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
1df90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
1dfa0 74 72 69 63 74 69 6f 6e 20 28 31 33 29 20 2a 2f  triction (13) */
1dfb0 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 66  .  if( pSub->pOf
1dfc0 66 73 65 74 20 29 20 72 65 74 75 72 6e 20 30 3b  fset ) return 0;
1dfd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dfe0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
1dff0 74 72 69 63 74 69 6f 6e 20 28 31 34 29 20 2a 2f  triction (14) */
1e000 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c  .  if( (p->selFl
1e010 61 67 73 20 26 20 53 46 5f 43 6f 6d 70 6f 75 6e  ags & SF_Compoun
1e020 64 29 21 3d 30 20 26 26 20 70 53 75 62 2d 3e 70  d)!=0 && pSub->p
1e030 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 72 65 74  Limit ){.    ret
1e040 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
1e050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e070 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1e080 20 28 31 35 29 20 2a 2f 0a 20 20 7d 0a 20 20 69   (15) */.  }.  i
1e090 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63  f( pSubSrc->nSrc
1e0a0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ==0 ) return 0; 
1e0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e0c0 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1e0d0 74 69 6f 6e 20 28 37 29 20 20 2a 2f 0a 20 20 69  tion (7)  */.  i
1e0e0 66 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67  f( pSub->selFlag
1e0f0 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20  s & SF_Distinct 
1e100 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
1e110 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1e120 74 69 6f 6e 20 28 35 29 20 20 2a 2f 0a 20 20 69  tion (5)  */.  i
1e130 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20  f( pSub->pLimit 
1e140 26 26 20 28 70 53 72 63 2d 3e 6e 53 72 63 3e 31  && (pSrc->nSrc>1
1e150 20 7c 7c 20 69 73 41 67 67 29 20 29 7b 0a 20 20   || isAgg) ){.  
1e160 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
1e170 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1e180 69 6f 6e 73 20 28 38 29 28 39 29 20 2a 2f 0a 20  ions (8)(9) */. 
1e190 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c   }.  if( (p->sel
1e1a0 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
1e1b0 6e 63 74 29 21 3d 30 20 26 26 20 73 75 62 71 75  nct)!=0 && subqu
1e1c0 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20  eryIsAgg ){.    
1e1d0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1e1e0 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1e1f0 6e 20 28 36 29 20 20 2a 2f 0a 20 20 7d 0a 20 20  n (6)  */.  }.  
1e200 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
1e210 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42  && pSub->pOrderB
1e220 79 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e  y ){.     return
1e230 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1e240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e260 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 31   Restriction (11
1e270 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 69  ) */.  }.  if( i
1e280 73 41 67 67 20 26 26 20 70 53 75 62 2d 3e 70 4f  sAgg && pSub->pO
1e290 72 64 65 72 42 79 20 29 20 72 65 74 75 72 6e 20  rderBy ) return 
1e2a0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1e2b0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1e2c0 20 28 31 36 29 20 2a 2f 0a 20 20 69 66 28 20 70   (16) */.  if( p
1e2d0 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70  Sub->pLimit && p
1e2e0 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74 75 72  ->pWhere ) retur
1e2f0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
1e300 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1e310 20 28 31 39 29 20 2a 2f 0a 20 20 69 66 28 20 70   (19) */.  if( p
1e320 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28  Sub->pLimit && (
1e330 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
1e340 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20 29 7b  _Distinct)!=0 ){
1e350 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  .     return 0; 
1e360 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1e370 69 63 74 69 6f 6e 20 28 32 31 29 20 2a 2f 0a 20  iction (21) */. 
1e380 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28 20 70   }.  testcase( p
1e390 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  Sub->selFlags & 
1e3a0 53 46 5f 52 65 63 75 72 73 69 76 65 20 29 3b 0a  SF_Recursive );.
1e3b0 20 20 74 65 73 74 63 61 73 65 28 20 70 53 75 62    testcase( pSub
1e3c0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
1e3d0 4d 69 6e 4d 61 78 41 67 67 20 29 3b 0a 20 20 69  MinMaxAgg );.  i
1e3e0 66 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67  f( pSub->selFlag
1e3f0 73 20 26 20 28 53 46 5f 52 65 63 75 72 73 69 76  s & (SF_Recursiv
1e400 65 7c 53 46 5f 4d 69 6e 4d 61 78 41 67 67 29 20  e|SF_MinMaxAgg) 
1e410 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
1e420 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 73   /* Restrictions
1e430 20 28 32 32 29 20 61 6e 64 20 28 32 34 29 20 2a   (22) and (24) *
1e440 2f 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e  /.  }.  if( (p->
1e450 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65  selFlags & SF_Re
1e460 63 75 72 73 69 76 65 29 20 26 26 20 70 53 75 62  cursive) && pSub
1e470 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
1e480 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 52 65 73  return 0; /* Res
1e490 74 72 69 63 74 69 6f 6e 20 28 32 33 29 20 2a 2f  triction (23) */
1e4a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 42 53 4f 4c  .  }..  /* OBSOL
1e4b0 45 54 45 20 43 4f 4d 4d 45 4e 54 20 31 3a 0a 20  ETE COMMENT 1:. 
1e4c0 20 2a 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   ** Restriction 
1e4d0 33 3a 20 20 49 66 20 74 68 65 20 73 75 62 71 75  3:  If the subqu
1e4e0 65 72 79 20 69 73 20 61 20 6a 6f 69 6e 2c 20 6d  ery is a join, m
1e4f0 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 75 62  ake sure the sub
1e500 71 75 65 72 79 20 69 73 20 0a 20 20 2a 2a 20 6e  query is .  ** n
1e510 6f 74 20 75 73 65 64 20 61 73 20 74 68 65 20 72  ot used as the r
1e520 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20  ight operand of 
1e530 61 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 2e 20 20  an outer join.  
1e540 45 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20  Examples of why 
1e550 74 68 69 73 0a 20 20 2a 2a 20 69 73 20 6e 6f 74  this.  ** is not
1e560 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20   allowed:.  **. 
1e570 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c   **         t1 L
1e580 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28  EFT OUTER JOIN (
1e590 74 32 20 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a  t2 JOIN t3).  **
1e5a0 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74  .  ** If we flat
1e5b0 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77  ten the above, w
1e5c0 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a  e would get.  **
1e5d0 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74  .  **         (t
1e5e0 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  1 LEFT OUTER JOI
1e5f0 4e 20 74 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20  N t2) JOIN t3.  
1e600 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 73  **.  ** which is
1e610 20 6e 6f 74 20 61 74 20 61 6c 6c 20 74 68 65 20   not at all the 
1e620 73 61 6d 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2a  same thing..  **
1e630 0a 20 20 2a 2a 20 4f 42 53 4f 4c 45 54 45 20 43  .  ** OBSOLETE C
1e640 4f 4d 4d 45 4e 54 20 32 3a 0a 20 20 2a 2a 20 52  OMMENT 2:.  ** R
1e650 65 73 74 72 69 63 74 69 6f 6e 20 31 32 3a 20 20  estriction 12:  
1e660 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
1e670 69 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65  is the right ope
1e680 72 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f  rand of a left o
1e690 75 74 65 72 0a 20 20 2a 2a 20 6a 6f 69 6e 2c 20  uter.  ** join, 
1e6a0 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 75  make sure the su
1e6b0 62 71 75 65 72 79 20 68 61 73 20 6e 6f 20 57 48  bquery has no WH
1e6c0 45 52 45 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a  ERE clause..  **
1e6d0 20 41 6e 20 65 78 61 6d 70 6c 65 73 20 6f 66 20   An examples of 
1e6e0 77 68 79 20 74 68 69 73 20 69 73 20 6e 6f 74 20  why this is not 
1e6f0 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20  allowed:.  **.  
1e700 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c 45  **         t1 LE
1e710 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 53  FT OUTER JOIN (S
1e720 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20  ELECT * FROM t2 
1e730 57 48 45 52 45 20 74 32 2e 78 3e 30 29 0a 20 20  WHERE t2.x>0).  
1e740 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c  **.  ** If we fl
1e750 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c  atten the above,
1e760 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20   we would get.  
1e770 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
1e780 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  (t1 LEFT OUTER J
1e790 4f 49 4e 20 74 32 29 20 57 48 45 52 45 20 74 32  OIN t2) WHERE t2
1e7a0 2e 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42  .x>0.  **.  ** B
1e7b0 75 74 20 74 68 65 20 74 32 2e 78 3e 30 20 74 65  ut the t2.x>0 te
1e7c0 73 74 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 66  st will always f
1e7d0 61 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c 20 72 6f  ail on a NULL ro
1e7e0 77 20 6f 66 20 74 32 2c 20 77 68 69 63 68 0a 20  w of t2, which. 
1e7f0 20 2a 2a 20 65 66 66 65 63 74 69 76 65 6c 79 20   ** effectively 
1e800 63 6f 6e 76 65 72 74 73 20 74 68 65 20 4f 55 54  converts the OUT
1e810 45 52 20 4a 4f 49 4e 20 69 6e 74 6f 20 61 6e 20  ER JOIN into an 
1e820 49 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20 20 2a 2a  INNER JOIN..  **
1e830 0a 20 20 2a 2a 20 54 48 49 53 20 4f 56 45 52 52  .  ** THIS OVERR
1e840 49 44 45 53 20 4f 42 53 4f 4c 45 54 45 20 43 4f  IDES OBSOLETE CO
1e850 4d 4d 45 4e 54 53 20 31 20 41 4e 44 20 32 20 41  MMENTS 1 AND 2 A
1e860 42 4f 56 45 3a 0a 20 20 2a 2a 20 54 69 63 6b 65  BOVE:.  ** Ticke
1e870 74 20 23 33 33 30 30 20 73 68 6f 77 73 20 74 68  t #3300 shows th
1e880 61 74 20 66 6c 61 74 74 65 6e 69 6e 67 20 74 68  at flattening th
1e890 65 20 72 69 67 68 74 20 74 65 72 6d 20 6f 66 20  e right term of 
1e8a0 61 20 4c 45 46 54 20 4a 4f 49 4e 0a 20 20 2a 2a  a LEFT JOIN.  **
1e8b0 20 69 73 20 66 72 61 75 67 68 74 20 77 69 74 68   is fraught with
1e8c0 20 64 61 6e 67 65 72 2e 20 20 42 65 73 74 20 74   danger.  Best t
1e8d0 6f 20 61 76 6f 69 64 20 74 68 65 20 77 68 6f 6c  o avoid the whol
1e8e0 65 20 74 68 69 6e 67 2e 20 20 49 66 20 74 68 65  e thing.  If the
1e8f0 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20 69  .  ** subquery i
1e900 73 20 74 68 65 20 72 69 67 68 74 20 74 65 72 6d  s the right term
1e910 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c   of a LEFT JOIN,
1e920 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 66 6c 61   then do not fla
1e930 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tten..  */.  if(
1e940 20 28 70 53 75 62 69 74 65 6d 2d 3e 66 67 2e 6a   (pSubitem->fg.j
1e950 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54  ointype & JT_OUT
1e960 45 52 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  ER)!=0 ){.    re
1e970 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
1e980 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 37  * Restriction 17
1e990 3a 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65  : If the sub-que
1e9a0 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ry is a compound
1e9b0 20 53 45 4c 45 43 54 2c 20 74 68 65 6e 20 69 74   SELECT, then it
1e9c0 20 6d 75 73 74 0a 20 20 2a 2a 20 75 73 65 20 6f   must.  ** use o
1e9d0 6e 6c 79 20 74 68 65 20 55 4e 49 4f 4e 20 41 4c  nly the UNION AL
1e9e0 4c 20 6f 70 65 72 61 74 6f 72 2e 20 41 6e 64 20  L operator. And 
1e9f0 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 69 6d 70  none of the simp
1ea00 6c 65 20 73 65 6c 65 63 74 20 71 75 65 72 69 65  le select querie
1ea10 73 0a 20 20 2a 2a 20 74 68 61 74 20 6d 61 6b 65  s.  ** that make
1ea20 20 75 70 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   up the compound
1ea30 20 53 45 4c 45 43 54 20 61 72 65 20 61 6c 6c 6f   SELECT are allo
1ea40 77 65 64 20 74 6f 20 62 65 20 61 67 67 72 65 67  wed to be aggreg
1ea50 61 74 65 20 6f 72 20 64 69 73 74 69 6e 63 74 0a  ate or distinct.
1ea60 20 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20 20    ** queries..  
1ea70 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
1ea80 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66 28  Prior ){.    if(
1ea90 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
1eaa0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1eab0 30 3b 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69  0;  /* Restricti
1eac0 6f 6e 20 32 30 20 2a 2f 0a 20 20 20 20 7d 0a 20  on 20 */.    }. 
1ead0 20 20 20 69 66 28 20 69 73 41 67 67 20 7c 7c 20     if( isAgg || 
1eae0 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
1eaf0 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20 7c  F_Distinct)!=0 |
1eb00 7c 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20  | pSrc->nSrc!=1 
1eb10 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1eb20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  0;.    }.    for
1eb30 28 70 53 75 62 31 3d 70 53 75 62 3b 20 70 53 75  (pSub1=pSub; pSu
1eb40 62 31 3b 20 70 53 75 62 31 3d 70 53 75 62 31 2d  b1; pSub1=pSub1-
1eb50 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20  >pPrior){.      
1eb60 74 65 73 74 63 61 73 65 28 20 28 70 53 75 62 31  testcase( (pSub1
1eb70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
1eb80 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
1eb90 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73  regate))==SF_Dis
1eba0 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 74  tinct );.      t
1ebb0 65 73 74 63 61 73 65 28 20 28 70 53 75 62 31 2d  estcase( (pSub1-
1ebc0 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
1ebd0 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
1ebe0 65 67 61 74 65 29 29 3d 3d 53 46 5f 41 67 67 72  egate))==SF_Aggr
1ebf0 65 67 61 74 65 20 29 3b 0a 20 20 20 20 20 20 61  egate );.      a
1ec00 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70 53 72  ssert( pSub->pSr
1ec10 63 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  c!=0 );.      as
1ec20 73 65 72 74 28 20 70 53 75 62 2d 3e 70 45 4c 69  sert( pSub->pELi
1ec30 73 74 2d 3e 6e 45 78 70 72 3d 3d 70 53 75 62 31  st->nExpr==pSub1
1ec40 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
1ec50 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 53  );.      if( (pS
1ec60 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ub1->selFlags & 
1ec70 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
1ec80 41 67 67 72 65 67 61 74 65 29 29 21 3d 30 0a 20  Aggregate))!=0. 
1ec90 20 20 20 20 20 20 7c 7c 20 28 70 53 75 62 31 2d        || (pSub1-
1eca0 3e 70 50 72 69 6f 72 20 26 26 20 70 53 75 62 31  >pPrior && pSub1
1ecb0 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 0a 20  ->op!=TK_ALL) . 
1ecc0 20 20 20 20 20 20 7c 7c 20 70 53 75 62 31 2d 3e        || pSub1->
1ecd0 70 53 72 63 2d 3e 6e 53 72 63 3c 31 0a 20 20 20  pSrc->nSrc<1.   
1ece0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65     ){.        re
1ecf0 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
1ed00 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1ed10 70 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e 53 72  pSub1->pSrc->nSr
1ed20 63 3e 31 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  c>1 );.    }..  
1ed30 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1ed40 20 31 38 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20   18. */.    if( 
1ed50 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  p->pOrderBy ){. 
1ed60 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20       int ii;.   
1ed70 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
1ed80 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  p->pOrderBy->nEx
1ed90 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  pr; ii++){.     
1eda0 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72     if( p->pOrder
1edb0 42 79 2d 3e 61 5b 69 69 5d 2e 75 2e 78 2e 69 4f  By->a[ii].u.x.iO
1edc0 72 64 65 72 42 79 43 6f 6c 3d 3d 30 20 29 20 72  rderByCol==0 ) r
1edd0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
1ede0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1edf0 2a 2a 2a 2a 20 49 66 20 77 65 20 72 65 61 63 68  **** If we reach
1ee00 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 66 6c 61   this point, fla
1ee10 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69  ttening is permi
1ee20 74 74 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a 20 20 53  tted. *****/.  S
1ee30 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50 61  ELECTTRACE(1,pPa
1ee40 72 73 65 2c 70 2c 28 22 66 6c 61 74 74 65 6e 20  rse,p,("flatten 
1ee50 25 73 2e 25 70 20 66 72 6f 6d 20 74 65 72 6d 20  %s.%p from term 
1ee60 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
1ee70 20 20 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e            pSub->
1ee80 7a 53 65 6c 4e 61 6d 65 2c 20 70 53 75 62 2c 20  zSelName, pSub, 
1ee90 69 46 72 6f 6d 29 29 3b 0a 0a 20 20 2f 2a 20 41  iFrom));..  /* A
1eea0 75 74 68 6f 72 69 7a 65 20 74 68 65 20 73 75 62  uthorize the sub
1eeb0 71 75 65 72 79 20 2a 2f 0a 20 20 70 50 61 72 73  query */.  pPars
1eec0 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20  e->zAuthContext 
1eed0 3d 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d  = pSubitem->zNam
1eee0 65 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28 69 20  e;.  TESTONLY(i 
1eef0 3d 29 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  =) sqlite3AuthCh
1ef00 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
1ef10 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c  TE_SELECT, 0, 0,
1ef20 20 30 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28   0);.  testcase(
1ef30 20 69 3d 3d 53 51 4c 49 54 45 5f 44 45 4e 59 20   i==SQLITE_DENY 
1ef40 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41 75  );.  pParse->zAu
1ef50 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76  thContext = zSav
1ef60 65 64 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 0a  edAuthContext;..
1ef70 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62 2d    /* If the sub-
1ef80 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f  query is a compo
1ef90 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74 65  und SELECT state
1efa0 6d 65 6e 74 2c 20 74 68 65 6e 20 28 62 79 20 72  ment, then (by r
1efb0 65 73 74 72 69 63 74 69 6f 6e 73 0a 20 20 2a 2a  estrictions.  **
1efc0 20 31 37 20 61 6e 64 20 31 38 20 61 62 6f 76 65   17 and 18 above
1efd0 29 20 69 74 20 6d 75 73 74 20 62 65 20 61 20 55  ) it must be a U
1efe0 4e 49 4f 4e 20 41 4c 4c 20 61 6e 64 20 74 68 65  NION ALL and the
1eff0 20 70 61 72 65 6e 74 20 71 75 65 72 79 20 6d 75   parent query mu
1f000 73 74 20 0a 20 20 2a 2a 20 62 65 20 6f 66 20 74  st .  ** be of t
1f010 68 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20  he form:.  **.  
1f020 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 3c 65  **     SELECT <e
1f030 78 70 72 2d 6c 69 73 74 3e 20 46 52 4f 4d 20 28  xpr-list> FROM (
1f040 3c 73 75 62 2d 71 75 65 72 79 3e 29 20 3c 77 68  <sub-query>) <wh
1f050 65 72 65 2d 63 6c 61 75 73 65 3e 20 0a 20 20 2a  ere-clause> .  *
1f060 2a 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20  *.  ** followed 
1f070 62 79 20 61 6e 79 20 4f 52 44 45 52 20 42 59 2c  by any ORDER BY,
1f080 20 4c 49 4d 49 54 20 61 6e 64 2f 6f 72 20 4f 46   LIMIT and/or OF
1f090 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20 54 68  FSET clauses. Th
1f0a0 69 73 20 62 6c 6f 63 6b 0a 20 20 2a 2a 20 63 72  is block.  ** cr
1f0b0 65 61 74 65 73 20 4e 2d 31 20 63 6f 70 69 65 73  eates N-1 copies
1f0c0 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 71   of the parent q
1f0d0 75 65 72 79 20 77 69 74 68 6f 75 74 20 61 6e 79  uery without any
1f0e0 20 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d 49 54   ORDER BY, LIMIT
1f0f0 20 6f 72 20 0a 20 20 2a 2a 20 4f 46 46 53 45 54   or .  ** OFFSET
1f100 20 63 6c 61 75 73 65 73 20 61 6e 64 20 6a 6f 69   clauses and joi
1f110 6e 73 20 74 68 65 6d 20 74 6f 20 74 68 65 20 6c  ns them to the l
1f120 65 66 74 2d 68 61 6e 64 2d 73 69 64 65 20 6f 66  eft-hand-side of
1f130 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20   the original.  
1f140 2a 2a 20 75 73 69 6e 67 20 55 4e 49 4f 4e 20 41  ** using UNION A
1f150 4c 4c 20 6f 70 65 72 61 74 6f 72 73 2e 20 49 6e  LL operators. In
1f160 20 74 68 69 73 20 63 61 73 65 20 4e 20 69 73 20   this case N is 
1f170 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69  the number of si
1f180 6d 70 6c 65 0a 20 20 2a 2a 20 73 65 6c 65 63 74  mple.  ** select
1f190 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 74   statements in t
1f1a0 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d  he compound sub-
1f1b0 71 75 65 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  query..  **.  **
1f1c0 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20   Example:.  **. 
1f1d0 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61   **     SELECT a
1f1e0 2b 31 20 46 52 4f 4d 20 28 0a 20 20 2a 2a 20 20  +1 FROM (.  **  
1f1f0 20 20 20 20 20 20 53 45 4c 45 43 54 20 78 20 46        SELECT x F
1f200 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20 20  ROM tab.  **    
1f210 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20      UNION ALL.  
1f220 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  **        SELECT
1f230 20 79 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a   y FROM tab.  **
1f240 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c          UNION AL
1f250 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45  L.  **        SE
1f260 4c 45 43 54 20 61 62 73 28 7a 2a 32 29 20 46 52  LECT abs(z*2) FR
1f270 4f 4d 20 74 61 62 32 0a 20 20 2a 2a 20 20 20 20  OM tab2.  **    
1f280 20 29 20 57 48 45 52 45 20 61 21 3d 35 20 4f 52   ) WHERE a!=5 OR
1f290 44 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20  DER BY 1.  **.  
1f2a0 2a 2a 20 54 72 61 6e 73 66 6f 72 6d 65 64 20 69  ** Transformed i
1f2b0 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  nto:.  **.  **  
1f2c0 20 20 20 53 45 4c 45 43 54 20 78 2b 31 20 46 52     SELECT x+1 FR
1f2d0 4f 4d 20 74 61 62 20 57 48 45 52 45 20 78 2b 31  OM tab WHERE x+1
1f2e0 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49  !=5.  **     UNI
1f2f0 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20  ON ALL.  **     
1f300 53 45 4c 45 43 54 20 79 2b 31 20 46 52 4f 4d 20  SELECT y+1 FROM 
1f310 74 61 62 20 57 48 45 52 45 20 79 2b 31 21 3d 35  tab WHERE y+1!=5
1f320 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20  .  **     UNION 
1f330 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c  ALL.  **     SEL
1f340 45 43 54 20 61 62 73 28 7a 2a 32 29 2b 31 20 46  ECT abs(z*2)+1 F
1f350 52 4f 4d 20 74 61 62 32 20 57 48 45 52 45 20 61  ROM tab2 WHERE a
1f360 62 73 28 7a 2a 32 29 2b 31 21 3d 35 0a 20 20 2a  bs(z*2)+1!=5.  *
1f370 2a 20 20 20 20 20 4f 52 44 45 52 20 42 59 20 31  *     ORDER BY 1
1f380 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 63 61  .  **.  ** We ca
1f390 6c 6c 20 74 68 69 73 20 74 68 65 20 22 63 6f 6d  ll this the "com
1f3a0 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20 66  pound-subquery f
1f3b0 6c 61 74 74 65 6e 69 6e 67 22 2e 0a 20 20 2a 2f  lattening"..  */
1f3c0 0a 20 20 66 6f 72 28 70 53 75 62 3d 70 53 75 62  .  for(pSub=pSub
1f3d0 2d 3e 70 50 72 69 6f 72 3b 20 70 53 75 62 3b 20  ->pPrior; pSub; 
1f3e0 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f  pSub=pSub->pPrio
1f3f0 72 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a  r){.    Select *
1f400 70 4e 65 77 3b 0a 20 20 20 20 45 78 70 72 4c 69  pNew;.    ExprLi
1f410 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70  st *pOrderBy = p
1f420 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  ->pOrderBy;.    
1f430 45 78 70 72 20 2a 70 4c 69 6d 69 74 20 3d 20 70  Expr *pLimit = p
1f440 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 45 78  ->pLimit;.    Ex
1f450 70 72 20 2a 70 4f 66 66 73 65 74 20 3d 20 70 2d  pr *pOffset = p-
1f460 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 53 65  >pOffset;.    Se
1f470 6c 65 63 74 20 2a 70 50 72 69 6f 72 20 3d 20 70  lect *pPrior = p
1f480 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 70 2d  ->pPrior;.    p-
1f490 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
1f4a0 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 30 3b 0a     p->pSrc = 0;.
1f4b0 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
1f4c0 30 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  0;.    p->pLimit
1f4d0 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 4f 66   = 0;.    p->pOf
1f4e0 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e  fset = 0;.    pN
1f4f0 65 77 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ew = sqlite3Sele
1f500 63 74 44 75 70 28 64 62 2c 20 70 2c 20 30 29 3b  ctDup(db, p, 0);
1f510 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
1f520 63 74 53 65 74 4e 61 6d 65 28 70 4e 65 77 2c 20  ctSetName(pNew, 
1f530 70 53 75 62 2d 3e 7a 53 65 6c 4e 61 6d 65 29 3b  pSub->zSelName);
1f540 0a 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20  .    p->pOffset 
1f550 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 70  = pOffset;.    p
1f560 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69  ->pLimit = pLimi
1f570 74 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  t;.    p->pOrder
1f580 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20  By = pOrderBy;. 
1f590 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 53 72     p->pSrc = pSr
1f5a0 63 3b 0a 20 20 20 20 70 2d 3e 6f 70 20 3d 20 54  c;.    p->op = T
1f5b0 4b 5f 41 4c 4c 3b 0a 20 20 20 20 69 66 28 20 70  K_ALL;.    if( p
1f5c0 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
1f5d0 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
1f5e0 6f 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  or;.    }else{. 
1f5f0 20 20 20 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f       pNew->pPrio
1f600 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
1f610 20 20 69 66 28 20 70 50 72 69 6f 72 20 29 20 70    if( pPrior ) p
1f620 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70  Prior->pNext = p
1f630 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  New;.      pNew-
1f640 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20  >pNext = p;.    
1f650 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 4e    p->pPrior = pN
1f660 65 77 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54  ew;.      SELECT
1f670 54 52 41 43 45 28 32 2c 70 50 61 72 73 65 2c 70  TRACE(2,pParse,p
1f680 2c 0a 20 20 20 20 20 20 20 20 20 28 22 63 6f 6d  ,.         ("com
1f690 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20 66  pound-subquery f
1f6a0 6c 61 74 74 65 6e 65 72 20 63 72 65 61 74 65 73  lattener creates
1f6b0 20 25 73 2e 25 70 20 61 73 20 70 65 65 72 5c 6e   %s.%p as peer\n
1f6c0 22 2c 0a 20 20 20 20 20 20 20 20 20 70 4e 65 77  ",.         pNew
1f6d0 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 20 70 4e 65 77  ->zSelName, pNew
1f6e0 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ));.    }.    if
1f6f0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
1f700 65 64 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  ed ) return 1;. 
1f710 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 66   }..  /* Begin f
1f720 6c 61 74 74 65 6e 69 6e 67 20 74 68 65 20 69 46  lattening the iF
1f730 72 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66 20  rom-th entry of 
1f740 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1f750 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74  .  ** in the out
1f760 65 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  er query..  */. 
1f770 20 70 53 75 62 20 3d 20 70 53 75 62 31 20 3d 20   pSub = pSub1 = 
1f780 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63  pSubitem->pSelec
1f790 74 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20  t;..  /* Delete 
1f7a0 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20 74 61  the transient ta
1f7b0 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 61 73  ble structure as
1f7c0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
1f7d0 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 0a  e.  ** subquery.
1f7e0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62    */.  sqlite3Db
1f7f0 46 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65  Free(db, pSubite
1f800 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  m->zDatabase);. 
1f810 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1f820 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61  b, pSubitem->zNa
1f830 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  me);.  sqlite3Db
1f840 46 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65  Free(db, pSubite
1f850 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 70 53  m->zAlias);.  pS
1f860 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73  ubitem->zDatabas
1f870 65 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65  e = 0;.  pSubite
1f880 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  m->zName = 0;.  
1f890 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73  pSubitem->zAlias
1f8a0 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d   = 0;.  pSubitem
1f8b0 2d 3e 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 0a  ->pSelect = 0;..
1f8c0 20 20 2f 2a 20 44 65 66 65 72 20 64 65 6c 65 74    /* Defer delet
1f8d0 69 6e 67 20 74 68 65 20 54 61 62 6c 65 20 6f 62  ing the Table ob
1f8e0 6a 65 63 74 20 61 73 73 6f 63 69 61 74 65 64 20  ject associated 
1f8f0 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75  with the.  ** su
1f900 62 71 75 65 72 79 20 75 6e 74 69 6c 20 63 6f 64  bquery until cod
1f910 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 69 73 0a  e generation is.
1f920 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 2c 20 73    ** complete, s
1f930 69 6e 63 65 20 74 68 65 72 65 20 6d 61 79 20 73  ince there may s
1f940 74 69 6c 6c 20 65 78 69 73 74 20 45 78 70 72 2e  till exist Expr.
1f950 70 54 61 62 20 65 6e 74 72 69 65 73 20 74 68 61  pTab entries tha
1f960 74 0a 20 20 2a 2a 20 72 65 66 65 72 20 74 6f 20  t.  ** refer to 
1f970 74 68 65 20 73 75 62 71 75 65 72 79 20 65 76 65  the subquery eve
1f980 6e 20 61 66 74 65 72 20 66 6c 61 74 74 65 6e 69  n after flatteni
1f990 6e 67 2e 20 20 54 69 63 6b 65 74 20 23 33 33 34  ng.  Ticket #334
1f9a0 36 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 70 53 75  6..  **.  ** pSu
1f9b0 62 69 74 65 6d 2d 3e 70 54 61 62 20 69 73 20 61  bitem->pTab is a
1f9c0 6c 77 61 79 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 62  lways non-NULL b
1f9d0 79 20 74 65 73 74 20 72 65 73 74 72 69 63 74 69  y test restricti
1f9e0 6f 6e 73 20 61 6e 64 20 74 65 73 74 73 20 61 62  ons and tests ab
1f9f0 6f 76 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ove..  */.  if( 
1fa00 41 4c 57 41 59 53 28 70 53 75 62 69 74 65 6d 2d  ALWAYS(pSubitem-
1fa10 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a 20 20 20  >pTab!=0) ){.   
1fa20 20 54 61 62 6c 65 20 2a 70 54 61 62 54 6f 44 65   Table *pTabToDe
1fa30 6c 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 54  l = pSubitem->pT
1fa40 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  ab;.    if( pTab
1fa50 54 6f 44 65 6c 2d 3e 6e 52 65 66 3d 3d 31 20 29  ToDel->nRef==1 )
1fa60 7b 0a 20 20 20 20 20 20 50 61 72 73 65 20 2a 70  {.      Parse *p
1fa70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74  Toplevel = sqlit
1fa80 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28  e3ParseToplevel(
1fa90 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 70  pParse);.      p
1faa0 54 61 62 54 6f 44 65 6c 2d 3e 70 4e 65 78 74 5a  TabToDel->pNextZ
1fab0 6f 6d 62 69 65 20 3d 20 70 54 6f 70 6c 65 76 65  ombie = pTopleve
1fac0 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 3b 0a 20  l->pZombieTab;. 
1fad0 20 20 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e       pToplevel->
1fae0 70 5a 6f 6d 62 69 65 54 61 62 20 3d 20 70 54 61  pZombieTab = pTa
1faf0 62 54 6f 44 65 6c 3b 0a 20 20 20 20 7d 65 6c 73  bToDel;.    }els
1fb00 65 7b 0a 20 20 20 20 20 20 70 54 61 62 54 6f 44  e{.      pTabToD
1fb10 65 6c 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20  el->nRef--;.    
1fb20 7d 0a 20 20 20 20 70 53 75 62 69 74 65 6d 2d 3e  }.    pSubitem->
1fb30 70 54 61 62 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  pTab = 0;.  }.. 
1fb40 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
1fb50 67 20 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e 63 65  g loop runs once
1fb60 20 66 6f 72 20 65 61 63 68 20 74 65 72 6d 20 69   for each term i
1fb70 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62  n a compound-sub
1fb80 71 75 65 72 79 0a 20 20 2a 2a 20 66 6c 61 74 74  query.  ** flatt
1fb90 65 6e 69 6e 67 20 28 61 73 20 64 65 73 63 72 69  ening (as descri
1fba0 62 65 64 20 61 62 6f 76 65 29 2e 20 20 49 66 20  bed above).  If 
1fbb0 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20 64  we are doing a d
1fbc0 69 66 66 65 72 65 6e 74 20 6b 69 6e 64 0a 20 20  ifferent kind.  
1fbd0 2a 2a 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67  ** of flattening
1fbe0 20 2d 20 61 20 66 6c 61 74 74 65 6e 69 6e 67 20   - a flattening 
1fbf0 6f 74 68 65 72 20 74 68 61 6e 20 61 20 63 6f 6d  other than a com
1fc00 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20 66  pound-subquery f
1fc10 6c 61 74 74 65 6e 69 6e 67 20 2d 0a 20 20 2a 2a  lattening -.  **
1fc20 20 74 68 65 6e 20 74 68 69 73 20 6c 6f 6f 70 20   then this loop 
1fc30 6f 6e 6c 79 20 72 75 6e 73 20 6f 6e 63 65 2e 0a  only runs once..
1fc40 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c    **.  ** This l
1fc50 6f 6f 70 20 6d 6f 76 65 73 20 61 6c 6c 20 6f 66  oop moves all of
1fc60 20 74 68 65 20 46 52 4f 4d 20 65 6c 65 6d 65 6e   the FROM elemen
1fc70 74 73 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ts of the subque
1fc80 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a  ry into the.  **
1fc90 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1fca0 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
1fcb0 65 72 79 2e 20 20 42 65 66 6f 72 65 20 64 6f 69  ery.  Before doi
1fcc0 6e 67 20 74 68 69 73 2c 20 72 65 6d 65 6d 62 65  ng this, remembe
1fcd0 72 0a 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f  r.  ** the curso
1fce0 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  r number for the
1fcf0 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74 65 72 20   original outer 
1fd00 71 75 65 72 79 20 46 52 4f 4d 20 65 6c 65 6d 65  query FROM eleme
1fd10 6e 74 20 69 6e 0a 20 20 2a 2a 20 69 50 61 72 65  nt in.  ** iPare
1fd20 6e 74 2e 20 20 54 68 65 20 69 50 61 72 65 6e 74  nt.  The iParent
1fd30 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 6e 65 76   cursor will nev
1fd40 65 72 20 62 65 20 75 73 65 64 2e 20 20 53 75 62  er be used.  Sub
1fd50 73 65 71 75 65 6e 74 20 63 6f 64 65 0a 20 20 2a  sequent code.  *
1fd60 2a 20 77 69 6c 6c 20 73 63 61 6e 20 65 78 70 72  * will scan expr
1fd70 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20  essions looking 
1fd80 66 6f 72 20 69 50 61 72 65 6e 74 20 72 65 66 65  for iParent refe
1fd90 72 65 6e 63 65 73 20 61 6e 64 20 72 65 70 6c 61  rences and repla
1fda0 63 65 0a 20 20 2a 2a 20 74 68 6f 73 65 20 72 65  ce.  ** those re
1fdb0 66 65 72 65 6e 63 65 73 20 77 69 74 68 20 65 78  ferences with ex
1fdc0 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 72  pressions that r
1fdd0 65 73 6f 6c 76 65 20 74 6f 20 74 68 65 20 73 75  esolve to the su
1fde0 62 71 75 65 72 79 20 46 52 4f 4d 0a 20 20 2a 2a  bquery FROM.  **
1fdf0 20 65 6c 65 6d 65 6e 74 73 20 77 65 20 61 72 65   elements we are
1fe00 20 6e 6f 77 20 63 6f 70 79 69 6e 67 20 69 6e 2e   now copying in.
1fe10 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 50 61 72  .  */.  for(pPar
1fe20 65 6e 74 3d 70 3b 20 70 50 61 72 65 6e 74 3b 20  ent=p; pParent; 
1fe30 70 50 61 72 65 6e 74 3d 70 50 61 72 65 6e 74 2d  pParent=pParent-
1fe40 3e 70 50 72 69 6f 72 2c 20 70 53 75 62 3d 70 53  >pPrior, pSub=pS
1fe50 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20  ub->pPrior){.   
1fe60 20 69 6e 74 20 6e 53 75 62 53 72 63 3b 0a 20 20   int nSubSrc;.  
1fe70 20 20 75 38 20 6a 6f 69 6e 74 79 70 65 20 3d 20    u8 jointype = 
1fe80 30 3b 0a 20 20 20 20 70 53 75 62 53 72 63 20 3d  0;.    pSubSrc =
1fe90 20 70 53 75 62 2d 3e 70 53 72 63 3b 20 20 20 20   pSub->pSrc;    
1fea0 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
1feb0 6f 66 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  of subquery */. 
1fec0 20 20 20 6e 53 75 62 53 72 63 20 3d 20 70 53 75     nSubSrc = pSu
1fed0 62 53 72 63 2d 3e 6e 53 72 63 3b 20 20 2f 2a 20  bSrc->nSrc;  /* 
1fee0 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20  Number of terms 
1fef0 69 6e 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d  in subquery FROM
1ff00 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 70   clause */.    p
1ff10 53 72 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70  Src = pParent->p
1ff20 53 72 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d  Src;     /* FROM
1ff30 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f   clause of the o
1ff40 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 0a 20  uter query */.. 
1ff50 20 20 20 69 66 28 20 70 53 72 63 20 29 7b 0a 20     if( pSrc ){. 
1ff60 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
1ff70 72 65 6e 74 3d 3d 70 20 29 3b 20 20 2f 2a 20 46  rent==p );  /* F
1ff80 69 72 73 74 20 74 69 6d 65 20 74 68 72 6f 75 67  irst time throug
1ff90 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20  h the loop */.  
1ffa0 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 70      jointype = p
1ffb0 53 75 62 69 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e  Subitem->fg.join
1ffc0 74 79 70 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  type;.    }else{
1ffd0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1ffe0 50 61 72 65 6e 74 21 3d 70 20 29 3b 20 20 2f 2a  Parent!=p );  /*
1fff0 20 32 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75   2nd and subsequ
20000 65 6e 74 20 74 69 6d 65 73 20 74 68 72 6f 75 67  ent times throug
20010 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20  h the loop */.  
20020 20 20 20 20 70 53 72 63 20 3d 20 70 50 61 72 65      pSrc = pPare
20030 6e 74 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74  nt->pSrc = sqlit
20040 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
20050 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  db, 0, 0, 0);.  
20060 20 20 20 20 69 66 28 20 70 53 72 63 3d 3d 30 20      if( pSrc==0 
20070 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
20080 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  t( db->mallocFai
20090 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 62  led );.        b
200a0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
200b0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20    }..    /* The 
200c0 73 75 62 71 75 65 72 79 20 75 73 65 73 20 61 20  subquery uses a 
200d0 73 69 6e 67 6c 65 20 73 6c 6f 74 20 6f 66 20 74  single slot of t
200e0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
200f0 66 20 74 68 65 20 6f 75 74 65 72 0a 20 20 20 20  f the outer.    
20100 2a 2a 20 71 75 65 72 79 2e 20 20 49 66 20 74 68  ** query.  If th
20110 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20 6d  e subquery has m
20120 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 65 6c 65  ore than one ele
20130 6d 65 6e 74 20 69 6e 20 69 74 73 20 46 52 4f 4d  ment in its FROM
20140 20 63 6c 61 75 73 65 2c 0a 20 20 20 20 2a 2a 20   clause,.    ** 
20150 74 68 65 6e 20 65 78 70 61 6e 64 20 74 68 65 20  then expand the 
20160 6f 75 74 65 72 20 71 75 65 72 79 20 74 6f 20 6d  outer query to m
20170 61 6b 65 20 73 70 61 63 65 20 66 6f 72 20 69 74  ake space for it
20180 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 65 6c 65   to hold all ele
20190 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6f 66 20  ments.    ** of 
201a0 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20  the subquery..  
201b0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d    **.    ** Exam
201c0 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ple:.    **.    
201d0 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  **    SELECT * F
201e0 52 4f 4d 20 74 61 62 41 2c 20 28 53 45 4c 45 43  ROM tabA, (SELEC
201f0 54 20 2a 20 46 52 4f 4d 20 73 75 62 31 2c 20 73  T * FROM sub1, s
20200 75 62 32 29 2c 20 74 61 62 42 3b 0a 20 20 20 20  ub2), tabB;.    
20210 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 75  **.    ** The ou
20220 74 65 72 20 71 75 65 72 79 20 68 61 73 20 33 20  ter query has 3 
20230 73 6c 6f 74 73 20 69 6e 20 69 74 73 20 46 52 4f  slots in its FRO
20240 4d 20 63 6c 61 75 73 65 2e 20 20 4f 6e 65 20 73  M clause.  One s
20250 6c 6f 74 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  lot of the.    *
20260 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20 28 74  * outer query (t
20270 68 65 20 6d 69 64 64 6c 65 20 73 6c 6f 74 29 20  he middle slot) 
20280 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 73  is used by the s
20290 75 62 71 75 65 72 79 2e 20 20 54 68 65 20 6e 65  ubquery.  The ne
202a0 78 74 0a 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20  xt.    ** block 
202b0 6f 66 20 63 6f 64 65 20 77 69 6c 6c 20 65 78 70  of code will exp
202c0 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75  and the outer qu
202d0 65 72 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  ery FROM clause 
202e0 74 6f 20 34 20 73 6c 6f 74 73 2e 0a 20 20 20 20  to 4 slots..    
202f0 2a 2a 20 54 68 65 20 6d 69 64 64 6c 65 20 73 6c  ** The middle sl
20300 6f 74 20 69 73 20 65 78 70 61 6e 64 65 64 20 74  ot is expanded t
20310 6f 20 74 77 6f 20 73 6c 6f 74 73 20 69 6e 20 6f  o two slots in o
20320 72 64 65 72 20 74 6f 20 6d 61 6b 65 20 73 70 61  rder to make spa
20330 63 65 0a 20 20 20 20 2a 2a 20 66 6f 72 20 74 68  ce.    ** for th
20340 65 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73 20 69  e two elements i
20350 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
20360 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  e of the subquer
20370 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  y..    */.    if
20380 28 20 6e 53 75 62 53 72 63 3e 31 20 29 7b 0a 20  ( nSubSrc>1 ){. 
20390 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 53       pParent->pS
203a0 72 63 20 3d 20 70 53 72 63 20 3d 20 73 71 6c 69  rc = pSrc = sqli
203b0 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67  te3SrcListEnlarg
203c0 65 28 64 62 2c 20 70 53 72 63 2c 20 6e 53 75 62  e(db, pSrc, nSub
203d0 53 72 63 2d 31 2c 69 46 72 6f 6d 2b 31 29 3b 0a  Src-1,iFrom+1);.
203e0 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61        if( db->ma
203f0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
20400 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
20410 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
20420 2f 2a 20 54 72 61 6e 73 66 65 72 20 74 68 65 20  /* Transfer the 
20430 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
20440 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62 71 75  s from the subqu
20450 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 20  ery into the.   
20460 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 2e   ** outer query.
20470 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
20480 69 3d 30 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20  i=0; i<nSubSrc; 
20490 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
204a0 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
204b0 64 62 2c 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46  db, pSrc->a[i+iF
204c0 72 6f 6d 5d 2e 70 55 73 69 6e 67 29 3b 0a 20 20  rom].pUsing);.  
204d0 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63      assert( pSrc
204e0 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 2e 66 67 2e  ->a[i+iFrom].fg.
204f0 69 73 54 61 62 46 75 6e 63 3d 3d 30 20 29 3b 0a  isTabFunc==0 );.
20500 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b        pSrc->a[i+
20510 69 46 72 6f 6d 5d 20 3d 20 70 53 75 62 53 72 63  iFrom] = pSubSrc
20520 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 6d 65  ->a[i];.      me
20530 6d 73 65 74 28 26 70 53 75 62 53 72 63 2d 3e 61  mset(&pSubSrc->a
20540 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  [i], 0, sizeof(p
20550 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a  SubSrc->a[i]));.
20560 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63 2d 3e      }.    pSrc->
20570 61 5b 69 46 72 6f 6d 5d 2e 66 67 2e 6a 6f 69 6e  a[iFrom].fg.join
20580 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70 65 3b  type = jointype;
20590 0a 20 20 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 62  .  .    /* Now b
205a0 65 67 69 6e 20 73 75 62 73 74 69 74 75 74 69 6e  egin substitutin
205b0 67 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c  g subquery resul
205c0 74 20 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e  t set expression
205d0 73 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 72 65  s for .    ** re
205e0 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
205f0 69 50 61 72 65 6e 74 20 69 6e 20 74 68 65 20 6f  iParent in the o
20600 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 20 20  uter query..    
20610 2a 2a 20 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70  ** .    ** Examp
20620 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le:.    **.    *
20630 2a 20 20 20 53 45 4c 45 43 54 20 61 2b 35 2c 20  *   SELECT a+5, 
20640 62 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c 45 43  b*10 FROM (SELEC
20650 54 20 78 2a 33 20 41 53 20 61 2c 20 79 2b 31 30  T x*3 AS a, y+10
20660 20 41 53 20 62 20 46 52 4f 4d 20 74 31 29 20 57   AS b FROM t1) W
20670 48 45 52 45 20 61 3e 62 3b 0a 20 20 20 20 2a 2a  HERE a>b;.    **
20680 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20     \            
20690 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f           \______
206a0 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79  _______ subquery
206b0 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20   __________/    
206c0 20 20 20 20 20 20 2f 0a 20 20 20 20 2a 2a 20 20        /.    **  
206d0 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f    \_____________
206e0 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71  ________ outer q
206f0 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  uery ___________
20700 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
20710 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ___/.    **.    
20720 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65 76  ** We look at ev
20730 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ery expression i
20740 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
20750 79 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63  y and every plac
20760 65 20 77 65 20 73 65 65 0a 20 20 20 20 2a 2a 20  e we see.    ** 
20770 22 61 22 20 77 65 20 73 75 62 73 74 69 74 75 74  "a" we substitut
20780 65 20 22 78 2a 33 22 20 61 6e 64 20 65 76 65 72  e "x*3" and ever
20790 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 20 22  y place we see "
207a0 62 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65  b" we substitute
207b0 20 22 79 2b 31 30 22 2e 0a 20 20 20 20 2a 2f 0a   "y+10"..    */.
207c0 20 20 20 20 70 4c 69 73 74 20 3d 20 70 50 61 72      pList = pPar
207d0 65 6e 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20  ent->pEList;.   
207e0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
207f0 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
20800 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d        if( pList-
20810 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 29  >a[i].zName==0 )
20820 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
20830 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
20840 62 53 74 72 44 75 70 28 64 62 2c 20 70 4c 69 73  bStrDup(db, pLis
20850 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 3b 0a  t->a[i].zSpan);.
20860 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
20870 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20  equote(zName);. 
20880 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b         pList->a[
20890 69 5d 2e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65  i].zName = zName
208a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
208b0 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f      if( pSub->pO
208c0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
208d0 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
208e0 2c 20 61 6e 79 20 6e 6f 6e 2d 7a 65 72 6f 20 69  , any non-zero i
208f0 4f 72 64 65 72 42 79 43 6f 6c 20 76 61 6c 75 65  OrderByCol value
20900 73 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  s indicate that 
20910 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 4f 52 44  the.      ** ORD
20920 45 52 20 42 59 20 63 6f 6c 75 6d 6e 20 65 78 70  ER BY column exp
20930 72 65 73 73 69 6f 6e 20 69 73 20 69 64 65 6e 74  ression is ident
20940 69 63 61 6c 20 74 6f 20 74 68 65 20 69 4f 72 64  ical to the iOrd
20950 65 72 42 79 43 6f 6c 27 74 68 0a 20 20 20 20 20  erByCol'th.     
20960 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 72   ** expression r
20970 65 74 75 72 6e 65 64 20 62 79 20 53 45 4c 45 43  eturned by SELEC
20980 54 20 73 74 61 74 65 6d 65 6e 74 20 70 53 75 62  T statement pSub
20990 2e 20 53 69 6e 63 65 20 74 68 65 73 65 20 76 61  . Since these va
209a0 6c 75 65 73 0a 20 20 20 20 20 20 2a 2a 20 64 6f  lues.      ** do
209b0 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
209c0 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 63   correspond to c
209d0 6f 6c 75 6d 6e 73 20 69 6e 20 53 45 4c 45 43 54  olumns in SELECT
209e0 20 73 74 61 74 65 6d 65 6e 74 20 70 50 61 72 65   statement pPare
209f0 6e 74 2c 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72  nt,.      ** zer
20a00 6f 20 74 68 65 6d 20 62 65 66 6f 72 65 20 74 72  o them before tr
20a10 61 6e 73 66 65 72 69 6e 67 20 74 68 65 20 4f 52  ansfering the OR
20a20 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 20  DER BY clause.. 
20a30 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
20a40 20 4e 6f 74 20 64 6f 69 6e 67 20 74 68 69 73 20   Not doing this 
20a50 6d 61 79 20 63 61 75 73 65 20 61 6e 20 65 72 72  may cause an err
20a60 6f 72 20 69 66 20 61 20 73 75 62 73 65 71 75 65  or if a subseque
20a70 6e 74 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 0a  nt call to this.
20a80 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
20a90 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c  n attempts to fl
20aa0 61 74 74 65 6e 20 61 20 63 6f 6d 70 6f 75 6e 64  atten a compound
20ab0 20 73 75 62 2d 71 75 65 72 79 20 69 6e 74 6f 20   sub-query into 
20ac0 70 50 61 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a  pParent.      **
20ad0 20 28 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74   (the only way t
20ae0 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 69  his can happen i
20af0 73 20 69 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e  s if the compoun
20b00 64 20 73 75 62 2d 71 75 65 72 79 20 69 73 0a 20  d sub-query is. 
20b10 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 6c       ** currentl
20b20 79 20 70 61 72 74 20 6f 66 20 70 53 75 62 2d 3e  y part of pSub->
20b30 70 53 72 63 29 2e 20 53 65 65 20 74 69 63 6b 65  pSrc). See ticke
20b40 74 20 5b 64 31 31 61 36 65 39 30 38 66 5d 2e 20  t [d11a6e908f]. 
20b50 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69   */.      ExprLi
20b60 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70  st *pOrderBy = p
20b70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  Sub->pOrderBy;. 
20b80 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
20b90 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
20ba0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   i++){.        p
20bb0 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 75 2e  OrderBy->a[i].u.
20bc0 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20  x.iOrderByCol = 
20bd0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
20be0 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
20bf0 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b  ->pOrderBy==0 );
20c00 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
20c10 53 75 62 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  Sub->pPrior==0 )
20c20 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
20c30 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  >pOrderBy = pOrd
20c40 65 72 42 79 3b 0a 20 20 20 20 20 20 70 53 75 62  erBy;.      pSub
20c50 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
20c60 20 20 20 20 7d 0a 20 20 20 20 70 57 68 65 72 65      }.    pWhere
20c70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
20c80 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 57 68 65  p(db, pSub->pWhe
20c90 72 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  re, 0);.    if( 
20ca0 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29 7b  subqueryIsAgg ){
20cb0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
20cc0 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 3d  Parent->pHaving=
20cd0 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72  =0 );.      pPar
20ce0 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70  ent->pHaving = p
20cf0 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 3b 0a  Parent->pWhere;.
20d00 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
20d10 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a  Where = pWhere;.
20d20 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
20d30 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33  Having = sqlite3
20d40 45 78 70 72 41 6e 64 28 64 62 2c 20 0a 20 20 20  ExprAnd(db, .   
20d50 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
20d60 70 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e  prDup(db, pSub->
20d70 70 48 61 76 69 6e 67 2c 20 30 29 2c 20 70 50 61  pHaving, 0), pPa
20d80 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 0a 20 20  rent->pHaving.  
20d90 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73      );.      ass
20da0 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 47  ert( pParent->pG
20db0 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20  roupBy==0 );.   
20dc0 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f     pParent->pGro
20dd0 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  upBy = sqlite3Ex
20de0 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 53  prListDup(db, pS
20df0 75 62 2d 3e 70 47 72 6f 75 70 42 79 2c 20 30 29  ub->pGroupBy, 0)
20e00 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
20e10 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65     pParent->pWhe
20e20 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  re = sqlite3Expr
20e30 41 6e 64 28 64 62 2c 20 70 57 68 65 72 65 2c 20  And(db, pWhere, 
20e40 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 29  pParent->pWhere)
20e50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 75 62 73  ;.    }.    subs
20e60 74 53 65 6c 65 63 74 28 64 62 2c 20 70 50 61 72  tSelect(db, pPar
20e70 65 6e 74 2c 20 69 50 61 72 65 6e 74 2c 20 70 53  ent, iParent, pS
20e80 75 62 2d 3e 70 45 4c 69 73 74 2c 20 30 29 3b 0a  ub->pEList, 0);.
20e90 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6c    .    /* The fl
20ea0 61 74 74 65 6e 65 64 20 71 75 65 72 79 20 69 73  attened query is
20eb0 20 64 69 73 74 69 6e 63 74 20 69 66 20 65 69 74   distinct if eit
20ec0 68 65 72 20 74 68 65 20 69 6e 6e 65 72 20 6f 72  her the inner or
20ed0 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65   the.    ** oute
20ee0 72 20 71 75 65 72 79 20 69 73 20 64 69 73 74 69  r query is disti
20ef0 6e 63 74 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  nct. .    */.   
20f00 20 70 50 61 72 65 6e 74 2d 3e 73 65 6c 46 6c 61   pParent->selFla
20f10 67 73 20 7c 3d 20 70 53 75 62 2d 3e 73 65 6c 46  gs |= pSub->selF
20f20 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
20f30 63 74 3b 0a 20 20 0a 20 20 20 20 2f 2a 0a 20 20  ct;.  .    /*.  
20f40 20 20 2a 2a 20 53 45 4c 45 43 54 20 2e 2e 2e 20    ** SELECT ... 
20f50 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e  FROM (SELECT ...
20f60 20 4c 49 4d 49 54 20 61 20 4f 46 46 53 45 54 20   LIMIT a OFFSET 
20f70 62 29 20 4c 49 4d 49 54 20 78 20 4f 46 46 53 45  b) LIMIT x OFFSE
20f80 54 20 79 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  T y;.    **.    
20f90 2a 2a 20 4f 6e 65 20 69 73 20 74 65 6d 70 74 65  ** One is tempte
20fa0 64 20 74 6f 20 74 72 79 20 74 6f 20 61 64 64 20  d to try to add 
20fb0 61 20 61 6e 64 20 62 20 74 6f 20 63 6f 6d 62 69  a and b to combi
20fc0 6e 65 20 74 68 65 20 6c 69 6d 69 74 73 2e 20 20  ne the limits.  
20fd0 42 75 74 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  But this.    ** 
20fe0 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 69 66  does not work if
20ff0 20 65 69 74 68 65 72 20 6c 69 6d 69 74 20 69 73   either limit is
21000 20 6e 65 67 61 74 69 76 65 2e 0a 20 20 20 20 2a   negative..    *
21010 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  /.    if( pSub->
21020 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  pLimit ){.      
21030 70 50 61 72 65 6e 74 2d 3e 70 4c 69 6d 69 74 20  pParent->pLimit 
21040 3d 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a  = pSub->pLimit;.
21050 20 20 20 20 20 20 70 53 75 62 2d 3e 70 4c 69 6d        pSub->pLim
21060 69 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  it = 0;.    }.  
21070 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69 61 6c 6c 79  }..  /* Finially
21080 2c 20 64 65 6c 65 74 65 20 77 68 61 74 20 69 73  , delete what is
21090 20 6c 65 66 74 20 6f 66 20 74 68 65 20 73 75 62   left of the sub
210a0 71 75 65 72 79 20 61 6e 64 20 72 65 74 75 72 6e  query and return
210b0 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 2e 0a 20  .  ** success.. 
210c0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 65 6c   */.  sqlite3Sel
210d0 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53  ectDelete(db, pS
210e0 75 62 31 29 3b 0a 0a 23 69 66 20 53 45 4c 45 43  ub1);..#if SELEC
210f0 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  TTRACE_ENABLED. 
21100 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
21110 63 74 54 72 61 63 65 20 26 20 30 78 31 30 30 20  ctTrace & 0x100 
21120 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41  ){.    SELECTTRA
21130 43 45 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c  CE(0x100,pParse,
21140 70 2c 28 22 41 66 74 65 72 20 66 6c 61 74 74 65  p,("After flatte
21150 6e 69 6e 67 3a 5c 6e 22 29 29 3b 0a 20 20 20 20  ning:\n"));.    
21160 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53  sqlite3TreeViewS
21170 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a  elect(0, p, 0);.
21180 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65    }.#endif..  re
21190 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  turn 1;.}.#endif
211a0 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
211b0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
211c0 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
211d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
211e0 20 2a 2f 0a 0a 0a 0a 23 69 66 20 21 64 65 66 69   */....#if !defi
211f0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
21200 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65  SUBQUERY) || !de
21210 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
21220 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20 4d 61  T_VIEW)./*.** Ma
21230 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 72 65 6c  ke copies of rel
21240 65 76 61 6e 74 20 57 48 45 52 45 20 63 6c 61 75  evant WHERE clau
21250 73 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  se terms of the 
21260 6f 75 74 65 72 20 71 75 65 72 79 20 69 6e 74 6f  outer query into
21270 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c  .** the WHERE cl
21280 61 75 73 65 20 6f 66 20 73 75 62 71 75 65 72 79  ause of subquery
21290 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  .  Example:.**.*
212a0 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  *    SELECT * FR
212b0 4f 4d 20 28 53 45 4c 45 43 54 20 61 20 41 53 20  OM (SELECT a AS 
212c0 78 2c 20 63 2d 64 20 41 53 20 79 20 46 52 4f 4d  x, c-d AS y FROM
212d0 20 74 31 29 20 57 48 45 52 45 20 78 3d 35 20 41   t1) WHERE x=5 A
212e0 4e 44 20 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a 20 54  ND y=10;.**.** T
212f0 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 3a  ransformed into:
21300 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54  .**.**    SELECT
21310 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20   * FROM (SELECT 
21320 61 20 41 53 20 78 2c 20 63 2d 64 20 41 53 20 79  a AS x, c-d AS y
21330 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
21340 3d 35 20 41 4e 44 20 63 2d 64 3d 31 30 29 0a 2a  =5 AND c-d=10).*
21350 2a 20 20 20 20 20 57 48 45 52 45 20 78 3d 35 20  *     WHERE x=5 
21360 41 4e 44 20 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a 20  AND y=10;.**.** 
21370 54 68 65 20 68 6f 70 65 20 69 73 20 74 68 61 74  The hope is that
21380 20 74 68 65 20 74 65 72 6d 73 20 61 64 64 65 64   the terms added
21390 20 74 6f 20 74 68 65 20 69 6e 6e 65 72 20 71 75   to the inner qu
213a0 65 72 79 20 77 69 6c 6c 20 6d 61 6b 65 20 69 74  ery will make it
213b0 20 6d 6f 72 65 0a 2a 2a 20 65 66 66 69 63 69 65   more.** efficie
213c0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74  nt..**.** Do not
213d0 20 61 74 74 65 6d 70 74 20 74 68 69 73 20 6f 70   attempt this op
213e0 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66 3a 0a 2a  timization if:.*
213f0 2a 0a 2a 2a 20 20 20 28 31 29 20 54 68 65 20 69  *.**   (1) The i
21400 6e 6e 65 72 20 71 75 65 72 79 20 69 73 20 61 6e  nner query is an
21410 20 61 67 67 72 65 67 61 74 65 2e 20 20 28 49 6e   aggregate.  (In
21420 20 74 68 61 74 20 63 61 73 65 2c 20 77 65 27 64   that case, we'd
21430 20 72 65 61 6c 6c 79 20 77 61 6e 74 0a 2a 2a 20   really want.** 
21440 20 20 20 20 20 20 74 6f 20 63 6f 70 79 20 74 68        to copy th
21450 65 20 6f 75 74 65 72 20 57 48 45 52 45 2d 63 6c  e outer WHERE-cl
21460 61 75 73 65 20 74 65 72 6d 73 20 6f 6e 74 6f 20  ause terms onto 
21470 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73  the HAVING claus
21480 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20 20  e of the.**     
21490 20 20 69 6e 6e 65 72 20 71 75 65 72 79 2e 20 20    inner query.  
214a0 42 75 74 20 74 68 65 79 20 70 72 6f 62 61 62 6c  But they probabl
214b0 79 20 77 6f 6e 27 74 20 68 65 6c 70 20 74 68 65  y won't help the
214c0 72 65 20 73 6f 20 64 6f 20 6e 6f 74 20 62 6f 74  re so do not bot
214d0 68 65 72 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 28 32  her.).**.**   (2
214e0 29 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72  ) The inner quer
214f0 79 20 69 73 20 74 68 65 20 72 65 63 75 72 73 69  y is the recursi
21500 76 65 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d  ve part of a com
21510 6d 6f 6e 20 74 61 62 6c 65 20 65 78 70 72 65 73  mon table expres
21520 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33  sion..**.**   (3
21530 29 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72  ) The inner quer
21540 79 20 68 61 73 20 61 20 4c 49 4d 49 54 20 63 6c  y has a LIMIT cl
21550 61 75 73 65 20 28 73 69 6e 63 65 20 74 68 65 20  ause (since the 
21560 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 57  changes to the W
21570 48 45 52 45 0a 2a 2a 20 20 20 20 20 20 20 63 6c  HERE.**       cl
21580 6f 73 65 20 77 6f 75 6c 64 20 63 68 61 6e 67 65  ose would change
21590 20 74 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20   the meaning of 
215a0 74 68 65 20 4c 49 4d 49 54 29 2e 0a 2a 2a 0a 2a  the LIMIT)..**.*
215b0 2a 20 20 20 28 34 29 20 54 68 65 20 69 6e 6e 65  *   (4) The inne
215c0 72 20 71 75 65 72 79 20 69 73 20 74 68 65 20 72  r query is the r
215d0 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20  ight operand of 
215e0 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 20 20 28 54  a LEFT JOIN.  (T
215f0 68 65 20 63 61 6c 6c 65 72 0a 2a 2a 20 20 20 20  he caller.**    
21600 20 20 20 65 6e 66 6f 72 63 65 73 20 74 68 69 73     enforces this
21610 20 72 65 73 74 72 69 63 74 69 6f 6e 20 73 69 6e   restriction sin
21620 63 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ce this routine 
21630 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 65 6e  does not have en
21640 6f 75 67 68 0a 2a 2a 20 20 20 20 20 20 20 69 6e  ough.**       in
21650 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 6b 6e 6f  formation to kno
21660 77 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 28 35 29 20  w.).**.**   (5) 
21670 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
21680 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 69 67   expression orig
21690 69 6e 61 74 65 73 20 69 6e 20 74 68 65 20 4f 4e  inates in the ON
216a0 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
216b0 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20 61 20 4c  .**       of a L
216c0 45 46 54 20 4a 4f 49 4e 2e 0a 2a 2a 0a 2a 2a 20  EFT JOIN..**.** 
216d0 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 20 63  Return 0 if no c
216e0 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
216f0 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20  and non-zero if 
21700 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57 48 45 52  one or more WHER
21710 45 20 63 6c 61 75 73 65 0a 2a 2a 20 74 65 72 6d  E clause.** term
21720 73 20 61 72 65 20 64 75 70 6c 69 63 61 74 65 64  s are duplicated
21730 20 69 6e 74 6f 20 74 68 65 20 73 75 62 71 75 65   into the subque
21740 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ry..*/.static in
21750 74 20 70 75 73 68 44 6f 77 6e 57 68 65 72 65 54  t pushDownWhereT
21760 65 72 6d 73 28 0a 20 20 73 71 6c 69 74 65 33 20  erms(.  sqlite3 
21770 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  *db,          /*
21780 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
21790 6e 6e 65 63 74 69 6f 6e 20 28 66 6f 72 20 6d 61  nnection (for ma
217a0 6c 6c 6f 63 28 29 29 20 2a 2f 0a 20 20 53 65 6c  lloc()) */.  Sel
217b0 65 63 74 20 2a 70 53 75 62 71 2c 20 20 20 20 20  ect *pSubq,     
217c0 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65     /* The subque
217d0 72 79 20 77 68 6f 73 65 20 57 48 45 52 45 20 63  ry whose WHERE c
217e0 6c 61 75 73 65 20 69 73 20 74 6f 20 62 65 20 61  lause is to be a
217f0 75 67 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 45 78  ugmented */.  Ex
21800 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20  pr *pWhere,     
21810 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
21820 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f   clause of the o
21830 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20  uter query */.  
21840 69 6e 74 20 69 43 75 72 73 6f 72 20 20 20 20 20  int iCursor     
21850 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
21860 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 73 75  number of the su
21870 62 71 75 65 72 79 20 2a 2f 0a 29 7b 0a 20 20 45  bquery */.){.  E
21880 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74  xpr *pNew;.  int
21890 20 6e 43 68 6e 67 20 3d 20 30 3b 0a 20 20 53 65   nChng = 0;.  Se
218a0 6c 65 63 74 20 2a 70 58 3b 20 20 20 20 20 20 20  lect *pX;       
218b0 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
218c0 6e 67 20 6f 76 65 72 20 63 6f 6d 70 6f 75 6e 64  ng over compound
218d0 20 53 45 4c 45 43 54 73 20 69 6e 20 70 53 75 62   SELECTs in pSub
218e0 71 20 2a 2f 0a 20 20 69 66 28 20 70 57 68 65 72  q */.  if( pWher
218f0 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  e==0 ) return 0;
21900 0a 20 20 66 6f 72 28 70 58 3d 70 53 75 62 71 3b  .  for(pX=pSubq;
21910 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 50 72 69   pX; pX=pX->pPri
21920 6f 72 29 7b 0a 20 20 20 20 69 66 28 20 28 70 58  or){.    if( (pX
21930 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
21940 5f 41 67 67 72 65 67 61 74 65 7c 53 46 5f 52 65  _Aggregate|SF_Re
21950 63 75 72 73 69 76 65 29 29 21 3d 30 20 29 7b 0a  cursive))!=0 ){.
21960 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
21970 70 58 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  pX->selFlags & S
21980 46 5f 41 67 67 72 65 67 61 74 65 20 29 3b 0a 20  F_Aggregate );. 
21990 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
219a0 58 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  X->selFlags & SF
219b0 5f 52 65 63 75 72 73 69 76 65 20 29 3b 0a 20 20  _Recursive );.  
219c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58      testcase( pX
219d0 21 3d 70 53 75 62 71 20 29 3b 0a 20 20 20 20 20  !=pSubq );.     
219e0 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72 65   return 0; /* re
219f0 73 74 72 69 63 74 69 6f 6e 73 20 28 31 29 20 61  strictions (1) a
21a00 6e 64 20 28 32 29 20 2a 2f 0a 20 20 20 20 7d 0a  nd (2) */.    }.
21a10 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62 71 2d    }.  if( pSubq-
21a20 3e 70 4c 69 6d 69 74 21 3d 30 20 29 7b 0a 20 20  >pLimit!=0 ){.  
21a30 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72    return 0; /* r
21a40 65 73 74 72 69 63 74 69 6f 6e 20 28 33 29 20 2a  estriction (3) *
21a50 2f 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70  /.  }.  while( p
21a60 57 68 65 72 65 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e  Where->op==TK_AN
21a70 44 20 29 7b 0a 20 20 20 20 6e 43 68 6e 67 20 2b  D ){.    nChng +
21a80 3d 20 70 75 73 68 44 6f 77 6e 57 68 65 72 65 54  = pushDownWhereT
21a90 65 72 6d 73 28 64 62 2c 20 70 53 75 62 71 2c 20  erms(db, pSubq, 
21aa0 70 57 68 65 72 65 2d 3e 70 52 69 67 68 74 2c 20  pWhere->pRight, 
21ab0 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 70 57  iCursor);.    pW
21ac0 68 65 72 65 20 3d 20 70 57 68 65 72 65 2d 3e 70  here = pWhere->p
21ad0 4c 65 66 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Left;.  }.  if( 
21ae0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
21af0 70 57 68 65 72 65 2c 45 50 5f 46 72 6f 6d 4a 6f  pWhere,EP_FromJo
21b00 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 20  in) ) return 0; 
21b10 2f 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 20 35  /* restriction 5
21b20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
21b30 33 45 78 70 72 49 73 54 61 62 6c 65 43 6f 6e 73  3ExprIsTableCons
21b40 74 61 6e 74 28 70 57 68 65 72 65 2c 20 69 43 75  tant(pWhere, iCu
21b50 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 6e 43 68  rsor) ){.    nCh
21b60 6e 67 2b 2b 3b 0a 20 20 20 20 77 68 69 6c 65 28  ng++;.    while(
21b70 20 70 53 75 62 71 20 29 7b 0a 20 20 20 20 20 20   pSubq ){.      
21b80 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
21b90 70 72 44 75 70 28 64 62 2c 20 70 57 68 65 72 65  prDup(db, pWhere
21ba0 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  , 0);.      pNew
21bb0 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c   = substExpr(db,
21bc0 20 70 4e 65 77 2c 20 69 43 75 72 73 6f 72 2c 20   pNew, iCursor, 
21bd0 70 53 75 62 71 2d 3e 70 45 4c 69 73 74 29 3b 0a  pSubq->pEList);.
21be0 20 20 20 20 20 20 70 53 75 62 71 2d 3e 70 57 68        pSubq->pWh
21bf0 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
21c00 72 41 6e 64 28 64 62 2c 20 70 53 75 62 71 2d 3e  rAnd(db, pSubq->
21c10 70 57 68 65 72 65 2c 20 70 4e 65 77 29 3b 0a 20  pWhere, pNew);. 
21c20 20 20 20 20 20 70 53 75 62 71 20 3d 20 70 53 75       pSubq = pSu
21c30 62 71 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20  bq->pPrior;.    
21c40 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  }.  }.  return n
21c50 43 68 6e 67 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  Chng;.}.#endif /
21c60 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
21c70 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
21c80 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
21c90 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a  ITE_OMIT_VIEW) *
21ca0 2f 0a 0a 2f 2a 0a 2a 2a 20 42 61 73 65 64 20 6f  /../*.** Based o
21cb0 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  n the contents o
21cc0 66 20 74 68 65 20 41 67 67 49 6e 66 6f 20 73 74  f the AggInfo st
21cd0 72 75 63 74 75 72 65 20 69 6e 64 69 63 61 74 65  ructure indicate
21ce0 64 20 62 79 20 74 68 65 20 66 69 72 73 74 0a 2a  d by the first.*
21cf0 2a 20 61 72 67 75 6d 65 6e 74 2c 20 74 68 69 73  * argument, this
21d00 20 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73   function checks
21d10 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   if the followin
21d20 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a  g are true:.**.*
21d30 2a 20 20 20 20 2a 20 74 68 65 20 71 75 65 72 79  *    * the query
21d40 20 63 6f 6e 74 61 69 6e 73 20 6a 75 73 74 20 61   contains just a
21d50 20 73 69 6e 67 6c 65 20 61 67 67 72 65 67 61 74   single aggregat
21d60 65 20 66 75 6e 63 74 69 6f 6e 2c 0a 2a 2a 20 20  e function,.**  
21d70 20 20 2a 20 74 68 65 20 61 67 67 72 65 67 61 74    * the aggregat
21d80 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 65 69  e function is ei
21d90 74 68 65 72 20 6d 69 6e 28 29 20 6f 72 20 6d 61  ther min() or ma
21da0 78 28 29 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 2a  x(), and.**    *
21db0 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f   the argument to
21dc0 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 66   the aggregate f
21dd0 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 63 6f 6c  unction is a col
21de0 75 6d 6e 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a  umn value..**.**
21df0 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 61   If all of the a
21e00 62 6f 76 65 20 61 72 65 20 74 72 75 65 2c 20 74  bove are true, t
21e10 68 65 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42  hen WHERE_ORDERB
21e20 59 5f 4d 49 4e 20 6f 72 20 57 48 45 52 45 5f 4f  Y_MIN or WHERE_O
21e30 52 44 45 52 42 59 5f 4d 41 58 0a 2a 2a 20 69 73  RDERBY_MAX.** is
21e40 20 72 65 74 75 72 6e 65 64 20 61 73 20 61 70 70   returned as app
21e50 72 6f 70 72 69 61 74 65 2e 20 41 6c 73 6f 2c 20  ropriate. Also, 
21e60 2a 70 70 4d 69 6e 4d 61 78 20 69 73 20 73 65 74  *ppMinMax is set
21e70 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
21e80 20 0a 2a 2a 20 6c 69 73 74 20 6f 66 20 61 72 67   .** list of arg
21e90 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f  uments passed to
21ea0 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 62   the aggregate b
21eb0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
21ec0 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68  .**.** Or, if th
21ed0 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f  e conditions abo
21ee0 76 65 20 61 72 65 20 6e 6f 74 20 6d 65 74 2c 20  ve are not met, 
21ef0 2a 70 70 4d 69 6e 4d 61 78 20 69 73 20 73 65 74  *ppMinMax is set
21f00 20 74 6f 20 30 20 61 6e 64 0a 2a 2a 20 57 48 45   to 0 and.** WHE
21f10 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41  RE_ORDERBY_NORMA
21f20 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  L is returned..*
21f30 2f 0a 73 74 61 74 69 63 20 75 38 20 6d 69 6e 4d  /.static u8 minM
21f40 61 78 51 75 65 72 79 28 41 67 67 49 6e 66 6f 20  axQuery(AggInfo 
21f50 2a 70 41 67 67 49 6e 66 6f 2c 20 45 78 70 72 4c  *pAggInfo, ExprL
21f60 69 73 74 20 2a 2a 70 70 4d 69 6e 4d 61 78 29 7b  ist **ppMinMax){
21f70 0a 20 20 69 6e 74 20 65 52 65 74 20 3d 20 57 48  .  int eRet = WH
21f80 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d  ERE_ORDERBY_NORM
21f90 41 4c 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  AL;          /* 
21fa0 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a  Return value */.
21fb0 0a 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 30  .  *ppMinMax = 0
21fc0 3b 0a 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f  ;.  if( pAggInfo
21fd0 2d 3e 6e 46 75 6e 63 3d 3d 31 20 29 7b 0a 20 20  ->nFunc==1 ){.  
21fe0 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
21ff0 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
22000 30 5d 2e 70 45 78 70 72 3b 20 2f 2a 20 41 67 67  0].pExpr; /* Agg
22010 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20  regate function 
22020 2a 2f 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  */.    ExprList 
22030 2a 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d  *pEList = pExpr-
22040 3e 78 2e 70 4c 69 73 74 3b 20 20 20 20 20 20 2f  >x.pList;      /
22050 2a 20 41 72 67 75 6d 65 6e 74 73 20 74 6f 20 61  * Arguments to a
22060 67 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a  gg function */..
22070 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
22080 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55  r->op==TK_AGG_FU
22090 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 69 66  NCTION );.    if
220a0 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69  ( pEList && pELi
220b0 73 74 2d 3e 6e 45 78 70 72 3d 3d 31 20 26 26 20  st->nExpr==1 && 
220c0 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
220d0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43  pr->op==TK_AGG_C
220e0 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 63  OLUMN ){.      c
220f0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63  onst char *zFunc
22100 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b   = pExpr->u.zTok
22110 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  en;.      if( sq
22120 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 46 75  lite3StrICmp(zFu
22130 6e 63 2c 20 22 6d 69 6e 22 29 3d 3d 30 20 29 7b  nc, "min")==0 ){
22140 0a 20 20 20 20 20 20 20 20 65 52 65 74 20 3d 20  .        eRet = 
22150 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
22160 4e 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 4d 69  N;.        *ppMi
22170 6e 4d 61 78 20 3d 20 70 45 4c 69 73 74 3b 0a 20  nMax = pEList;. 
22180 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
22190 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 46  qlite3StrICmp(zF
221a0 75 6e 63 2c 20 22 6d 61 78 22 29 3d 3d 30 20 29  unc, "max")==0 )
221b0 7b 0a 20 20 20 20 20 20 20 20 65 52 65 74 20 3d  {.        eRet =
221c0 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d   WHERE_ORDERBY_M
221d0 41 58 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 4d  AX;.        *ppM
221e0 69 6e 4d 61 78 20 3d 20 70 45 4c 69 73 74 3b 0a  inMax = pEList;.
221f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
22200 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 70  }..  assert( *pp
22210 4d 69 6e 4d 61 78 3d 3d 30 20 7c 7c 20 28 2a 70  MinMax==0 || (*p
22220 70 4d 69 6e 4d 61 78 29 2d 3e 6e 45 78 70 72 3d  pMinMax)->nExpr=
22230 3d 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 65  =1 );.  return e
22240 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  Ret;.}../*.** Th
22250 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  e select stateme
22260 6e 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  nt passed as the
22270 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
22280 69 73 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  is an aggregate 
22290 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 65  query..** The se
222a0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
222b0 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
222c0 61 67 67 72 65 67 61 74 65 2d 69 6e 66 6f 20 6f  aggregate-info o
222d0 62 6a 65 63 74 2e 20 54 68 69 73 20 0a 2a 2a 20  bject. This .** 
222e0 66 75 6e 63 74 69 6f 6e 20 74 65 73 74 73 20 69  function tests i
222f0 66 20 74 68 65 20 53 45 4c 45 43 54 20 69 73 20  f the SELECT is 
22300 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a  of the form:.**.
22310 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e  **   SELECT coun
22320 74 28 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a  t(*) FROM <tbl>.
22330 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61 62 6c  **.** where tabl
22340 65 20 69 73 20 61 20 64 61 74 61 62 61 73 65 20  e is a database 
22350 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20 73 75 62  table, not a sub
22360 2d 73 65 6c 65 63 74 20 6f 72 20 76 69 65 77 2e  -select or view.
22370 20 49 66 20 74 68 65 20 71 75 65 72 79 0a 2a 2a   If the query.**
22380 20 64 6f 65 73 20 6d 61 74 63 68 20 74 68 69 73   does match this
22390 20 70 61 74 74 65 72 6e 2c 20 74 68 65 6e 20 61   pattern, then a
223a0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
223b0 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 72 65 70  Table object rep
223c0 72 65 73 65 6e 74 69 6e 67 0a 2a 2a 20 3c 74 62  resenting.** <tb
223d0 6c 3e 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  l> is returned. 
223e0 4f 74 68 65 72 77 69 73 65 2c 20 30 20 69 73 20  Otherwise, 0 is 
223f0 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
22400 74 69 63 20 54 61 62 6c 65 20 2a 69 73 53 69 6d  tic Table *isSim
22410 70 6c 65 43 6f 75 6e 74 28 53 65 6c 65 63 74 20  pleCount(Select 
22420 2a 70 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67  *p, AggInfo *pAg
22430 67 49 6e 66 6f 29 7b 0a 20 20 54 61 62 6c 65 20  gInfo){.  Table 
22440 2a 70 54 61 62 3b 0a 20 20 45 78 70 72 20 2a 70  *pTab;.  Expr *p
22450 45 78 70 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  Expr;..  assert(
22460 20 21 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 3b   !p->pGroupBy );
22470 0a 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72  ..  if( p->pWher
22480 65 20 7c 7c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  e || p->pEList->
22490 6e 45 78 70 72 21 3d 31 20 0a 20 20 20 7c 7c 20  nExpr!=1 .   || 
224a0 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31  p->pSrc->nSrc!=1
224b0 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30   || p->pSrc->a[0
224c0 5d 2e 70 53 65 6c 65 63 74 0a 20 20 29 7b 0a 20  ].pSelect.  ){. 
224d0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
224e0 0a 20 20 70 54 61 62 20 3d 20 70 2d 3e 70 53 72  .  pTab = p->pSr
224f0 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20  c->a[0].pTab;.  
22500 70 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73  pExpr = p->pELis
22510 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
22520 20 61 73 73 65 72 74 28 20 70 54 61 62 20 26 26   assert( pTab &&
22530 20 21 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20   !pTab->pSelect 
22540 26 26 20 70 45 78 70 72 20 29 3b 0a 0a 20 20 69  && pExpr );..  i
22550 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
22560 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  b) ) return 0;. 
22570 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
22580 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
22590 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
225a0 28 20 4e 45 56 45 52 28 70 41 67 67 49 6e 66 6f  ( NEVER(pAggInfo
225b0 2d 3e 6e 46 75 6e 63 3d 3d 30 29 20 29 20 72 65  ->nFunc==0) ) re
225c0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70  turn 0;.  if( (p
225d0 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30  AggInfo->aFunc[0
225e0 5d 2e 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61  ].pFunc->funcFla
225f0 67 73 26 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43  gs&SQLITE_FUNC_C
22600 4f 55 4e 54 29 3d 3d 30 20 29 20 72 65 74 75 72  OUNT)==0 ) retur
22610 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72  n 0;.  if( pExpr
22620 2d 3e 66 6c 61 67 73 26 45 50 5f 44 69 73 74 69  ->flags&EP_Disti
22630 6e 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  nct ) return 0;.
22640 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a  .  return pTab;.
22650 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
22660 73 6f 75 72 63 65 2d 6c 69 73 74 20 69 74 65 6d  source-list item
22670 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72   passed as an ar
22680 67 75 6d 65 6e 74 20 77 61 73 20 61 75 67 6d 65  gument was augme
22690 6e 74 65 64 20 77 69 74 68 20 61 6e 0a 2a 2a 20  nted with an.** 
226a0 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
226b0 65 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 20 6c  e, then try to l
226c0 6f 63 61 74 65 20 74 68 65 20 73 70 65 63 69 66  ocate the specif
226d0 69 65 64 20 69 6e 64 65 78 2e 20 49 66 20 74 68  ied index. If th
226e0 65 72 65 0a 2a 2a 20 77 61 73 20 73 75 63 68 20  ere.** was such 
226f0 61 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65  a clause and the
22700 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 63 61 6e   named index can
22710 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2c 20 72 65  not be found, re
22720 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  turn .** SQLITE_
22730 45 52 52 4f 52 20 61 6e 64 20 6c 65 61 76 65 20  ERROR and leave 
22740 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72  an error in pPar
22750 73 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 70  se. Otherwise, p
22760 6f 70 75 6c 61 74 65 20 0a 2a 2a 20 70 46 72 6f  opulate .** pFro
22770 6d 2d 3e 70 49 6e 64 65 78 20 61 6e 64 20 72 65  m->pIndex and re
22780 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
22790 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e  */.int sqlite3In
227a0 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28 50 61  dexedByLookup(Pa
227b0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72  rse *pParse, str
227c0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
227d0 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20   *pFrom){.  if( 
227e0 70 46 72 6f 6d 2d 3e 70 54 61 62 20 26 26 20 70  pFrom->pTab && p
227f0 46 72 6f 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78  From->fg.isIndex
22800 65 64 42 79 20 29 7b 0a 20 20 20 20 54 61 62 6c  edBy ){.    Tabl
22810 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d  e *pTab = pFrom-
22820 3e 70 54 61 62 3b 0a 20 20 20 20 63 68 61 72 20  >pTab;.    char 
22830 2a 7a 49 6e 64 65 78 65 64 42 79 20 3d 20 70 46  *zIndexedBy = pF
22840 72 6f 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64  rom->u1.zIndexed
22850 42 79 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70  By;.    Index *p
22860 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64  Idx;.    for(pId
22870 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
22880 0a 20 20 20 20 20 20 20 20 70 49 64 78 20 26 26  .        pIdx &&
22890 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
228a0 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 49 6e  pIdx->zName, zIn
228b0 64 65 78 65 64 42 79 29 3b 20 0a 20 20 20 20 20  dexedBy); .     
228c0 20 20 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e     pIdx=pIdx->pN
228d0 65 78 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  ext.    );.    i
228e0 66 28 20 21 70 49 64 78 20 29 7b 0a 20 20 20 20  f( !pIdx ){.    
228f0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
22900 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75  g(pParse, "no su
22910 63 68 20 69 6e 64 65 78 3a 20 25 73 22 2c 20 7a  ch index: %s", z
22920 49 6e 64 65 78 65 64 42 79 2c 20 30 29 3b 0a 20  IndexedBy, 0);. 
22930 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65       pParse->che
22940 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20  ckSchema = 1;.  
22950 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
22960 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  E_ERROR;.    }. 
22970 20 20 20 70 46 72 6f 6d 2d 3e 70 49 42 49 6e 64     pFrom->pIBInd
22980 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 7d 0a 20  ex = pIdx;.  }. 
22990 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
229a0 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 44 65 74 65 63  K;.}./*.** Detec
229b0 74 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  t compound SELEC
229c0 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61  T statements tha
229d0 74 20 75 73 65 20 61 6e 20 4f 52 44 45 52 20 42  t use an ORDER B
229e0 59 20 63 6c 61 75 73 65 20 77 69 74 68 20 0a 2a  Y clause with .*
229f0 2a 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65  * an alternative
22a00 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
22a10 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45  nce..**.**    SE
22a20 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31  LECT ... FROM t1
22a30 20 45 58 43 45 50 54 20 53 45 4c 45 43 54 20 2e   EXCEPT SELECT .
22a40 2e 2e 20 46 52 4f 4d 20 74 32 20 4f 52 44 45 52  .. FROM t2 ORDER
22a50 20 42 59 20 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e   BY .. COLLATE .
22a60 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 61  ...**.** These a
22a70 72 65 20 72 65 77 72 69 74 74 65 6e 20 61 73 20  re rewritten as 
22a80 61 20 73 75 62 71 75 65 72 79 3a 0a 2a 2a 0a 2a  a subquery:.**.*
22a90 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  *    SELECT * FR
22aa0 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 46  OM (SELECT ... F
22ab0 52 4f 4d 20 74 31 20 45 58 43 45 50 54 20 53 45  ROM t1 EXCEPT SE
22ac0 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 32  LECT ... FROM t2
22ad0 29 0a 2a 2a 20 20 20 20 20 4f 52 44 45 52 20 42  ).**     ORDER B
22ae0 59 20 2e 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e  Y ... COLLATE ..
22af0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 74 72 61  ..**.** This tra
22b00 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e  nsformation is n
22b10 65 63 65 73 73 61 72 79 20 62 65 63 61 75 73 65  ecessary because
22b20 20 74 68 65 20 6d 75 6c 74 69 53 65 6c 65 63 74   the multiSelect
22b30 4f 72 64 65 72 42 79 28 29 20 72 6f 75 74 69 6e  OrderBy() routin
22b40 65 0a 2a 2a 20 61 62 6f 76 65 20 74 68 61 74 20  e.** above that 
22b50 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f  generates the co
22b60 64 65 20 66 6f 72 20 61 20 63 6f 6d 70 6f 75 6e  de for a compoun
22b70 64 20 53 45 4c 45 43 54 20 77 69 74 68 20 61 6e  d SELECT with an
22b80 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
22b90 0a 2a 2a 20 75 73 65 73 20 61 20 6d 65 72 67 65  .** uses a merge
22ba0 20 61 6c 67 6f 72 69 74 68 6d 20 74 68 61 74 20   algorithm that 
22bb0 72 65 71 75 69 72 65 73 20 74 68 65 20 73 61 6d  requires the sam
22bc0 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
22bd0 65 6e 63 65 20 6f 6e 20 74 68 65 0a 2a 2a 20 72  ence on the.** r
22be0 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 61 73  esult columns as
22bf0 20 6f 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   on the ORDER BY
22c00 20 63 6c 61 75 73 65 2e 20 20 53 65 65 20 74 69   clause.  See ti
22c10 63 6b 65 74 0a 2a 2a 20 68 74 74 70 3a 2f 2f 77  cket.** http://w
22c20 77 77 2e 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72  ww.sqlite.org/sr
22c30 63 2f 69 6e 66 6f 2f 36 37 30 39 35 37 34 64 32  c/info/6709574d2
22c40 61 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 74 72 61  a.**.** This tra
22c50 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6f  nsformation is o
22c60 6e 6c 79 20 6e 65 65 64 65 64 20 66 6f 72 20 45  nly needed for E
22c70 58 43 45 50 54 2c 20 49 4e 54 45 52 53 45 43 54  XCEPT, INTERSECT
22c80 2c 20 61 6e 64 20 55 4e 49 4f 4e 2e 0a 2a 2a 20  , and UNION..** 
22c90 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70  The UNION ALL op
22ca0 65 72 61 74 6f 72 20 77 6f 72 6b 73 20 66 69 6e  erator works fin
22cb0 65 20 77 69 74 68 20 6d 75 6c 74 69 53 65 6c 65  e with multiSele
22cc0 63 74 4f 72 64 65 72 42 79 28 29 20 65 76 65 6e  ctOrderBy() even
22cd0 20 77 68 65 6e 0a 2a 2a 20 74 68 65 72 65 20 61   when.** there a
22ce0 72 65 20 43 4f 4c 4c 41 54 45 20 74 65 72 6d 73  re COLLATE terms
22cf0 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   in the ORDER BY
22d00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
22d10 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53  convertCompoundS
22d20 65 6c 65 63 74 54 6f 53 75 62 71 75 65 72 79 28  electToSubquery(
22d30 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
22d40 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69   Select *p){.  i
22d50 6e 74 20 69 3b 0a 20 20 53 65 6c 65 63 74 20 2a  nt i;.  Select *
22d60 70 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74 20 2a  pNew;.  Select *
22d70 70 58 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  pX;.  sqlite3 *d
22d80 62 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  b;.  struct Expr
22d90 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20  List_item *a;.  
22da0 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 53 72 63  SrcList *pNewSrc
22db0 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  ;.  Parse *pPars
22dc0 65 3b 0a 20 20 54 6f 6b 65 6e 20 64 75 6d 6d 79  e;.  Token dummy
22dd0 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  ;..  if( p->pPri
22de0 6f 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57  or==0 ) return W
22df0 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69  RC_Continue;.  i
22e00 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  f( p->pOrderBy==
22e10 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43  0 ) return WRC_C
22e20 6f 6e 74 69 6e 75 65 3b 0a 20 20 66 6f 72 28 70  ontinue;.  for(p
22e30 58 3d 70 3b 20 70 58 20 26 26 20 28 70 58 2d 3e  X=p; pX && (pX->
22e40 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 58  op==TK_ALL || pX
22e50 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 29  ->op==TK_SELECT)
22e60 3b 20 70 58 3d 70 58 2d 3e 70 50 72 69 6f 72 29  ; pX=pX->pPrior)
22e70 7b 7d 0a 20 20 69 66 28 20 70 58 3d 3d 30 20 29  {}.  if( pX==0 )
22e80 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
22e90 69 6e 75 65 3b 0a 20 20 61 20 3d 20 70 2d 3e 70  inue;.  a = p->p
22ea0 4f 72 64 65 72 42 79 2d 3e 61 3b 0a 20 20 66 6f  OrderBy->a;.  fo
22eb0 72 28 69 3d 70 2d 3e 70 4f 72 64 65 72 42 79 2d  r(i=p->pOrderBy-
22ec0 3e 6e 45 78 70 72 2d 31 3b 20 69 3e 3d 30 3b 20  >nExpr-1; i>=0; 
22ed0 69 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20 61 5b  i--){.    if( a[
22ee0 69 5d 2e 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  i].pExpr->flags 
22ef0 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 20 62  & EP_Collate ) b
22f00 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  reak;.  }.  if( 
22f10 69 3c 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  i<0 ) return WRC
22f20 5f 43 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 2f 2a  _Continue;..  /*
22f30 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
22f40 73 20 70 6f 69 6e 74 2c 20 74 68 61 74 20 6d 65  s point, that me
22f50 61 6e 73 20 74 68 65 20 74 72 61 6e 73 66 6f 72  ans the transfor
22f60 6d 61 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72  mation is requir
22f70 65 64 2e 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65  ed. */..  pParse
22f80 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72   = pWalker->pPar
22f90 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73  se;.  db = pPars
22fa0 65 2d 3e 64 62 3b 0a 20 20 70 4e 65 77 20 3d 20  e->db;.  pNew = 
22fb0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
22fc0 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  ero(db, sizeof(*
22fd0 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70  pNew) );.  if( p
22fe0 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
22ff0 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 6d 65 6d  WRC_Abort;.  mem
23000 73 65 74 28 26 64 75 6d 6d 79 2c 20 30 2c 20 73  set(&dummy, 0, s
23010 69 7a 65 6f 66 28 64 75 6d 6d 79 29 29 3b 0a 20  izeof(dummy));. 
23020 20 70 4e 65 77 53 72 63 20 3d 20 73 71 6c 69 74   pNewSrc = sqlit
23030 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 46  e3SrcListAppendF
23040 72 6f 6d 54 65 72 6d 28 70 50 61 72 73 65 2c 30  romTerm(pParse,0
23050 2c 30 2c 30 2c 26 64 75 6d 6d 79 2c 70 4e 65 77  ,0,0,&dummy,pNew
23060 2c 30 2c 30 29 3b 0a 20 20 69 66 28 20 70 4e 65  ,0,0);.  if( pNe
23070 77 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e  wSrc==0 ) return
23080 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 2a 70   WRC_Abort;.  *p
23090 4e 65 77 20 3d 20 2a 70 3b 0a 20 20 70 2d 3e 70  New = *p;.  p->p
230a0 53 72 63 20 3d 20 70 4e 65 77 53 72 63 3b 0a 20  Src = pNewSrc;. 
230b0 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c   p->pEList = sql
230c0 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
230d0 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 73 71  nd(pParse, 0, sq
230e0 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b  lite3Expr(db, TK
230f0 5f 41 53 54 45 52 49 53 4b 2c 20 30 29 29 3b 0a  _ASTERISK, 0));.
23100 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c    p->op = TK_SEL
23110 45 43 54 3b 0a 20 20 70 2d 3e 70 57 68 65 72 65  ECT;.  p->pWhere
23120 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 47   = 0;.  pNew->pG
23130 72 6f 75 70 42 79 20 3d 20 30 3b 0a 20 20 70 4e  roupBy = 0;.  pN
23140 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 30 3b  ew->pHaving = 0;
23150 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42  .  pNew->pOrderB
23160 79 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 50 72 69  y = 0;.  p->pPri
23170 6f 72 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 4e 65  or = 0;.  p->pNe
23180 78 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 57 69  xt = 0;.  p->pWi
23190 74 68 20 3d 20 30 3b 0a 20 20 70 2d 3e 73 65 6c  th = 0;.  p->sel
231a0 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 43 6f 6d  Flags &= ~SF_Com
231b0 70 6f 75 6e 64 3b 0a 20 20 61 73 73 65 72 74 28  pound;.  assert(
231c0 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
231d0 53 46 5f 43 6f 6e 76 65 72 74 65 64 29 3d 3d 30  SF_Converted)==0
231e0 20 29 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67   );.  p->selFlag
231f0 73 20 7c 3d 20 53 46 5f 43 6f 6e 76 65 72 74 65  s |= SF_Converte
23200 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65  d;.  assert( pNe
23210 77 2d 3e 70 50 72 69 6f 72 21 3d 30 20 29 3b 0a  w->pPrior!=0 );.
23220 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 2d 3e    pNew->pPrior->
23230 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20  pNext = pNew;.  
23240 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 30  pNew->pLimit = 0
23250 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65  ;.  pNew->pOffse
23260 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  t = 0;.  return 
23270 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
23280 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
23290 73 65 65 20 69 66 20 74 68 65 20 46 52 4f 4d 20  see if the FROM 
232a0 63 6c 61 75 73 65 20 74 65 72 6d 20 70 46 72 6f  clause term pFro
232b0 6d 20 68 61 73 20 74 61 62 6c 65 2d 76 61 6c 75  m has table-valu
232c0 65 64 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61  ed function.** a
232d0 72 67 75 6d 65 6e 74 73 2e 20 20 49 66 20 69 74  rguments.  If it
232e0 20 64 6f 65 73 2c 20 6c 65 61 76 65 20 61 6e 20   does, leave an 
232f0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
23300 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75   pParse and retu
23310 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  rn.** non-zero, 
23320 73 69 6e 63 65 20 70 46 72 6f 6d 20 69 73 20 6e  since pFrom is n
23330 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65  ot allowed to be
23340 20 61 20 74 61 62 6c 65 2d 76 61 6c 75 65 64 20   a table-valued 
23350 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
23360 74 69 63 20 69 6e 74 20 63 61 6e 6e 6f 74 42 65  tic int cannotBe
23370 46 75 6e 63 74 69 6f 6e 28 50 61 72 73 65 20 2a  Function(Parse *
23380 70 50 61 72 73 65 2c 20 73 74 72 75 63 74 20 53  pParse, struct S
23390 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72  rcList_item *pFr
233a0 6f 6d 29 7b 0a 20 20 69 66 28 20 70 46 72 6f 6d  om){.  if( pFrom
233b0 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 20 29  ->fg.isTabFunc )
233c0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
233d0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 27  orMsg(pParse, "'
233e0 25 73 27 20 69 73 20 6e 6f 74 20 61 20 66 75 6e  %s' is not a fun
233f0 63 74 69 6f 6e 22 2c 20 70 46 72 6f 6d 2d 3e 7a  ction", pFrom->z
23400 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Name);.    retur
23410 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
23420 6e 20 30 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  n 0;.}..#ifndef 
23430 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
23440 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70  /*.** Argument p
23450 57 69 74 68 20 28 77 68 69 63 68 20 6d 61 79 20  With (which may 
23460 62 65 20 4e 55 4c 4c 29 20 70 6f 69 6e 74 73 20  be NULL) points 
23470 74 6f 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74  to a linked list
23480 20 6f 66 20 6e 65 73 74 65 64 20 0a 2a 2a 20 57   of nested .** W
23490 49 54 48 20 63 6f 6e 74 65 78 74 73 2c 20 66 72  ITH contexts, fr
234a0 6f 6d 20 69 6e 6e 65 72 20 74 6f 20 6f 75 74 65  om inner to oute
234b0 72 6d 6f 73 74 2e 20 49 66 20 74 68 65 20 74 61  rmost. If the ta
234c0 62 6c 65 20 69 64 65 6e 74 69 66 69 65 64 20 62  ble identified b
234d0 79 20 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73  y .** FROM claus
234e0 65 20 65 6c 65 6d 65 6e 74 20 70 49 74 65 6d 20  e element pItem 
234f0 69 73 20 72 65 61 6c 6c 79 20 61 20 63 6f 6d 6d  is really a comm
23500 6f 6e 2d 74 61 62 6c 65 2d 65 78 70 72 65 73 73  on-table-express
23510 69 6f 6e 20 28 43 54 45 29 20 0a 2a 2a 20 74 68  ion (CTE) .** th
23520 65 6e 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  en return a poin
23530 74 65 72 20 74 6f 20 74 68 65 20 43 54 45 20 64  ter to the CTE d
23540 65 66 69 6e 69 74 69 6f 6e 20 66 6f 72 20 74 68  efinition for th
23550 61 74 20 74 61 62 6c 65 2e 20 4f 74 68 65 72 77  at table. Otherw
23560 69 73 65 0a 2a 2a 20 72 65 74 75 72 6e 20 4e 55  ise.** return NU
23570 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6e  LL..**.** If a n
23580 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69 73  on-NULL value is
23590 20 72 65 74 75 72 6e 65 64 2c 20 73 65 74 20 2a   returned, set *
235a0 70 70 43 6f 6e 74 65 78 74 20 74 6f 20 70 6f 69  ppContext to poi
235b0 6e 74 20 74 6f 20 74 68 65 20 57 69 74 68 0a 2a  nt to the With.*
235c0 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20 74 68  * object that th
235d0 65 20 72 65 74 75 72 6e 65 64 20 43 54 45 20 62  e returned CTE b
235e0 65 6c 6f 6e 67 73 20 74 6f 2e 0a 2a 2f 0a 73 74  elongs to..*/.st
235f0 61 74 69 63 20 73 74 72 75 63 74 20 43 74 65 20  atic struct Cte 
23600 2a 73 65 61 72 63 68 57 69 74 68 28 0a 20 20 57  *searchWith(.  W
23610 69 74 68 20 2a 70 57 69 74 68 2c 20 20 20 20 20  ith *pWith,     
23620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23630 2a 20 43 75 72 72 65 6e 74 20 69 6e 6e 65 72 6d  * Current innerm
23640 6f 73 74 20 57 49 54 48 20 63 6c 61 75 73 65 20  ost WITH clause 
23650 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
23660 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c  ist_item *pItem,
23670 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61       /* FROM cla
23680 75 73 65 20 65 6c 65 6d 65 6e 74 20 74 6f 20 72  use element to r
23690 65 73 6f 6c 76 65 20 2a 2f 0a 20 20 57 69 74 68  esolve */.  With
236a0 20 2a 2a 70 70 43 6f 6e 74 65 78 74 20 20 20 20   **ppContext    
236b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
236c0 55 54 3a 20 57 49 54 48 20 63 6c 61 75 73 65 20  UT: WITH clause 
236d0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 62 65 6c  return value bel
236e0 6f 6e 67 73 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20  ongs to */.){.  
236f0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
23700 65 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 2d 3e  e;.  if( pItem->
23710 7a 44 61 74 61 62 61 73 65 3d 3d 30 20 26 26 20  zDatabase==0 && 
23720 28 7a 4e 61 6d 65 20 3d 20 70 49 74 65 6d 2d 3e  (zName = pItem->
23730 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20  zName)!=0 ){.   
23740 20 57 69 74 68 20 2a 70 3b 0a 20 20 20 20 66 6f   With *p;.    fo
23750 72 28 70 3d 70 57 69 74 68 3b 20 70 3b 20 70 3d  r(p=pWith; p; p=
23760 70 2d 3e 70 4f 75 74 65 72 29 7b 0a 20 20 20 20  p->pOuter){.    
23770 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66    int i;.      f
23780 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 74  or(i=0; i<p->nCt
23790 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  e; i++){.       
237a0 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
237b0 43 6d 70 28 7a 4e 61 6d 65 2c 20 70 2d 3e 61 5b  Cmp(zName, p->a[
237c0 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  i].zName)==0 ){.
237d0 20 20 20 20 20 20 20 20 20 20 2a 70 70 43 6f 6e            *ppCon
237e0 74 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  text = p;.      
237f0 20 20 20 20 72 65 74 75 72 6e 20 26 70 2d 3e 61      return &p->a
23800 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  [i];.        }. 
23810 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
23820 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
23830 2f 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65  /* The code gene
23840 72 61 74 6f 72 20 6d 61 69 6e 74 61 69 6e 73 20  rator maintains 
23850 61 20 73 74 61 63 6b 20 6f 66 20 61 63 74 69 76  a stack of activ
23860 65 20 57 49 54 48 20 63 6c 61 75 73 65 73 0a 2a  e WITH clauses.*
23870 2a 20 77 69 74 68 20 74 68 65 20 69 6e 6e 65 72  * with the inner
23880 2d 6d 6f 73 74 20 57 49 54 48 20 63 6c 61 75 73  -most WITH claus
23890 65 20 62 65 69 6e 67 20 61 74 20 74 68 65 20 74  e being at the t
238a0 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e  op of the stack.
238b0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
238c0 69 6e 65 20 70 75 73 68 65 73 20 74 68 65 20 57  ine pushes the W
238d0 49 54 48 20 63 6c 61 75 73 65 20 70 61 73 73 65  ITH clause passe
238e0 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
238f0 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 6f 6e 74 6f  argument.** onto
23900 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20   the top of the 
23910 73 74 61 63 6b 2e 20 49 66 20 61 72 67 75 6d 65  stack. If argume
23920 6e 74 20 62 46 72 65 65 20 69 73 20 74 72 75 65  nt bFree is true
23930 2c 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20 57  , then this.** W
23940 49 54 48 20 63 6c 61 75 73 65 20 77 69 6c 6c 20  ITH clause will 
23950 6e 65 76 65 72 20 62 65 20 70 6f 70 70 65 64 20  never be popped 
23960 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e 20  from the stack. 
23970 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 0a  In this case it.
23980 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 66 72 65  ** should be fre
23990 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68  ed along with th
239a0 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 2e 20  e Parse object. 
239b0 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20  In other cases, 
239c0 77 68 65 6e 0a 2a 2a 20 62 46 72 65 65 3d 3d 30  when.** bFree==0
239d0 2c 20 74 68 65 20 57 69 74 68 20 6f 62 6a 65 63  , the With objec
239e0 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20  t will be freed 
239f0 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 53  along with the S
23a00 45 4c 45 43 54 20 0a 2a 2a 20 73 74 61 74 65 6d  ELECT .** statem
23a10 65 6e 74 20 77 69 74 68 20 77 68 69 63 68 20 69  ent with which i
23a20 74 20 69 73 20 61 73 73 6f 63 69 61 74 65 64 2e  t is associated.
23a30 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
23a40 57 69 74 68 50 75 73 68 28 50 61 72 73 65 20 2a  WithPush(Parse *
23a50 70 50 61 72 73 65 2c 20 57 69 74 68 20 2a 70 57  pParse, With *pW
23a60 69 74 68 2c 20 75 38 20 62 46 72 65 65 29 7b 0a  ith, u8 bFree){.
23a70 20 20 61 73 73 65 72 74 28 20 62 46 72 65 65 3d    assert( bFree=
23a80 3d 30 20 7c 7c 20 28 70 50 61 72 73 65 2d 3e 70  =0 || (pParse->p
23a90 57 69 74 68 3d 3d 30 20 26 26 20 70 50 61 72 73  With==0 && pPars
23aa0 65 2d 3e 70 57 69 74 68 54 6f 46 72 65 65 3d 3d  e->pWithToFree==
23ab0 30 29 20 29 3b 0a 20 20 69 66 28 20 70 57 69 74  0) );.  if( pWit
23ac0 68 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  h ){.    assert(
23ad0 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 21 3d   pParse->pWith!=
23ae0 70 57 69 74 68 20 29 3b 0a 20 20 20 20 70 57 69  pWith );.    pWi
23af0 74 68 2d 3e 70 4f 75 74 65 72 20 3d 20 70 50 61  th->pOuter = pPa
23b00 72 73 65 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20  rse->pWith;.    
23b10 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20  pParse->pWith = 
23b20 70 57 69 74 68 3b 0a 20 20 20 20 69 66 28 20 62  pWith;.    if( b
23b30 46 72 65 65 20 29 20 70 50 61 72 73 65 2d 3e 70  Free ) pParse->p
23b40 57 69 74 68 54 6f 46 72 65 65 20 3d 20 70 57 69  WithToFree = pWi
23b50 74 68 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  th;.  }.}../*.**
23b60 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
23b70 68 65 63 6b 73 20 69 66 20 61 72 67 75 6d 65 6e  hecks if argumen
23b80 74 20 70 46 72 6f 6d 20 72 65 66 65 72 73 20 74  t pFrom refers t
23b90 6f 20 61 20 43 54 45 20 64 65 63 6c 61 72 65 64  o a CTE declared
23ba0 20 62 79 20 0a 2a 2a 20 61 20 57 49 54 48 20 63   by .** a WITH c
23bb0 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 73 74 61  lause on the sta
23bc0 63 6b 20 63 75 72 72 65 6e 74 6c 79 20 6d 61 69  ck currently mai
23bd0 6e 74 61 69 6e 65 64 20 62 79 20 74 68 65 20 70  ntained by the p
23be0 61 72 73 65 72 2e 20 41 6e 64 2c 0a 2a 2a 20 69  arser. And,.** i
23bf0 66 20 63 75 72 72 65 6e 74 6c 79 20 70 72 6f 63  f currently proc
23c00 65 73 73 69 6e 67 20 61 20 43 54 45 20 65 78 70  essing a CTE exp
23c10 72 65 73 73 69 6f 6e 2c 20 69 66 20 69 74 20 69  ression, if it i
23c20 73 20 61 20 72 65 63 75 72 73 69 76 65 0a 2a 2a  s a recursive.**
23c30 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
23c40 65 20 63 75 72 72 65 6e 74 20 43 54 45 2e 0a 2a  e current CTE..*
23c50 2a 0a 2a 2a 20 49 66 20 70 46 72 6f 6d 20 66 61  *.** If pFrom fa
23c60 6c 6c 73 20 69 6e 74 6f 20 65 69 74 68 65 72 20  lls into either 
23c70 6f 66 20 74 68 65 20 74 77 6f 20 63 61 74 65 67  of the two categ
23c80 6f 72 69 65 73 20 61 62 6f 76 65 2c 20 70 46 72  ories above, pFr
23c90 6f 6d 2d 3e 70 54 61 62 0a 2a 2a 20 61 6e 64 20  om->pTab.** and 
23ca0 6f 74 68 65 72 20 66 69 65 6c 64 73 20 61 72 65  other fields are
23cb0 20 70 6f 70 75 6c 61 74 65 64 20 61 63 63 6f 72   populated accor
23cc0 64 69 6e 67 6c 79 2e 20 54 68 65 20 63 61 6c 6c  dingly. The call
23cd0 65 72 20 73 68 6f 75 6c 64 20 63 68 65 63 6b 0a  er should check.
23ce0 2a 2a 20 28 70 46 72 6f 6d 2d 3e 70 54 61 62 21  ** (pFrom->pTab!
23cf0 3d 30 29 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  =0) to determine
23d00 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
23d10 61 20 73 75 63 63 65 73 73 66 75 6c 20 6d 61 74  a successful mat
23d20 63 68 0a 2a 2a 20 77 61 73 20 66 6f 75 6e 64 2e  ch.** was found.
23d30 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f  .**.** Whether o
23d40 72 20 6e 6f 74 20 61 20 6d 61 74 63 68 20 69 73  r not a match is
23d50 20 66 6f 75 6e 64 2c 20 53 51 4c 49 54 45 5f 4f   found, SQLITE_O
23d60 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
23d70 20 6e 6f 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63   no error.** occ
23d80 75 72 73 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  urs. If an error
23d90 20 64 6f 65 73 20 6f 63 63 75 72 2c 20 61 6e 20   does occur, an 
23da0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
23db0 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 0a 2a   stored in the.*
23dc0 2a 20 70 61 72 73 65 72 20 61 6e 64 20 73 6f 6d  * parser and som
23dd0 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68  e error code oth
23de0 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f  er than SQLITE_O
23df0 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  K returned..*/.s
23e00 74 61 74 69 63 20 69 6e 74 20 77 69 74 68 45 78  tatic int withEx
23e10 70 61 6e 64 28 0a 20 20 57 61 6c 6b 65 72 20 2a  pand(.  Walker *
23e20 70 57 61 6c 6b 65 72 2c 20 0a 20 20 73 74 72 75  pWalker, .  stru
23e30 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
23e40 2a 70 46 72 6f 6d 0a 29 7b 0a 20 20 50 61 72 73  *pFrom.){.  Pars
23e50 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c  e *pParse = pWal
23e60 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 73  ker->pParse;.  s
23e70 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
23e80 72 73 65 2d 3e 64 62 3b 0a 20 20 73 74 72 75 63  rse->db;.  struc
23e90 74 20 43 74 65 20 2a 70 43 74 65 3b 20 20 20 20  t Cte *pCte;    
23ea0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
23eb0 74 63 68 65 64 20 43 54 45 20 28 6f 72 20 4e 55  tched CTE (or NU
23ec0 4c 4c 20 69 66 20 6e 6f 20 6d 61 74 63 68 29 20  LL if no match) 
23ed0 2a 2f 0a 20 20 57 69 74 68 20 2a 70 57 69 74 68  */.  With *pWith
23ee0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
23ef0 20 20 20 20 20 2f 2a 20 57 49 54 48 20 63 6c 61       /* WITH cla
23f00 75 73 65 20 74 68 61 74 20 70 43 74 65 20 62 65  use that pCte be
23f10 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20 20 61  longs to */..  a
23f20 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54  ssert( pFrom->pT
23f30 61 62 3d 3d 30 20 29 3b 0a 0a 20 20 70 43 74 65  ab==0 );..  pCte
23f40 20 3d 20 73 65 61 72 63 68 57 69 74 68 28 70 50   = searchWith(pP
23f50 61 72 73 65 2d 3e 70 57 69 74 68 2c 20 70 46 72  arse->pWith, pFr
23f60 6f 6d 2c 20 26 70 57 69 74 68 29 3b 0a 20 20 69  om, &pWith);.  i
23f70 66 28 20 70 43 74 65 20 29 7b 0a 20 20 20 20 54  f( pCte ){.    T
23f80 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
23f90 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
23fa0 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53  ;.    Select *pS
23fb0 65 6c 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a  el;.    Select *
23fc0 70 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20 20  pLeft;          
23fd0 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 2d 6d 6f        /* Left-mo
23fe0 73 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  st SELECT statem
23ff0 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62  ent */.    int b
24000 4d 61 79 52 65 63 75 72 73 69 76 65 3b 20 20 20  MayRecursive;   
24010 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
24020 20 69 66 20 63 6f 6d 70 6f 75 6e 64 20 6a 6f 69   if compound joi
24030 6e 65 64 20 62 79 20 55 4e 49 4f 4e 20 5b 41 4c  ned by UNION [AL
24040 4c 5d 20 2a 2f 0a 20 20 20 20 57 69 74 68 20 2a  L] */.    With *
24050 70 53 61 76 65 64 57 69 74 68 3b 20 20 20 20 20  pSavedWith;     
24060 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69          /* Initi
24070 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 50 61 72  al value of pPar
24080 73 65 2d 3e 70 57 69 74 68 20 2a 2f 0a 0a 20 20  se->pWith */..  
24090 20 20 2f 2a 20 49 66 20 70 43 74 65 2d 3e 7a 43    /* If pCte->zC
240a0 74 65 45 72 72 20 69 73 20 6e 6f 6e 2d 4e 55 4c  teErr is non-NUL
240b0 4c 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  L at this point,
240c0 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 61 6e   then this is an
240d0 20 69 6c 6c 65 67 61 6c 0a 20 20 20 20 2a 2a 20   illegal.    ** 
240e0 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65  recursive refere
240f0 6e 63 65 20 74 6f 20 43 54 45 20 70 43 74 65 2e  nce to CTE pCte.
24100 20 4c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   Leave an error 
24110 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65  in pParse and re
24120 74 75 72 6e 0a 20 20 20 20 2a 2a 20 65 61 72 6c  turn.    ** earl
24130 79 2e 20 49 66 20 70 43 74 65 2d 3e 7a 43 74 65  y. If pCte->zCte
24140 45 72 72 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  Err is NULL, the
24150 6e 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20  n this is not a 
24160 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65  recursive refere
24170 6e 63 65 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74  nce..    ** In t
24180 68 69 73 20 63 61 73 65 2c 20 70 72 6f 63 65 65  his case, procee
24190 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  d.  */.    if( p
241a0 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 29 7b 0a  Cte->zCteErr ){.
241b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
241c0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 70 43  orMsg(pParse, pC
241d0 74 65 2d 3e 7a 43 74 65 45 72 72 2c 20 70 43 74  te->zCteErr, pCt
241e0 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  e->zName);.     
241f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
24200 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
24210 69 66 28 20 63 61 6e 6e 6f 74 42 65 46 75 6e 63  if( cannotBeFunc
24220 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 46 72  tion(pParse, pFr
24230 6f 6d 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  om) ) return SQL
24240 49 54 45 5f 45 52 52 4f 52 3b 0a 0a 20 20 20 20  ITE_ERROR;..    
24250 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
24260 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 70 46  Tab==0 );.    pF
24270 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62  rom->pTab = pTab
24280 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
24290 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
242a0 66 28 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 69  f(Table));.    i
242b0 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74  f( pTab==0 ) ret
242c0 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
242d0 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20     pTab->nRef = 
242e0 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61  1;.    pTab->zNa
242f0 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
24300 72 44 75 70 28 64 62 2c 20 70 43 74 65 2d 3e 7a  rDup(db, pCte->z
24310 4e 61 6d 65 29 3b 0a 20 20 20 20 70 54 61 62 2d  Name);.    pTab-
24320 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20  >iPKey = -1;.   
24330 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73   pTab->nRowLogEs
24340 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28  t = 200; assert(
24350 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67   200==sqlite3Log
24360 45 73 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a  Est(1048576) );.
24370 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61      pTab->tabFla
24380 67 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65 72  gs |= TF_Ephemer
24390 61 6c 20 7c 20 54 46 5f 4e 6f 56 69 73 69 62 6c  al | TF_NoVisibl
243a0 65 52 6f 77 69 64 3b 0a 20 20 20 20 70 46 72 6f  eRowid;.    pFro
243b0 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  m->pSelect = sql
243c0 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
243d0 2c 20 70 43 74 65 2d 3e 70 53 65 6c 65 63 74 2c  , pCte->pSelect,
243e0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d   0);.    if( db-
243f0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
24400 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
24410 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73  MEM_BKPT;.    as
24420 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65  sert( pFrom->pSe
24430 6c 65 63 74 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  lect );..    /* 
24440 43 68 65 63 6b 20 69 66 20 74 68 69 73 20 69 73  Check if this is
24450 20 61 20 72 65 63 75 72 73 69 76 65 20 43 54 45   a recursive CTE
24460 2e 20 2a 2f 0a 20 20 20 20 70 53 65 6c 20 3d 20  . */.    pSel = 
24470 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a  pFrom->pSelect;.
24480 20 20 20 20 62 4d 61 79 52 65 63 75 72 73 69 76      bMayRecursiv
24490 65 20 3d 20 28 20 70 53 65 6c 2d 3e 6f 70 3d 3d  e = ( pSel->op==
244a0 54 4b 5f 41 4c 4c 20 7c 7c 20 70 53 65 6c 2d 3e  TK_ALL || pSel->
244b0 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a  op==TK_UNION );.
244c0 20 20 20 20 69 66 28 20 62 4d 61 79 52 65 63 75      if( bMayRecu
244d0 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 69  rsive ){.      i
244e0 6e 74 20 69 3b 0a 20 20 20 20 20 20 53 72 63 4c  nt i;.      SrcL
244f0 69 73 74 20 2a 70 53 72 63 20 3d 20 70 46 72 6f  ist *pSrc = pFro
24500 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72 63  m->pSelect->pSrc
24510 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
24520 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69   i<pSrc->nSrc; i
24530 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72  ++){.        str
24540 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
24550 20 2a 70 49 74 65 6d 20 3d 20 26 70 53 72 63 2d   *pItem = &pSrc-
24560 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69  >a[i];.        i
24570 66 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62  f( pItem->zDatab
24580 61 73 65 3d 3d 30 20 0a 20 20 20 20 20 20 20 20  ase==0 .        
24590 20 26 26 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65   && pItem->zName
245a0 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20 26 26  !=0 .         &&
245b0 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43   0==sqlite3StrIC
245c0 6d 70 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c  mp(pItem->zName,
245d0 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 0a 20 20   pCte->zName).  
245e0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
245f0 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62       pItem->pTab
24600 20 3d 20 70 54 61 62 3b 0a 20 20 20 20 20 20 20   = pTab;.       
24610 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 52     pItem->fg.isR
24620 65 63 75 72 73 69 76 65 20 3d 20 31 3b 0a 20 20  ecursive = 1;.  
24630 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52          pTab->nR
24640 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ef++;.          
24650 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 7c  pSel->selFlags |
24660 3d 20 53 46 5f 52 65 63 75 72 73 69 76 65 3b 0a  = SF_Recursive;.
24670 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
24680 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
24690 4f 6e 6c 79 20 6f 6e 65 20 72 65 63 75 72 73 69  Only one recursi
246a0 76 65 20 72 65 66 65 72 65 6e 63 65 20 69 73 20  ve reference is 
246b0 70 65 72 6d 69 74 74 65 64 2e 20 2a 2f 20 0a 20  permitted. */ . 
246c0 20 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 52 65     if( pTab->nRe
246d0 66 3e 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  f>2 ){.      sql
246e0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 0a 20 20  ite3ErrorMsg(.  
246f0 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20          pParse, 
24700 22 6d 75 6c 74 69 70 6c 65 20 72 65 66 65 72 65  "multiple refere
24710 6e 63 65 73 20 74 6f 20 72 65 63 75 72 73 69 76  nces to recursiv
24720 65 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 70 43  e table: %s", pC
24730 74 65 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20  te->zName.      
24740 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
24750 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
24760 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
24770 70 54 61 62 2d 3e 6e 52 65 66 3d 3d 31 20 7c 7c  pTab->nRef==1 ||
24780 20 28 28 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67   ((pSel->selFlag
24790 73 26 53 46 5f 52 65 63 75 72 73 69 76 65 29 20  s&SF_Recursive) 
247a0 26 26 20 70 54 61 62 2d 3e 6e 52 65 66 3d 3d 32  && pTab->nRef==2
247b0 20 29 29 3b 0a 0a 20 20 20 20 70 43 74 65 2d 3e   ));..    pCte->
247c0 7a 43 74 65 45 72 72 20 3d 20 22 63 69 72 63 75  zCteErr = "circu
247d0 6c 61 72 20 72 65 66 65 72 65 6e 63 65 3a 20 25  lar reference: %
247e0 73 22 3b 0a 20 20 20 20 70 53 61 76 65 64 57 69  s";.    pSavedWi
247f0 74 68 20 3d 20 70 50 61 72 73 65 2d 3e 70 57 69  th = pParse->pWi
24800 74 68 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  th;.    pParse->
24810 70 57 69 74 68 20 3d 20 70 57 69 74 68 3b 0a 20  pWith = pWith;. 
24820 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65     sqlite3WalkSe
24830 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 62 4d  lect(pWalker, bM
24840 61 79 52 65 63 75 72 73 69 76 65 20 3f 20 70 53  ayRecursive ? pS
24850 65 6c 2d 3e 70 50 72 69 6f 72 20 3a 20 70 53 65  el->pPrior : pSe
24860 6c 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  l);.    pParse->
24870 70 57 69 74 68 20 3d 20 70 57 69 74 68 3b 0a 0a  pWith = pWith;..
24880 20 20 20 20 66 6f 72 28 70 4c 65 66 74 3d 70 53      for(pLeft=pS
24890 65 6c 3b 20 70 4c 65 66 74 2d 3e 70 50 72 69 6f  el; pLeft->pPrio
248a0 72 3b 20 70 4c 65 66 74 3d 70 4c 65 66 74 2d 3e  r; pLeft=pLeft->
248b0 70 50 72 69 6f 72 29 3b 0a 20 20 20 20 70 45 4c  pPrior);.    pEL
248c0 69 73 74 20 3d 20 70 4c 65 66 74 2d 3e 70 45 4c  ist = pLeft->pEL
248d0 69 73 74 3b 0a 20 20 20 20 69 66 28 20 70 43 74  ist;.    if( pCt
248e0 65 2d 3e 70 43 6f 6c 73 20 29 7b 0a 20 20 20 20  e->pCols ){.    
248f0 20 20 69 66 28 20 70 45 4c 69 73 74 20 26 26 20    if( pEList && 
24900 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70  pEList->nExpr!=p
24910 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78 70  Cte->pCols->nExp
24920 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  r ){.        sql
24930 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
24940 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 68  rse, "table %s h
24950 61 73 20 25 64 20 76 61 6c 75 65 73 20 66 6f 72  as %d values for
24960 20 25 64 20 63 6f 6c 75 6d 6e 73 22 2c 0a 20 20   %d columns",.  
24970 20 20 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e            pCte->
24980 7a 4e 61 6d 65 2c 20 70 45 4c 69 73 74 2d 3e 6e  zName, pEList->n
24990 45 78 70 72 2c 20 70 43 74 65 2d 3e 70 43 6f 6c  Expr, pCte->pCol
249a0 73 2d 3e 6e 45 78 70 72 0a 20 20 20 20 20 20 20  s->nExpr.       
249b0 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72   );.        pPar
249c0 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 53 61 76  se->pWith = pSav
249d0 65 64 57 69 74 68 3b 0a 20 20 20 20 20 20 20 20  edWith;.        
249e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
249f0 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
24a00 20 20 20 70 45 4c 69 73 74 20 3d 20 70 43 74 65     pEList = pCte
24a10 2d 3e 70 43 6f 6c 73 3b 0a 20 20 20 20 7d 0a 0a  ->pCols;.    }..
24a20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d      sqlite3Colum
24a30 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  nsFromExprList(p
24a40 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2c 20 26  Parse, pEList, &
24a50 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61  pTab->nCol, &pTa
24a60 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 69 66  b->aCol);.    if
24a70 28 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 20  ( bMayRecursive 
24a80 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 53 65  ){.      if( pSe
24a90 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  l->selFlags & SF
24aa0 5f 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20  _Recursive ){.  
24ab0 20 20 20 20 20 20 70 43 74 65 2d 3e 7a 43 74 65        pCte->zCte
24ac0 45 72 72 20 3d 20 22 6d 75 6c 74 69 70 6c 65 20  Err = "multiple 
24ad0 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65  recursive refere
24ae0 6e 63 65 73 3a 20 25 73 22 3b 0a 20 20 20 20 20  nces: %s";.     
24af0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
24b00 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20  pCte->zCteErr = 
24b10 22 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72  "recursive refer
24b20 65 6e 63 65 20 69 6e 20 61 20 73 75 62 71 75 65  ence in a subque
24b30 72 79 3a 20 25 73 22 3b 0a 20 20 20 20 20 20 7d  ry: %s";.      }
24b40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61  .      sqlite3Wa
24b50 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72  lkSelect(pWalker
24b60 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 7d 0a 20  , pSel);.    }. 
24b70 20 20 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72     pCte->zCteErr
24b80 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 72 73 65   = 0;.    pParse
24b90 2d 3e 70 57 69 74 68 20 3d 20 70 53 61 76 65 64  ->pWith = pSaved
24ba0 57 69 74 68 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  With;.  }..  ret
24bb0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
24bc0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
24bd0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45   SQLITE_OMIT_CTE
24be0 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53 45  ./*.** If the SE
24bf0 4c 45 43 54 20 70 61 73 73 65 64 20 61 73 20 74  LECT passed as t
24c00 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
24c10 6e 74 20 68 61 73 20 61 6e 20 61 73 73 6f 63 69  nt has an associ
24c20 61 74 65 64 20 57 49 54 48 20 0a 2a 2a 20 63 6c  ated WITH .** cl
24c30 61 75 73 65 2c 20 70 6f 70 20 69 74 20 66 72 6f  ause, pop it fro
24c40 6d 20 74 68 65 20 73 74 61 63 6b 20 73 74 6f 72  m the stack stor
24c50 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  ed as part of th
24c60 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 2e 0a  e Parse object..
24c70 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
24c80 69 6f 6e 20 69 73 20 75 73 65 64 20 61 73 20 74  ion is used as t
24c90 68 65 20 78 53 65 6c 65 63 74 43 61 6c 6c 62 61  he xSelectCallba
24ca0 63 6b 32 28 29 20 63 61 6c 6c 62 61 63 6b 20 62  ck2() callback b
24cb0 79 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65  y.** sqlite3Sele
24cc0 63 74 45 78 70 61 6e 64 28 29 20 77 68 65 6e 20  ctExpand() when 
24cd0 77 61 6c 6b 69 6e 67 20 61 20 53 45 4c 45 43 54  walking a SELECT
24ce0 20 74 72 65 65 20 74 6f 20 72 65 73 6f 6c 76 65   tree to resolve
24cf0 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20   table.** names 
24d00 61 6e 64 20 6f 74 68 65 72 20 46 52 4f 4d 20 63  and other FROM c
24d10 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 73 2e 20  lause elements. 
24d20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
24d30 73 65 6c 65 63 74 50 6f 70 57 69 74 68 28 57 61  selectPopWith(Wa
24d40 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53  lker *pWalker, S
24d50 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72  elect *p){.  Par
24d60 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61  se *pParse = pWa
24d70 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20  lker->pParse;.  
24d80 57 69 74 68 20 2a 70 57 69 74 68 20 3d 20 66 69  With *pWith = fi
24d90 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e  ndRightmost(p)->
24da0 70 57 69 74 68 3b 0a 20 20 69 66 28 20 70 57 69  pWith;.  if( pWi
24db0 74 68 21 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  th!=0 ){.    ass
24dc0 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 57 69  ert( pParse->pWi
24dd0 74 68 3d 3d 70 57 69 74 68 20 29 3b 0a 20 20 20  th==pWith );.   
24de0 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d   pParse->pWith =
24df0 20 70 57 69 74 68 2d 3e 70 4f 75 74 65 72 3b 0a   pWith->pOuter;.
24e00 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66    }.}.#else.#def
24e10 69 6e 65 20 73 65 6c 65 63 74 50 6f 70 57 69 74  ine selectPopWit
24e20 68 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  h 0.#endif../*.*
24e30 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
24e40 73 20 61 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62  s a Walker callb
24e50 61 63 6b 20 66 6f 72 20 22 65 78 70 61 6e 64 69  ack for "expandi
24e60 6e 67 22 20 61 20 53 45 4c 45 43 54 20 73 74 61  ng" a SELECT sta
24e70 74 65 6d 65 6e 74 2e 0a 2a 2a 20 22 45 78 70 61  tement..** "Expa
24e80 6e 64 69 6e 67 22 20 6d 65 61 6e 73 20 74 6f 20  nding" means to 
24e90 64 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  do the following
24ea0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20  :.**.**    (1)  
24eb0 4d 61 6b 65 20 73 75 72 65 20 56 44 42 45 20 63  Make sure VDBE c
24ec0 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61  ursor numbers ha
24ed0 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64  ve been assigned
24ee0 20 74 6f 20 65 76 65 72 79 0a 2a 2a 20 20 20 20   to every.**    
24ef0 20 20 20 20 20 65 6c 65 6d 65 6e 74 20 6f 66 20       element of 
24f00 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
24f10 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 46  .**.**    (2)  F
24f20 69 6c 6c 20 69 6e 20 74 68 65 20 70 54 61 62 4c  ill in the pTabL
24f30 69 73 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69  ist->a[].pTab fi
24f40 65 6c 64 73 20 69 6e 20 74 68 65 20 53 72 63 4c  elds in the SrcL
24f50 69 73 74 20 74 68 61 74 20 0a 2a 2a 20 20 20 20  ist that .**    
24f60 20 20 20 20 20 64 65 66 69 6e 65 73 20 46 52 4f       defines FRO
24f70 4d 20 63 6c 61 75 73 65 2e 20 20 57 68 65 6e 20  M clause.  When 
24f80 76 69 65 77 73 20 61 70 70 65 61 72 20 69 6e 20  views appear in 
24f90 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c  the FROM clause,
24fa0 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 69 6c 6c  .**         fill
24fb0 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70   pTabList->a[].p
24fc0 53 65 6c 65 63 74 20 77 69 74 68 20 61 20 63 6f  Select with a co
24fd0 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  py of the SELECT
24fe0 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20   statement.**   
24ff0 20 20 20 20 20 20 74 68 61 74 20 69 6d 70 6c 65        that imple
25000 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77 2e 20  ments the view. 
25010 20 41 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20   A copy is made 
25020 6f 66 20 74 68 65 20 76 69 65 77 27 73 20 53 45  of the view's SE
25030 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20  LECT.**         
25040 73 74 61 74 65 6d 65 6e 74 20 73 6f 20 74 68 61  statement so tha
25050 74 20 77 65 20 63 61 6e 20 66 72 65 65 6c 79 20  t we can freely 
25060 6d 6f 64 69 66 79 20 6f 72 20 64 65 6c 65 74 65  modify or delete
25070 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74 0a   that statement.
25080 2a 2a 20 20 20 20 20 20 20 20 20 77 69 74 68 6f  **         witho
25090 75 74 20 77 6f 72 72 79 69 6e 67 20 61 62 6f 75  ut worrying abou
250a0 74 20 6d 65 73 73 69 6e 67 20 75 70 20 74 68 65  t messing up the
250b0 20 70 65 72 73 69 73 74 65 6e 74 20 72 65 70 72   persistent repr
250c0 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20 20  esentation.**   
250d0 20 20 20 20 20 20 6f 66 20 74 68 65 20 76 69 65        of the vie
250e0 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20  w..**.**    (3) 
250f0 20 41 64 64 20 74 65 72 6d 73 20 74 6f 20 74 68   Add terms to th
25100 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
25110 6f 20 61 63 63 6f 6d 6d 6f 64 61 74 65 20 74 68  o accommodate th
25120 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72  e NATURAL keywor
25130 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e 20  d.**         on 
25140 6a 6f 69 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e  joins and the ON
25150 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
25160 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a  e of joins..**.*
25170 2a 20 20 20 20 28 34 29 20 20 53 63 61 6e 20 74  *    (4)  Scan t
25180 68 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d  he list of colum
25190 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ns in the result
251a0 20 73 65 74 20 28 70 45 4c 69 73 74 29 20 6c 6f   set (pEList) lo
251b0 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20  oking.**        
251c0 20 66 6f 72 20 69 6e 73 74 61 6e 63 65 73 20 6f   for instances o
251d0 66 20 74 68 65 20 22 2a 22 20 6f 70 65 72 61 74  f the "*" operat
251e0 6f 72 20 6f 72 20 74 68 65 20 54 41 42 4c 45 2e  or or the TABLE.
251f0 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20  * operator..**  
25200 20 20 20 20 20 20 20 49 66 20 66 6f 75 6e 64 2c         If found,
25210 20 65 78 70 61 6e 64 20 65 61 63 68 20 22 2a 22   expand each "*"
25220 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c   to be every col
25230 75 6d 6e 20 69 6e 20 65 76 65 72 79 20 74 61 62  umn in every tab
25240 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 6e  le.**         an
25250 64 20 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20  d TABLE.* to be 
25260 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20  every column in 
25270 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61  TABLE..**.*/.sta
25280 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 45 78  tic int selectEx
25290 70 61 6e 64 65 72 28 57 61 6c 6b 65 72 20 2a 70  pander(Walker *p
252a0 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a  Walker, Select *
252b0 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  p){.  Parse *pPa
252c0 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70  rse = pWalker->p
252d0 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 2c 20  Parse;.  int i, 
252e0 6a 2c 20 6b 3b 0a 20 20 53 72 63 4c 69 73 74 20  j, k;.  SrcList 
252f0 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 45 78 70  *pTabList;.  Exp
25300 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20  rList *pEList;. 
25310 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
25320 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20 73  item *pFrom;.  s
25330 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
25340 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20  rse->db;.  Expr 
25350 2a 70 45 2c 20 2a 70 52 69 67 68 74 2c 20 2a 70  *pE, *pRight, *p
25360 45 78 70 72 3b 0a 20 20 75 31 36 20 73 65 6c 46  Expr;.  u16 selF
25370 6c 61 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61  lags = p->selFla
25380 67 73 3b 0a 0a 20 20 70 2d 3e 73 65 6c 46 6c 61  gs;..  p->selFla
25390 67 73 20 7c 3d 20 53 46 5f 45 78 70 61 6e 64 65  gs |= SF_Expande
253a0 64 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  d;.  if( db->mal
253b0 6c 6f 63 46 61 69 6c 65 64 20 20 29 7b 0a 20 20  locFailed  ){.  
253c0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
253d0 72 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4e 45  rt;.  }.  if( NE
253e0 56 45 52 28 70 2d 3e 70 53 72 63 3d 3d 30 29 20  VER(p->pSrc==0) 
253f0 7c 7c 20 28 73 65 6c 46 6c 61 67 73 20 26 20 53  || (selFlags & S
25400 46 5f 45 78 70 61 6e 64 65 64 29 21 3d 30 20 29  F_Expanded)!=0 )
25410 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  {.    return WRC
25420 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 70 54  _Prune;.  }.  pT
25430 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63  abList = p->pSrc
25440 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e  ;.  pEList = p->
25450 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 57  pEList;.  if( pW
25460 61 6c 6b 65 72 2d 3e 78 53 65 6c 65 63 74 43 61  alker->xSelectCa
25470 6c 6c 62 61 63 6b 32 3d 3d 73 65 6c 65 63 74 50  llback2==selectP
25480 6f 70 57 69 74 68 20 29 7b 0a 20 20 20 20 73 71  opWith ){.    sq
25490 6c 69 74 65 33 57 69 74 68 50 75 73 68 28 70 50  lite3WithPush(pP
254a0 61 72 73 65 2c 20 66 69 6e 64 52 69 67 68 74 6d  arse, findRightm
254b0 6f 73 74 28 70 29 2d 3e 70 57 69 74 68 2c 20 30  ost(p)->pWith, 0
254c0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  );.  }..  /* Mak
254d0 65 20 73 75 72 65 20 63 75 72 73 6f 72 20 6e 75  e sure cursor nu
254e0 6d 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20  mbers have been 
254f0 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20  assigned to all 
25500 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a 2a 20  entries in.  ** 
25510 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
25520 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  of the SELECT st
25530 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20  atement..  */.  
25540 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73  sqlite3SrcListAs
25550 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72  signCursors(pPar
25560 73 65 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a 0a  se, pTabList);..
25570 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65    /* Look up eve
25580 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 69  ry table named i
25590 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
255a0 65 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e  e of the select.
255b0 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e 74    If.  ** an ent
255c0 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  ry of the FROM c
255d0 6c 61 75 73 65 20 69 73 20 61 20 73 75 62 71 75  lause is a subqu
255e0 65 72 79 20 69 6e 73 74 65 61 64 20 6f 66 20 61  ery instead of a
255f0 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2c 0a   table or view,.
25600 20 20 2a 2a 20 74 68 65 6e 20 63 72 65 61 74 65    ** then create
25610 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62   a transient tab
25620 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  le structure to 
25630 64 65 73 63 72 69 62 65 20 74 68 65 20 73 75 62  describe the sub
25640 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f  query..  */.  fo
25650 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61  r(i=0, pFrom=pTa
25660 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62  bList->a; i<pTab
25670 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
25680 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54   pFrom++){.    T
25690 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
256a0 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 66  assert( pFrom->f
256b0 67 2e 69 73 52 65 63 75 72 73 69 76 65 3d 3d 30  g.isRecursive==0
256c0 20 7c 7c 20 70 46 72 6f 6d 2d 3e 70 54 61 62 21   || pFrom->pTab!
256d0 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 46  =0 );.    if( pF
256e0 72 6f 6d 2d 3e 66 67 2e 69 73 52 65 63 75 72 73  rom->fg.isRecurs
256f0 69 76 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ive ) continue;.
25700 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
25710 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 23 69  m->pTab==0 );.#i
25720 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
25730 54 5f 43 54 45 0a 20 20 20 20 69 66 28 20 77 69  T_CTE.    if( wi
25740 74 68 45 78 70 61 6e 64 28 70 57 61 6c 6b 65 72  thExpand(pWalker
25750 2c 20 70 46 72 6f 6d 29 20 29 20 72 65 74 75 72  , pFrom) ) retur
25760 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
25770 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62   if( pFrom->pTab
25780 20 29 20 7b 7d 20 65 6c 73 65 0a 23 65 6e 64 69   ) {} else.#endi
25790 66 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d  f.    if( pFrom-
257a0 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69 66  >zName==0 ){.#if
257b0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
257c0 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 20 20  _SUBQUERY.      
257d0 53 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70  Select *pSel = p
257e0 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  From->pSelect;. 
257f0 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75       /* A sub-qu
25800 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ery in the FROM 
25810 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45  clause of a SELE
25820 43 54 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  CT */.      asse
25830 72 74 28 20 70 53 65 6c 21 3d 30 20 29 3b 0a 20  rt( pSel!=0 );. 
25840 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72       assert( pFr
25850 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20  om->pTab==0 );. 
25860 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
25870 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b  WalkSelect(pWalk
25880 65 72 2c 20 70 53 65 6c 29 20 29 20 72 65 74 75  er, pSel) ) retu
25890 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
258a0 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20      pFrom->pTab 
258b0 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33  = pTab = sqlite3
258c0 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
258d0 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b   sizeof(Table));
258e0 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d  .      if( pTab=
258f0 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
25900 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 70 54 61  Abort;.      pTa
25910 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  b->nRef = 1;.   
25920 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d     pTab->zName =
25930 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
25940 64 62 2c 20 22 73 71 6c 69 74 65 5f 73 71 5f 25  db, "sqlite_sq_%
25950 70 22 2c 20 28 76 6f 69 64 2a 29 70 54 61 62 29  p", (void*)pTab)
25960 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70  ;.      while( p
25970 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29 7b 20 70  Sel->pPrior ){ p
25980 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69  Sel = pSel->pPri
25990 6f 72 3b 20 7d 0a 20 20 20 20 20 20 73 71 6c 69  or; }.      sqli
259a0 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78  te3ColumnsFromEx
259b0 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
259c0 53 65 6c 2d 3e 70 45 4c 69 73 74 2c 26 70 54 61  Sel->pEList,&pTa
259d0 62 2d 3e 6e 43 6f 6c 2c 26 70 54 61 62 2d 3e 61  b->nCol,&pTab->a
259e0 43 6f 6c 29 3b 0a 20 20 20 20 20 20 70 54 61 62  Col);.      pTab
259f0 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20  ->iPKey = -1;.  
25a00 20 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f      pTab->nRowLo
25a10 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65  gEst = 200; asse
25a20 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33  rt( 200==sqlite3
25a30 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36 29 20  LogEst(1048576) 
25a40 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74  );.      pTab->t
25a50 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70  abFlags |= TF_Ep
25a60 68 65 6d 65 72 61 6c 3b 0a 23 65 6e 64 69 66 0a  hemeral;.#endif.
25a70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25a80 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79 20   /* An ordinary 
25a90 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61  table or view na
25aa0 6d 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  me in the FROM c
25ab0 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 61  lause */.      a
25ac0 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54  ssert( pFrom->pT
25ad0 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ab==0 );.      p
25ae0 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61  From->pTab = pTa
25af0 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  b = sqlite3Locat
25b00 65 54 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73  eTableItem(pPars
25b10 65 2c 20 30 2c 20 70 46 72 6f 6d 29 3b 0a 20 20  e, 0, pFrom);.  
25b20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20      if( pTab==0 
25b30 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
25b40 72 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  rt;.      if( pT
25b50 61 62 2d 3e 6e 52 65 66 3d 3d 30 78 66 66 66 66  ab->nRef==0xffff
25b60 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
25b70 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
25b80 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 72 65  se, "too many re
25b90 66 65 72 65 6e 63 65 73 20 74 6f 20 5c 22 25 73  ferences to \"%s
25ba0 5c 22 3a 20 6d 61 78 20 36 35 35 33 35 22 2c 0a  \": max 65535",.
25bb0 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d             pTab-
25bc0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  >zName);.       
25bd0 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 30   pFrom->pTab = 0
25be0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
25bf0 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
25c00 20 20 7d 0a 20 20 20 20 20 20 70 54 61 62 2d 3e    }.      pTab->
25c10 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 69 66  nRef++;.      if
25c20 28 20 21 49 73 56 69 72 74 75 61 6c 28 70 54 61  ( !IsVirtual(pTa
25c30 62 29 20 26 26 20 63 61 6e 6e 6f 74 42 65 46 75  b) && cannotBeFu
25c40 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70  nction(pParse, p
25c50 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20 20 20 20  From) ){.       
25c60 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
25c70 74 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 21  t;.      }.#if !
25c80 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
25c90 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65  MIT_VIEW) || !de
25ca0 66 69 6e 65 64 20 28 53 51 4c 49 54 45 5f 4f 4d  fined (SQLITE_OM
25cb0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  IT_VIRTUALTABLE)
25cc0 0a 20 20 20 20 20 20 69 66 28 20 49 73 56 69 72  .      if( IsVir
25cd0 74 75 61 6c 28 70 54 61 62 29 20 7c 7c 20 70 54  tual(pTab) || pT
25ce0 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  ab->pSelect ){. 
25cf0 20 20 20 20 20 20 20 69 31 36 20 6e 43 6f 6c 3b         i16 nCol;
25d00 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
25d10 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d  ite3ViewGetColum
25d20 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  nNames(pParse, p
25d30 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 57 52  Tab) ) return WR
25d40 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 20  C_Abort;.       
25d50 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
25d60 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a 20 20  pSelect==0 );.  
25d70 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65        pFrom->pSe
25d80 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65  lect = sqlite3Se
25d90 6c 65 63 74 44 75 70 28 64 62 2c 20 70 54 61 62  lectDup(db, pTab
25da0 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20  ->pSelect, 0);. 
25db0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65         sqlite3Se
25dc0 6c 65 63 74 53 65 74 4e 61 6d 65 28 70 46 72 6f  lectSetName(pFro
25dd0 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 70 54 61 62  m->pSelect, pTab
25de0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
25df0 20 20 6e 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e    nCol = pTab->n
25e00 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 54 61  Col;.        pTa
25e10 62 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20  b->nCol = -1;.  
25e20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c        sqlite3Wal
25e30 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c  kSelect(pWalker,
25e40 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29   pFrom->pSelect)
25e50 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e  ;.        pTab->
25e60 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20  nCol = nCol;.   
25e70 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
25e80 7d 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 61 74 65  }..    /* Locate
25e90 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 64   the index named
25ea0 20 62 79 20 74 68 65 20 49 4e 44 45 58 45 44 20   by the INDEXED 
25eb0 42 59 20 63 6c 61 75 73 65 2c 20 69 66 20 61 6e  BY clause, if an
25ec0 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71  y. */.    if( sq
25ed0 6c 69 74 65 33 49 6e 64 65 78 65 64 42 79 4c 6f  lite3IndexedByLo
25ee0 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70 46 72  okup(pParse, pFr
25ef0 6f 6d 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  om) ){.      ret
25f00 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
25f10 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50     }.  }..  /* P
25f20 72 6f 63 65 73 73 20 4e 41 54 55 52 41 4c 20 6b  rocess NATURAL k
25f30 65 79 77 6f 72 64 73 2c 20 61 6e 64 20 4f 4e 20  eywords, and ON 
25f40 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65  and USING clause
25f50 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f  s of joins..  */
25f60 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
25f70 63 46 61 69 6c 65 64 20 7c 7c 20 73 71 6c 69 74  cFailed || sqlit
25f80 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70 50 61  eProcessJoin(pPa
25f90 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 72  rse, p) ){.    r
25fa0 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
25fb0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 65  .  }..  /* For e
25fc0 76 65 72 79 20 22 2a 22 20 74 68 61 74 20 6f 63  very "*" that oc
25fd0 63 75 72 73 20 69 6e 20 74 68 65 20 63 6f 6c 75  curs in the colu
25fe0 6d 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72 74 20  mn list, insert 
25ff0 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20 20 2a  the names of.  *
26000 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e  * all columns in
26010 20 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20 41 6e   all tables.  An
26020 64 20 66 6f 72 20 65 76 65 72 79 20 54 41 42 4c  d for every TABL
26030 45 2e 2a 20 69 6e 73 65 72 74 20 74 68 65 20 6e  E.* insert the n
26040 61 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c  ames.  ** of all
26050 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41 42 4c   columns in TABL
26060 45 2e 20 20 54 68 65 20 70 61 72 73 65 72 20 69  E.  The parser i
26070 6e 73 65 72 74 65 64 20 61 20 73 70 65 63 69 61  nserted a specia
26080 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a  l expression.  *
26090 2a 20 77 69 74 68 20 74 68 65 20 54 4b 5f 41 53  * with the TK_AS
260a0 54 45 52 49 53 4b 20 6f 70 65 72 61 74 6f 72 20  TERISK operator 
260b0 66 6f 72 20 65 61 63 68 20 22 2a 22 20 74 68 61  for each "*" tha
260c0 74 20 69 74 20 66 6f 75 6e 64 20 69 6e 20 74 68  t it found in th
260d0 65 20 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20 6c 69  e column.  ** li
260e0 73 74 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  st.  The followi
260f0 6e 67 20 63 6f 64 65 20 6a 75 73 74 20 68 61 73  ng code just has
26100 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 54   to locate the T
26110 4b 5f 41 53 54 45 52 49 53 4b 0a 20 20 2a 2a 20  K_ASTERISK.  ** 
26120 65 78 70 72 65 73 73 69 6f 6e 73 20 61 6e 64 20  expressions and 
26130 65 78 70 61 6e 64 20 65 61 63 68 20 6f 6e 65 20  expand each one 
26140 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61  to the list of a
26150 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 0a 20 20  ll columns in.  
26160 2a 2a 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a 20  ** all tables.. 
26170 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72   **.  ** The fir
26180 73 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63 68 65  st loop just che
26190 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 74 68  cks to see if th
261a0 65 72 65 20 61 72 65 20 61 6e 79 20 22 2a 22 20  ere are any "*" 
261b0 6f 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a 20 74  operators.  ** t
261c0 68 61 74 20 6e 65 65 64 20 65 78 70 61 6e 64 69  hat need expandi
261d0 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 6b  ng..  */.  for(k
261e0 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; k<pEList->nE
261f0 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 70  xpr; k++){.    p
26200 45 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d  E = pEList->a[k]
26210 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  .pExpr;.    if( 
26220 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 53 54 45 52  pE->op==TK_ASTER
26230 49 53 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ISK ) break;.   
26240 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21   assert( pE->op!
26250 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70  =TK_DOT || pE->p
26260 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20 20  Right!=0 );.    
26270 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d  assert( pE->op!=
26280 54 4b 5f 44 4f 54 20 7c 7c 20 28 70 45 2d 3e 70  TK_DOT || (pE->p
26290 4c 65 66 74 21 3d 30 20 26 26 20 70 45 2d 3e 70  Left!=0 && pE->p
262a0 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 29  Left->op==TK_ID)
262b0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e   );.    if( pE->
262c0 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45  op==TK_DOT && pE
262d0 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b  ->pRight->op==TK
262e0 5f 41 53 54 45 52 49 53 4b 20 29 20 62 72 65 61  _ASTERISK ) brea
262f0 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6b 3c 70  k;.  }.  if( k<p
26300 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  EList->nExpr ){.
26310 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66      /*.    ** If
26320 20 77 65 20 67 65 74 20 68 65 72 65 20 69 74 20   we get here it 
26330 6d 65 61 6e 73 20 74 68 65 20 72 65 73 75 6c 74  means the result
26340 20 73 65 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e   set contains on
26350 65 20 6f 72 20 6d 6f 72 65 20 22 2a 22 0a 20 20  e or more "*".  
26360 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20 74    ** operators t
26370 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65  hat need to be e
26380 78 70 61 6e 64 65 64 2e 20 20 4c 6f 6f 70 20 74  xpanded.  Loop t
26390 68 72 6f 75 67 68 20 65 61 63 68 20 65 78 70 72  hrough each expr
263a0 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e  ession.    ** in
263b0 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
263c0 61 6e 64 20 65 78 70 61 6e 64 20 74 68 65 6d 20  and expand them 
263d0 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20  one by one..    
263e0 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  */.    struct Ex
263f0 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 20 3d  prList_item *a =
26400 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20   pEList->a;.    
26410 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 20 3d  ExprList *pNew =
26420 20 30 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67   0;.    int flag
26430 73 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  s = pParse->db->
26440 66 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74 20 6c  flags;.    int l
26450 6f 6e 67 4e 61 6d 65 73 20 3d 20 28 66 6c 61 67  ongNames = (flag
26460 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43  s & SQLITE_FullC
26470 6f 6c 4e 61 6d 65 73 29 21 3d 30 0a 20 20 20 20  olNames)!=0.    
26480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26490 20 20 26 26 20 28 66 6c 61 67 73 20 26 20 53 51    && (flags & SQ
264a0 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d  LITE_ShortColNam
264b0 65 73 29 3d 3d 30 3b 0a 0a 20 20 20 20 66 6f 72  es)==0;..    for
264c0 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e  (k=0; k<pEList->
264d0 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20  nExpr; k++){.   
264e0 20 20 20 70 45 20 3d 20 61 5b 6b 5d 2e 70 45 78     pE = a[k].pEx
264f0 70 72 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74  pr;.      pRight
26500 20 3d 20 70 45 2d 3e 70 52 69 67 68 74 3b 0a 20   = pE->pRight;. 
26510 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d       assert( pE-
26520 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70  >op!=TK_DOT || p
26530 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20 20  Right!=0 );.    
26540 20 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d 54 4b    if( pE->op!=TK
26550 5f 41 53 54 45 52 49 53 4b 0a 20 20 20 20 20 20  _ASTERISK.      
26560 20 26 26 20 28 70 45 2d 3e 6f 70 21 3d 54 4b 5f   && (pE->op!=TK_
26570 44 4f 54 20 7c 7c 20 70 52 69 67 68 74 2d 3e 6f  DOT || pRight->o
26580 70 21 3d 54 4b 5f 41 53 54 45 52 49 53 4b 29 0a  p!=TK_ASTERISK).
26590 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
265a0 20 2f 2a 20 54 68 69 73 20 70 61 72 74 69 63 75   /* This particu
265b0 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20 64  lar expression d
265c0 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
265d0 62 65 20 65 78 70 61 6e 64 65 64 2e 0a 20 20 20  be expanded..   
265e0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
265f0 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
26600 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
26610 72 73 65 2c 20 70 4e 65 77 2c 20 61 5b 6b 5d 2e  rse, pNew, a[k].
26620 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
26630 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
26640 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e        pNew->a[pN
26650 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61  ew->nExpr-1].zNa
26660 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b  me = a[k].zName;
26670 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
26680 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31  >a[pNew->nExpr-1
26690 5d 2e 7a 53 70 61 6e 20 3d 20 61 5b 6b 5d 2e 7a  ].zSpan = a[k].z
266a0 53 70 61 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  Span;.          
266b0 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a  a[k].zName = 0;.
266c0 20 20 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a            a[k].z
266d0 53 70 61 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  Span = 0;.      
266e0 20 20 7d 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d    }.        a[k]
266f0 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20  .pExpr = 0;.    
26700 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
26710 20 2f 2a 20 54 68 69 73 20 65 78 70 72 65 73 73   /* This express
26720 69 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f 72 20  ion is a "*" or 
26730 61 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20  a "TABLE.*" and 
26740 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20  needs to be.    
26750 20 20 20 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e      ** expanded.
26760 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
26770 74 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20  tableSeen = 0;  
26780 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20      /* Set to 1 
26790 77 68 65 6e 20 54 41 42 4c 45 20 6d 61 74 63 68  when TABLE match
267a0 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68  es */.        ch
267b0 61 72 20 2a 7a 54 4e 61 6d 65 20 3d 20 30 3b 20  ar *zTName = 0; 
267c0 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20 6f 66        /* text of
267d0 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a   name of TABLE *
267e0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45  /.        if( pE
267f0 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a  ->op==TK_DOT ){.
26800 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
26810 28 20 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20 29  ( pE->pLeft!=0 )
26820 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
26830 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
26840 65 72 74 79 28 70 45 2d 3e 70 4c 65 66 74 2c 20  erty(pE->pLeft, 
26850 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
26860 20 20 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65            zTName
26870 20 3d 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 75 2e   = pE->pLeft->u.
26880 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20  zToken;.        
26890 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  }.        for(i=
268a0 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73  0, pFrom=pTabLis
268b0 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74  t->a; i<pTabList
268c0 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72  ->nSrc; i++, pFr
268d0 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  om++){.         
268e0 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
268f0 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  From->pTab;.    
26900 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53        Select *pS
26910 75 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  ub = pFrom->pSel
26920 65 63 74 3b 0a 20 20 20 20 20 20 20 20 20 20 63  ect;.          c
26930 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20  har *zTabName = 
26940 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20  pFrom->zAlias;. 
26950 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63           const c
26960 68 61 72 20 2a 7a 53 63 68 65 6d 61 4e 61 6d 65  har *zSchemaName
26970 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
26980 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20  int iDb;.       
26990 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d     if( zTabName=
269a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
269b0 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54 61    zTabName = pTa
269c0 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  b->zName;.      
269d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
269e0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
269f0 69 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a 20 20  iled ) break;.  
26a00 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62          if( pSub
26a10 3d 3d 30 20 7c 7c 20 28 70 53 75 62 2d 3e 73 65  ==0 || (pSub->se
26a20 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e 65 73 74  lFlags & SF_Nest
26a30 65 64 46 72 6f 6d 29 3d 3d 30 20 29 7b 0a 20 20  edFrom)==0 ){.  
26a40 20 20 20 20 20 20 20 20 20 20 70 53 75 62 20 3d            pSub =
26a50 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
26a60 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 73 71  if( zTName && sq
26a70 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 4e  lite3StrICmp(zTN
26a80 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 29 21 3d  ame, zTabName)!=
26a90 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
26aa0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
26ab0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
26ac0 20 20 20 20 20 20 20 69 44 62 20 3d 20 73 71 6c         iDb = sql
26ad0 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
26ae0 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  x(db, pTab->pSch
26af0 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ema);.          
26b00 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65 20 3d 20    zSchemaName = 
26b10 69 44 62 3e 3d 30 20 3f 20 64 62 2d 3e 61 44 62  iDb>=0 ? db->aDb
26b20 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 20 3a  [iDb].zDbSName :
26b30 20 22 2a 22 3b 0a 20 20 20 20 20 20 20 20 20 20   "*";.          
26b40 7d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  }.          for(
26b50 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f  j=0; j<pTab->nCo
26b60 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
26b70 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
26b80 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d   = pTab->aCol[j]
26b90 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
26ba0 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6e 61      char *zColna
26bb0 6d 65 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70  me;  /* The comp
26bc0 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  uted column name
26bd0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
26be0 63 68 61 72 20 2a 7a 54 6f 46 72 65 65 3b 20 20  char *zToFree;  
26bf0 20 2f 2a 20 4d 61 6c 6c 6f 63 65 64 20 73 74 72   /* Malloced str
26c00 69 6e 67 20 74 68 61 74 20 6e 65 65 64 73 20 74  ing that needs t
26c10 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20  o be freed */.  
26c20 20 20 20 20 20 20 20 20 20 20 54 6f 6b 65 6e 20            Token 
26c30 73 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 43 6f  sColname;  /* Co
26c40 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61  mputed column na
26c50 6d 65 20 61 73 20 61 20 74 6f 6b 65 6e 20 2a 2f  me as a token */
26c60 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  ..            as
26c70 73 65 72 74 28 20 7a 4e 61 6d 65 20 29 3b 0a 20  sert( zName );. 
26c80 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a             if( z
26c90 54 4e 61 6d 65 20 26 26 20 70 53 75 62 0a 20 20  TName && pSub.  
26ca0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71             && sq
26cb0 6c 69 74 65 33 4d 61 74 63 68 53 70 61 6e 4e 61  lite3MatchSpanNa
26cc0 6d 65 28 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d  me(pSub->pEList-
26cd0 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 2c 20 30 2c 20  >a[j].zSpan, 0, 
26ce0 7a 54 4e 61 6d 65 2c 20 30 29 3d 3d 30 0a 20 20  zTName, 0)==0.  
26cf0 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
26d00 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
26d10 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
26d20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
26d30 2f 2a 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20 69  /* If a column i
26d40 73 20 6d 61 72 6b 65 64 20 61 73 20 27 68 69 64  s marked as 'hid
26d50 64 65 6e 27 2c 20 6f 6d 69 74 20 69 74 20 66 72  den', omit it fr
26d60 6f 6d 20 74 68 65 20 65 78 70 61 6e 64 65 64 0a  om the expanded.
26d70 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72              ** r
26d80 65 73 75 6c 74 2d 73 65 74 20 6c 69 73 74 20 75  esult-set list u
26d90 6e 6c 65 73 73 20 74 68 65 20 53 45 4c 45 43 54  nless the SELECT
26da0 20 68 61 73 20 74 68 65 20 53 46 5f 49 6e 63 6c   has the SF_Incl
26db0 75 64 65 48 69 64 64 65 6e 0a 20 20 20 20 20 20  udeHidden.      
26dc0 20 20 20 20 20 20 2a 2a 20 62 69 74 20 73 65 74        ** bit set
26dd0 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f  ..            */
26de0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
26df0 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
26e00 53 46 5f 49 6e 63 6c 75 64 65 48 69 64 64 65 6e  SF_IncludeHidden
26e10 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )==0.           
26e20 20 20 26 26 20 49 73 48 69 64 64 65 6e 43 6f 6c    && IsHiddenCol
26e30 75 6d 6e 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b  umn(&pTab->aCol[
26e40 6a 5d 29 20 0a 20 20 20 20 20 20 20 20 20 20 20  j]) .           
26e50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
26e60 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
26e70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26e80 20 20 20 20 20 20 74 61 62 6c 65 53 65 65 6e 20        tableSeen 
26e90 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  = 1;..          
26ea0 20 20 69 66 28 20 69 3e 30 20 26 26 20 7a 54 4e    if( i>0 && zTN
26eb0 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame==0 ){.      
26ec0 20 20 20 20 20 20 20 20 69 66 28 20 28 70 46 72          if( (pFr
26ed0 6f 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20  om->fg.jointype 
26ee0 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21 3d 30  & JT_NATURAL)!=0
26ef0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26f00 20 26 26 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75   && tableAndColu
26f10 6d 6e 49 6e 64 65 78 28 70 54 61 62 4c 69 73 74  mnIndex(pTabList
26f20 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 30  , i, zName, 0, 0
26f30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
26f40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
26f50 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55 52     /* In a NATUR
26f60 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74 68  AL join, omit th
26f70 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20 66  e join columns f
26f80 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20 20  rom the .       
26f90 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c           ** tabl
26fa0 65 20 74 6f 20 74 68 65 20 72 69 67 68 74 20 6f  e to the right o
26fb0 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20  f the join */.  
26fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
26fd0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
26fe0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
26ff0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
27000 33 49 64 4c 69 73 74 49 6e 64 65 78 28 70 46 72  3IdListIndex(pFr
27010 6f 6d 2d 3e 70 55 73 69 6e 67 2c 20 7a 4e 61 6d  om->pUsing, zNam
27020 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)>=0 ){.       
27030 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61           /* In a
27040 20 6a 6f 69 6e 20 77 69 74 68 20 61 20 55 53 49   join with a USI
27050 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69 74 20  NG clause, omit 
27060 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a 20  columns in the. 
27070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
27080 2a 20 75 73 69 6e 67 20 63 6c 61 75 73 65 20 66  * using clause f
27090 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20 6f 6e  rom the table on
270a0 20 74 68 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20   the right. */. 
270b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
270c0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
270d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
270e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
270f0 20 20 20 70 52 69 67 68 74 20 3d 20 73 71 6c 69     pRight = sqli
27100 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49  te3Expr(db, TK_I
27110 44 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  D, zName);.     
27120 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65 20         zColname 
27130 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  = zName;.       
27140 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d 20 30       zToFree = 0
27150 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
27160 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c 20 70  ( longNames || p
27170 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 20  TabList->nSrc>1 
27180 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
27190 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 0a 20 20   Expr *pLeft;.  
271a0 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 66              pLef
271b0 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  t = sqlite3Expr(
271c0 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 54 61 62 4e  db, TK_ID, zTabN
271d0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
271e0 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69      pExpr = sqli
271f0 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
27200 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20   TK_DOT, pLeft, 
27210 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20  pRight, 0);.    
27220 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 53            if( zS
27230 63 68 65 6d 61 4e 61 6d 65 20 29 7b 0a 20 20 20  chemaName ){.   
27240 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65               pLe
27250 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
27260 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 53 63 68  (db, TK_ID, zSch
27270 65 6d 61 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  emaName);.      
27280 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20            pExpr 
27290 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
272a0 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70  Parse, TK_DOT, p
272b0 4c 65 66 74 2c 20 70 45 78 70 72 2c 20 30 29 3b  Left, pExpr, 0);
272c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
272d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
272e0 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a  f( longNames ){.
272f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27300 7a 43 6f 6c 6e 61 6d 65 20 3d 20 73 71 6c 69 74  zColname = sqlit
27310 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
27320 73 2e 25 73 22 2c 20 7a 54 61 62 4e 61 6d 65 2c  s.%s", zTabName,
27330 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
27340 20 20 20 20 20 20 20 20 20 7a 54 6f 46 72 65 65           zToFree
27350 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20   = zColname;.   
27360 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
27370 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
27380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
27390 78 70 72 20 3d 20 70 52 69 67 68 74 3b 0a 20 20  xpr = pRight;.  
273a0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
273b0 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73          pNew = s
273c0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
273d0 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e 65  pend(pParse, pNe
273e0 77 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20  w, pExpr);.     
273f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 6f         sqlite3To
27400 6b 65 6e 49 6e 69 74 28 26 73 43 6f 6c 6e 61 6d  kenInit(&sColnam
27410 65 2c 20 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20  e, zColname);.  
27420 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
27430 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65  3ExprListSetName
27440 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 26  (pParse, pNew, &
27450 73 43 6f 6c 6e 61 6d 65 2c 20 30 29 3b 0a 20 20  sColname, 0);.  
27460 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e            if( pN
27470 65 77 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61  ew && (p->selFla
27480 67 73 20 26 20 53 46 5f 4e 65 73 74 65 64 46 72  gs & SF_NestedFr
27490 6f 6d 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  om)!=0 ){.      
274a0 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45          struct E
274b0 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 58  xprList_item *pX
274c0 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 70 4e 65 77   = &pNew->a[pNew
274d0 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20  ->nExpr-1];.    
274e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53            if( pS
274f0 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ub ){.          
27500 20 20 20 20 20 20 70 58 2d 3e 7a 53 70 61 6e 20        pX->zSpan 
27510 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
27520 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 45 4c 69  p(db, pSub->pELi
27530 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 29 3b  st->a[j].zSpan);
27540 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27550 20 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e 7a   testcase( pX->z
27560 53 70 61 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Span==0 );.     
27570 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
27580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27590 70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69  pX->zSpan = sqli
275a0 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
275b0 25 73 2e 25 73 2e 25 73 22 2c 0a 20 20 20 20 20  %s.%s.%s",.     
275c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
275d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
275e0 20 20 20 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d        zSchemaNam
275f0 65 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 43 6f  e, zTabName, zCo
27600 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  lname);.        
27610 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
27620 28 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29  ( pX->zSpan==0 )
27630 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
27640 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
27650 70 58 2d 3e 62 53 70 61 6e 49 73 54 61 62 20 3d  pX->bSpanIsTab =
27660 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
27670 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  }.            sq
27680 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
27690 7a 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 20 20  zToFree);.      
276a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
276b0 20 20 20 20 20 20 20 20 69 66 28 20 21 74 61 62          if( !tab
276c0 6c 65 53 65 65 6e 20 29 7b 0a 20 20 20 20 20 20  leSeen ){.      
276d0 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 29      if( zTName )
276e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
276f0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
27700 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74  arse, "no such t
27710 61 62 6c 65 3a 20 25 73 22 2c 20 7a 54 4e 61 6d  able: %s", zTNam
27720 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  e);.          }e
27730 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
27740 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
27750 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 74 61 62  (pParse, "no tab
27760 6c 65 73 20 73 70 65 63 69 66 69 65 64 22 29 3b  les specified");
27770 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
27780 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
27790 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
277a0 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
277b0 62 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  b, pEList);.    
277c0 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65 77  p->pEList = pNew
277d0 3b 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45  ;.  }.#if SQLITE
277e0 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66  _MAX_COLUMN.  if
277f0 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70  ( p->pEList && p
27800 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  ->pEList->nExpr>
27810 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
27820 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20  E_LIMIT_COLUMN] 
27830 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
27840 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
27850 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73  too many columns
27860 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 22 29   in result set")
27870 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  ;.    return WRC
27880 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 23 65 6e 64  _Abort;.  }.#end
27890 69 66 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f  if.  return WRC_
278a0 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
278b0 2a 2a 20 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65  ** No-op routine
278c0 20 66 6f 72 20 74 68 65 20 70 61 72 73 65 2d 74   for the parse-t
278d0 72 65 65 20 77 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a  ree walker..**.*
278e0 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * When this rout
278f0 69 6e 65 20 69 73 20 74 68 65 20 57 61 6c 6b 65  ine is the Walke
27900 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  r.xExprCallback 
27910 74 68 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  then expression 
27920 74 72 65 65 73 0a 2a 2a 20 61 72 65 20 77 61 6c  trees.** are wal
27930 6b 65 64 20 77 69 74 68 6f 75 74 20 61 6e 79 20  ked without any 
27940 61 63 74 69 6f 6e 73 20 62 65 69 6e 67 20 74 61  actions being ta
27950 6b 65 6e 20 61 74 20 65 61 63 68 20 6e 6f 64 65  ken at each node
27960 2e 20 20 50 72 65 73 75 6d 61 62 6c 79 2c 0a 2a  .  Presumably,.*
27970 2a 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * when this rout
27980 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
27990 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c  Walker.xExprCall
279a0 62 61 63 6b 20 74 68 65 6e 20 0a 2a 2a 20 57 61  back then .** Wa
279b0 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c  lker.xSelectCall
279c0 62 61 63 6b 20 69 73 20 73 65 74 20 74 6f 20 64  back is set to d
279d0 6f 20 73 6f 6d 65 74 68 69 6e 67 20 75 73 65 66  o something usef
279e0 75 6c 20 66 6f 72 20 65 76 65 72 79 20 0a 2a 2a  ul for every .**
279f0 20 73 75 62 71 75 65 72 79 20 69 6e 20 74 68 65   subquery in the
27a00 20 70 61 72 73 65 72 20 74 72 65 65 2e 0a 2a 2f   parser tree..*/
27a10 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
27a20 57 61 6c 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72 20  WalkNoop(Walker 
27a30 2a 4e 6f 74 55 73 65 64 2c 20 45 78 70 72 20 2a  *NotUsed, Expr *
27a40 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55  NotUsed2){.  UNU
27a50 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e  SED_PARAMETER2(N
27a60 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32  otUsed, NotUsed2
27a70 29 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f  );.  return WRC_
27a80 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
27a90 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
27aa0 22 65 78 70 61 6e 64 73 22 20 61 20 53 45 4c 45  "expands" a SELE
27ab0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64  CT statement and
27ac0 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 71   all of its subq
27ad0 75 65 72 69 65 73 2e 0a 2a 2a 20 46 6f 72 20 61  ueries..** For a
27ae0 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
27af0 61 74 69 6f 6e 20 6f 6e 20 77 68 61 74 20 69 74  ation on what it
27b00 20 6d 65 61 6e 73 20 74 6f 20 22 65 78 70 61 6e   means to "expan
27b10 64 22 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20 73  d" a SELECT.** s
27b20 74 61 74 65 6d 65 6e 74 2c 20 73 65 65 20 74 68  tatement, see th
27b30 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65  e comment on the
27b40 20 73 65 6c 65 63 74 45 78 70 61 6e 64 20 77 6f   selectExpand wo
27b50 72 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20 61 62  rker callback ab
27b60 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 61 6e  ove..**.** Expan
27b70 64 69 6e 67 20 61 20 53 45 4c 45 43 54 20 73 74  ding a SELECT st
27b80 61 74 65 6d 65 6e 74 20 69 73 20 74 68 65 20 66  atement is the f
27b90 69 72 73 74 20 73 74 65 70 20 69 6e 20 70 72 6f  irst step in pro
27ba0 63 65 73 73 69 6e 67 20 61 0a 2a 2a 20 53 45 4c  cessing a.** SEL
27bb0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  ECT statement.  
27bc0 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
27bd0 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 65 78 70  ment must be exp
27be0 61 6e 64 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20  anded before.** 
27bf0 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20  name resolution 
27c00 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 0a 2a 2a  is performed..**
27c10 0a 2a 2a 20 49 66 20 61 6e 79 74 68 69 6e 67 20  .** If anything 
27c20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 61 6e 20 65  goes wrong, an e
27c30 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20  rror message is 
27c40 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 70 50 61  written into pPa
27c50 72 73 65 2e 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  rse..** The call
27c60 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e  ing function can
27c70 20 64 65 74 65 63 74 20 74 68 65 20 70 72 6f 62   detect the prob
27c80 6c 65 6d 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61  lem by looking a
27c90 74 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 0a 2a  t pParse->nErr.*
27ca0 2a 20 61 6e 64 2f 6f 72 20 70 50 61 72 73 65 2d  * and/or pParse-
27cb0 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
27cc0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
27cd0 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45  d sqlite3SelectE
27ce0 78 70 61 6e 64 28 50 61 72 73 65 20 2a 70 50 61  xpand(Parse *pPa
27cf0 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  rse, Select *pSe
27d00 6c 65 63 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20  lect){.  Walker 
27d10 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20  w;.  memset(&w, 
27d20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20  0, sizeof(w));. 
27d30 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
27d40 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 57 61   = sqlite3ExprWa
27d50 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72  lkNoop;.  w.pPar
27d60 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 69  se = pParse;.  i
27d70 66 28 20 70 50 61 72 73 65 2d 3e 68 61 73 43 6f  f( pParse->hasCo
27d80 6d 70 6f 75 6e 64 20 29 7b 0a 20 20 20 20 77 2e  mpound ){.    w.
27d90 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
27da0 3d 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e  = convertCompoun
27db0 64 53 65 6c 65 63 74 54 6f 53 75 62 71 75 65 72  dSelectToSubquer
27dc0 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61  y;.    sqlite3Wa
27dd0 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65  lkSelect(&w, pSe
27de0 6c 65 63 74 29 3b 0a 20 20 7d 0a 20 20 77 2e 78  lect);.  }.  w.x
27df0 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d  SelectCallback =
27e00 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72 3b   selectExpander;
27e10 0a 20 20 69 66 28 20 28 70 53 65 6c 65 63 74 2d  .  if( (pSelect-
27e20 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4d  >selFlags & SF_M
27e30 75 6c 74 69 56 61 6c 75 65 29 3d 3d 30 20 29 7b  ultiValue)==0 ){
27e40 0a 20 20 20 20 77 2e 78 53 65 6c 65 63 74 43 61  .    w.xSelectCa
27e50 6c 6c 62 61 63 6b 32 20 3d 20 73 65 6c 65 63 74  llback2 = select
27e60 50 6f 70 57 69 74 68 3b 0a 20 20 7d 0a 20 20 73  PopWith;.  }.  s
27e70 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
27e80 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 7d  (&w, pSelect);.}
27e90 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
27ea0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
27eb0 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
27ec0 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61  Walker.xSelectCa
27ed0 6c 6c 62 61 63 6b 20 63 61 6c 6c 62 61 63 6b 20  llback callback 
27ee0 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65 33 53  for the sqlite3S
27ef0 65 6c 65 63 74 54 79 70 65 49 6e 66 6f 28 29 0a  electTypeInfo().
27f00 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a  ** interface..**
27f10 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20 46 52 4f  .** For each FRO
27f20 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72  M-clause subquer
27f30 79 2c 20 61 64 64 20 43 6f 6c 75 6d 6e 2e 7a 54  y, add Column.zT
27f40 79 70 65 20 61 6e 64 20 43 6f 6c 75 6d 6e 2e 7a  ype and Column.z
27f50 43 6f 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74  Coll.** informat
27f60 69 6f 6e 20 74 6f 20 74 68 65 20 54 61 62 6c 65  ion to the Table
27f70 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
27f80 72 65 70 72 65 73 65 6e 74 73 20 74 68 65 20 72  represents the r
27f90 65 73 75 6c 74 20 73 65 74 0a 2a 2a 20 6f 66 20  esult set.** of 
27fa0 74 68 61 74 20 73 75 62 71 75 65 72 79 2e 0a 2a  that subquery..*
27fb0 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20 73  *.** The Table s
27fc0 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65  tructure that re
27fd0 70 72 65 73 65 6e 74 73 20 74 68 65 20 72 65 73  presents the res
27fe0 75 6c 74 20 73 65 74 20 77 61 73 20 63 6f 6e 73  ult set was cons
27ff0 74 72 75 63 74 65 64 0a 2a 2a 20 62 79 20 73 65  tructed.** by se
28000 6c 65 63 74 45 78 70 61 6e 64 65 72 28 29 20 62  lectExpander() b
28010 75 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20  ut the type and 
28020 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d  collation inform
28030 61 74 69 6f 6e 20 77 61 73 20 6f 6d 69 74 74 65  ation was omitte
28040 64 0a 2a 2a 20 61 74 20 74 68 61 74 20 70 6f 69  d.** at that poi
28050 6e 74 20 62 65 63 61 75 73 65 20 69 64 65 6e 74  nt because ident
28060 69 66 69 65 72 73 20 68 61 64 20 6e 6f 74 20 79  ifiers had not y
28070 65 74 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64  et been resolved
28080 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69  .  This.** routi
28090 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  ne is called aft
280a0 65 72 20 69 64 65 6e 74 69 66 69 65 72 20 72 65  er identifier re
280b0 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  solution..*/.sta
280c0 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74 41  tic void selectA
280d0 64 64 53 75 62 71 75 65 72 79 54 79 70 65 49 6e  ddSubqueryTypeIn
280e0 66 6f 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  fo(Walker *pWalk
280f0 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  er, Select *p){.
28100 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b    Parse *pParse;
28110 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 72 63 4c  .  int i;.  SrcL
28120 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20  ist *pTabList;. 
28130 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
28140 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20  item *pFrom;..  
28150 61 73 73 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c  assert( p->selFl
28160 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c 76 65  ags & SF_Resolve
28170 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  d );.  assert( (
28180 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
28190 5f 48 61 73 54 79 70 65 49 6e 66 6f 29 3d 3d 30  _HasTypeInfo)==0
281a0 20 29 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67   );.  p->selFlag
281b0 73 20 7c 3d 20 53 46 5f 48 61 73 54 79 70 65 49  s |= SF_HasTypeI
281c0 6e 66 6f 3b 0a 20 20 70 50 61 72 73 65 20 3d 20  nfo;.  pParse = 
281d0 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b  pWalker->pParse;
281e0 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d  .  pTabList = p-
281f0 3e 70 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30  >pSrc;.  for(i=0
28200 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74  , pFrom=pTabList
28210 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  ->a; i<pTabList-
28220 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f  >nSrc; i++, pFro
28230 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  m++){.    Table 
28240 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pTab = pFrom->p
28250 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Tab;.    assert(
28260 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20   pTab!=0 );.    
28270 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c  if( (pTab->tabFl
28280 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72  ags & TF_Ephemer
28290 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  al)!=0 ){.      
282a0 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20 69  /* A sub-query i
282b0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
282c0 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f  e of a SELECT */
282d0 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
282e0 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65  Sel = pFrom->pSe
282f0 6c 65 63 74 3b 0a 20 20 20 20 20 20 69 66 28 20  lect;.      if( 
28300 70 53 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  pSel ){.        
28310 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72  while( pSel->pPr
28320 69 6f 72 20 29 20 70 53 65 6c 20 3d 20 70 53 65  ior ) pSel = pSe
28330 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20  l->pPrior;.     
28340 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
28350 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64  AddColumnTypeAnd
28360 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65  Collation(pParse
28370 2c 20 70 54 61 62 2c 20 70 53 65 6c 29 3b 0a 20  , pTab, pSel);. 
28380 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
28390 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
283a0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
283b0 64 64 73 20 64 61 74 61 74 79 70 65 20 61 6e 64  dds datatype and
283c0 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
283d0 6e 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  nce information 
283e0 74 6f 0a 2a 2a 20 74 68 65 20 54 61 62 6c 65 20  to.** the Table 
283f0 73 74 72 75 63 74 75 72 65 73 20 6f 66 20 61 6c  structures of al
28400 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75  l FROM-clause su
28410 62 71 75 65 72 69 65 73 20 69 6e 20 61 0a 2a 2a  bqueries in a.**
28420 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
28430 74 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 69  t..**.** Use thi
28440 73 20 72 6f 75 74 69 6e 65 20 61 66 74 65 72 20  s routine after 
28450 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 2e  name resolution.
28460 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
28470 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64  sqlite3SelectAdd
28480 54 79 70 65 49 6e 66 6f 28 50 61 72 73 65 20 2a  TypeInfo(Parse *
28490 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
284a0 70 53 65 6c 65 63 74 29 7b 0a 23 69 66 6e 64 65  pSelect){.#ifnde
284b0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
284c0 42 51 55 45 52 59 0a 20 20 57 61 6c 6b 65 72 20  BQUERY.  Walker 
284d0 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20  w;.  memset(&w, 
284e0 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20  0, sizeof(w));. 
284f0 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
28500 63 6b 32 20 3d 20 73 65 6c 65 63 74 41 64 64 53  ck2 = selectAddS
28510 75 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f 3b  ubqueryTypeInfo;
28520 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61  .  w.xExprCallba
28530 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ck = sqlite3Expr
28540 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50  WalkNoop;.  w.pP
28550 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
28560 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
28570 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b  ct(&w, pSelect);
28580 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a  .#endif.}.../*.*
28590 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
285a0 65 74 73 20 75 70 20 61 20 53 45 4c 45 43 54 20  ets up a SELECT 
285b0 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 70 72  statement for pr
285c0 6f 63 65 73 73 69 6e 67 2e 20 20 54 68 65 0a 2a  ocessing.  The.*
285d0 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61  * following is a
285e0 63 63 6f 6d 70 6c 69 73 68 65 64 3a 0a 2a 2a 0a  ccomplished:.**.
285f0 2a 2a 20 20 20 20 20 2a 20 20 56 44 42 45 20 43  **     *  VDBE C
28600 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 61 72  ursor numbers ar
28610 65 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c  e assigned to al
28620 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 74 65  l FROM-clause te
28630 72 6d 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 45  rms..**     *  E
28640 70 68 65 6d 65 72 61 6c 20 54 61 62 6c 65 20 6f  phemeral Table o
28650 62 6a 65 63 74 73 20 61 72 65 20 63 72 65 61 74  bjects are creat
28660 65 64 20 66 6f 72 20 61 6c 6c 20 46 52 4f 4d 2d  ed for all FROM-
28670 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 69 65  clause subquerie
28680 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 4f 4e 20  s..**     *  ON 
28690 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65  and USING clause
286a0 73 20 61 72 65 20 73 68 69 66 74 65 64 20 69 6e  s are shifted in
286b0 74 6f 20 57 48 45 52 45 20 73 74 61 74 65 6d 65  to WHERE stateme
286c0 6e 74 73 0a 2a 2a 20 20 20 20 20 2a 20 20 57 69  nts.**     *  Wi
286d0 6c 64 63 61 72 64 73 20 22 2a 22 20 61 6e 64 20  ldcards "*" and 
286e0 22 54 41 42 4c 45 2e 2a 22 20 69 6e 20 72 65 73  "TABLE.*" in res
286f0 75 6c 74 20 73 65 74 73 20 61 72 65 20 65 78 70  ult sets are exp
28700 61 6e 64 65 64 2e 0a 2a 2a 20 20 20 20 20 2a 20  anded..**     * 
28710 20 49 64 65 6e 74 69 66 69 65 72 73 20 69 6e 20   Identifiers in 
28720 65 78 70 72 65 73 73 69 6f 6e 20 61 72 65 20 6d  expression are m
28730 61 74 63 68 65 64 20 74 6f 20 74 61 62 6c 65 73  atched to tables
28740 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
28750 74 69 6e 65 20 61 63 74 73 20 72 65 63 75 72 73  tine acts recurs
28760 69 76 65 6c 79 20 6f 6e 20 61 6c 6c 20 73 75 62  ively on all sub
28770 71 75 65 72 69 65 73 20 77 69 74 68 69 6e 20 74  queries within t
28780 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f  he SELECT..*/.vo
28790 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  id sqlite3Select
287a0 50 72 65 70 28 0a 20 20 50 61 72 73 65 20 2a 70  Prep(.  Parse *p
287b0 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
287c0 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
287d0 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
287e0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
287f0 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
28800 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63  tatement being c
28810 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43  oded. */.  NameC
28820 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65 72 4e 43  ontext *pOuterNC
28830 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78    /* Name contex
28840 74 20 66 6f 72 20 63 6f 6e 74 61 69 6e 65 72 20  t for container 
28850 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
28860 2a 64 62 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  *db;.  if( NEVER
28870 28 70 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b  (p==0) ) return;
28880 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
28890 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  db;.  if( db->ma
288a0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
288b0 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 73 65  urn;.  if( p->se
288c0 6c 46 6c 61 67 73 20 26 20 53 46 5f 48 61 73 54  lFlags & SF_HasT
288d0 79 70 65 49 6e 66 6f 20 29 20 72 65 74 75 72 6e  ypeInfo ) return
288e0 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
288f0 74 45 78 70 61 6e 64 28 70 50 61 72 73 65 2c 20  tExpand(pParse, 
28900 70 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  p);.  if( pParse
28910 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61  ->nErr || db->ma
28920 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
28930 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  urn;.  sqlite3Re
28940 73 6f 6c 76 65 53 65 6c 65 63 74 4e 61 6d 65 73  solveSelectNames
28950 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4f 75 74  (pParse, p, pOut
28960 65 72 4e 43 29 3b 0a 20 20 69 66 28 20 70 50 61  erNC);.  if( pPa
28970 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d  rse->nErr || db-
28980 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
28990 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65  return;.  sqlite
289a0 33 53 65 6c 65 63 74 41 64 64 54 79 70 65 49 6e  3SelectAddTypeIn
289b0 66 6f 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 7d  fo(pParse, p);.}
289c0 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68  ../*.** Reset th
289d0 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75  e aggregate accu
289e0 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  mulator..**.** T
289f0 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63  he aggregate acc
28a00 75 6d 75 6c 61 74 6f 72 20 69 73 20 61 20 73 65  umulator is a se
28a10 74 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  t of memory cell
28a20 73 20 74 68 61 74 20 68 6f 6c 64 0a 2a 2a 20 69  s that hold.** i
28a30 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75  ntermediate resu
28a40 6c 74 73 20 77 68 69 6c 65 20 63 61 6c 63 75 6c  lts while calcul
28a50 61 74 69 6e 67 20 61 6e 20 61 67 67 72 65 67 61  ating an aggrega
28a60 74 65 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75  te.  This.** rou
28a70 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63  tine generates c
28a80 6f 64 65 20 74 68 61 74 20 73 74 6f 72 65 73 20  ode that stores 
28a90 4e 55 4c 4c 73 20 69 6e 20 61 6c 6c 20 6f 66 20  NULLs in all of 
28aa0 74 68 6f 73 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20  those memory.** 
28ab0 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  cells..*/.static
28ac0 20 76 6f 69 64 20 72 65 73 65 74 41 63 63 75 6d   void resetAccum
28ad0 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50  ulator(Parse *pP
28ae0 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70  arse, AggInfo *p
28af0 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65  AggInfo){.  Vdbe
28b00 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
28b10 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
28b20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66  struct AggInfo_f
28b30 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20 69 6e  unc *pFunc;.  in
28b40 74 20 6e 52 65 67 20 3d 20 70 41 67 67 49 6e 66  t nReg = pAggInf
28b50 6f 2d 3e 6e 46 75 6e 63 20 2b 20 70 41 67 67 49  o->nFunc + pAggI
28b60 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  nfo->nColumn;.  
28b70 69 66 28 20 6e 52 65 67 3d 3d 30 20 29 20 72 65  if( nReg==0 ) re
28b80 74 75 72 6e 3b 0a 23 69 66 64 65 66 20 53 51 4c  turn;.#ifdef SQL
28b90 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 56  ITE_DEBUG.  /* V
28ba0 65 72 69 66 79 20 74 68 61 74 20 61 6c 6c 20 41  erify that all A
28bb0 67 67 49 6e 66 6f 20 72 65 67 69 73 74 65 72 73  ggInfo registers
28bc0 20 61 72 65 20 77 69 74 68 69 6e 20 74 68 65 20   are within the 
28bd0 72 61 6e 67 65 20 73 70 65 63 69 66 69 65 64 20  range specified 
28be0 62 79 0a 20 20 2a 2a 20 41 67 67 49 6e 66 6f 2e  by.  ** AggInfo.
28bf0 6d 6e 52 65 67 2e 2e 41 67 67 49 6e 66 6f 2e 6d  mnReg..AggInfo.m
28c00 78 52 65 67 20 2a 2f 0a 20 20 61 73 73 65 72 74  xReg */.  assert
28c10 28 20 6e 52 65 67 3d 3d 70 41 67 67 49 6e 66 6f  ( nReg==pAggInfo
28c20 2d 3e 6d 78 52 65 67 2d 70 41 67 67 49 6e 66 6f  ->mxReg-pAggInfo
28c30 2d 3e 6d 6e 52 65 67 2b 31 20 29 3b 0a 20 20 66  ->mnReg+1 );.  f
28c40 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e  or(i=0; i<pAggIn
28c50 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  fo->nColumn; i++
28c60 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
28c70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d  AggInfo->aCol[i]
28c80 2e 69 4d 65 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d  .iMem>=pAggInfo-
28c90 3e 6d 6e 52 65 67 0a 20 20 20 20 20 20 20 20 20  >mnReg.         
28ca0 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  && pAggInfo->aCo
28cb0 6c 5b 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67 49  l[i].iMem<=pAggI
28cc0 6e 66 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a 20 20  nfo->mxReg );.  
28cd0 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  }.  for(i=0; i<p
28ce0 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20  AggInfo->nFunc; 
28cf0 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  i++){.    assert
28d00 28 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  ( pAggInfo->aFun
28d10 63 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41 67 67 49  c[i].iMem>=pAggI
28d20 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20 20 20 20  nfo->mnReg.     
28d30 20 20 20 20 26 26 20 70 41 67 67 49 6e 66 6f 2d      && pAggInfo-
28d40 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d 3c 3d  >aFunc[i].iMem<=
28d50 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 20  pAggInfo->mxReg 
28d60 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
28d70 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
28d80 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  3(v, OP_Null, 0,
28d90 20 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67   pAggInfo->mnReg
28da0 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65  , pAggInfo->mxRe
28db0 67 29 3b 0a 20 20 66 6f 72 28 70 46 75 6e 63 3d  g);.  for(pFunc=
28dc0 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c  pAggInfo->aFunc,
28dd0 20 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f   i=0; i<pAggInfo
28de0 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46  ->nFunc; i++, pF
28df0 75 6e 63 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  unc++){.    if( 
28e00 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74  pFunc->iDistinct
28e10 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70  >=0 ){.      Exp
28e20 72 20 2a 70 45 20 3d 20 70 46 75 6e 63 2d 3e 70  r *pE = pFunc->p
28e30 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65  Expr;.      asse
28e40 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
28e50 65 72 74 79 28 70 45 2c 20 45 50 5f 78 49 73 53  erty(pE, EP_xIsS
28e60 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
28e70 69 66 28 20 70 45 2d 3e 78 2e 70 4c 69 73 74 3d  if( pE->x.pList=
28e80 3d 30 20 7c 7c 20 70 45 2d 3e 78 2e 70 4c 69 73  =0 || pE->x.pLis
28e90 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20  t->nExpr!=1 ){. 
28ea0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
28eb0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
28ec0 44 49 53 54 49 4e 43 54 20 61 67 67 72 65 67 61  DISTINCT aggrega
28ed0 74 65 73 20 6d 75 73 74 20 68 61 76 65 20 65 78  tes must have ex
28ee0 61 63 74 6c 79 20 6f 6e 65 20 22 0a 20 20 20 20  actly one ".    
28ef0 20 20 20 20 20 20 20 22 61 72 67 75 6d 65 6e 74         "argument
28f00 22 29 3b 0a 20 20 20 20 20 20 20 20 70 46 75 6e  ");.        pFun
28f10 63 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d  c->iDistinct = -
28f20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
28f30 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20          KeyInfo 
28f40 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49  *pKeyInfo = keyI
28f50 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
28f60 70 50 61 72 73 65 2c 20 70 45 2d 3e 78 2e 70 4c  pParse, pE->x.pL
28f70 69 73 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ist, 0, 0);.    
28f80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
28f90 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp4(v, OP_Open
28fa0 45 70 68 65 6d 65 72 61 6c 2c 20 70 46 75 6e 63  Ephemeral, pFunc
28fb0 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 30 2c 20  ->iDistinct, 0, 
28fc0 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
28fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
28fe0 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  ar*)pKeyInfo, P4
28ff0 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20  _KEYINFO);.     
29000 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
29010 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  /*.** Invoke the
29020 20 4f 50 5f 41 67 67 46 69 6e 61 6c 69 7a 65 20   OP_AggFinalize 
29030 6f 70 63 6f 64 65 20 66 6f 72 20 65 76 65 72 79  opcode for every
29040 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
29050 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 41 67  ion.** in the Ag
29060 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  gInfo structure.
29070 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
29080 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74  finalizeAggFunct
29090 69 6f 6e 73 28 50 61 72 73 65 20 2a 70 50 61 72  ions(Parse *pPar
290a0 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67  se, AggInfo *pAg
290b0 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a  gInfo){.  Vdbe *
290c0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
290d0 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  e;.  int i;.  st
290e0 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e  ruct AggInfo_fun
290f0 63 20 2a 70 46 3b 0a 20 20 66 6f 72 28 69 3d 30  c *pF;.  for(i=0
29100 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61  , pF=pAggInfo->a
29110 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f  Func; i<pAggInfo
29120 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46  ->nFunc; i++, pF
29130 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73  ++){.    ExprLis
29140 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70  t *pList = pF->p
29150 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
29160 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
29170 48 61 73 50 72 6f 70 65 72 74 79 28 70 46 2d 3e  HasProperty(pF->
29180 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
29190 65 63 74 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  ect) );.    sqli
291a0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
291b0 20 4f 50 5f 41 67 67 46 69 6e 61 6c 2c 20 70 46   OP_AggFinal, pF
291c0 2d 3e 69 4d 65 6d 2c 20 70 4c 69 73 74 20 3f 20  ->iMem, pList ? 
291d0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30  pList->nExpr : 0
291e0 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
291f0 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
29200 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f  *)pF->pFunc, P4_
29210 46 55 4e 43 44 45 46 29 3b 0a 20 20 7d 0a 7d 0a  FUNCDEF);.  }.}.
29220 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68  ./*.** Update th
29230 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 6d 65  e accumulator me
29240 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20 61  mory cells for a
29250 6e 20 61 67 67 72 65 67 61 74 65 20 62 61 73 65  n aggregate base
29260 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 75 72 72  d on.** the curr
29270 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74  ent cursor posit
29280 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
29290 6f 69 64 20 75 70 64 61 74 65 41 63 63 75 6d 75  oid updateAccumu
292a0 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61  lator(Parse *pPa
292b0 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41  rse, AggInfo *pA
292c0 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20  ggInfo){.  Vdbe 
292d0 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
292e0 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  be;.  int i;.  i
292f0 6e 74 20 72 65 67 48 69 74 20 3d 20 30 3b 0a 20  nt regHit = 0;. 
29300 20 69 6e 74 20 61 64 64 72 48 69 74 54 65 73 74   int addrHitTest
29310 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74 20 41   = 0;.  struct A
29320 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b  ggInfo_func *pF;
29330 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66  .  struct AggInf
29340 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20 70 41  o_col *pC;..  pA
29350 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f  ggInfo->directMo
29360 64 65 20 3d 20 31 3b 0a 20 20 66 6f 72 28 69 3d  de = 1;.  for(i=
29370 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e  0, pF=pAggInfo->
29380 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66  aFunc; i<pAggInf
29390 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70  o->nFunc; i++, p
293a0 46 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41  F++){.    int nA
293b0 72 67 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72  rg;.    int addr
293c0 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e  Next = 0;.    in
293d0 74 20 72 65 67 41 67 67 3b 0a 20 20 20 20 45 78  t regAgg;.    Ex
293e0 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
293f0 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69  pF->pExpr->x.pLi
29400 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  st;.    assert( 
29410 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
29420 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78  (pF->pExpr, EP_x
29430 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
29440 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
29450 20 20 20 20 6e 41 72 67 20 3d 20 70 4c 69 73 74      nArg = pList
29460 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 72  ->nExpr;.      r
29470 65 67 41 67 67 20 3d 20 73 71 6c 69 74 65 33 47  egAgg = sqlite3G
29480 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
29490 73 65 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 20  se, nArg);.     
294a0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
294b0 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
294c0 20 70 4c 69 73 74 2c 20 72 65 67 41 67 67 2c 20   pList, regAgg, 
294d0 30 2c 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44  0, SQLITE_ECEL_D
294e0 55 50 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  UP);.    }else{.
294f0 20 20 20 20 20 20 6e 41 72 67 20 3d 20 30 3b 0a        nArg = 0;.
29500 20 20 20 20 20 20 72 65 67 41 67 67 20 3d 20 30        regAgg = 0
29510 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
29520 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30  pF->iDistinct>=0
29530 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 4e 65   ){.      addrNe
29540 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  xt = sqlite3Vdbe
29550 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
29560 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 41      testcase( nA
29570 72 67 3d 3d 30 20 29 3b 20 20 2f 2a 20 45 72 72  rg==0 );  /* Err
29580 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 2a 2f 0a  or condition */.
29590 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
295a0 6e 41 72 67 3e 31 20 29 3b 20 20 20 2f 2a 20 41  nArg>1 );   /* A
295b0 6c 73 6f 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a  lso an error */.
295c0 20 20 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e        codeDistin
295d0 63 74 28 70 50 61 72 73 65 2c 20 70 46 2d 3e 69  ct(pParse, pF->i
295e0 44 69 73 74 69 6e 63 74 2c 20 61 64 64 72 4e 65  Distinct, addrNe
295f0 78 74 2c 20 31 2c 20 72 65 67 41 67 67 29 3b 0a  xt, 1, regAgg);.
29600 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46      }.    if( pF
29610 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61  ->pFunc->funcFla
29620 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
29630 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20  _NEEDCOLL ){.   
29640 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
29650 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 72  l = 0;.      str
29660 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
29670 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20  m *pItem;.      
29680 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 61 73 73  int j;.      ass
29690 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b  ert( pList!=0 );
296a0 20 20 2f 2a 20 70 4c 69 73 74 21 3d 30 20 69 66    /* pList!=0 if
296b0 20 70 46 2d 3e 70 46 75 6e 63 20 68 61 73 20 4e   pF->pFunc has N
296c0 45 45 44 43 4f 4c 4c 20 2a 2f 0a 20 20 20 20 20  EEDCOLL */.     
296d0 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d   for(j=0, pItem=
296e0 70 4c 69 73 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c  pList->a; !pColl
296f0 20 26 26 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c   && j<nArg; j++,
29700 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
29710 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
29720 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
29730 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78  arse, pItem->pEx
29740 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  pr);.      }.   
29750 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b     if( !pColl ){
29760 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
29770 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66   pParse->db->pDf
29780 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  ltColl;.      }.
29790 20 20 20 20 20 20 69 66 28 20 72 65 67 48 69 74        if( regHit
297a0 3d 3d 30 20 26 26 20 70 41 67 67 49 6e 66 6f 2d  ==0 && pAggInfo-
297b0 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 29 20  >nAccumulator ) 
297c0 72 65 67 48 69 74 20 3d 20 2b 2b 70 50 61 72 73  regHit = ++pPars
297d0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73  e->nMem;.      s
297e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
297f0 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20  (v, OP_CollSeq, 
29800 72 65 67 48 69 74 2c 20 30 2c 20 30 2c 20 28 63  regHit, 0, 0, (c
29810 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f  har *)pColl, P4_
29820 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 7d 0a  COLLSEQ);.    }.
29830 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
29840 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67 53  ddOp4(v, OP_AggS
29850 74 65 70 30 2c 20 30 2c 20 72 65 67 41 67 67 2c  tep0, 0, regAgg,
29860 20 70 46 2d 3e 69 4d 65 6d 2c 0a 20 20 20 20 20   pF->iMem,.     
29870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29880 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e   (void*)pF->pFun
29890 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a  c, P4_FUNCDEF);.
298a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
298b0 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29 6e  hangeP5(v, (u8)n
298c0 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Arg);.    sqlite
298d0 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
298e0 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
298f0 20 72 65 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a   regAgg, nArg);.
29900 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
29910 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  seTempRange(pPar
29920 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41 72 67  se, regAgg, nArg
29930 29 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72 4e  );.    if( addrN
29940 65 78 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ext ){.      sql
29950 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
29960 61 62 65 6c 28 76 2c 20 61 64 64 72 4e 65 78 74  abel(v, addrNext
29970 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
29980 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
29990 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Parse);.    }.  
299a0 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 70  }..  /* Before p
299b0 6f 70 75 6c 61 74 69 6e 67 20 74 68 65 20 61 63  opulating the ac
299c0 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69 73 74  cumulator regist
299d0 65 72 73 2c 20 63 6c 65 61 72 20 74 68 65 20 63  ers, clear the c
299e0 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 20 20 2a  olumn cache..  *
299f0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
29a00 61 6e 79 20 6f 66 20 74 68 65 20 72 65 71 75 69  any of the requi
29a10 72 65 64 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  red column value
29a20 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 70 72  s are already pr
29a30 65 73 65 6e 74 20 0a 20 20 2a 2a 20 69 6e 20 72  esent .  ** in r
29a40 65 67 69 73 74 65 72 73 2c 20 73 71 6c 69 74 65  egisters, sqlite
29a50 33 45 78 70 72 43 6f 64 65 28 29 20 6d 61 79 20  3ExprCode() may 
29a60 75 73 65 20 4f 50 5f 53 43 6f 70 79 20 74 6f 20  use OP_SCopy to 
29a70 63 6f 70 79 20 74 68 65 20 76 61 6c 75 65 0a 20  copy the value. 
29a80 20 2a 2a 20 74 6f 20 70 43 2d 3e 69 4d 65 6d 2e   ** to pC->iMem.
29a90 20 42 75 74 20 62 79 20 74 68 65 20 74 69 6d 65   But by the time
29aa0 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 75 73   the value is us
29ab0 65 64 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  ed, the original
29ac0 20 72 65 67 69 73 74 65 72 0a 20 20 2a 2a 20 6d   register.  ** m
29ad0 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 73 65  ay have been use
29ae0 64 2c 20 69 6e 76 61 6c 69 64 61 74 69 6e 67 20  d, invalidating 
29af0 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 62  the underlying b
29b00 75 66 66 65 72 20 68 6f 6c 64 69 6e 67 20 74 68  uffer holding th
29b10 65 0a 20 20 2a 2a 20 74 65 78 74 20 6f 72 20 62  e.  ** text or b
29b20 6c 6f 62 20 76 61 6c 75 65 2e 20 53 65 65 20 74  lob value. See t
29b30 69 63 6b 65 74 20 5b 38 38 33 30 33 34 64 63 62  icket [883034dcb
29b40 35 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e  5]..  **.  ** An
29b50 6f 74 68 65 72 20 73 6f 6c 75 74 69 6f 6e 20 77  other solution w
29b60 6f 75 6c 64 20 62 65 20 74 6f 20 63 68 61 6e 67  ould be to chang
29b70 65 20 74 68 65 20 4f 50 5f 53 43 6f 70 79 20 75  e the OP_SCopy u
29b80 73 65 64 20 74 6f 20 63 6f 70 79 20 63 61 63 68  sed to copy cach
29b90 65 64 0a 20 20 2a 2a 20 76 61 6c 75 65 73 20 74  ed.  ** values t
29ba0 6f 20 61 6e 20 4f 50 5f 43 6f 70 79 2e 0a 20 20  o an OP_Copy..  
29bb0 2a 2f 0a 20 20 69 66 28 20 72 65 67 48 69 74 20  */.  if( regHit 
29bc0 29 7b 0a 20 20 20 20 61 64 64 72 48 69 74 54 65  ){.    addrHitTe
29bd0 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  st = sqlite3Vdbe
29be0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c  AddOp1(v, OP_If,
29bf0 20 72 65 67 48 69 74 29 3b 20 56 64 62 65 43 6f   regHit); VdbeCo
29c00 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20  verage(v);.  }. 
29c10 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
29c20 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
29c30 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 3d 70 41    for(i=0, pC=pA
29c40 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c  ggInfo->aCol; i<
29c50 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d  pAggInfo->nAccum
29c60 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b  ulator; i++, pC+
29c70 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  +){.    sqlite3E
29c80 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
29c90 70 43 2d 3e 70 45 78 70 72 2c 20 70 43 2d 3e 69  pC->pExpr, pC->i
29ca0 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 70 41 67 67  Mem);.  }.  pAgg
29cb0 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65  Info->directMode
29cc0 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45   = 0;.  sqlite3E
29cd0 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
29ce0 61 72 73 65 29 3b 0a 20 20 69 66 28 20 61 64 64  arse);.  if( add
29cf0 72 48 69 74 54 65 73 74 20 29 7b 0a 20 20 20 20  rHitTest ){.    
29d00 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
29d10 65 72 65 28 76 2c 20 61 64 64 72 48 69 74 54 65  ere(v, addrHitTe
29d20 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  st);.  }.}../*.*
29d30 2a 20 41 64 64 20 61 20 73 69 6e 67 6c 65 20 4f  * Add a single O
29d40 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72 75  P_Explain instru
29d50 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 56 44 42  ction to the VDB
29d60 45 20 74 6f 20 65 78 70 6c 61 69 6e 20 61 20 73  E to explain a s
29d70 69 6d 70 6c 65 0a 2a 2a 20 63 6f 75 6e 74 28 2a  imple.** count(*
29d80 29 20 71 75 65 72 79 20 28 22 53 45 4c 45 43 54  ) query ("SELECT
29d90 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 70   count(*) FROM p
29da0 54 61 62 22 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65  Tab")..*/.#ifnde
29db0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
29dc0 50 4c 41 49 4e 0a 73 74 61 74 69 63 20 76 6f 69  PLAIN.static voi
29dd0 64 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43  d explainSimpleC
29de0 6f 75 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70  ount(.  Parse *p
29df0 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
29e00 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
29e10 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61   context */.  Ta
29e20 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20  ble *pTab,      
29e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29e40 20 54 61 62 6c 65 20 62 65 69 6e 67 20 71 75 65   Table being que
29e50 72 69 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20  ried */.  Index 
29e60 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 20 20  *pIdx           
29e70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
29e80 65 78 20 75 73 65 64 20 74 6f 20 6f 70 74 69 6d  ex used to optim
29e90 69 7a 65 20 73 63 61 6e 2c 20 6f 72 20 4e 55 4c  ize scan, or NUL
29ea0 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 50  L */.){.  if( pP
29eb0 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  arse->explain==2
29ec0 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 43 6f 76   ){.    int bCov
29ed0 65 72 20 3d 20 28 70 49 64 78 21 3d 30 20 26 26  er = (pIdx!=0 &&
29ee0 20 28 48 61 73 52 6f 77 69 64 28 70 54 61 62 29   (HasRowid(pTab)
29ef0 20 7c 7c 20 21 49 73 50 72 69 6d 61 72 79 4b 65   || !IsPrimaryKe
29f00 79 49 6e 64 65 78 28 70 49 64 78 29 29 29 3b 0a  yIndex(pIdx)));.
29f10 20 20 20 20 63 68 61 72 20 2a 7a 45 71 70 20 3d      char *zEqp =
29f20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
29f30 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 53 43 41  pParse->db, "SCA
29f40 4e 20 54 41 42 4c 45 20 25 73 25 73 25 73 22 2c  N TABLE %s%s%s",
29f50 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a  .        pTab->z
29f60 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 62 43  Name,.        bC
29f70 6f 76 65 72 20 3f 20 22 20 55 53 49 4e 47 20 43  over ? " USING C
29f80 4f 56 45 52 49 4e 47 20 49 4e 44 45 58 20 22 20  OVERING INDEX " 
29f90 3a 20 22 22 2c 0a 20 20 20 20 20 20 20 20 62 43  : "",.        bC
29fa0 6f 76 65 72 20 3f 20 70 49 64 78 2d 3e 7a 4e 61  over ? pIdx->zNa
29fb0 6d 65 20 3a 20 22 22 0a 20 20 20 20 29 3b 0a 20  me : "".    );. 
29fc0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
29fd0 64 4f 70 34 28 0a 20 20 20 20 20 20 20 20 70 50  dOp4(.        pP
29fe0 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f  arse->pVdbe, OP_
29ff0 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d  Explain, pParse-
2a000 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30  >iSelectId, 0, 0
2a010 2c 20 7a 45 71 70 2c 20 50 34 5f 44 59 4e 41 4d  , zEqp, P4_DYNAM
2a020 49 43 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a  IC.    );.  }.}.
2a030 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 65  #else.# define e
2a040 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e  xplainSimpleCoun
2a050 74 28 61 2c 62 2c 63 29 0a 23 65 6e 64 69 66 0a  t(a,b,c).#endif.
2a060 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
2a070 63 6f 64 65 20 66 6f 72 20 74 68 65 20 53 45 4c  code for the SEL
2a080 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 67 69  ECT statement gi
2a090 76 65 6e 20 69 6e 20 74 68 65 20 70 20 61 72 67  ven in the p arg
2a0a0 75 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 54  ument.  .**.** T
2a0b0 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 72  he results are r
2a0c0 65 74 75 72 6e 65 64 20 61 63 63 6f 72 64 69 6e  eturned accordin
2a0d0 67 20 74 6f 20 74 68 65 20 53 65 6c 65 63 74 44  g to the SelectD
2a0e0 65 73 74 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  est structure..*
2a0f0 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 69  * See comments i
2a100 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68 20 66 6f  n sqliteInt.h fo
2a110 72 20 66 75 72 74 68 65 72 20 69 6e 66 6f 72 6d  r further inform
2a120 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ation..**.** Thi
2a130 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
2a140 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
2a150 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 79 20  errors.  If any 
2a160 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65 6e  errors are.** en
2a170 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20  countered, then 
2a180 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
2a190 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20  rror message is 
2a1a0 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72 73  left in.** pPars
2a1b0 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a  e->zErrMsg..**.*
2a1c0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
2a1d0 6f 65 73 20 4e 4f 54 20 66 72 65 65 20 74 68 65  oes NOT free the
2a1e0 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72   Select structur
2a1f0 65 20 70 61 73 73 65 64 20 69 6e 2e 20 20 54 68  e passed in.  Th
2a200 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75 6e  e.** calling fun
2a210 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 64  ction needs to d
2a220 6f 20 74 68 61 74 2e 0a 2a 2f 0a 69 6e 74 20 73  o that..*/.int s
2a230 71 6c 69 74 65 33 53 65 6c 65 63 74 28 0a 20 20  qlite3Select(.  
2a240 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
2a250 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
2a260 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
2a270 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
2a280 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2a290 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
2a2a0 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f   being coded. */
2a2b0 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
2a2c0 44 65 73 74 20 20 20 20 20 20 2f 2a 20 57 68 61  Dest      /* Wha
2a2d0 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65  t to do with the
2a2e0 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
2a2f0 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  /.){.  int i, j;
2a300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a310 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
2a320 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  /.  WhereInfo *p
2a330 57 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 52 65  WInfo;     /* Re
2a340 74 75 72 6e 20 66 72 6f 6d 20 73 71 6c 69 74 65  turn from sqlite
2a350 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 2a 2f  3WhereBegin() */
2a360 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
2a370 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2a380 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
2a390 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
2a3a0 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41  ion */.  int isA
2a3b0 67 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gg;             
2a3c0 2f 2a 20 54 72 75 65 20 66 6f 72 20 73 65 6c 65  /* True for sele
2a3d0 63 74 20 6c 69 73 74 73 20 6c 69 6b 65 20 22 63  ct lists like "c
2a3e0 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78  ount(*)" */.  Ex
2a3f0 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d  prList *pEList =
2a400 20 30 3b 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20   0;  /* List of 
2a410 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72 61  columns to extra
2a420 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ct. */.  SrcList
2a430 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20   *pTabList;     
2a440 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65  /* List of table
2a450 73 20 74 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d  s to select from
2a460 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
2a470 72 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  re;          /* 
2a480 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
2a490 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  .  May be NULL *
2a4a0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47  /.  ExprList *pG
2a4b0 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20 54 68  roupBy;    /* Th
2a4c0 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  e GROUP BY claus
2a4d0 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
2a4e0 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69  */.  Expr *pHavi
2a4f0 6e 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ng;         /* T
2a500 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65  he HAVING clause
2a510 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  .  May be NULL *
2a520 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 31 3b 20  /.  int rc = 1; 
2a530 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
2a540 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 66 72  lue to return fr
2a550 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  om this function
2a560 20 2a 2f 0a 20 20 44 69 73 74 69 6e 63 74 43 74   */.  DistinctCt
2a570 78 20 73 44 69 73 74 69 6e 63 74 3b 20 2f 2a 20  x sDistinct; /* 
2a580 49 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 63  Info on how to c
2a590 6f 64 65 20 74 68 65 20 44 49 53 54 49 4e 43 54  ode the DISTINCT
2a5a0 20 6b 65 79 77 6f 72 64 20 2a 2f 0a 20 20 53 6f   keyword */.  So
2a5b0 72 74 43 74 78 20 73 53 6f 72 74 3b 20 20 20 20  rtCtx sSort;    
2a5c0 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20       /* Info on 
2a5d0 68 6f 77 20 74 6f 20 63 6f 64 65 20 74 68 65 20  how to code the 
2a5e0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
2a5f0 2a 2f 0a 20 20 41 67 67 49 6e 66 6f 20 73 41 67  */.  AggInfo sAg
2a600 67 49 6e 66 6f 3b 20 20 20 20 20 20 2f 2a 20 49  gInfo;      /* I
2a610 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64 20  nformation used 
2a620 62 79 20 61 67 67 72 65 67 61 74 65 20 71 75 65  by aggregate que
2a630 72 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45  ries */.  int iE
2a640 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nd;             
2a650 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
2a660 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 71 75  he end of the qu
2a670 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ery */.  sqlite3
2a680 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
2a690 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
2a6a0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 23  connection */..#
2a6b0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2a6c0 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74  IT_EXPLAIN.  int
2a6d0 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63 74 49   iRestoreSelectI
2a6e0 64 20 3d 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  d = pParse->iSel
2a6f0 65 63 74 49 64 3b 0a 20 20 70 50 61 72 73 65 2d  ectId;.  pParse-
2a700 3e 69 53 65 6c 65 63 74 49 64 20 3d 20 70 50 61  >iSelectId = pPa
2a710 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
2a720 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  Id++;.#endif..  
2a730 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
2a740 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 64  .  if( p==0 || d
2a750 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2a760 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
2a770 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
2a780 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
2a790 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
2a7a0 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43  se, SQLITE_SELEC
2a7b0 54 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72 65  T, 0, 0, 0) ) re
2a7c0 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 73 65 74  turn 1;.  memset
2a7d0 28 26 73 41 67 67 49 6e 66 6f 2c 20 30 2c 20 73  (&sAggInfo, 0, s
2a7e0 69 7a 65 6f 66 28 73 41 67 67 49 6e 66 6f 29 29  izeof(sAggInfo))
2a7f0 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  ;.#if SELECTTRAC
2a800 45 5f 45 4e 41 42 4c 45 44 0a 20 20 70 50 61 72  E_ENABLED.  pPar
2a810 73 65 2d 3e 6e 53 65 6c 65 63 74 49 6e 64 65 6e  se->nSelectInden
2a820 74 2b 2b 3b 0a 20 20 53 45 4c 45 43 54 54 52 41  t++;.  SELECTTRA
2a830 43 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 20 28  CE(1,pParse,p, (
2a840 22 62 65 67 69 6e 20 70 72 6f 63 65 73 73 69 6e  "begin processin
2a850 67 3a 5c 6e 22 29 29 3b 0a 20 20 69 66 28 20 73  g:\n"));.  if( s
2a860 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
2a870 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20 20 20  e & 0x100 ){.   
2a880 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
2a890 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b  Select(0, p, 0);
2a8a0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61  .  }.#endif..  a
2a8b0 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
2a8c0 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e  By==0 || pDest->
2a8d0 65 44 65 73 74 21 3d 53 52 54 5f 44 69 73 74 46  eDest!=SRT_DistF
2a8e0 69 66 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ifo );.  assert(
2a8f0 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20   p->pOrderBy==0 
2a900 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21  || pDest->eDest!
2a910 3d 53 52 54 5f 46 69 66 6f 20 29 3b 0a 20 20 61  =SRT_Fifo );.  a
2a920 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
2a930 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e  By==0 || pDest->
2a940 65 44 65 73 74 21 3d 53 52 54 5f 44 69 73 74 51  eDest!=SRT_DistQ
2a950 75 65 75 65 20 29 3b 0a 20 20 61 73 73 65 72 74  ueue );.  assert
2a960 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
2a970 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74   || pDest->eDest
2a980 21 3d 53 52 54 5f 51 75 65 75 65 20 29 3b 0a 20  !=SRT_Queue );. 
2a990 20 69 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72   if( IgnorableOr
2a9a0 64 65 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a  derby(pDest) ){.
2a9b0 20 20 20 20 61 73 73 65 72 74 28 70 44 65 73 74      assert(pDest
2a9c0 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 69  ->eDest==SRT_Exi
2a9d0 73 74 73 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44  sts || pDest->eD
2a9e0 65 73 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20 7c  est==SRT_Union |
2a9f0 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 70 44  | .           pD
2aa00 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
2aa10 45 78 63 65 70 74 20 7c 7c 20 70 44 65 73 74 2d  Except || pDest-
2aa20 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63  >eDest==SRT_Disc
2aa30 61 72 64 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ard ||.         
2aa40 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d    pDest->eDest==
2aa50 53 52 54 5f 51 75 65 75 65 20 20 7c 7c 20 70 44  SRT_Queue  || pD
2aa60 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
2aa70 44 69 73 74 46 69 66 6f 20 7c 7c 0a 20 20 20 20  DistFifo ||.    
2aa80 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44         pDest->eD
2aa90 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 51 75 65  est==SRT_DistQue
2aaa0 75 65 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65  ue || pDest->eDe
2aab0 73 74 3d 3d 53 52 54 5f 46 69 66 6f 29 3b 0a 20  st==SRT_Fifo);. 
2aac0 20 20 20 2f 2a 20 49 66 20 4f 52 44 45 52 20 42     /* If ORDER B
2aad0 59 20 6d 61 6b 65 73 20 6e 6f 20 64 69 66 66 65  Y makes no diffe
2aae0 72 65 6e 63 65 20 69 6e 20 74 68 65 20 6f 75 74  rence in the out
2aaf0 70 75 74 20 74 68 65 6e 20 6e 65 69 74 68 65 72  put then neither
2ab00 20 64 6f 65 73 0a 20 20 20 20 2a 2a 20 44 49 53   does.    ** DIS
2ab10 54 49 4e 43 54 20 73 6f 20 69 74 20 63 61 6e 20  TINCT so it can 
2ab20 62 65 20 72 65 6d 6f 76 65 64 20 74 6f 6f 2e 20  be removed too. 
2ab30 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  */.    sqlite3Ex
2ab40 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
2ab50 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20   p->pOrderBy);. 
2ab60 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
2ab70 20 30 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c   0;.    p->selFl
2ab80 61 67 73 20 26 3d 20 7e 53 46 5f 44 69 73 74 69  ags &= ~SF_Disti
2ab90 6e 63 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  nct;.  }.  sqlit
2aba0 65 33 53 65 6c 65 63 74 50 72 65 70 28 70 50 61  e3SelectPrep(pPa
2abb0 72 73 65 2c 20 70 2c 20 30 29 3b 0a 20 20 6d 65  rse, p, 0);.  me
2abc0 6d 73 65 74 28 26 73 53 6f 72 74 2c 20 30 2c 20  mset(&sSort, 0, 
2abd0 73 69 7a 65 6f 66 28 73 53 6f 72 74 29 29 3b 0a  sizeof(sSort));.
2abe0 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79    sSort.pOrderBy
2abf0 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
2ac00 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
2ac10 70 53 72 63 3b 0a 20 20 69 66 28 20 70 50 61 72  pSrc;.  if( pPar
2ac20 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e  se->nErr || db->
2ac30 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
2ac40 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
2ac50 65 6e 64 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  end;.  }.  asser
2ac60 74 28 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20  t( p->pEList!=0 
2ac70 29 3b 0a 20 20 69 73 41 67 67 20 3d 20 28 70 2d  );.  isAgg = (p-
2ac80 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41  >selFlags & SF_A
2ac90 67 67 72 65 67 61 74 65 29 21 3d 30 3b 0a 23 69  ggregate)!=0;.#i
2aca0 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e  f SELECTTRACE_EN
2acb0 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69  ABLED.  if( sqli
2acc0 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26  te3SelectTrace &
2acd0 20 30 78 31 30 30 20 29 7b 0a 20 20 20 20 53 45   0x100 ){.    SE
2ace0 4c 45 43 54 54 52 41 43 45 28 30 78 31 30 30 2c  LECTTRACE(0x100,
2acf0 70 50 61 72 73 65 2c 70 2c 20 28 22 61 66 74 65  pParse,p, ("afte
2ad00 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f  r name resolutio
2ad10 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c  n:\n"));.    sql
2ad20 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65  ite3TreeViewSele
2ad30 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d  ct(0, p, 0);.  }
2ad40 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 54 72  .#endif..  /* Tr
2ad50 79 20 74 6f 20 66 6c 61 74 74 65 6e 20 73 75 62  y to flatten sub
2ad60 71 75 65 72 69 65 73 20 69 6e 20 74 68 65 20 46  queries in the F
2ad70 52 4f 4d 20 63 6c 61 75 73 65 20 75 70 20 69 6e  ROM clause up in
2ad80 74 6f 20 74 68 65 20 6d 61 69 6e 20 71 75 65 72  to the main quer
2ad90 79 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69  y.  */.#if !defi
2ada0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
2adb0 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65  SUBQUERY) || !de
2adc0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
2add0 54 5f 56 49 45 57 29 0a 20 20 66 6f 72 28 69 3d  T_VIEW).  for(i=
2ade0 30 3b 20 21 70 2d 3e 70 50 72 69 6f 72 20 26 26  0; !p->pPrior &&
2adf0 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
2ae00 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  c; i++){.    str
2ae10 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
2ae20 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c   *pItem = &pTabL
2ae30 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 53  ist->a[i];.    S
2ae40 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70 49  elect *pSub = pI
2ae50 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  tem->pSelect;.  
2ae60 20 20 69 6e 74 20 69 73 41 67 67 53 75 62 3b 0a    int isAggSub;.
2ae70 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
2ae80 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  = pItem->pTab;. 
2ae90 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20 29     if( pSub==0 )
2aea0 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20   continue;..    
2aeb0 2f 2a 20 43 61 74 63 68 20 6d 69 73 6d 61 74 63  /* Catch mismatc
2aec0 68 20 69 6e 20 74 68 65 20 64 65 63 6c 61 72 65  h in the declare
2aed0 64 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 61 20 76  d columns of a v
2aee0 69 65 77 20 61 6e 64 20 74 68 65 20 6e 75 6d 62  iew and the numb
2aef0 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 63 6f 6c  er of.    ** col
2af00 75 6d 6e 73 20 69 6e 20 74 68 65 20 53 45 4c 45  umns in the SELE
2af10 43 54 20 6f 6e 20 74 68 65 20 52 48 53 20 2a 2f  CT on the RHS */
2af20 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 6e  .    if( pTab->n
2af30 43 6f 6c 21 3d 70 53 75 62 2d 3e 70 45 4c 69 73  Col!=pSub->pELis
2af40 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
2af50 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
2af60 67 28 70 50 61 72 73 65 2c 20 22 65 78 70 65 63  g(pParse, "expec
2af70 74 65 64 20 25 64 20 63 6f 6c 75 6d 6e 73 20 66  ted %d columns f
2af80 6f 72 20 27 25 73 27 20 62 75 74 20 67 6f 74 20  or '%s' but got 
2af90 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %d",.           
2afa0 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d             pTab-
2afb0 3e 6e 43 6f 6c 2c 20 70 54 61 62 2d 3e 7a 4e 61  >nCol, pTab->zNa
2afc0 6d 65 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  me, pSub->pEList
2afd0 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->nExpr);.      
2afe0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
2aff0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 73 41 67  .    }..    isAg
2b000 67 53 75 62 20 3d 20 28 70 53 75 62 2d 3e 73 65  gSub = (pSub->se
2b010 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72  lFlags & SF_Aggr
2b020 65 67 61 74 65 29 21 3d 30 3b 0a 20 20 20 20 69  egate)!=0;.    i
2b030 66 28 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65  f( flattenSubque
2b040 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20 69 2c  ry(pParse, p, i,
2b050 20 69 73 41 67 67 2c 20 69 73 41 67 67 53 75 62   isAgg, isAggSub
2b060 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  ) ){.      /* Th
2b070 69 73 20 73 75 62 71 75 65 72 79 20 63 61 6e 20  is subquery can 
2b080 62 65 20 61 62 73 6f 72 62 65 64 20 69 6e 74 6f  be absorbed into
2b090 20 69 74 73 20 70 61 72 65 6e 74 2e 20 2a 2f 0a   its parent. */.
2b0a0 20 20 20 20 20 20 69 66 28 20 69 73 41 67 67 53        if( isAggS
2b0b0 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 69 73  ub ){.        is
2b0c0 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Agg = 1;.       
2b0d0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20   p->selFlags |= 
2b0e0 53 46 5f 41 67 67 72 65 67 61 74 65 3b 0a 20 20  SF_Aggregate;.  
2b0f0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 20 3d 20      }.      i = 
2b100 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54  -1;.    }.    pT
2b110 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63  abList = p->pSrc
2b120 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  ;.    if( db->ma
2b130 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74  llocFailed ) got
2b140 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
2b150 20 20 69 66 28 20 21 49 67 6e 6f 72 61 62 6c 65    if( !Ignorable
2b160 4f 72 64 65 72 62 79 28 70 44 65 73 74 29 20 29  Orderby(pDest) )
2b170 7b 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f  {.      sSort.pO
2b180 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
2b190 65 72 42 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  erBy;.    }.  }.
2b1a0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 74  #endif..  /* Get
2b1b0 20 61 20 70 6f 69 6e 74 65 72 20 74 68 65 20 56   a pointer the V
2b1c0 44 42 45 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  DBE under constr
2b1d0 75 63 74 69 6f 6e 2c 20 61 6c 6c 6f 63 61 74 69  uction, allocati
2b1e0 6e 67 20 61 20 6e 65 77 20 56 44 42 45 20 69 66  ng a new VDBE if
2b1f0 20 6f 6e 65 0a 20 20 2a 2a 20 64 6f 65 73 20 6e   one.  ** does n
2b200 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ot already exist
2b210 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
2b220 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
2b230 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67  ;.  if( v==0 ) g
2b240 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
2b250 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2b260 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
2b270 4c 45 43 54 0a 20 20 2f 2a 20 48 61 6e 64 6c 65  LECT.  /* Handle
2b280 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
2b290 20 73 74 61 74 65 6d 65 6e 74 73 20 75 73 69 6e   statements usin
2b2a0 67 20 74 68 65 20 73 65 70 61 72 61 74 65 20 6d  g the separate m
2b2b0 75 6c 74 69 53 65 6c 65 63 74 28 29 0a 20 20 2a  ultiSelect().  *
2b2c0 2a 20 70 72 6f 63 65 64 75 72 65 2e 0a 20 20 2a  * procedure..  *
2b2d0 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  /.  if( p->pPrio
2b2e0 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d 75  r ){.    rc = mu
2b2f0 6c 74 69 53 65 6c 65 63 74 28 70 50 61 72 73 65  ltiSelect(pParse
2b300 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 20  , p, pDest);.   
2b310 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
2b320 65 72 28 70 50 61 72 73 65 2d 3e 69 53 65 6c 65  er(pParse->iSele
2b330 63 74 49 64 2c 20 69 52 65 73 74 6f 72 65 53 65  ctId, iRestoreSe
2b340 6c 65 63 74 49 64 29 3b 0a 23 69 66 20 53 45 4c  lectId);.#if SEL
2b350 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ECTTRACE_ENABLED
2b360 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45  .    SELECTTRACE
2b370 28 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 65 6e  (1,pParse,p,("en
2b380 64 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63  d compound-selec
2b390 74 20 70 72 6f 63 65 73 73 69 6e 67 5c 6e 22 29  t processing\n")
2b3a0 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  );.    pParse->n
2b3b0 53 65 6c 65 63 74 49 6e 64 65 6e 74 2d 2d 3b 0a  SelectIndent--;.
2b3c0 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72  #endif.    retur
2b3d0 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  n rc;.  }.#endif
2b3e0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
2b3f0 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75 62  code for all sub
2b400 2d 71 75 65 72 69 65 73 20 69 6e 20 74 68 65 20  -queries in the 
2b410 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f  FROM clause.  */
2b420 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
2b430 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
2b440 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
2b450 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
2b460 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ).  for(i=0; i<p
2b470 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
2b480 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
2b490 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
2b4a0 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d  tem = &pTabList-
2b4b0 3e 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63  >a[i];.    Selec
2b4c0 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20  tDest dest;.    
2b4d0 53 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70  Select *pSub = p
2b4e0 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  Item->pSelect;. 
2b4f0 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20 29     if( pSub==0 )
2b500 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20   continue;..    
2b510 2f 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74 68 65  /* Sometimes the
2b520 20 63 6f 64 65 20 66 6f 72 20 61 20 73 75 62 71   code for a subq
2b530 75 65 72 79 20 77 69 6c 6c 20 62 65 20 67 65 6e  uery will be gen
2b540 65 72 61 74 65 64 20 6d 6f 72 65 20 74 68 61 6e  erated more than
2b550 0a 20 20 20 20 2a 2a 20 6f 6e 63 65 2c 20 69 66  .    ** once, if
2b560 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
2b570 20 70 61 72 74 20 6f 66 20 74 68 65 20 57 48 45   part of the WHE
2b580 52 45 20 63 6c 61 75 73 65 20 69 6e 20 61 20 4c  RE clause in a L
2b590 45 46 54 20 4a 4f 49 4e 2c 0a 20 20 20 20 2a 2a  EFT JOIN,.    **
2b5a0 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20 20 49   for example.  I
2b5b0 6e 20 74 68 61 74 20 63 61 73 65 2c 20 64 6f 20  n that case, do 
2b5c0 6e 6f 74 20 72 65 67 65 6e 65 72 61 74 65 20 74  not regenerate t
2b5d0 68 65 20 63 6f 64 65 20 74 6f 20 6d 61 6e 69 66  he code to manif
2b5e0 65 73 74 0a 20 20 20 20 2a 2a 20 61 20 76 69 65  est.    ** a vie
2b5f0 77 20 6f 72 20 74 68 65 20 63 6f 2d 72 6f 75 74  w or the co-rout
2b600 69 6e 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ine to implement
2b610 20 61 20 76 69 65 77 2e 20 20 54 68 65 20 66 69   a view.  The fi
2b620 72 73 74 20 69 6e 73 74 61 6e 63 65 0a 20 20 20  rst instance.   
2b630 20 2a 2a 20 69 73 20 73 75 66 66 69 63 69 65 6e   ** is sufficien
2b640 74 2c 20 74 68 6f 75 67 68 20 74 68 65 20 73 75  t, though the su
2b650 62 72 6f 75 74 69 6e 65 20 74 6f 20 6d 61 6e 69  broutine to mani
2b660 66 65 73 74 20 74 68 65 20 76 69 65 77 20 64 6f  fest the view do
2b670 65 73 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74  es need.    ** t
2b680 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 61 67 61  o be invoked aga
2b690 69 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  in. */.    if( p
2b6a0 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
2b6b0 62 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  b ){.      if( p
2b6c0 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f  Item->fg.viaCoro
2b6d0 75 74 69 6e 65 3d 3d 30 20 29 7b 0a 20 20 20 20  utine==0 ){.    
2b6e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2b6f0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
2b700 62 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74  b, pItem->regRet
2b710 75 72 6e 2c 20 70 49 74 65 6d 2d 3e 61 64 64 72  urn, pItem->addr
2b720 46 69 6c 6c 53 75 62 29 3b 0a 20 20 20 20 20 20  FillSub);.      
2b730 7d 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  }.      continue
2b740 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
2b750 49 6e 63 72 65 6d 65 6e 74 20 50 61 72 73 65 2e  Increment Parse.
2b760 6e 48 65 69 67 68 74 20 62 79 20 74 68 65 20 68  nHeight by the h
2b770 65 69 67 68 74 20 6f 66 20 74 68 65 20 6c 61 72  eight of the lar
2b780 67 65 73 74 20 65 78 70 72 65 73 73 69 6f 6e 0a  gest expression.
2b790 20 20 20 20 2a 2a 20 74 72 65 65 20 72 65 66 65      ** tree refe
2b7a0 72 72 65 64 20 74 6f 20 62 79 20 74 68 69 73 2c  rred to by this,
2b7b0 20 74 68 65 20 70 61 72 65 6e 74 20 73 65 6c 65   the parent sele
2b7c0 63 74 2e 20 54 68 65 20 63 68 69 6c 64 20 73 65  ct. The child se
2b7d0 6c 65 63 74 0a 20 20 20 20 2a 2a 20 6d 61 79 20  lect.    ** may 
2b7e0 63 6f 6e 74 61 69 6e 20 65 78 70 72 65 73 73 69  contain expressi
2b7f0 6f 6e 20 74 72 65 65 73 20 6f 66 20 61 74 20 6d  on trees of at m
2b800 6f 73 74 0a 20 20 20 20 2a 2a 20 28 53 51 4c 49  ost.    ** (SQLI
2b810 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54  TE_MAX_EXPR_DEPT
2b820 48 2d 50 61 72 73 65 2e 6e 48 65 69 67 68 74 29  H-Parse.nHeight)
2b830 20 68 65 69 67 68 74 2e 20 54 68 69 73 20 69 73   height. This is
2b840 20 61 20 62 69 74 0a 20 20 20 20 2a 2a 20 6d 6f   a bit.    ** mo
2b850 72 65 20 63 6f 6e 73 65 72 76 61 74 69 76 65 20  re conservative 
2b860 74 68 61 6e 20 6e 65 63 65 73 73 61 72 79 2c 20  than necessary, 
2b870 62 75 74 20 6d 75 63 68 20 65 61 73 69 65 72 20  but much easier 
2b880 74 68 61 6e 20 65 6e 66 6f 72 63 69 6e 67 0a 20  than enforcing. 
2b890 20 20 20 2a 2a 20 61 6e 20 65 78 61 63 74 20 6c     ** an exact l
2b8a0 69 6d 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  imit..    */.   
2b8b0 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74   pParse->nHeight
2b8c0 20 2b 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63   += sqlite3Selec
2b8d0 74 45 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a  tExprHeight(p);.
2b8e0 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 63 6f 70  .    /* Make cop
2b8f0 69 65 73 20 6f 66 20 63 6f 6e 73 74 61 6e 74 20  ies of constant 
2b900 57 48 45 52 45 2d 63 6c 61 75 73 65 20 74 65 72  WHERE-clause ter
2b910 6d 73 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20  ms in the outer 
2b920 71 75 65 72 79 20 64 6f 77 6e 0a 20 20 20 20 2a  query down.    *
2b930 2a 20 69 6e 73 69 64 65 20 74 68 65 20 73 75 62  * inside the sub
2b940 71 75 65 72 79 2e 20 20 54 68 69 73 20 63 61 6e  query.  This can
2b950 20 68 65 6c 70 20 74 68 65 20 73 75 62 71 75 65   help the subque
2b960 72 79 20 74 6f 20 72 75 6e 20 6d 6f 72 65 20 65  ry to run more e
2b970 66 66 69 63 69 65 6e 74 6c 79 2e 0a 20 20 20 20  fficiently..    
2b980 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 49 74 65  */.    if( (pIte
2b990 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26  m->fg.jointype &
2b9a0 20 4a 54 5f 4f 55 54 45 52 29 3d 3d 30 0a 20 20   JT_OUTER)==0.  
2b9b0 20 20 20 26 26 20 70 75 73 68 44 6f 77 6e 57 68     && pushDownWh
2b9c0 65 72 65 54 65 72 6d 73 28 64 62 2c 20 70 53 75  ereTerms(db, pSu
2b9d0 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 70 49  b, p->pWhere, pI
2b9e0 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 0a 20 20  tem->iCursor).  
2b9f0 20 20 29 7b 0a 23 69 66 20 53 45 4c 45 43 54 54    ){.#if SELECTT
2ba00 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20  RACE_ENABLED.   
2ba10 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65     if( sqlite3Se
2ba20 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 31 30  lectTrace & 0x10
2ba30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 53 45 4c  0 ){.        SEL
2ba40 45 43 54 54 52 41 43 45 28 30 78 31 30 30 2c 70  ECTTRACE(0x100,p
2ba50 50 61 72 73 65 2c 70 2c 28 22 41 66 74 65 72 20  Parse,p,("After 
2ba60 57 48 45 52 45 2d 63 6c 61 75 73 65 20 70 75 73  WHERE-clause pus
2ba70 68 2d 64 6f 77 6e 3a 5c 6e 22 29 29 3b 0a 20 20  h-down:\n"));.  
2ba80 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65        sqlite3Tre
2ba90 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70  eViewSelect(0, p
2baa0 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  , 0);.      }.#e
2bab0 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ndif.    }..    
2bac0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
2bad0 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
2bae0 65 20 73 75 62 71 75 65 72 79 0a 20 20 20 20 2a  e subquery.    *
2baf0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 75 62  *.    ** The sub
2bb00 71 75 65 72 79 20 69 73 20 69 6d 70 6c 65 6d 65  query is impleme
2bb10 6e 74 65 64 20 61 73 20 61 20 63 6f 2d 72 6f 75  nted as a co-rou
2bb20 74 69 6e 65 20 69 66 20 61 6c 6c 20 6f 66 20 74  tine if all of t
2bb30 68 65 73 65 20 61 72 65 20 74 72 75 65 3a 0a 20  hese are true:. 
2bb40 20 20 20 2a 2a 20 20 20 28 31 29 20 20 54 68 65     **   (1)  The
2bb50 20 73 75 62 71 75 65 72 79 20 69 73 20 67 75 61   subquery is gua
2bb60 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 74 68  ranteed to be th
2bb70 65 20 6f 75 74 65 72 20 6c 6f 6f 70 20 28 73 6f  e outer loop (so
2bb80 20 74 68 61 74 20 69 74 0a 20 20 20 20 2a 2a 20   that it.    ** 
2bb90 20 20 20 20 20 20 20 64 6f 65 73 20 6e 6f 74 20         does not 
2bba0 6e 65 65 64 20 74 6f 20 62 65 20 63 6f 6d 70 75  need to be compu
2bbb0 74 65 64 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  ted more than on
2bbc0 63 65 29 0a 20 20 20 20 2a 2a 20 20 20 28 32 29  ce).    **   (2)
2bbd0 20 20 54 68 65 20 41 4c 4c 20 6b 65 79 77 6f 72    The ALL keywor
2bbe0 64 20 61 66 74 65 72 20 53 45 4c 45 43 54 20 69  d after SELECT i
2bbf0 73 20 6f 6d 69 74 74 65 64 2e 20 20 28 41 70 70  s omitted.  (App
2bc00 6c 69 63 61 74 69 6f 6e 73 20 61 72 65 0a 20 20  lications are.  
2bc10 20 20 2a 2a 20 20 20 20 20 20 20 20 61 6c 6c 6f    **        allo
2bc20 77 65 64 20 74 6f 20 73 61 79 20 22 53 45 4c 45  wed to say "SELE
2bc30 43 54 20 41 4c 4c 22 20 69 6e 73 74 65 61 64 20  CT ALL" instead 
2bc40 6f 66 20 6a 75 73 74 20 22 53 45 4c 45 43 54 22  of just "SELECT"
2bc50 20 74 6f 20 64 69 73 61 62 6c 65 0a 20 20 20 20   to disable.    
2bc60 2a 2a 20 20 20 20 20 20 20 20 74 68 65 20 75 73  **        the us
2bc70 65 20 6f 66 20 63 6f 2d 72 6f 75 74 69 6e 65 73  e of co-routines
2bc80 2e 29 0a 20 20 20 20 2a 2a 20 20 20 28 33 29 20  .).    **   (3) 
2bc90 20 43 6f 2d 72 6f 75 74 69 6e 65 73 20 61 72 65   Co-routines are
2bca0 20 6e 6f 74 20 64 69 73 61 62 6c 65 64 20 75 73   not disabled us
2bcb0 69 6e 67 20 73 71 6c 69 74 65 33 5f 74 65 73 74  ing sqlite3_test
2bcc0 5f 63 6f 6e 74 72 6f 6c 28 29 0a 20 20 20 20 2a  _control().    *
2bcd0 2a 20 20 20 20 20 20 20 20 77 69 74 68 20 53 51  *        with SQ
2bce0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50  LITE_TESTCTRL_OP
2bcf0 54 49 4d 49 5a 41 54 49 4f 4e 53 2e 0a 20 20 20  TIMIZATIONS..   
2bd00 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 4f 44 4f 3a   **.    ** TODO:
2bd10 20 41 72 65 20 74 68 65 72 65 20 6f 74 68 65 72   Are there other
2bd20 20 72 65 61 73 6f 6e 73 20 62 65 73 69 64 65 20   reasons beside 
2bd30 28 31 29 20 74 6f 20 75 73 65 20 61 20 63 6f 2d  (1) to use a co-
2bd40 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20 69  routine.    ** i
2bd50 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 3f 0a 20  mplementation?. 
2bd60 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 3d     */.    if( i=
2bd70 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 61 62  =0.     && (pTab
2bd80 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 31 0a 20 20  List->nSrc==1.  
2bd90 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 54            || (pT
2bda0 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 66 67 2e  abList->a[1].fg.
2bdb0 6a 6f 69 6e 74 79 70 65 26 28 4a 54 5f 4c 45 46  jointype&(JT_LEF
2bdc0 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30 29  T|JT_CROSS))!=0)
2bdd0 20 20 2f 2a 20 28 31 29 20 2a 2f 0a 20 20 20 20    /* (1) */.    
2bde0 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73   && (p->selFlags
2bdf0 20 26 20 53 46 5f 41 6c 6c 29 3d 3d 30 20 20 20   & SF_All)==0   
2be00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2be10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2be20 2f 2a 20 28 32 29 20 2a 2f 0a 20 20 20 20 20 26  /* (2) */.     &
2be30 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e  & OptimizationEn
2be40 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45  abled(db, SQLITE
2be50 5f 53 75 62 71 43 6f 72 6f 75 74 69 6e 65 29 20  _SubqCoroutine) 
2be60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2be70 20 28 33 29 20 2a 2f 0a 20 20 20 20 29 7b 0a 20   (3) */.    ){. 
2be80 20 20 20 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e       /* Implemen
2be90 74 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74  t a co-routine t
2bea0 68 61 74 20 77 69 6c 6c 20 72 65 74 75 72 6e 20  hat will return 
2beb0 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20  a single row of 
2bec0 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20  the result.     
2bed0 20 2a 2a 20 73 65 74 20 6f 6e 20 65 61 63 68 20   ** set on each 
2bee0 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a 20 20 20 20  invocation..    
2bef0 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61    */.      int a
2bf00 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33  ddrTop = sqlite3
2bf10 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
2bf20 76 29 2b 31 3b 0a 20 20 20 20 20 20 70 49 74 65  v)+1;.      pIte
2bf30 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b  m->regReturn = +
2bf40 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
2bf50 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2bf60 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69  AddOp3(v, OP_Ini
2bf70 74 43 6f 72 6f 75 74 69 6e 65 2c 20 70 49 74 65  tCoroutine, pIte
2bf80 6d 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 30 2c  m->regReturn, 0,
2bf90 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 20 20 20   addrTop);.     
2bfa0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
2bfb0 20 22 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54   "%s", pItem->pT
2bfc0 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  ab->zName));.   
2bfd0 20 20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69     pItem->addrFi
2bfe0 6c 6c 53 75 62 20 3d 20 61 64 64 72 54 6f 70 3b  llSub = addrTop;
2bff0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
2c000 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65  lectDestInit(&de
2c010 73 74 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st, SRT_Coroutin
2c020 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74  e, pItem->regRet
2c030 75 72 6e 29 3b 0a 20 20 20 20 20 20 65 78 70 6c  urn);.      expl
2c040 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 70 49  ainSetInteger(pI
2c050 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20  tem->iSelectId, 
2c060 28 75 38 29 70 50 61 72 73 65 2d 3e 69 4e 65 78  (u8)pParse->iNex
2c070 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20  tSelectId);.    
2c080 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
2c090 70 50 61 72 73 65 2c 20 70 53 75 62 2c 20 26 64  pParse, pSub, &d
2c0a0 65 73 74 29 3b 0a 20 20 20 20 20 20 70 49 74 65  est);.      pIte
2c0b0 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67  m->pTab->nRowLog
2c0c0 45 73 74 20 3d 20 70 53 75 62 2d 3e 6e 53 65 6c  Est = pSub->nSel
2c0d0 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 70 49  ectRow;.      pI
2c0e0 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75  tem->fg.viaCorou
2c0f0 74 69 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  tine = 1;.      
2c100 70 49 74 65 6d 2d 3e 72 65 67 52 65 73 75 6c 74  pItem->regResult
2c110 20 3d 20 64 65 73 74 2e 69 53 64 73 74 3b 0a 20   = dest.iSdst;. 
2c120 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2c130 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28 76 2c 20  EndCoroutine(v, 
2c140 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
2c150 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2c160 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
2c170 61 64 64 72 54 6f 70 2d 31 29 3b 0a 20 20 20 20  addrTop-1);.    
2c180 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65    sqlite3ClearTe
2c190 6d 70 52 65 67 43 61 63 68 65 28 70 50 61 72 73  mpRegCache(pPars
2c1a0 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
2c1b0 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
2c1c0 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68   a subroutine th
2c1d0 61 74 20 77 69 6c 6c 20 66 69 6c 6c 20 61 6e 20  at will fill an 
2c1e0 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  ephemeral table 
2c1f0 77 69 74 68 0a 20 20 20 20 20 20 2a 2a 20 74 68  with.      ** th
2c200 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69  e content of thi
2c210 73 20 73 75 62 71 75 65 72 79 2e 20 20 70 49 74  s subquery.  pIt
2c220 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20  em->addrFillSub 
2c230 77 69 6c 6c 20 70 6f 69 6e 74 0a 20 20 20 20 20  will point.     
2c240 20 2a 2a 20 74 6f 20 74 68 65 20 61 64 64 72 65   ** to the addre
2c250 73 73 20 6f 66 20 74 68 65 20 67 65 6e 65 72 61  ss of the genera
2c260 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65 2e 20  ted subroutine. 
2c270 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72   pItem->regRetur
2c280 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61 20  n.      ** is a 
2c290 72 65 67 69 73 74 65 72 20 61 6c 6c 6f 63 61 74  register allocat
2c2a0 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 73  ed to hold the s
2c2b0 75 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  ubroutine return
2c2c0 20 61 64 64 72 65 73 73 0a 20 20 20 20 20 20 2a   address.      *
2c2d0 2f 0a 20 20 20 20 20 20 69 6e 74 20 74 6f 70 41  /.      int topA
2c2e0 64 64 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f  ddr;.      int o
2c2f0 6e 63 65 41 64 64 72 20 3d 20 30 3b 0a 20 20 20  nceAddr = 0;.   
2c300 20 20 20 69 6e 74 20 72 65 74 41 64 64 72 3b 0a     int retAddr;.
2c310 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
2c320 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
2c330 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 49 74  ==0 );.      pIt
2c340 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20  em->regReturn = 
2c350 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
2c360 20 20 20 20 20 20 74 6f 70 41 64 64 72 20 3d 20        topAddr = 
2c370 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2c380 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
2c390 20 30 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65   0, pItem->regRe
2c3a0 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 70 49 74  turn);.      pIt
2c3b0 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20  em->addrFillSub 
2c3c0 3d 20 74 6f 70 41 64 64 72 2b 31 3b 0a 20 20 20  = topAddr+1;.   
2c3d0 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67     if( pItem->fg
2c3e0 2e 69 73 43 6f 72 72 65 6c 61 74 65 64 3d 3d 30  .isCorrelated==0
2c3f0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
2c400 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
2c410 73 20 6e 6f 74 20 63 6f 72 72 65 6c 61 74 65 64  s not correlated
2c420 20 61 6e 64 20 69 66 20 77 65 20 61 72 65 20 6e   and if we are n
2c430 6f 74 20 69 6e 73 69 64 65 20 6f 66 0a 20 20 20  ot inside of.   
2c440 20 20 20 20 20 2a 2a 20 61 20 74 72 69 67 67 65       ** a trigge
2c450 72 2c 20 74 68 65 6e 20 77 65 20 6f 6e 6c 79 20  r, then we only 
2c460 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20  need to compute 
2c470 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
2c480 20 73 75 62 71 75 65 72 79 0a 20 20 20 20 20 20   subquery.      
2c490 20 20 2a 2a 20 6f 6e 63 65 2e 20 2a 2f 0a 20 20    ** once. */.  
2c4a0 20 20 20 20 20 20 6f 6e 63 65 41 64 64 72 20 3d        onceAddr =
2c4b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2c4c0 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20  p0(v, OP_Once); 
2c4d0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
2c4e0 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
2c4f0 6d 65 6e 74 28 28 76 2c 20 22 6d 61 74 65 72 69  ment((v, "materi
2c500 61 6c 69 7a 65 20 5c 22 25 73 5c 22 22 2c 20 70  alize \"%s\"", p
2c510 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  Item->pTab->zNam
2c520 65 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  e));.      }else
2c530 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65 4e 6f  {.        VdbeNo
2c540 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6d  opComment((v, "m
2c550 61 74 65 72 69 61 6c 69 7a 65 20 5c 22 25 73 5c  aterialize \"%s\
2c560 22 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d  "", pItem->pTab-
2c570 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  >zName));.      
2c580 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  }.      sqlite3S
2c590 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
2c5a0 65 73 74 2c 20 53 52 54 5f 45 70 68 65 6d 54 61  est, SRT_EphemTa
2c5b0 62 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  b, pItem->iCurso
2c5c0 72 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69  r);.      explai
2c5d0 6e 53 65 74 49 6e 74 65 67 65 72 28 70 49 74 65  nSetInteger(pIte
2c5e0 6d 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 28 75  m->iSelectId, (u
2c5f0 38 29 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  8)pParse->iNextS
2c600 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20  electId);.      
2c610 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
2c620 61 72 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73  arse, pSub, &des
2c630 74 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d  t);.      pItem-
2c640 3e 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73  >pTab->nRowLogEs
2c650 74 20 3d 20 70 53 75 62 2d 3e 6e 53 65 6c 65 63  t = pSub->nSelec
2c660 74 52 6f 77 3b 0a 20 20 20 20 20 20 69 66 28 20  tRow;.      if( 
2c670 6f 6e 63 65 41 64 64 72 20 29 20 73 71 6c 69 74  onceAddr ) sqlit
2c680 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
2c690 2c 20 6f 6e 63 65 41 64 64 72 29 3b 0a 20 20 20  , onceAddr);.   
2c6a0 20 20 20 72 65 74 41 64 64 72 20 3d 20 73 71 6c     retAddr = sql
2c6b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
2c6c0 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 70 49 74  , OP_Return, pIt
2c6d0 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a  em->regReturn);.
2c6e0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
2c6f0 74 28 28 76 2c 20 22 65 6e 64 20 25 73 22 2c 20  t((v, "end %s", 
2c700 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61  pItem->pTab->zNa
2c710 6d 65 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  me));.      sqli
2c720 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28  te3VdbeChangeP1(
2c730 76 2c 20 74 6f 70 41 64 64 72 2c 20 72 65 74 41  v, topAddr, retA
2c740 64 64 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ddr);.      sqli
2c750 74 65 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43  te3ClearTempRegC
2c760 61 63 68 65 28 70 50 61 72 73 65 29 3b 0a 20 20  ache(pParse);.  
2c770 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e    }.    if( db->
2c780 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
2c790 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
2c7a0 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69      pParse->nHei
2c7b0 67 68 74 20 2d 3d 20 73 71 6c 69 74 65 33 53 65  ght -= sqlite3Se
2c7c0 6c 65 63 74 45 78 70 72 48 65 69 67 68 74 28 70  lectExprHeight(p
2c7d0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
2c7e0 20 2f 2a 20 56 61 72 69 6f 75 73 20 65 6c 65 6d   /* Various elem
2c7f0 65 6e 74 73 20 6f 66 20 74 68 65 20 53 45 4c 45  ents of the SELE
2c800 43 54 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 6c  CT copied into l
2c810 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73 20 66  ocal variables f
2c820 6f 72 0a 20 20 2a 2a 20 63 6f 6e 76 65 6e 69 65  or.  ** convenie
2c830 6e 63 65 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20  nce */.  pEList 
2c840 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 70  = p->pEList;.  p
2c850 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72  Where = p->pWher
2c860 65 3b 0a 20 20 70 47 72 6f 75 70 42 79 20 3d 20  e;.  pGroupBy = 
2c870 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 70  p->pGroupBy;.  p
2c880 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76  Having = p->pHav
2c890 69 6e 67 3b 0a 20 20 73 44 69 73 74 69 6e 63 74  ing;.  sDistinct
2c8a0 2e 69 73 54 6e 63 74 20 3d 20 28 70 2d 3e 73 65  .isTnct = (p->se
2c8b0 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74  lFlags & SF_Dist
2c8c0 69 6e 63 74 29 21 3d 30 3b 0a 0a 23 69 66 20 53  inct)!=0;..#if S
2c8d0 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c  ELECTTRACE_ENABL
2c8e0 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ED.  if( sqlite3
2c8f0 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30 78  SelectTrace & 0x
2c900 34 30 30 20 29 7b 0a 20 20 20 20 53 45 4c 45 43  400 ){.    SELEC
2c910 54 54 52 41 43 45 28 30 78 34 30 30 2c 70 50 61  TTRACE(0x400,pPa
2c920 72 73 65 2c 70 2c 28 22 41 66 74 65 72 20 61 6c  rse,p,("After al
2c930 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 61 6e  l FROM-clause an
2c940 61 6c 79 73 69 73 3a 5c 6e 22 29 29 3b 0a 20 20  alysis:\n"));.  
2c950 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
2c960 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29  wSelect(0, p, 0)
2c970 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
2c980 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20  /* If the query 
2c990 69 73 20 44 49 53 54 49 4e 43 54 20 77 69 74 68  is DISTINCT with
2c9a0 20 61 6e 20 4f 52 44 45 52 20 42 59 20 62 75 74   an ORDER BY but
2c9b0 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65   is not an aggre
2c9c0 67 61 74 65 2c 20 61 6e 64 20 0a 20 20 2a 2a 20  gate, and .  ** 
2c9d0 69 66 20 74 68 65 20 73 65 6c 65 63 74 2d 6c 69  if the select-li
2c9e0 73 74 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  st is the same a
2c9f0 73 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 6c  s the ORDER BY l
2ca00 69 73 74 2c 20 74 68 65 6e 20 74 68 69 73 20 71  ist, then this q
2ca10 75 65 72 79 0a 20 20 2a 2a 20 63 61 6e 20 62 65  uery.  ** can be
2ca20 20 72 65 77 72 69 74 74 65 6e 20 61 73 20 61 20   rewritten as a 
2ca30 47 52 4f 55 50 20 42 59 2e 20 49 6e 20 6f 74 68  GROUP BY. In oth
2ca40 65 72 20 77 6f 72 64 73 2c 20 74 68 69 73 3a 0a  er words, this:.
2ca50 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45    **.  **     SE
2ca60 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 78 79  LECT DISTINCT xy
2ca70 7a 20 46 52 4f 4d 20 2e 2e 2e 20 4f 52 44 45 52  z FROM ... ORDER
2ca80 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a   BY xyz.  **.  *
2ca90 2a 20 69 73 20 74 72 61 6e 73 66 6f 72 6d 65 64  * is transformed
2caa0 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   to:.  **.  **  
2cab0 20 20 20 53 45 4c 45 43 54 20 78 79 7a 20 46 52     SELECT xyz FR
2cac0 4f 4d 20 2e 2e 2e 20 47 52 4f 55 50 20 42 59 20  OM ... GROUP BY 
2cad0 78 79 7a 20 4f 52 44 45 52 20 42 59 20 78 79 7a  xyz ORDER BY xyz
2cae0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73  .  **.  ** The s
2caf0 65 63 6f 6e 64 20 66 6f 72 6d 20 69 73 20 70 72  econd form is pr
2cb00 65 66 65 72 72 65 64 20 61 73 20 61 20 73 69 6e  eferred as a sin
2cb10 67 6c 65 20 69 6e 64 65 78 20 28 6f 72 20 74 65  gle index (or te
2cb20 6d 70 2d 74 61 62 6c 65 29 20 6d 61 79 20 62 65  mp-table) may be
2cb30 20 0a 20 20 2a 2a 20 75 73 65 64 20 66 6f 72 20   .  ** used for 
2cb40 62 6f 74 68 20 74 68 65 20 4f 52 44 45 52 20 42  both the ORDER B
2cb50 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54 20 70  Y and DISTINCT p
2cb60 72 6f 63 65 73 73 69 6e 67 2e 20 41 73 20 6f 72  rocessing. As or
2cb70 69 67 69 6e 61 6c 6c 79 20 0a 20 20 2a 2a 20 77  iginally .  ** w
2cb80 72 69 74 74 65 6e 20 74 68 65 20 71 75 65 72 79  ritten the query
2cb90 20 6d 75 73 74 20 75 73 65 20 61 20 74 65 6d 70   must use a temp
2cba0 2d 74 61 62 6c 65 20 66 6f 72 20 61 74 20 6c 65  -table for at le
2cbb0 61 73 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 4f  ast one of the O
2cbc0 52 44 45 52 20 0a 20 20 2a 2a 20 42 59 20 61 6e  RDER .  ** BY an
2cbd0 64 20 44 49 53 54 49 4e 43 54 2c 20 61 6e 64 20  d DISTINCT, and 
2cbe0 61 6e 20 69 6e 64 65 78 20 6f 72 20 73 65 70 61  an index or sepa
2cbf0 72 61 74 65 20 74 65 6d 70 2d 74 61 62 6c 65 20  rate temp-table 
2cc00 66 6f 72 20 74 68 65 20 6f 74 68 65 72 2e 0a 20  for the other.. 
2cc10 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73 65   */.  if( (p->se
2cc20 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73  lFlags & (SF_Dis
2cc30 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61  tinct|SF_Aggrega
2cc40 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63  te))==SF_Distinc
2cc50 74 20 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33  t .   && sqlite3
2cc60 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28  ExprListCompare(
2cc70 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 20  sSort.pOrderBy, 
2cc80 70 45 4c 69 73 74 2c 20 2d 31 29 3d 3d 30 0a 20  pEList, -1)==0. 
2cc90 20 29 7b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c   ){.    p->selFl
2cca0 61 67 73 20 26 3d 20 7e 53 46 5f 44 69 73 74 69  ags &= ~SF_Disti
2ccb0 6e 63 74 3b 0a 20 20 20 20 70 47 72 6f 75 70 42  nct;.    pGroupB
2ccc0 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 20  y = p->pGroupBy 
2ccd0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
2cce0 74 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74 2c  tDup(db, pEList,
2ccf0 20 30 29 3b 0a 20 20 20 20 2f 2a 20 4e 6f 74 69   0);.    /* Noti
2cd00 63 65 20 74 68 61 74 20 65 76 65 6e 20 74 68 6f  ce that even tho
2cd10 75 67 68 74 20 53 46 5f 44 69 73 74 69 6e 63 74  ught SF_Distinct
2cd20 20 68 61 73 20 62 65 65 6e 20 63 6c 65 61 72 65   has been cleare
2cd30 64 20 66 72 6f 6d 20 70 2d 3e 73 65 6c 46 6c 61  d from p->selFla
2cd40 67 73 2c 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  gs,.    ** the s
2cd50 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20  Distinct.isTnct 
2cd60 69 73 20 73 74 69 6c 6c 20 73 65 74 2e 20 20 48  is still set.  H
2cd70 65 6e 63 65 2c 20 69 73 54 6e 63 74 20 72 65 70  ence, isTnct rep
2cd80 72 65 73 65 6e 74 73 20 74 68 65 0a 20 20 20 20  resents the.    
2cd90 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 73 65 74 74  ** original sett
2cda0 69 6e 67 20 6f 66 20 74 68 65 20 53 46 5f 44 69  ing of the SF_Di
2cdb0 73 74 69 6e 63 74 20 66 6c 61 67 2c 20 6e 6f 74  stinct flag, not
2cdc0 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 65 74   the current set
2cdd0 74 69 6e 67 20 2a 2f 0a 20 20 20 20 61 73 73 65  ting */.    asse
2cde0 72 74 28 20 73 44 69 73 74 69 6e 63 74 2e 69 73  rt( sDistinct.is
2cdf0 54 6e 63 74 20 29 3b 0a 0a 23 69 66 20 53 45 4c  Tnct );..#if SEL
2ce00 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ECTTRACE_ENABLED
2ce10 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
2ce20 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30 78  SelectTrace & 0x
2ce30 34 30 30 20 29 7b 0a 20 20 20 20 20 20 53 45 4c  400 ){.      SEL
2ce40 45 43 54 54 52 41 43 45 28 30 78 34 30 30 2c 70  ECTTRACE(0x400,p
2ce50 50 61 72 73 65 2c 70 2c 28 22 54 72 61 6e 73 66  Parse,p,("Transf
2ce60 6f 72 6d 20 44 49 53 54 49 4e 43 54 20 69 6e 74  orm DISTINCT int
2ce70 6f 20 47 52 4f 55 50 20 42 59 3a 5c 6e 22 29 29  o GROUP BY:\n"))
2ce80 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  ;.      sqlite3T
2ce90 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c  reeViewSelect(0,
2cea0 20 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65   p, 0);.    }.#e
2ceb0 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ndif.  }..  /* I
2cec0 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52  f there is an OR
2ced0 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74  DER BY clause, t
2cee0 68 65 6e 20 63 72 65 61 74 65 20 61 6e 20 65 70  hen create an ep
2cef0 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20 74 6f  hemeral index to
2cf00 0a 20 20 2a 2a 20 64 6f 20 74 68 65 20 73 6f 72  .  ** do the sor
2cf10 74 69 6e 67 2e 20 20 42 75 74 20 74 68 69 73 20  ting.  But this 
2cf20 73 6f 72 74 69 6e 67 20 65 70 68 65 6d 65 72 61  sorting ephemera
2cf30 6c 20 69 6e 64 65 78 20 6d 69 67 68 74 20 65 6e  l index might en
2cf40 64 20 75 70 0a 20 20 2a 2a 20 62 65 69 6e 67 20  d up.  ** being 
2cf50 75 6e 75 73 65 64 20 69 66 20 74 68 65 20 64 61  unused if the da
2cf60 74 61 20 63 61 6e 20 62 65 20 65 78 74 72 61 63  ta can be extrac
2cf70 74 65 64 20 69 6e 20 70 72 65 2d 73 6f 72 74 65  ted in pre-sorte
2cf80 64 20 6f 72 64 65 72 2e 0a 20 20 2a 2a 20 49 66  d order..  ** If
2cf90 20 74 68 61 74 20 69 73 20 74 68 65 20 63 61 73   that is the cas
2cfa0 65 2c 20 74 68 65 6e 20 74 68 65 20 4f 50 5f 4f  e, then the OP_O
2cfb0 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73  penEphemeral ins
2cfc0 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65  truction will be
2cfd0 0a 20 20 2a 2a 20 63 68 61 6e 67 65 64 20 74 6f  .  ** changed to
2cfe0 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65   an OP_Noop once
2cff0 20 77 65 20 66 69 67 75 72 65 20 6f 75 74 20 74   we figure out t
2d000 68 61 74 20 74 68 65 20 73 6f 72 74 69 6e 67 20  hat the sorting 
2d010 69 6e 64 65 78 20 69 73 0a 20 20 2a 2a 20 6e 6f  index is.  ** no
2d020 74 20 6e 65 65 64 65 64 2e 20 20 54 68 65 20 73  t needed.  The s
2d030 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64  Sort.addrSortInd
2d040 65 78 20 76 61 72 69 61 62 6c 65 20 69 73 20 75  ex variable is u
2d050 73 65 64 20 74 6f 20 66 61 63 69 6c 69 74 61 74  sed to facilitat
2d060 65 0a 20 20 2a 2a 20 74 68 61 74 20 63 68 61 6e  e.  ** that chan
2d070 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  ge..  */.  if( s
2d080 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 29 7b  Sort.pOrderBy ){
2d090 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
2d0a0 65 79 49 6e 66 6f 3b 0a 20 20 20 20 70 4b 65 79  eyInfo;.    pKey
2d0b0 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72  Info = keyInfoFr
2d0c0 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
2d0d0 65 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  e, sSort.pOrderB
2d0e0 79 2c 20 30 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  y, 0, pEList->nE
2d0f0 78 70 72 29 3b 0a 20 20 20 20 73 53 6f 72 74 2e  xpr);.    sSort.
2d100 69 45 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73  iECursor = pPars
2d110 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73  e->nTab++;.    s
2d120 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64  Sort.addrSortInd
2d130 65 78 20 3d 0a 20 20 20 20 20 20 73 71 6c 69 74  ex =.      sqlit
2d140 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
2d150 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
2d160 2c 0a 20 20 20 20 20 20 20 20 20 20 73 53 6f 72  ,.          sSor
2d170 74 2e 69 45 43 75 72 73 6f 72 2c 20 73 53 6f 72  t.iECursor, sSor
2d180 74 2e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  t.pOrderBy->nExp
2d190 72 2b 31 2b 70 45 4c 69 73 74 2d 3e 6e 45 78 70  r+1+pEList->nExp
2d1a0 72 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  r, 0,.          
2d1b0 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c  (char*)pKeyInfo,
2d1c0 20 50 34 5f 4b 45 59 49 4e 46 4f 0a 20 20 20 20   P4_KEYINFO.    
2d1d0 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20    );.  }else{.  
2d1e0 20 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74    sSort.addrSort
2d1f0 49 6e 64 65 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a  Index = -1;.  }.
2d200 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74  .  /* If the out
2d210 70 75 74 20 69 73 20 64 65 73 74 69 6e 65 64 20  put is destined 
2d220 66 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20  for a temporary 
2d230 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74  table, open that
2d240 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69   table..  */.  i
2d250 66 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  f( pDest->eDest=
2d260 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b  =SRT_EphemTab ){
2d270 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2d280 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
2d290 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 44 65 73  nEphemeral, pDes
2d2a0 74 2d 3e 69 53 44 50 61 72 6d 2c 20 70 45 4c 69  t->iSDParm, pELi
2d2b0 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 7d 0a  st->nExpr);.  }.
2d2c0 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6c 69  .  /* Set the li
2d2d0 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 45  miter..  */.  iE
2d2e0 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nd = sqlite3Vdbe
2d2f0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
2d300 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
2d310 33 32 30 3b 20 20 2f 2a 20 34 20 62 69 6c 6c 69  320;  /* 4 billi
2d320 6f 6e 20 72 6f 77 73 20 2a 2f 0a 20 20 63 6f 6d  on rows */.  com
2d330 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
2d340 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 45  rs(pParse, p, iE
2d350 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c  nd);.  if( p->iL
2d360 69 6d 69 74 3d 3d 30 20 26 26 20 73 53 6f 72 74  imit==0 && sSort
2d370 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d  .addrSortIndex>=
2d380 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
2d390 56 64 62 65 43 68 61 6e 67 65 4f 70 63 6f 64 65  VdbeChangeOpcode
2d3a0 28 76 2c 20 73 53 6f 72 74 2e 61 64 64 72 53 6f  (v, sSort.addrSo
2d3b0 72 74 49 6e 64 65 78 2c 20 4f 50 5f 53 6f 72 74  rtIndex, OP_Sort
2d3c0 65 72 4f 70 65 6e 29 3b 0a 20 20 20 20 73 53 6f  erOpen);.    sSo
2d3d0 72 74 2e 73 6f 72 74 46 6c 61 67 73 20 7c 3d 20  rt.sortFlags |= 
2d3e0 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74  SORTFLAG_UseSort
2d3f0 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70  er;.  }..  /* Op
2d400 65 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20  en an ephemeral 
2d410 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72  index to use for
2d420 20 74 68 65 20 64 69 73 74 69 6e 63 74 20 73 65   the distinct se
2d430 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  t..  */.  if( p-
2d440 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
2d450 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 73  istinct ){.    s
2d460 44 69 73 74 69 6e 63 74 2e 74 61 62 54 6e 63 74  Distinct.tabTnct
2d470 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
2d480 2b 3b 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74  +;.    sDistinct
2d490 2e 61 64 64 72 54 6e 63 74 20 3d 20 73 71 6c 69  .addrTnct = sqli
2d4a0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
2d4b0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
2d4c0 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l,.             
2d4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d4e0 73 44 69 73 74 69 6e 63 74 2e 74 61 62 54 6e 63  sDistinct.tabTnc
2d4f0 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20  t, 0, 0,.       
2d500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d510 20 20 20 20 20 20 28 63 68 61 72 2a 29 6b 65 79        (char*)key
2d520 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
2d530 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69  (pParse, p->pELi
2d540 73 74 2c 30 2c 30 29 2c 0a 20 20 20 20 20 20 20  st,0,0),.       
2d550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d560 20 20 20 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f        P4_KEYINFO
2d570 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
2d580 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 42 54  beChangeP5(v, BT
2d590 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b 0a  REE_UNORDERED);.
2d5a0 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54      sDistinct.eT
2d5b0 6e 63 74 54 79 70 65 20 3d 20 57 48 45 52 45 5f  nctType = WHERE_
2d5c0 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52  DISTINCT_UNORDER
2d5d0 45 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ED;.  }else{.   
2d5e0 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74   sDistinct.eTnct
2d5f0 54 79 70 65 20 3d 20 57 48 45 52 45 5f 44 49 53  Type = WHERE_DIS
2d600 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a  TINCT_NOOP;.  }.
2d610 0a 20 20 69 66 28 20 21 69 73 41 67 67 20 26 26  .  if( !isAgg &&
2d620 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a   pGroupBy==0 ){.
2d630 20 20 20 20 2f 2a 20 4e 6f 20 61 67 67 72 65 67      /* No aggreg
2d640 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e  ate functions an
2d650 64 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c  d no GROUP BY cl
2d660 61 75 73 65 20 2a 2f 0a 20 20 20 20 75 31 36 20  ause */.    u16 
2d670 77 63 74 72 6c 46 6c 61 67 73 20 3d 20 28 73 44  wctrlFlags = (sD
2d680 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 3f  istinct.isTnct ?
2d690 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54   WHERE_WANT_DIST
2d6a0 49 4e 43 54 20 3a 20 30 29 3b 0a 20 20 20 20 61  INCT : 0);.    a
2d6b0 73 73 65 72 74 28 20 57 48 45 52 45 5f 55 53 45  ssert( WHERE_USE
2d6c0 5f 4c 49 4d 49 54 3d 3d 53 46 5f 46 69 78 65 64  _LIMIT==SF_Fixed
2d6d0 4c 69 6d 69 74 20 29 3b 0a 20 20 20 20 77 63 74  Limit );.    wct
2d6e0 72 6c 46 6c 61 67 73 20 7c 3d 20 70 2d 3e 73 65  rlFlags |= p->se
2d6f0 6c 46 6c 61 67 73 20 26 20 53 46 5f 46 69 78 65  lFlags & SF_Fixe
2d700 64 4c 69 6d 69 74 3b 0a 0a 20 20 20 20 2f 2a 20  dLimit;..    /* 
2d710 42 65 67 69 6e 20 74 68 65 20 64 61 74 61 62 61  Begin the databa
2d720 73 65 20 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20  se scan. */.    
2d730 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  pWInfo = sqlite3
2d740 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73  WhereBegin(pPars
2d750 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68  e, pTabList, pWh
2d760 65 72 65 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65  ere, sSort.pOrde
2d770 72 42 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rBy,.           
2d780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d790 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 2c 20 77      p->pEList, w
2d7a0 63 74 72 6c 46 6c 61 67 73 2c 20 70 2d 3e 6e 53  ctrlFlags, p->nS
2d7b0 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20 20 20 69  electRow);.    i
2d7c0 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67  f( pWInfo==0 ) g
2d7d0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
2d7e0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
2d7f0 68 65 72 65 4f 75 74 70 75 74 52 6f 77 43 6f 75  hereOutputRowCou
2d800 6e 74 28 70 57 49 6e 66 6f 29 20 3c 20 70 2d 3e  nt(pWInfo) < p->
2d810 6e 53 65 6c 65 63 74 52 6f 77 20 29 7b 0a 20 20  nSelectRow ){.  
2d820 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f      p->nSelectRo
2d830 77 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  w = sqlite3Where
2d840 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 70  OutputRowCount(p
2d850 57 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  WInfo);.    }.  
2d860 20 20 69 66 28 20 73 44 69 73 74 69 6e 63 74 2e    if( sDistinct.
2d870 69 73 54 6e 63 74 20 26 26 20 73 71 6c 69 74 65  isTnct && sqlite
2d880 33 57 68 65 72 65 49 73 44 69 73 74 69 6e 63 74  3WhereIsDistinct
2d890 28 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20  (pWInfo) ){.    
2d8a0 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63    sDistinct.eTnc
2d8b0 74 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 57  tType = sqlite3W
2d8c0 68 65 72 65 49 73 44 69 73 74 69 6e 63 74 28 70  hereIsDistinct(p
2d8d0 57 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  WInfo);.    }.  
2d8e0 20 20 69 66 28 20 73 53 6f 72 74 2e 70 4f 72 64    if( sSort.pOrd
2d8f0 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 73 53  erBy ){.      sS
2d900 6f 72 74 2e 6e 4f 42 53 61 74 20 3d 20 73 71 6c  ort.nOBSat = sql
2d910 69 74 65 33 57 68 65 72 65 49 73 4f 72 64 65 72  ite3WhereIsOrder
2d920 65 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  ed(pWInfo);.    
2d930 20 20 73 53 6f 72 74 2e 62 4f 72 64 65 72 65 64    sSort.bOrdered
2d940 49 6e 6e 65 72 4c 6f 6f 70 20 3d 20 73 71 6c 69  InnerLoop = sqli
2d950 74 65 33 57 68 65 72 65 4f 72 64 65 72 65 64 49  te3WhereOrderedI
2d960 6e 6e 65 72 4c 6f 6f 70 28 70 57 49 6e 66 6f 29  nnerLoop(pWInfo)
2d970 3b 0a 20 20 20 20 20 20 69 66 28 20 73 53 6f 72  ;.      if( sSor
2d980 74 2e 6e 4f 42 53 61 74 3d 3d 73 53 6f 72 74 2e  t.nOBSat==sSort.
2d990 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20  pOrderBy->nExpr 
2d9a0 29 7b 0a 20 20 20 20 20 20 20 20 73 53 6f 72 74  ){.        sSort
2d9b0 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  .pOrderBy = 0;. 
2d9c0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
2d9d0 20 20 2f 2a 20 49 66 20 73 6f 72 74 69 6e 67 20    /* If sorting 
2d9e0 69 6e 64 65 78 20 74 68 61 74 20 77 61 73 20 63  index that was c
2d9f0 72 65 61 74 65 64 20 62 79 20 61 20 70 72 69 6f  reated by a prio
2da00 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  r OP_OpenEphemer
2da10 61 6c 20 0a 20 20 20 20 2a 2a 20 69 6e 73 74 72  al .    ** instr
2da20 75 63 74 69 6f 6e 20 65 6e 64 65 64 20 75 70 20  uction ended up 
2da30 6e 6f 74 20 62 65 69 6e 67 20 6e 65 65 64 65 64  not being needed
2da40 2c 20 74 68 65 6e 20 63 68 61 6e 67 65 20 74 68  , then change th
2da50 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  e OP_OpenEphemer
2da60 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 61  al.    ** into a
2da70 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a 20 20 20 20 2a  n OP_Noop..    *
2da80 2f 0a 20 20 20 20 69 66 28 20 73 53 6f 72 74 2e  /.    if( sSort.
2da90 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30  addrSortIndex>=0
2daa0 20 26 26 20 73 53 6f 72 74 2e 70 4f 72 64 65 72   && sSort.pOrder
2dab0 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  By==0 ){.      s
2dac0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
2dad0 54 6f 4e 6f 6f 70 28 76 2c 20 73 53 6f 72 74 2e  ToNoop(v, sSort.
2dae0 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a  addrSortIndex);.
2daf0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 73      }..    /* Us
2db00 65 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 69  e the standard i
2db10 6e 6e 65 72 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20  nner loop. */.  
2db20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
2db30 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45 4c  p(pParse, p, pEL
2db40 69 73 74 2c 20 2d 31 2c 20 26 73 53 6f 72 74 2c  ist, -1, &sSort,
2db50 20 26 73 44 69 73 74 69 6e 63 74 2c 20 70 44 65   &sDistinct, pDe
2db60 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
2db70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
2db80 68 65 72 65 43 6f 6e 74 69 6e 75 65 4c 61 62 65  hereContinueLabe
2db90 6c 28 70 57 49 6e 66 6f 29 2c 0a 20 20 20 20 20  l(pWInfo),.     
2dba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
2dbb0 71 6c 69 74 65 33 57 68 65 72 65 42 72 65 61 6b  qlite3WhereBreak
2dbc0 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 29 3b 0a  Label(pWInfo));.
2dbd0 0a 20 20 20 20 2f 2a 20 45 6e 64 20 74 68 65 20  .    /* End the 
2dbe0 64 61 74 61 62 61 73 65 20 73 63 61 6e 20 6c 6f  database scan lo
2dbf0 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  op..    */.    s
2dc00 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
2dc10 57 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b  WInfo);.  }else{
2dc20 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73  .    /* This cas
2dc30 65 20 77 68 65 6e 20 74 68 65 72 65 20 65 78 69  e when there exi
2dc40 73 74 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  st aggregate fun
2dc50 63 74 69 6f 6e 73 20 6f 72 20 61 20 47 52 4f 55  ctions or a GROU
2dc60 50 20 42 59 20 63 6c 61 75 73 65 0a 20 20 20 20  P BY clause.    
2dc70 2a 2a 20 6f 72 20 62 6f 74 68 20 2a 2f 0a 20 20  ** or both */.  
2dc80 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
2dc90 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f  C;    /* Name co
2dca0 6e 74 65 78 74 20 66 6f 72 20 70 72 6f 63 65 73  ntext for proces
2dcb0 73 69 6e 67 20 61 67 67 72 65 67 61 74 65 20 69  sing aggregate i
2dcc0 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20  nformation */.  
2dcd0 20 20 69 6e 74 20 69 41 4d 65 6d 3b 20 20 20 20    int iAMem;    
2dce0 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d        /* First M
2dcf0 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20 73  em address for s
2dd00 74 6f 72 69 6e 67 20 63 75 72 72 65 6e 74 20 47  toring current G
2dd10 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69  ROUP BY */.    i
2dd20 6e 74 20 69 42 4d 65 6d 3b 20 20 20 20 20 20 20  nt iBMem;       
2dd30 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20     /* First Mem 
2dd40 61 64 64 72 65 73 73 20 66 6f 72 20 70 72 65 76  address for prev
2dd50 69 6f 75 73 20 47 52 4f 55 50 20 42 59 20 2a 2f  ious GROUP BY */
2dd60 0a 20 20 20 20 69 6e 74 20 69 55 73 65 46 6c 61  .    int iUseFla
2dd70 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 20  g;       /* Mem 
2dd80 61 64 64 72 65 73 73 20 68 6f 6c 64 69 6e 67 20  address holding 
2dd90 66 6c 61 67 20 69 6e 64 69 63 61 74 69 6e 67 20  flag indicating 
2dda0 74 68 61 74 20 61 74 20 6c 65 61 73 74 0a 20 20  that at least.  
2ddb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ddc0 20 20 20 20 20 20 2a 2a 20 6f 6e 65 20 72 6f 77        ** one row
2ddd0 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 74 6f   of the input to
2dde0 20 74 68 65 20 61 67 67 72 65 67 61 74 6f 72 20   the aggregator 
2ddf0 68 61 73 20 62 65 65 6e 0a 20 20 20 20 20 20 20  has been.       
2de00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2de10 20 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 2a 2f   ** processed */
2de20 0a 20 20 20 20 69 6e 74 20 69 41 62 6f 72 74 46  .    int iAbortF
2de30 6c 61 67 3b 20 20 20 20 20 2f 2a 20 4d 65 6d 20  lag;     /* Mem 
2de40 61 64 64 72 65 73 73 20 77 68 69 63 68 20 63 61  address which ca
2de50 75 73 65 73 20 71 75 65 72 79 20 61 62 6f 72 74  uses query abort
2de60 20 69 66 20 70 6f 73 69 74 69 76 65 20 2a 2f 0a   if positive */.
2de70 20 20 20 20 69 6e 74 20 67 72 6f 75 70 42 79 53      int groupByS
2de80 6f 72 74 3b 20 20 20 20 2f 2a 20 52 6f 77 73 20  ort;    /* Rows 
2de90 63 6f 6d 65 20 66 72 6f 6d 20 73 6f 75 72 63 65  come from source
2dea0 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64   in GROUP BY ord
2deb0 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64  er */.    int ad
2dec0 64 72 45 6e 64 3b 20 20 20 20 20 20 20 20 2f 2a  drEnd;        /*
2ded0 20 45 6e 64 20 6f 66 20 70 72 6f 63 65 73 73 69   End of processi
2dee0 6e 67 20 66 6f 72 20 74 68 69 73 20 53 45 4c 45  ng for this SELE
2def0 43 54 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f  CT */.    int so
2df00 72 74 50 54 61 62 20 3d 20 30 3b 20 20 20 2f 2a  rtPTab = 0;   /*
2df10 20 50 73 65 75 64 6f 74 61 62 6c 65 20 75 73 65   Pseudotable use
2df20 64 20 74 6f 20 64 65 63 6f 64 65 20 73 6f 72 74  d to decode sort
2df30 69 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20  ing results */. 
2df40 20 20 20 69 6e 74 20 73 6f 72 74 4f 75 74 20 3d     int sortOut =
2df50 20 30 3b 20 20 20 20 2f 2a 20 4f 75 74 70 75 74   0;    /* Output
2df60 20 72 65 67 69 73 74 65 72 20 66 72 6f 6d 20 74   register from t
2df70 68 65 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20 20  he sorter */.   
2df80 20 69 6e 74 20 6f 72 64 65 72 42 79 47 72 70 20   int orderByGrp 
2df90 3d 20 30 3b 20 2f 2a 20 54 72 75 65 20 69 66 20  = 0; /* True if 
2dfa0 74 68 65 20 47 52 4f 55 50 20 42 59 20 61 6e 64  the GROUP BY and
2dfb0 20 4f 52 44 45 52 20 42 59 20 61 72 65 20 74 68   ORDER BY are th
2dfc0 65 20 73 61 6d 65 20 2a 2f 0a 0a 20 20 20 20 2f  e same */..    /
2dfd0 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 61 6e 64  * Remove any and
2dfe0 20 61 6c 6c 20 61 6c 69 61 73 65 73 20 62 65 74   all aliases bet
2dff0 77 65 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  ween the result 
2e000 73 65 74 20 61 6e 64 20 74 68 65 0a 20 20 20 20  set and the.    
2e010 2a 2a 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  ** GROUP BY clau
2e020 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  se..    */.    i
2e030 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20  f( pGroupBy ){. 
2e040 20 20 20 20 20 69 6e 74 20 6b 3b 20 20 20 20 20       int k;     
2e050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e060 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
2e070 65 72 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75  er */.      stru
2e080 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
2e090 20 2a 70 49 74 65 6d 3b 20 20 2f 2a 20 46 6f 72   *pItem;  /* For
2e0a0 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65 78   looping over ex
2e0b0 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 20 6c 69  pression in a li
2e0c0 73 74 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72  st */..      for
2e0d0 28 6b 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  (k=p->pEList->nE
2e0e0 78 70 72 2c 20 70 49 74 65 6d 3d 70 2d 3e 70 45  xpr, pItem=p->pE
2e0f0 4c 69 73 74 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d  List->a; k>0; k-
2e100 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  -, pItem++){.   
2e110 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e       pItem->u.x.
2e120 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20  iAlias = 0;.    
2e130 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d    }.      for(k=
2e140 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c  pGroupBy->nExpr,
2e150 20 70 49 74 65 6d 3d 70 47 72 6f 75 70 42 79 2d   pItem=pGroupBy-
2e160 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49  >a; k>0; k--, pI
2e170 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
2e180 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c 69 61  pItem->u.x.iAlia
2e190 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  s = 0;.      }. 
2e1a0 20 20 20 20 20 61 73 73 65 72 74 28 20 36 36 3d       assert( 66=
2e1b0 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31  =sqlite3LogEst(1
2e1c0 30 30 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  00) );.      if(
2e1d0 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 36   p->nSelectRow>6
2e1e0 36 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  6 ) p->nSelectRo
2e1f0 77 20 3d 20 36 36 3b 0a 20 20 20 20 7d 65 6c 73  w = 66;.    }els
2e200 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
2e210 20 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73   0==sqlite3LogEs
2e220 74 28 31 29 20 29 3b 0a 20 20 20 20 20 20 70 2d  t(1) );.      p-
2e230 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 30 3b  >nSelectRow = 0;
2e240 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
2e250 66 20 74 68 65 72 65 20 69 73 20 62 6f 74 68 20  f there is both 
2e260 61 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20 61  a GROUP BY and a
2e270 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
2e280 65 20 61 6e 64 20 74 68 65 79 20 61 72 65 0a 20  e and they are. 
2e290 20 20 20 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c     ** identical,
2e2a0 20 74 68 65 6e 20 69 74 20 6d 61 79 20 62 65 20   then it may be 
2e2b0 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 69 73 61  possible to disa
2e2c0 62 6c 65 20 74 68 65 20 4f 52 44 45 52 20 42 59  ble the ORDER BY
2e2d0 20 63 6c 61 75 73 65 20 0a 20 20 20 20 2a 2a 20   clause .    ** 
2e2e0 6f 6e 20 74 68 65 20 67 72 6f 75 6e 64 73 20 74  on the grounds t
2e2f0 68 61 74 20 74 68 65 20 47 52 4f 55 50 20 42 59  hat the GROUP BY
2e300 20 77 69 6c 6c 20 63 61 75 73 65 20 65 6c 65 6d   will cause elem
2e310 65 6e 74 73 20 74 6f 20 63 6f 6d 65 20 6f 75 74  ents to come out
2e320 20 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20   .    ** in the 
2e330 63 6f 72 72 65 63 74 20 6f 72 64 65 72 2e 20 49  correct order. I
2e340 74 20 61 6c 73 6f 20 6d 61 79 20 6e 6f 74 20 2d  t also may not -
2e350 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 6d 69   the GROUP BY mi
2e360 67 68 74 20 75 73 65 20 61 0a 20 20 20 20 2a 2a  ght use a.    **
2e370 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20   database index 
2e380 74 68 61 74 20 63 61 75 73 65 73 20 72 6f 77 73  that causes rows
2e390 20 74 6f 20 62 65 20 67 72 6f 75 70 65 64 20 74   to be grouped t
2e3a0 6f 67 65 74 68 65 72 20 61 73 20 72 65 71 75 69  ogether as requi
2e3b0 72 65 64 0a 20 20 20 20 2a 2a 20 62 75 74 20 6e  red.    ** but n
2e3c0 6f 74 20 61 63 74 75 61 6c 6c 79 20 73 6f 72 74  ot actually sort
2e3d0 65 64 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20  ed. Either way, 
2e3e0 72 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20  record the fact 
2e3f0 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20  that the.    ** 
2e400 4f 52 44 45 52 20 42 59 20 61 6e 64 20 47 52 4f  ORDER BY and GRO
2e410 55 50 20 42 59 20 63 6c 61 75 73 65 73 20 61 72  UP BY clauses ar
2e420 65 20 74 68 65 20 73 61 6d 65 20 62 79 20 73 65  e the same by se
2e430 74 74 69 6e 67 20 74 68 65 20 6f 72 64 65 72 42  tting the orderB
2e440 79 47 72 70 0a 20 20 20 20 2a 2a 20 76 61 72 69  yGrp.    ** vari
2e450 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66  able.  */.    if
2e460 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  ( sqlite3ExprLis
2e470 74 43 6f 6d 70 61 72 65 28 70 47 72 6f 75 70 42  tCompare(pGroupB
2e480 79 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  y, sSort.pOrderB
2e490 79 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20  y, -1)==0 ){.   
2e4a0 20 20 20 6f 72 64 65 72 42 79 47 72 70 20 3d 20     orderByGrp = 
2e4b0 31 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f  1;.    }. .    /
2e4c0 2a 20 43 72 65 61 74 65 20 61 20 6c 61 62 65 6c  * Create a label
2e4d0 20 74 6f 20 6a 75 6d 70 20 74 6f 20 77 68 65 6e   to jump to when
2e4e0 20 77 65 20 77 61 6e 74 20 74 6f 20 61 62 6f 72   we want to abor
2e4f0 74 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20  t the query */. 
2e500 20 20 20 61 64 64 72 45 6e 64 20 3d 20 73 71 6c     addrEnd = sql
2e510 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
2e520 6c 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f  l(v);..    /* Co
2e530 6e 76 65 72 74 20 54 4b 5f 43 4f 4c 55 4d 4e 20  nvert TK_COLUMN 
2e540 6e 6f 64 65 73 20 69 6e 74 6f 20 54 4b 5f 41 47  nodes into TK_AG
2e550 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 6d 61 6b  G_COLUMN and mak
2e560 65 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 20  e entries in.   
2e570 20 2a 2a 20 73 41 67 67 49 6e 66 6f 20 66 6f 72   ** sAggInfo for
2e580 20 61 6c 6c 20 54 4b 5f 41 47 47 5f 46 55 4e 43   all TK_AGG_FUNC
2e590 54 49 4f 4e 20 6e 6f 64 65 73 20 69 6e 20 65 78  TION nodes in ex
2e5a0 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65  pressions of the
2e5b0 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 73  .    ** SELECT s
2e5c0 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 2a 2f  tatement..    */
2e5d0 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e 43  .    memset(&sNC
2e5e0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29  , 0, sizeof(sNC)
2e5f0 29 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61 72 73  );.    sNC.pPars
2e600 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20  e = pParse;.    
2e610 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
2e620 54 61 62 4c 69 73 74 3b 0a 20 20 20 20 73 4e 43  TabList;.    sNC
2e630 2e 70 41 67 67 49 6e 66 6f 20 3d 20 26 73 41 67  .pAggInfo = &sAg
2e640 67 49 6e 66 6f 3b 0a 20 20 20 20 73 41 67 67 49  gInfo;.    sAggI
2e650 6e 66 6f 2e 6d 6e 52 65 67 20 3d 20 70 50 61 72  nfo.mnReg = pPar
2e660 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
2e670 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e  sAggInfo.nSortin
2e680 67 43 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f 75 70  gColumn = pGroup
2e690 42 79 20 3f 20 70 47 72 6f 75 70 42 79 2d 3e 6e  By ? pGroupBy->n
2e6a0 45 78 70 72 20 3a 20 30 3b 0a 20 20 20 20 73 41  Expr : 0;.    sA
2e6b0 67 67 49 6e 66 6f 2e 70 47 72 6f 75 70 42 79 20  ggInfo.pGroupBy 
2e6c0 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20  = pGroupBy;.    
2e6d0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
2e6e0 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20  zeAggList(&sNC, 
2e6f0 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c  pEList);.    sql
2e700 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
2e710 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 73 53 6f  ggList(&sNC, sSo
2e720 72 74 2e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  rt.pOrderBy);.  
2e730 20 20 69 66 28 20 70 48 61 76 69 6e 67 20 29 7b    if( pHaving ){
2e740 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
2e750 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
2e760 74 65 73 28 26 73 4e 43 2c 20 70 48 61 76 69 6e  tes(&sNC, pHavin
2e770 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 41  g);.    }.    sA
2e780 67 67 49 6e 66 6f 2e 6e 41 63 63 75 6d 75 6c 61  ggInfo.nAccumula
2e790 74 6f 72 20 3d 20 73 41 67 67 49 6e 66 6f 2e 6e  tor = sAggInfo.n
2e7a0 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 66 6f 72 28  Column;.    for(
2e7b0 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e  i=0; i<sAggInfo.
2e7c0 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  nFunc; i++){.   
2e7d0 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
2e7e0 48 61 73 50 72 6f 70 65 72 74 79 28 73 41 67 67  HasProperty(sAgg
2e7f0 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45  Info.aFunc[i].pE
2e800 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
2e810 74 29 20 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e  t) );.      sNC.
2e820 6e 63 46 6c 61 67 73 20 7c 3d 20 4e 43 5f 49 6e  ncFlags |= NC_In
2e830 41 67 67 46 75 6e 63 3b 0a 20 20 20 20 20 20 73  AggFunc;.      s
2e840 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
2e850 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 73  eAggList(&sNC, s
2e860 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d  AggInfo.aFunc[i]
2e870 2e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29  .pExpr->x.pList)
2e880 3b 0a 20 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c  ;.      sNC.ncFl
2e890 61 67 73 20 26 3d 20 7e 4e 43 5f 49 6e 41 67 67  ags &= ~NC_InAgg
2e8a0 46 75 6e 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Func;.    }.    
2e8b0 73 41 67 67 49 6e 66 6f 2e 6d 78 52 65 67 20 3d  sAggInfo.mxReg =
2e8c0 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20   pParse->nMem;. 
2e8d0 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
2e8e0 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73  cFailed ) goto s
2e8f0 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 20 20  elect_end;..    
2e900 2f 2a 20 50 72 6f 63 65 73 73 69 6e 67 20 66 6f  /* Processing fo
2e910 72 20 61 67 67 72 65 67 61 74 65 73 20 77 69 74  r aggregates wit
2e920 68 20 47 52 4f 55 50 20 42 59 20 69 73 20 76 65  h GROUP BY is ve
2e930 72 79 20 64 69 66 66 65 72 65 6e 74 20 61 6e 64  ry different and
2e940 0a 20 20 20 20 2a 2a 20 6d 75 63 68 20 6d 6f 72  .    ** much mor
2e950 65 20 63 6f 6d 70 6c 65 78 20 74 68 61 6e 20 61  e complex than a
2e960 67 67 72 65 67 61 74 65 73 20 77 69 74 68 6f 75  ggregates withou
2e970 74 20 61 20 47 52 4f 55 50 20 42 59 2e 0a 20 20  t a GROUP BY..  
2e980 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47 72    */.    if( pGr
2e990 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 4b  oupBy ){.      K
2e9a0 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
2e9b0 3b 20 20 2f 2a 20 4b 65 79 69 6e 67 20 69 6e 66  ;  /* Keying inf
2e9c0 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65  ormation for the
2e9d0 20 67 72 6f 75 70 20 62 79 20 63 6c 61 75 73 65   group by clause
2e9e0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
2e9f0 64 72 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  dr1;          /*
2ea00 20 41 2d 76 73 2d 42 20 63 6f 6d 70 61 72 69 73   A-vs-B comparis
2ea10 69 6f 6e 20 6a 75 6d 70 20 2a 2f 0a 20 20 20 20  ion jump */.    
2ea20 20 20 69 6e 74 20 61 64 64 72 4f 75 74 70 75 74    int addrOutput
2ea30 52 6f 77 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f  Row;  /* Start o
2ea40 66 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  f subroutine tha
2ea50 74 20 6f 75 74 70 75 74 73 20 61 20 72 65 73 75  t outputs a resu
2ea60 6c 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20  lt row */.      
2ea70 69 6e 74 20 72 65 67 4f 75 74 70 75 74 52 6f 77  int regOutputRow
2ea80 3b 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64  ;   /* Return ad
2ea90 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
2eaa0 6f 72 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75  or output subrou
2eab0 74 69 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  tine */.      in
2eac0 74 20 61 64 64 72 53 65 74 41 62 6f 72 74 3b 20  t addrSetAbort; 
2ead0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 61 62 6f    /* Set the abo
2eae0 72 74 20 66 6c 61 67 20 61 6e 64 20 72 65 74 75  rt flag and retu
2eaf0 72 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  rn */.      int 
2eb00 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20  addrTopOfLoop;  
2eb10 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e  /* Top of the in
2eb20 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20  put loop */.    
2eb30 20 20 69 6e 74 20 61 64 64 72 53 6f 72 74 69 6e    int addrSortin
2eb40 67 49 64 78 3b 20 2f 2a 20 54 68 65 20 4f 50 5f  gIdx; /* The OP_
2eb50 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 66 6f  OpenEphemeral fo
2eb60 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e  r the sorting in
2eb70 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  dex */.      int
2eb80 20 61 64 64 72 52 65 73 65 74 3b 20 20 20 20 20   addrReset;     
2eb90 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65 20 66   /* Subroutine f
2eba0 6f 72 20 72 65 73 65 74 74 69 6e 67 20 74 68 65  or resetting the
2ebb0 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a   accumulator */.
2ebc0 20 20 20 20 20 20 69 6e 74 20 72 65 67 52 65 73        int regRes
2ebd0 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 74  et;       /* Ret
2ebe0 75 72 6e 20 61 64 64 72 65 73 73 20 72 65 67 69  urn address regi
2ebf0 73 74 65 72 20 66 6f 72 20 72 65 73 65 74 20 73  ster for reset s
2ec00 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20 20  ubroutine */..  
2ec10 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
2ec20 69 73 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c  is a GROUP BY cl
2ec30 61 75 73 65 20 77 65 20 6d 69 67 68 74 20 6e 65  ause we might ne
2ec40 65 64 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64  ed a sorting ind
2ec50 65 78 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 69  ex to.      ** i
2ec60 6d 70 6c 65 6d 65 6e 74 20 69 74 2e 20 20 41 6c  mplement it.  Al
2ec70 6c 6f 63 61 74 65 20 74 68 61 74 20 73 6f 72 74  locate that sort
2ec80 69 6e 67 20 69 6e 64 65 78 20 6e 6f 77 2e 20 20  ing index now.  
2ec90 49 66 20 69 74 20 74 75 72 6e 73 20 6f 75 74 0a  If it turns out.
2eca0 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65        ** that we
2ecb0 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 69 74 20   do not need it 
2ecc0 61 66 74 65 72 20 61 6c 6c 2c 20 74 68 65 20 4f  after all, the O
2ecd0 50 5f 53 6f 72 74 65 72 4f 70 65 6e 20 69 6e 73  P_SorterOpen ins
2ece0 74 72 75 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a  truction.      *
2ecf0 2a 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72  * will be conver
2ed00 74 65 64 20 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e  ted into a Noop.
2ed10 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20    .      */.    
2ed20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69    sAggInfo.sorti
2ed30 6e 67 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e  ngIdx = pParse->
2ed40 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70 4b  nTab++;.      pK
2ed50 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f  eyInfo = keyInfo
2ed60 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
2ed70 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 30  rse, pGroupBy, 0
2ed80 2c 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75  , sAggInfo.nColu
2ed90 6d 6e 29 3b 0a 20 20 20 20 20 20 61 64 64 72 53  mn);.      addrS
2eda0 6f 72 74 69 6e 67 49 64 78 20 3d 20 73 71 6c 69  ortingIdx = sqli
2edb0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
2edc0 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 2c 20   OP_SorterOpen, 
2edd0 0a 20 20 20 20 20 20 20 20 20 20 73 41 67 67 49  .          sAggI
2ede0 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20  nfo.sortingIdx, 
2edf0 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e  sAggInfo.nSortin
2ee00 67 43 6f 6c 75 6d 6e 2c 20 0a 20 20 20 20 20 20  gColumn, .      
2ee10 20 20 20 20 30 2c 20 28 63 68 61 72 2a 29 70 4b      0, (char*)pK
2ee20 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
2ee30 46 4f 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  FO);..      /* I
2ee40 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79  nitialize memory
2ee50 20 6c 6f 63 61 74 69 6f 6e 73 20 75 73 65 64 20   locations used 
2ee60 62 79 20 47 52 4f 55 50 20 42 59 20 61 67 67 72  by GROUP BY aggr
2ee70 65 67 61 74 65 20 70 72 6f 63 65 73 73 69 6e 67  egate processing
2ee80 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2ee90 69 55 73 65 46 6c 61 67 20 3d 20 2b 2b 70 50 61  iUseFlag = ++pPa
2eea0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
2eeb0 20 69 41 62 6f 72 74 46 6c 61 67 20 3d 20 2b 2b   iAbortFlag = ++
2eec0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
2eed0 20 20 20 20 72 65 67 4f 75 74 70 75 74 52 6f 77      regOutputRow
2eee0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
2eef0 6d 3b 0a 20 20 20 20 20 20 61 64 64 72 4f 75 74  m;.      addrOut
2ef00 70 75 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  putRow = sqlite3
2ef10 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
2ef20 3b 0a 20 20 20 20 20 20 72 65 67 52 65 73 65 74  ;.      regReset
2ef30 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
2ef40 6d 3b 0a 20 20 20 20 20 20 61 64 64 72 52 65 73  m;.      addrRes
2ef50 65 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  et = sqlite3Vdbe
2ef60 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
2ef70 20 20 20 20 69 41 4d 65 6d 20 3d 20 70 50 61 72      iAMem = pPar
2ef80 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20  se->nMem + 1;.  
2ef90 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
2efa0 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45   += pGroupBy->nE
2efb0 78 70 72 3b 0a 20 20 20 20 20 20 69 42 4d 65 6d  xpr;.      iBMem
2efc0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20   = pParse->nMem 
2efd0 2b 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73  + 1;.      pPars
2efe0 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75  e->nMem += pGrou
2eff0 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  pBy->nExpr;.    
2f000 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2f010 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
2f020 72 2c 20 30 2c 20 69 41 62 6f 72 74 46 6c 61 67  r, 0, iAbortFlag
2f030 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
2f040 6d 65 6e 74 28 28 76 2c 20 22 63 6c 65 61 72 20  ment((v, "clear 
2f050 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20  abort flag"));. 
2f060 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2f070 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
2f080 65 67 65 72 2c 20 30 2c 20 69 55 73 65 46 6c 61  eger, 0, iUseFla
2f090 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  g);.      VdbeCo
2f0a0 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64 69 63  mment((v, "indic
2f0b0 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  ate accumulator 
2f0c0 65 6d 70 74 79 22 29 29 3b 0a 20 20 20 20 20 20  empty"));.      
2f0d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2f0e0 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  3(v, OP_Null, 0,
2f0f0 20 69 41 4d 65 6d 2c 20 69 41 4d 65 6d 2b 70 47   iAMem, iAMem+pG
2f100 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2d 31 29  roupBy->nExpr-1)
2f110 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 42 65 67 69  ;..      /* Begi
2f120 6e 20 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69  n a loop that wi
2f130 6c 6c 20 65 78 74 72 61 63 74 20 61 6c 6c 20 73  ll extract all s
2f140 6f 75 72 63 65 20 72 6f 77 73 20 69 6e 20 47 52  ource rows in GR
2f150 4f 55 50 20 42 59 20 6f 72 64 65 72 2e 0a 20 20  OUP BY order..  
2f160 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68      ** This migh
2f170 74 20 69 6e 76 6f 6c 76 65 20 74 77 6f 20 73 65  t involve two se
2f180 70 61 72 61 74 65 20 6c 6f 6f 70 73 20 77 69 74  parate loops wit
2f190 68 20 61 6e 20 4f 50 5f 53 6f 72 74 20 69 6e 20  h an OP_Sort in 
2f1a0 62 65 74 77 65 65 6e 2c 20 6f 72 0a 20 20 20 20  between, or.    
2f1b0 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65    ** it might be
2f1c0 20 61 20 73 69 6e 67 6c 65 20 6c 6f 6f 70 20 74   a single loop t
2f1d0 68 61 74 20 75 73 65 73 20 61 6e 20 69 6e 64 65  hat uses an inde
2f1e0 78 20 74 6f 20 65 78 74 72 61 63 74 20 69 6e 66  x to extract inf
2f1f0 6f 72 6d 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a  ormation.      *
2f200 2a 20 69 6e 20 74 68 65 20 72 69 67 68 74 20 6f  * in the right o
2f210 72 64 65 72 20 74 6f 20 62 65 67 69 6e 20 77 69  rder to begin wi
2f220 74 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  th..      */.   
2f230 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2f240 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
2f250 2c 20 72 65 67 52 65 73 65 74 2c 20 61 64 64 72  , regReset, addr
2f260 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 70 57  Reset);.      pW
2f270 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68  Info = sqlite3Wh
2f280 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c  ereBegin(pParse,
2f290 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72   pTabList, pWher
2f2a0 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 30 2c 0a  e, pGroupBy, 0,.
2f2b0 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45 5f            WHERE_
2f2c0 47 52 4f 55 50 42 59 20 7c 20 28 6f 72 64 65 72  GROUPBY | (order
2f2d0 42 79 47 72 70 20 3f 20 57 48 45 52 45 5f 53 4f  ByGrp ? WHERE_SO
2f2e0 52 54 42 59 47 52 4f 55 50 20 3a 20 30 29 2c 20  RTBYGROUP : 0), 
2f2f0 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  0.      );.     
2f300 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29   if( pWInfo==0 )
2f310 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
2f320 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
2f330 74 65 33 57 68 65 72 65 49 73 4f 72 64 65 72 65  te3WhereIsOrdere
2f340 64 28 70 57 49 6e 66 6f 29 3d 3d 70 47 72 6f 75  d(pWInfo)==pGrou
2f350 70 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  pBy->nExpr ){.  
2f360 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 74        /* The opt
2f370 69 6d 69 7a 65 72 20 69 73 20 61 62 6c 65 20 74  imizer is able t
2f380 6f 20 64 65 6c 69 76 65 72 20 72 6f 77 73 20 69  o deliver rows i
2f390 6e 20 67 72 6f 75 70 20 62 79 20 6f 72 64 65 72  n group by order
2f3a0 20 73 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 77   so.        ** w
2f3b0 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f  e do not have to
2f3c0 20 73 6f 72 74 2e 20 20 54 68 65 20 4f 50 5f 4f   sort.  The OP_O
2f3d0 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 74 61 62  penEphemeral tab
2f3e0 6c 65 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20  le will be.     
2f3f0 20 20 20 2a 2a 20 63 61 6e 63 65 6c 6c 65 64 20     ** cancelled 
2f400 6c 61 74 65 72 20 62 65 63 61 75 73 65 20 77 65  later because we
2f410 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75   still need to u
2f420 73 65 20 74 68 65 20 70 4b 65 79 49 6e 66 6f 0a  se the pKeyInfo.
2f430 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2f440 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d     groupBySort =
2f450 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
2f460 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 73  .        /* Rows
2f470 20 61 72 65 20 63 6f 6d 69 6e 67 20 6f 75 74 20   are coming out 
2f480 69 6e 20 75 6e 64 65 74 65 72 6d 69 6e 65 64 20  in undetermined 
2f490 6f 72 64 65 72 2e 20 20 57 65 20 68 61 76 65 20  order.  We have 
2f4a0 74 6f 20 70 75 73 68 0a 20 20 20 20 20 20 20 20  to push.        
2f4b0 2a 2a 20 65 61 63 68 20 72 6f 77 20 69 6e 74 6f  ** each row into
2f4c0 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78   a sorting index
2f4d0 2c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  , terminate the 
2f4e0 66 69 72 73 74 20 6c 6f 6f 70 2c 0a 20 20 20 20  first loop,.    
2f4f0 20 20 20 20 2a 2a 20 74 68 65 6e 20 6c 6f 6f 70      ** then loop
2f500 20 6f 76 65 72 20 74 68 65 20 73 6f 72 74 69 6e   over the sortin
2f510 67 20 69 6e 64 65 78 20 69 6e 20 6f 72 64 65 72  g index in order
2f520 20 74 6f 20 67 65 74 20 74 68 65 20 6f 75 74 70   to get the outp
2f530 75 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  ut.        ** in
2f540 20 73 6f 72 74 65 64 20 6f 72 64 65 72 0a 20 20   sorted order.  
2f550 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2f560 20 69 6e 74 20 72 65 67 42 61 73 65 3b 0a 20 20   int regBase;.  
2f570 20 20 20 20 20 20 69 6e 74 20 72 65 67 52 65 63        int regRec
2f580 6f 72 64 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  ord;.        int
2f590 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69   nCol;.        i
2f5a0 6e 74 20 6e 47 72 6f 75 70 42 79 3b 0a 0a 20 20  nt nGroupBy;..  
2f5b0 20 20 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d        explainTem
2f5c0 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 0a  pTable(pParse, .
2f5d0 20 20 20 20 20 20 20 20 20 20 20 20 28 73 44 69              (sDi
2f5e0 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 26 26  stinct.isTnct &&
2f5f0 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 26 53 46   (p->selFlags&SF
2f600 5f 44 69 73 74 69 6e 63 74 29 3d 3d 30 29 20 3f  _Distinct)==0) ?
2f610 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2f620 20 20 20 20 20 22 44 49 53 54 49 4e 43 54 22 20       "DISTINCT" 
2f630 3a 20 22 47 52 4f 55 50 20 42 59 22 29 3b 0a 0a  : "GROUP BY");..
2f640 20 20 20 20 20 20 20 20 67 72 6f 75 70 42 79 53          groupByS
2f650 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ort = 1;.       
2f660 20 6e 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f   nGroupBy = pGro
2f670 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  upBy->nExpr;.   
2f680 20 20 20 20 20 6e 43 6f 6c 20 3d 20 6e 47 72 6f       nCol = nGro
2f690 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 6a 20  upBy;.        j 
2f6a0 3d 20 6e 47 72 6f 75 70 42 79 3b 0a 20 20 20 20  = nGroupBy;.    
2f6b0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
2f6c0 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b  AggInfo.nColumn;
2f6d0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
2f6e0 20 69 66 28 20 73 41 67 67 49 6e 66 6f 2e 61 43   if( sAggInfo.aC
2f6f0 6f 6c 5b 69 5d 2e 69 53 6f 72 74 65 72 43 6f 6c  ol[i].iSorterCol
2f700 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20  umn>=j ){.      
2f710 20 20 20 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20        nCol++;.  
2f720 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20            j++;. 
2f730 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2f740 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67     }.        reg
2f750 42 61 73 65 20 3d 20 73 71 6c 69 74 65 33 47 65  Base = sqlite3Ge
2f760 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
2f770 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20  e, nCol);.      
2f780 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
2f790 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
2f7a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2f7b0 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
2f7c0 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42  (pParse, pGroupB
2f7d0 79 2c 20 72 65 67 42 61 73 65 2c 20 30 2c 20 30  y, regBase, 0, 0
2f7e0 29 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e  );.        j = n
2f7f0 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20  GroupBy;.       
2f800 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67   for(i=0; i<sAgg
2f810 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  Info.nColumn; i+
2f820 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74  +){.          st
2f830 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c  ruct AggInfo_col
2f840 20 2a 70 43 6f 6c 20 3d 20 26 73 41 67 67 49 6e   *pCol = &sAggIn
2f850 66 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20  fo.aCol[i];.    
2f860 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e        if( pCol->
2f870 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a  iSorterColumn>=j
2f880 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2f890 69 6e 74 20 72 31 20 3d 20 6a 20 2b 20 72 65 67  int r1 = j + reg
2f8a0 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Base;.          
2f8b0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
2f8c0 65 47 65 74 43 6f 6c 75 6d 6e 54 6f 52 65 67 28  eGetColumnToReg(
2f8d0 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
2f8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f8f0 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54          pCol->pT
2f900 61 62 2c 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d  ab, pCol->iColum
2f910 6e 2c 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c  n, pCol->iTable,
2f920 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20   r1);.          
2f930 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20    j++;.         
2f940 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2f950 20 20 20 20 20 72 65 67 52 65 63 6f 72 64 20 3d       regRecord =
2f960 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
2f970 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
2f980 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2f990 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
2f9a0 52 65 63 6f 72 64 2c 20 72 65 67 42 61 73 65 2c  Record, regBase,
2f9b0 20 6e 43 6f 6c 2c 20 72 65 67 52 65 63 6f 72 64   nCol, regRecord
2f9c0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2f9d0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2f9e0 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 2c  OP_SorterInsert,
2f9f0 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
2fa00 67 49 64 78 2c 20 72 65 67 52 65 63 6f 72 64 29  gIdx, regRecord)
2fa10 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2fa20 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
2fa30 70 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72  pParse, regRecor
2fa40 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  d);.        sqli
2fa50 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
2fa60 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 42  nge(pParse, regB
2fa70 61 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20  ase, nCol);.    
2fa80 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
2fa90 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  End(pWInfo);.   
2faa0 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f       sAggInfo.so
2fab0 72 74 69 6e 67 49 64 78 50 54 61 62 20 3d 20 73  rtingIdxPTab = s
2fac0 6f 72 74 50 54 61 62 20 3d 20 70 50 61 72 73 65  ortPTab = pParse
2fad0 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
2fae0 20 20 73 6f 72 74 4f 75 74 20 3d 20 73 71 6c 69    sortOut = sqli
2faf0 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
2fb00 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
2fb10 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
2fb20 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64  (v, OP_OpenPseud
2fb30 6f 2c 20 73 6f 72 74 50 54 61 62 2c 20 73 6f 72  o, sortPTab, sor
2fb40 74 4f 75 74 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20  tOut, nCol);.   
2fb50 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2fb60 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
2fb70 74 65 72 53 6f 72 74 2c 20 73 41 67 67 49 6e 66  terSort, sAggInf
2fb80 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64  o.sortingIdx, ad
2fb90 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 20 20  drEnd);.        
2fba0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
2fbb0 22 47 52 4f 55 50 20 42 59 20 73 6f 72 74 22 29  "GROUP BY sort")
2fbc0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
2fbd0 76 29 3b 0a 20 20 20 20 20 20 20 20 73 41 67 67  v);.        sAgg
2fbe0 49 6e 66 6f 2e 75 73 65 53 6f 72 74 69 6e 67 49  Info.useSortingI
2fbf0 64 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  dx = 1;.        
2fc00 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
2fc10 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 0a  Clear(pParse);..
2fc20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
2fc30 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78 20 6f  * If the index o
2fc40 72 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  r temporary tabl
2fc50 65 20 75 73 65 64 20 62 79 20 74 68 65 20 47 52  e used by the GR
2fc60 4f 55 50 20 42 59 20 73 6f 72 74 0a 20 20 20 20  OUP BY sort.    
2fc70 20 20 2a 2a 20 77 69 6c 6c 20 6e 61 74 75 72 61    ** will natura
2fc80 6c 6c 79 20 64 65 6c 69 76 65 72 20 72 6f 77 73  lly deliver rows
2fc90 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 72 65   in the order re
2fca0 71 75 69 72 65 64 20 62 79 20 74 68 65 20 4f 52  quired by the OR
2fcb0 44 45 52 20 42 59 0a 20 20 20 20 20 20 2a 2a 20  DER BY.      ** 
2fcc0 63 6c 61 75 73 65 2c 20 63 61 6e 63 65 6c 20 74  clause, cancel t
2fcd0 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  he ephemeral tab
2fce0 6c 65 20 6f 70 65 6e 20 63 6f 64 65 64 20 65 61  le open coded ea
2fcf0 72 6c 69 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a  rlier..      **.
2fd00 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73        ** This is
2fd10 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
2fd20 20 2d 20 74 68 65 20 63 6f 72 72 65 63 74 20 61   - the correct a
2fd30 6e 73 77 65 72 20 73 68 6f 75 6c 64 20 72 65 73  nswer should res
2fd40 75 6c 74 20 72 65 67 61 72 64 6c 65 73 73 2e 0a  ult regardless..
2fd50 20 20 20 20 20 20 2a 2a 20 55 73 65 20 74 68 65        ** Use the
2fd60 20 53 51 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f   SQLITE_GroupByO
2fd70 72 64 65 72 20 66 6c 61 67 20 77 69 74 68 20 53  rder flag with S
2fd80 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f  QLITE_TESTCTRL_O
2fd90 50 54 49 4d 49 5a 45 52 20 74 6f 20 0a 20 20 20  PTIMIZER to .   
2fda0 20 20 20 2a 2a 20 64 69 73 61 62 6c 65 20 74 68     ** disable th
2fdb0 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  is optimization 
2fdc0 66 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72 70  for testing purp
2fdd0 6f 73 65 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20  oses.  */.      
2fde0 69 66 28 20 6f 72 64 65 72 42 79 47 72 70 20 26  if( orderByGrp &
2fdf0 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e  & OptimizationEn
2fe00 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45  abled(db, SQLITE
2fe10 5f 47 72 6f 75 70 42 79 4f 72 64 65 72 29 20 0a  _GroupByOrder) .
2fe20 20 20 20 20 20 20 20 26 26 20 28 67 72 6f 75 70         && (group
2fe30 42 79 53 6f 72 74 20 7c 7c 20 73 71 6c 69 74 65  BySort || sqlite
2fe40 33 57 68 65 72 65 49 73 53 6f 72 74 65 64 28 70  3WhereIsSorted(p
2fe50 57 49 6e 66 6f 29 29 0a 20 20 20 20 20 20 29 7b  WInfo)).      ){
2fe60 0a 20 20 20 20 20 20 20 20 73 53 6f 72 74 2e 70  .        sSort.p
2fe70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
2fe80 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2fe90 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20  ChangeToNoop(v, 
2fea0 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e  sSort.addrSortIn
2feb0 64 65 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  dex);.      }.. 
2fec0 20 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65       /* Evaluate
2fed0 20 74 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f   the current GRO
2fee0 55 50 20 42 59 20 74 65 72 6d 73 20 61 6e 64 20  UP BY terms and 
2fef0 73 74 6f 72 65 20 69 6e 20 62 30 2c 20 62 31 2c  store in b0, b1,
2ff00 20 62 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20   b2....      ** 
2ff10 28 62 30 20 69 73 20 6d 65 6d 6f 72 79 20 6c 6f  (b0 is memory lo
2ff20 63 61 74 69 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20  cation iBMem+0, 
2ff30 62 31 20 69 73 20 69 42 4d 65 6d 2b 31 2c 20 61  b1 is iBMem+1, a
2ff40 6e 64 20 73 6f 20 66 6f 72 74 68 29 0a 20 20 20  nd so forth).   
2ff50 20 20 20 2a 2a 20 54 68 65 6e 20 63 6f 6d 70 61     ** Then compa
2ff60 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 47  re the current G
2ff70 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61 67  ROUP BY terms ag
2ff80 61 69 6e 73 74 20 74 68 65 20 47 52 4f 55 50 20  ainst the GROUP 
2ff90 42 59 20 74 65 72 6d 73 0a 20 20 20 20 20 20 2a  BY terms.      *
2ffa0 2a 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69  * from the previ
2ffb0 6f 75 73 20 72 6f 77 20 63 75 72 72 65 6e 74 6c  ous row currentl
2ffc0 79 20 73 74 6f 72 65 64 20 69 6e 20 61 30 2c 20  y stored in a0, 
2ffd0 61 31 2c 20 61 32 2e 2e 2e 0a 20 20 20 20 20 20  a1, a2....      
2ffe0 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 54 6f 70  */.      addrTop
2fff0 4f 66 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33  OfLoop = sqlite3
30000 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
30010 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
30020 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
30030 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69  pParse);.      i
30040 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29  f( groupBySort )
30050 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
30060 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
30070 50 5f 53 6f 72 74 65 72 44 61 74 61 2c 20 73 41  P_SorterData, sA
30080 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
30090 78 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  x,.             
300a0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 6f 72               sor
300b0 74 4f 75 74 2c 20 73 6f 72 74 50 54 61 62 29 3b  tOut, sortPTab);
300c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
300d0 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75 70  or(j=0; j<pGroup
300e0 42 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b  By->nExpr; j++){
300f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 67 72 6f  .        if( gro
30100 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20  upBySort ){.    
30110 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
30120 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
30130 6c 75 6d 6e 2c 20 73 6f 72 74 50 54 61 62 2c 20  lumn, sortPTab, 
30140 6a 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20  j, iBMem+j);.   
30150 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
30160 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 64        sAggInfo.d
30170 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20  irectMode = 1;. 
30180 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
30190 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
301a0 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 6a 5d 2e   pGroupBy->a[j].
301b0 70 45 78 70 72 2c 20 69 42 4d 65 6d 2b 6a 29 3b  pExpr, iBMem+j);
301c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
301d0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
301e0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
301f0 5f 43 6f 6d 70 61 72 65 2c 20 69 41 4d 65 6d 2c  _Compare, iAMem,
30200 20 69 42 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79   iBMem, pGroupBy
30210 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20  ->nExpr,.       
30220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30230 20 20 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65     (char*)sqlite
30240 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79  3KeyInfoRef(pKey
30250 49 6e 66 6f 29 2c 20 50 34 5f 4b 45 59 49 4e 46  Info), P4_KEYINF
30260 4f 29 3b 0a 20 20 20 20 20 20 61 64 64 72 31 20  O);.      addr1 
30270 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
30280 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
30290 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
302a0 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c  dOp3(v, OP_Jump,
302b0 20 61 64 64 72 31 2b 31 2c 20 30 2c 20 61 64 64   addr1+1, 0, add
302c0 72 31 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72  r1+1); VdbeCover
302d0 61 67 65 28 76 29 3b 0a 0a 20 20 20 20 20 20 2f  age(v);..      /
302e0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
302f0 74 68 61 74 20 72 75 6e 73 20 77 68 65 6e 65 76  that runs whenev
30300 65 72 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  er the GROUP BY 
30310 63 68 61 6e 67 65 73 2e 0a 20 20 20 20 20 20 2a  changes..      *
30320 2a 20 43 68 61 6e 67 65 73 20 69 6e 20 74 68 65  * Changes in the
30330 20 47 52 4f 55 50 20 42 59 20 61 72 65 20 64 65   GROUP BY are de
30340 74 65 63 74 65 64 20 62 79 20 74 68 65 20 70 72  tected by the pr
30350 65 76 69 6f 75 73 20 63 6f 64 65 0a 20 20 20 20  evious code.    
30360 20 20 2a 2a 20 62 6c 6f 63 6b 2e 20 20 49 66 20    ** block.  If 
30370 74 68 65 72 65 20 77 65 72 65 20 6e 6f 20 63 68  there were no ch
30380 61 6e 67 65 73 2c 20 74 68 69 73 20 62 6c 6f 63  anges, this bloc
30390 6b 20 69 73 20 73 6b 69 70 70 65 64 2e 0a 20 20  k is skipped..  
303a0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
303b0 54 68 69 73 20 63 6f 64 65 20 63 6f 70 69 65 73  This code copies
303c0 20 63 75 72 72 65 6e 74 20 67 72 6f 75 70 20 62   current group b
303d0 79 20 74 65 72 6d 73 20 69 6e 20 62 30 2c 62 31  y terms in b0,b1
303e0 2c 62 32 2c 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a  ,b2,....      **
303f0 20 6f 76 65 72 20 74 6f 20 61 30 2c 61 31 2c 61   over to a0,a1,a
30400 32 2e 20 20 49 74 20 74 68 65 6e 20 63 61 6c 6c  2.  It then call
30410 73 20 74 68 65 20 6f 75 74 70 75 74 20 73 75 62  s the output sub
30420 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a  routine.      **
30430 20 61 6e 64 20 72 65 73 65 74 73 20 74 68 65 20   and resets the 
30440 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75  aggregate accumu
30450 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72 73 20  lator registers 
30460 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 0a 20  in preparation. 
30470 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20       ** for the 
30480 6e 65 78 74 20 47 52 4f 55 50 20 42 59 20 62 61  next GROUP BY ba
30490 74 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  tch..      */.  
304a0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
304b0 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20  odeMove(pParse, 
304c0 69 42 4d 65 6d 2c 20 69 41 4d 65 6d 2c 20 70 47  iBMem, iAMem, pG
304d0 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 29 3b 0a  roupBy->nExpr);.
304e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
304f0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
30500 73 75 62 2c 20 72 65 67 4f 75 74 70 75 74 52 6f  sub, regOutputRo
30510 77 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  w, addrOutputRow
30520 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
30530 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74 70 75 74  ment((v, "output
30540 20 6f 6e 65 20 72 6f 77 22 29 29 3b 0a 20 20 20   one row"));.   
30550 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
30560 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73  dOp2(v, OP_IfPos
30570 2c 20 69 41 62 6f 72 74 46 6c 61 67 2c 20 61 64  , iAbortFlag, ad
30580 64 72 45 6e 64 29 3b 20 56 64 62 65 43 6f 76 65  drEnd); VdbeCove
30590 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56  rage(v);.      V
305a0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
305b0 63 68 65 63 6b 20 61 62 6f 72 74 20 66 6c 61 67  check abort flag
305c0 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
305d0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
305e0 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 73  OP_Gosub, regRes
305f0 65 74 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a  et, addrReset);.
30600 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
30610 74 28 28 76 2c 20 22 72 65 73 65 74 20 61 63 63  t((v, "reset acc
30620 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20  umulator"));..  
30630 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
30640 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75  e aggregate accu
30650 6d 75 6c 61 74 6f 72 73 20 62 61 73 65 64 20 6f  mulators based o
30660 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  n the content of
30670 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 75  .      ** the cu
30680 72 72 65 6e 74 20 72 6f 77 0a 20 20 20 20 20 20  rrent row.      
30690 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
306a0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
306b0 61 64 64 72 31 29 3b 0a 20 20 20 20 20 20 75 70  addr1);.      up
306c0 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28  dateAccumulator(
306d0 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
306e0 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  o);.      sqlite
306f0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
30700 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 55  P_Integer, 1, iU
30710 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56  seFlag);.      V
30720 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
30730 69 6e 64 69 63 61 74 65 20 64 61 74 61 20 69 6e  indicate data in
30740 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b   accumulator"));
30750 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f  ..      /* End o
30760 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20 20 20 20  f the loop.     
30770 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 67 72   */.      if( gr
30780 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20  oupBySort ){.   
30790 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
307a0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
307b0 74 65 72 4e 65 78 74 2c 20 73 41 67 67 49 6e 66  terNext, sAggInf
307c0 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64  o.sortingIdx, ad
307d0 64 72 54 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20  drTopOfLoop);.  
307e0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
307f0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ge(v);.      }el
30800 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
30810 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e  te3WhereEnd(pWIn
30820 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  fo);.        sql
30830 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f  ite3VdbeChangeTo
30840 4e 6f 6f 70 28 76 2c 20 61 64 64 72 53 6f 72 74  Noop(v, addrSort
30850 69 6e 67 49 64 78 29 3b 0a 20 20 20 20 20 20 7d  ingIdx);.      }
30860 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75  ..      /* Outpu
30870 74 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 20  t the final row 
30880 6f 66 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20  of result.      
30890 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
308a0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
308b0 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 70 75  _Gosub, regOutpu
308c0 74 52 6f 77 2c 20 61 64 64 72 4f 75 74 70 75 74  tRow, addrOutput
308d0 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65  Row);.      Vdbe
308e0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74  Comment((v, "out
308f0 70 75 74 20 66 69 6e 61 6c 20 72 6f 77 22 29 29  put final row"))
30900 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70  ;..      /* Jump
30910 20 6f 76 65 72 20 74 68 65 20 73 75 62 72 6f 75   over the subrou
30920 74 69 6e 65 73 0a 20 20 20 20 20 20 2a 2f 0a 20  tines.      */. 
30930 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
30940 47 6f 74 6f 28 76 2c 20 61 64 64 72 45 6e 64 29  Goto(v, addrEnd)
30950 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  ;..      /* Gene
30960 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e  rate a subroutin
30970 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 61  e that outputs a
30980 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74   single row of t
30990 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20  he result.      
309a0 2a 2a 20 73 65 74 2e 20 20 54 68 69 73 20 73 75  ** set.  This su
309b0 62 72 6f 75 74 69 6e 65 20 66 69 72 73 74 20 6c  broutine first l
309c0 6f 6f 6b 73 20 61 74 20 74 68 65 20 69 55 73 65  ooks at the iUse
309d0 46 6c 61 67 2e 20 20 49 66 20 69 55 73 65 46 6c  Flag.  If iUseFl
309e0 61 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6c  ag.      ** is l
309f0 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
30a00 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 20 73  l to zero, the s
30a10 75 62 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  ubroutine is a n
30a20 6f 2d 6f 70 2e 20 20 49 66 0a 20 20 20 20 20 20  o-op.  If.      
30a30 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e  ** the processin
30a40 67 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20  g calls for the 
30a50 71 75 65 72 79 20 74 6f 20 61 62 6f 72 74 2c 20  query to abort, 
30a60 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 0a  this subroutine.
30a70 20 20 20 20 20 20 2a 2a 20 69 6e 63 72 65 6d 65        ** increme
30a80 6e 74 73 20 74 68 65 20 69 41 62 6f 72 74 46 6c  nts the iAbortFl
30a90 61 67 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69  ag memory locati
30aa0 6f 6e 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  on before return
30ab0 69 6e 67 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20  ing in.      ** 
30ac0 6f 72 64 65 72 20 74 6f 20 73 69 67 6e 61 6c 20  order to signal 
30ad0 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 61 62  the caller to ab
30ae0 6f 72 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ort..      */.  
30af0 20 20 20 20 61 64 64 72 53 65 74 41 62 6f 72 74      addrSetAbort
30b00 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
30b10 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
30b20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
30b30 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
30b40 67 65 72 2c 20 31 2c 20 69 41 62 6f 72 74 46 6c  ger, 1, iAbortFl
30b50 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ag);.      VdbeC
30b60 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73 65 74 20  omment((v, "set 
30b70 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20  abort flag"));. 
30b80 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
30b90 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74  AddOp1(v, OP_Ret
30ba0 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f  urn, regOutputRo
30bb0 77 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  w);.      sqlite
30bc0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
30bd0 6c 28 76 2c 20 61 64 64 72 4f 75 74 70 75 74 52  l(v, addrOutputR
30be0 6f 77 29 3b 0a 20 20 20 20 20 20 61 64 64 72 4f  ow);.      addrO
30bf0 75 74 70 75 74 52 6f 77 20 3d 20 73 71 6c 69 74  utputRow = sqlit
30c00 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
30c10 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r(v);.      sqli
30c20 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
30c30 20 4f 50 5f 49 66 50 6f 73 2c 20 69 55 73 65 46   OP_IfPos, iUseF
30c40 6c 61 67 2c 20 61 64 64 72 4f 75 74 70 75 74 52  lag, addrOutputR
30c50 6f 77 2b 32 29 3b 0a 20 20 20 20 20 20 56 64 62  ow+2);.      Vdb
30c60 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
30c70 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
30c80 28 76 2c 20 22 47 72 6f 75 70 62 79 20 72 65 73  (v, "Groupby res
30c90 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 20 65 6e  ult generator en
30ca0 74 72 79 20 70 6f 69 6e 74 22 29 29 3b 0a 20 20  try point"));.  
30cb0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
30cc0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
30cd0 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77  rn, regOutputRow
30ce0 29 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c 69 7a  );.      finaliz
30cf0 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50  eAggFunctions(pP
30d00 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
30d10 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
30d20 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
30d30 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72  e, pHaving, addr
30d40 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 53 51 4c  OutputRow+1, SQL
30d50 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
30d60 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e  .      selectInn
30d70 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
30d80 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 2d 31 2c  , p->pEList, -1,
30d90 20 26 73 53 6f 72 74 2c 0a 20 20 20 20 20 20 20   &sSort,.       
30da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
30db0 73 44 69 73 74 69 6e 63 74 2c 20 70 44 65 73 74  sDistinct, pDest
30dc0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
30dd0 20 20 20 20 20 20 20 20 61 64 64 72 4f 75 74 70          addrOutp
30de0 75 74 52 6f 77 2b 31 2c 20 61 64 64 72 53 65 74  utRow+1, addrSet
30df0 41 62 6f 72 74 29 3b 0a 20 20 20 20 20 20 73 71  Abort);.      sq
30e00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
30e10 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65  v, OP_Return, re
30e20 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20  gOutputRow);.   
30e30 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
30e40 76 2c 20 22 65 6e 64 20 67 72 6f 75 70 62 79 20  v, "end groupby 
30e50 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72  result generator
30e60 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47  "));..      /* G
30e70 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
30e80 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 72  tine that will r
30e90 65 73 65 74 20 74 68 65 20 67 72 6f 75 70 2d 62  eset the group-b
30ea0 79 20 61 63 63 75 6d 75 6c 61 74 6f 72 0a 20 20  y accumulator.  
30eb0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
30ec0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
30ed0 61 62 65 6c 28 76 2c 20 61 64 64 72 52 65 73 65  abel(v, addrRese
30ee0 74 29 3b 0a 20 20 20 20 20 20 72 65 73 65 74 41  t);.      resetA
30ef0 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73  ccumulator(pPars
30f00 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
30f10 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
30f20 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74  AddOp1(v, OP_Ret
30f30 75 72 6e 2c 20 72 65 67 52 65 73 65 74 29 3b 0a  urn, regReset);.
30f40 20 20 20 20 20 0a 20 20 20 20 7d 20 2f 2a 20 65       .    } /* e
30f50 6e 64 69 66 20 70 47 72 6f 75 70 42 79 2e 20 20  ndif pGroupBy.  
30f60 42 65 67 69 6e 20 61 67 67 72 65 67 61 74 65 20  Begin aggregate 
30f70 71 75 65 72 69 65 73 20 77 69 74 68 6f 75 74 20  queries without 
30f80 47 52 4f 55 50 20 42 59 3a 20 2a 2f 0a 20 20 20  GROUP BY: */.   
30f90 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 45 78   else {.      Ex
30fa0 70 72 4c 69 73 74 20 2a 70 44 65 6c 20 3d 20 30  prList *pDel = 0
30fb0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
30fc0 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54  _OMIT_BTREECOUNT
30fd0 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
30fe0 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70  ab;.      if( (p
30ff0 54 61 62 20 3d 20 69 73 53 69 6d 70 6c 65 43 6f  Tab = isSimpleCo
31000 75 6e 74 28 70 2c 20 26 73 41 67 67 49 6e 66 6f  unt(p, &sAggInfo
31010 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))!=0 ){.       
31020 20 2f 2a 20 49 66 20 69 73 53 69 6d 70 6c 65 43   /* If isSimpleC
31030 6f 75 6e 74 28 29 20 72 65 74 75 72 6e 73 20 61  ount() returns a
31040 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 54 61   pointer to a Ta
31050 62 6c 65 20 73 74 72 75 63 74 75 72 65 2c 20 74  ble structure, t
31060 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  hen.        ** t
31070 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
31080 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a   is of the form:
31090 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
310a0 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20      **   SELECT 
310b0 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c 74  count(*) FROM <t
310c0 62 6c 3e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  bl>.        **. 
310d0 20 20 20 20 20 20 20 2a 2a 20 77 68 65 72 65 20         ** where 
310e0 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  the Table struct
310f0 75 72 65 20 72 65 74 75 72 6e 65 64 20 72 65 70  ure returned rep
31100 72 65 73 65 6e 74 73 20 74 61 62 6c 65 20 3c 74  resents table <t
31110 62 6c 3e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  bl>..        **.
31120 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20          ** This 
31130 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73 6f 20  statement is so 
31140 63 6f 6d 6d 6f 6e 20 74 68 61 74 20 69 74 20 69  common that it i
31150 73 20 6f 70 74 69 6d 69 7a 65 64 20 73 70 65 63  s optimized spec
31160 69 61 6c 6c 79 2e 20 54 68 65 0a 20 20 20 20 20  ially. The.     
31170 20 20 20 2a 2a 20 4f 50 5f 43 6f 75 6e 74 20 69     ** OP_Count i
31180 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 65 78  nstruction is ex
31190 65 63 75 74 65 64 20 65 69 74 68 65 72 20 6f 6e  ecuted either on
311a0 20 74 68 65 20 69 6e 74 6b 65 79 20 74 61 62 6c   the intkey tabl
311b0 65 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a  e that.        *
311c0 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64  * contains the d
311d0 61 74 61 20 66 6f 72 20 74 61 62 6c 65 20 3c 74  ata for table <t
311e0 62 6c 3e 20 6f 72 20 6f 6e 20 6f 6e 65 20 6f 66  bl> or on one of
311f0 20 69 74 73 20 69 6e 64 65 78 65 73 2e 20 49 74   its indexes. It
31200 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 62  .        ** is b
31210 65 74 74 65 72 20 74 6f 20 65 78 65 63 75 74 65  etter to execute
31220 20 74 68 65 20 6f 70 20 6f 6e 20 61 6e 20 69 6e   the op on an in
31230 64 65 78 2c 20 61 73 20 69 6e 64 65 78 65 73 20  dex, as indexes 
31240 61 72 65 20 61 6c 6d 6f 73 74 0a 20 20 20 20 20  are almost.     
31250 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 70 72     ** always spr
31260 65 61 64 20 61 63 72 6f 73 73 20 6c 65 73 73 20  ead across less 
31270 70 61 67 65 73 20 74 68 61 6e 20 74 68 65 69 72  pages than their
31280 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
31290 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  ables..        *
312a0 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  /.        const 
312b0 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65  int iDb = sqlite
312c0 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70  3SchemaToIndex(p
312d0 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d  Parse->db, pTab-
312e0 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20  >pSchema);.     
312f0 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 43 73     const int iCs
31300 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
31310 2b 2b 3b 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  ++;     /* Curso
31320 72 20 74 6f 20 73 63 61 6e 20 62 2d 74 72 65 65  r to scan b-tree
31330 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e 64 65   */.        Inde
31340 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20  x *pIdx;        
31350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31360 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72   /* Iterator var
31370 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  iable */.       
31380 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
31390 66 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  fo = 0;         
313a0 20 20 20 20 20 20 2f 2a 20 4b 65 79 69 6e 66 6f        /* Keyinfo
313b0 20 66 6f 72 20 73 63 61 6e 6e 65 64 20 69 6e 64   for scanned ind
313c0 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e  ex */.        In
313d0 64 65 78 20 2a 70 42 65 73 74 20 3d 20 30 3b 20  dex *pBest = 0; 
313e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
313f0 20 20 20 2f 2a 20 42 65 73 74 20 69 6e 64 65 78     /* Best index
31400 20 66 6f 75 6e 64 20 73 6f 20 66 61 72 20 2a 2f   found so far */
31410 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 6f  .        int iRo
31420 6f 74 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b  ot = pTab->tnum;
31430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31440 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 73 63   Root page of sc
31450 61 6e 6e 65 64 20 62 2d 74 72 65 65 20 2a 2f 0a  anned b-tree */.
31460 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
31470 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
31480 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
31490 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61         sqlite3Ta
314a0 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20  bleLock(pParse, 
314b0 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c  iDb, pTab->tnum,
314c0 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29   0, pTab->zName)
314d0 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65  ;..        /* Se
314e0 61 72 63 68 20 66 6f 72 20 74 68 65 20 69 6e 64  arch for the ind
314f0 65 78 20 74 68 61 74 20 68 61 73 20 74 68 65 20  ex that has the 
31500 6c 6f 77 65 73 74 20 73 63 61 6e 20 63 6f 73 74  lowest scan cost
31510 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
31520 20 20 20 20 20 2a 2a 20 28 32 30 31 31 2d 30 34       ** (2011-04
31530 2d 31 35 29 20 44 6f 20 6e 6f 74 20 64 6f 20 61  -15) Do not do a
31540 20 66 75 6c 6c 20 73 63 61 6e 20 6f 66 20 61 6e   full scan of an
31550 20 75 6e 6f 72 64 65 72 65 64 20 69 6e 64 65 78   unordered index
31560 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
31570 20 20 20 20 20 2a 2a 20 28 32 30 31 33 2d 31 30       ** (2013-10
31580 2d 30 33 29 20 44 6f 20 6e 6f 74 20 63 6f 75 6e  -03) Do not coun
31590 74 20 74 68 65 20 65 6e 74 72 69 65 73 20 69 6e  t the entries in
315a0 20 61 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78   a partial index
315b0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
315c0 20 20 20 20 20 2a 2a 20 49 6e 20 70 72 61 63 74       ** In pract
315d0 69 63 65 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  ice the KeyInfo 
315e0 73 74 72 75 63 74 75 72 65 20 77 69 6c 6c 20 6e  structure will n
315f0 6f 74 20 62 65 20 75 73 65 64 2e 20 49 74 20 69  ot be used. It i
31600 73 20 6f 6e 6c 79 20 0a 20 20 20 20 20 20 20 20  s only .        
31610 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 6b 65 65  ** passed to kee
31620 70 20 4f 50 5f 4f 70 65 6e 52 65 61 64 20 68 61  p OP_OpenRead ha
31630 70 70 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ppy..        */.
31640 20 20 20 20 20 20 20 20 69 66 28 20 21 48 61 73          if( !Has
31650 52 6f 77 69 64 28 70 54 61 62 29 20 29 20 70 42  Rowid(pTab) ) pB
31660 65 73 74 20 3d 20 73 71 6c 69 74 65 33 50 72 69  est = sqlite3Pri
31670 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61  maryKeyIndex(pTa
31680 62 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  b);.        for(
31690 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
316a0 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
316b0 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
316c0 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
316d0 62 55 6e 6f 72 64 65 72 65 64 3d 3d 30 0a 20 20  bUnordered==0.  
316e0 20 20 20 20 20 20 20 20 20 26 26 20 70 49 64 78           && pIdx
316f0 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 54 61 62 2d  ->szIdxRow<pTab-
31700 3e 73 7a 54 61 62 52 6f 77 0a 20 20 20 20 20 20  >szTabRow.      
31710 20 20 20 20 20 26 26 20 70 49 64 78 2d 3e 70 50       && pIdx->pP
31720 61 72 74 49 64 78 57 68 65 72 65 3d 3d 30 0a 20  artIdxWhere==0. 
31730 20 20 20 20 20 20 20 20 20 20 26 26 20 28 21 70            && (!p
31740 42 65 73 74 20 7c 7c 20 70 49 64 78 2d 3e 73 7a  Best || pIdx->sz
31750 49 64 78 52 6f 77 3c 70 42 65 73 74 2d 3e 73 7a  IdxRow<pBest->sz
31760 49 64 78 52 6f 77 29 0a 20 20 20 20 20 20 20 20  IdxRow).        
31770 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
31780 20 70 42 65 73 74 20 3d 20 70 49 64 78 3b 0a 20   pBest = pIdx;. 
31790 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
317a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
317b0 20 70 42 65 73 74 20 29 7b 0a 20 20 20 20 20 20   pBest ){.      
317c0 20 20 20 20 69 52 6f 6f 74 20 3d 20 70 42 65 73      iRoot = pBes
317d0 74 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20  t->tnum;.       
317e0 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71     pKeyInfo = sq
317f0 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e  lite3KeyInfoOfIn
31800 64 65 78 28 70 50 61 72 73 65 2c 20 70 42 65 73  dex(pParse, pBes
31810 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  t);.        }.. 
31820 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 61         /* Open a
31830 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f   read-only curso
31840 72 2c 20 65 78 65 63 75 74 65 20 74 68 65 20 4f  r, execute the O
31850 50 5f 43 6f 75 6e 74 2c 20 63 6c 6f 73 65 20 74  P_Count, close t
31860 68 65 20 63 75 72 73 6f 72 2e 20 2a 2f 0a 20 20  he cursor. */.  
31870 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
31880 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
31890 5f 4f 70 65 6e 52 65 61 64 2c 20 69 43 73 72 2c  _OpenRead, iCsr,
318a0 20 69 52 6f 6f 74 2c 20 69 44 62 2c 20 31 29 3b   iRoot, iDb, 1);
318b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4b 65  .        if( pKe
318c0 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20  yInfo ){.       
318d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
318e0 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63  angeP4(v, -1, (c
318f0 68 61 72 20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  har *)pKeyInfo, 
31900 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P4_KEYINFO);.   
31910 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
31920 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
31930 28 76 2c 20 4f 50 5f 43 6f 75 6e 74 2c 20 69 43  (v, OP_Count, iC
31940 73 72 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75  sr, sAggInfo.aFu
31950 6e 63 5b 30 5d 2e 69 4d 65 6d 29 3b 0a 20 20 20  nc[0].iMem);.   
31960 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
31970 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp1(v, OP_Clo
31980 73 65 2c 20 69 43 73 72 29 3b 0a 20 20 20 20 20  se, iCsr);.     
31990 20 20 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65     explainSimple
319a0 43 6f 75 6e 74 28 70 50 61 72 73 65 2c 20 70 54  Count(pParse, pT
319b0 61 62 2c 20 70 42 65 73 74 29 3b 0a 20 20 20 20  ab, pBest);.    
319c0 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f    }else.#endif /
319d0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54  * SQLITE_OMIT_BT
319e0 52 45 45 43 4f 55 4e 54 20 2a 2f 0a 20 20 20 20  REECOUNT */.    
319f0 20 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43    {.        /* C
31a00 68 65 63 6b 20 69 66 20 74 68 65 20 71 75 65 72  heck if the quer
31a10 79 20 69 73 20 6f 66 20 6f 6e 65 20 6f 66 20 74  y is of one of t
31a20 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72  he following for
31a30 6d 73 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ms:.        **. 
31a40 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45         **   SELE
31a50 43 54 20 6d 69 6e 28 78 29 20 46 52 4f 4d 20 2e  CT min(x) FROM .
31a60 2e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  ...        **   
31a70 53 45 4c 45 43 54 20 6d 61 78 28 78 29 20 46 52  SELECT max(x) FR
31a80 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 20 20 2a  OM ....        *
31a90 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20  *.        ** If 
31aa0 69 74 20 69 73 2c 20 74 68 65 6e 20 61 73 6b 20  it is, then ask 
31ab0 74 68 65 20 63 6f 64 65 20 69 6e 20 77 68 65 72  the code in wher
31ac0 65 2e 63 20 74 6f 20 61 74 74 65 6d 70 74 20 74  e.c to attempt t
31ad0 6f 20 73 6f 72 74 20 72 65 73 75 6c 74 73 0a 20  o sort results. 
31ae0 20 20 20 20 20 20 20 2a 2a 20 61 73 20 69 66 20         ** as if 
31af0 74 68 65 72 65 20 77 61 73 20 61 6e 20 22 4f 52  there was an "OR
31b00 44 45 52 20 4f 4e 20 78 22 20 6f 72 20 22 4f 52  DER ON x" or "OR
31b10 44 45 52 20 4f 4e 20 78 20 44 45 53 43 22 20 63  DER ON x DESC" c
31b20 6c 61 75 73 65 2e 20 0a 20 20 20 20 20 20 20 20  lause. .        
31b30 2a 2a 20 49 66 20 77 68 65 72 65 2e 63 20 69 73  ** If where.c is
31b40 20 61 62 6c 65 20 74 6f 20 70 72 6f 64 75 63 65   able to produce
31b50 20 72 65 73 75 6c 74 73 20 73 6f 72 74 65 64 20   results sorted 
31b60 69 6e 20 74 68 69 73 20 6f 72 64 65 72 2c 20 74  in this order, t
31b70 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  hen.        ** a
31b80 64 64 20 76 64 62 65 20 63 6f 64 65 20 74 6f 20  dd vdbe code to 
31b90 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65  break out of the
31ba0 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 6f 70   processing loop
31bb0 20 61 66 74 65 72 20 74 68 65 20 0a 20 20 20 20   after the .    
31bc0 20 20 20 20 2a 2a 20 66 69 72 73 74 20 69 74 65      ** first ite
31bd0 72 61 74 69 6f 6e 20 28 73 69 6e 63 65 20 74 68  ration (since th
31be0 65 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f  e first iteratio
31bf0 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 73  n of the loop is
31c00 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 67 75 61   .        ** gua
31c10 72 61 6e 74 65 65 64 20 74 6f 20 6f 70 65 72 61  ranteed to opera
31c20 74 65 20 6f 6e 20 74 68 65 20 72 6f 77 20 77 69  te on the row wi
31c30 74 68 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 6f  th the minimum o
31c40 72 20 6d 61 78 69 6d 75 6d 20 0a 20 20 20 20 20  r maximum .     
31c50 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 78     ** value of x
31c60 2c 20 74 68 65 20 6f 6e 6c 79 20 72 6f 77 20 72  , the only row r
31c70 65 71 75 69 72 65 64 29 2e 0a 20 20 20 20 20 20  equired)..      
31c80 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
31c90 41 20 73 70 65 63 69 61 6c 20 66 6c 61 67 20 6d  A special flag m
31ca0 75 73 74 20 62 65 20 70 61 73 73 65 64 20 74 6f  ust be passed to
31cb0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
31cc0 69 6e 28 29 20 74 6f 20 73 6c 69 67 68 74 6c 79  in() to slightly
31cd0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 69  .        ** modi
31ce0 66 79 20 62 65 68 61 76 69 6f 72 20 61 73 20 66  fy behavior as f
31cf0 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20 20 20  ollows:.        
31d00 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
31d10 2b 20 49 66 20 74 68 65 20 71 75 65 72 79 20 69  + If the query i
31d20 73 20 61 20 22 53 45 4c 45 43 54 20 6d 69 6e 28  s a "SELECT min(
31d30 78 29 22 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f  x)", then the lo
31d40 6f 70 20 63 6f 64 65 64 20 62 79 0a 20 20 20 20  op coded by.    
31d50 20 20 20 20 2a 2a 20 20 20 20 20 77 68 65 72 65      **     where
31d60 2e 63 20 73 68 6f 75 6c 64 20 6e 6f 74 20 69 74  .c should not it
31d70 65 72 61 74 65 20 6f 76 65 72 20 61 6e 79 20 76  erate over any v
31d80 61 6c 75 65 73 20 77 69 74 68 20 61 20 4e 55 4c  alues with a NUL
31d90 4c 20 76 61 6c 75 65 0a 20 20 20 20 20 20 20 20  L value.        
31da0 2a 2a 20 20 20 20 20 66 6f 72 20 78 2e 0a 20 20  **     for x..  
31db0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
31dc0 20 2a 2a 20 20 20 2b 20 54 68 65 20 6f 70 74 69   **   + The opti
31dd0 6d 69 7a 65 72 20 63 6f 64 65 20 69 6e 20 77 68  mizer code in wh
31de0 65 72 65 2e 63 20 28 74 68 65 20 74 68 69 6e 67  ere.c (the thing
31df0 20 74 68 61 74 20 64 65 63 69 64 65 73 20 77 68   that decides wh
31e00 69 63 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  ich.        **  
31e10 20 20 20 69 6e 64 65 78 20 6f 72 20 69 6e 64 69     index or indi
31e20 63 65 73 20 74 6f 20 75 73 65 29 20 73 68 6f 75  ces to use) shou
31e30 6c 64 20 70 6c 61 63 65 20 61 20 64 69 66 66 65  ld place a diffe
31e40 72 65 6e 74 20 70 72 69 6f 72 69 74 79 20 6f 6e  rent priority on
31e50 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20   .        **    
31e60 20 73 61 74 69 73 66 79 69 6e 67 20 74 68 65 20   satisfying the 
31e70 27 4f 52 44 45 52 20 42 59 27 20 63 6c 61 75 73  'ORDER BY' claus
31e80 65 20 74 68 61 6e 20 69 74 20 64 6f 65 73 20 69  e than it does i
31e90 6e 20 6f 74 68 65 72 20 63 61 73 65 73 2e 0a 20  n other cases.. 
31ea0 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 52 65         **     Re
31eb0 66 65 72 20 74 6f 20 63 6f 64 65 20 61 6e 64 20  fer to code and 
31ec0 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 77 68 65 72  comments in wher
31ed0 65 2e 63 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  e.c for details.
31ee0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
31ef0 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4d      ExprList *pM
31f00 69 6e 4d 61 78 20 3d 20 30 3b 0a 20 20 20 20 20  inMax = 0;.     
31f10 20 20 20 75 38 20 66 6c 61 67 20 3d 20 57 48 45     u8 flag = WHE
31f20 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41  RE_ORDERBY_NORMA
31f30 4c 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20  L;.        .    
31f40 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
31f50 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20  GroupBy==0 );.  
31f60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 66 6c        assert( fl
31f70 61 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ag==0 );.       
31f80 20 69 66 28 20 70 2d 3e 70 48 61 76 69 6e 67 3d   if( p->pHaving=
31f90 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
31fa0 66 6c 61 67 20 3d 20 6d 69 6e 4d 61 78 51 75 65  flag = minMaxQue
31fb0 72 79 28 26 73 41 67 67 49 6e 66 6f 2c 20 26 70  ry(&sAggInfo, &p
31fc0 4d 69 6e 4d 61 78 29 3b 0a 20 20 20 20 20 20 20  MinMax);.       
31fd0 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
31fe0 74 28 20 66 6c 61 67 3d 3d 30 20 7c 7c 20 28 70  t( flag==0 || (p
31ff0 4d 69 6e 4d 61 78 21 3d 30 20 26 26 20 70 4d 69  MinMax!=0 && pMi
32000 6e 4d 61 78 2d 3e 6e 45 78 70 72 3d 3d 31 29 20  nMax->nExpr==1) 
32010 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20  );..        if( 
32020 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20  flag ){.        
32030 20 20 70 4d 69 6e 4d 61 78 20 3d 20 73 71 6c 69    pMinMax = sqli
32040 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
32050 62 2c 20 70 4d 69 6e 4d 61 78 2c 20 30 29 3b 0a  b, pMinMax, 0);.
32060 20 20 20 20 20 20 20 20 20 20 70 44 65 6c 20 3d            pDel =
32070 20 70 4d 69 6e 4d 61 78 3b 0a 20 20 20 20 20 20   pMinMax;.      
32080 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
32090 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
320a0 70 4d 69 6e 4d 61 78 21 3d 30 20 29 3b 0a 20 20  pMinMax!=0 );.  
320b0 20 20 20 20 20 20 20 20 69 66 28 20 21 64 62 2d          if( !db-
320c0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
320d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4d 69  .            pMi
320e0 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f  nMax->a[0].sortO
320f0 72 64 65 72 20 3d 20 66 6c 61 67 21 3d 57 48 45  rder = flag!=WHE
32100 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20 3f  RE_ORDERBY_MIN ?
32110 31 3a 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  1:0;.           
32120 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 70   pMinMax->a[0].p
32130 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f  Expr->op = TK_CO
32140 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20 20  LUMN;.          
32150 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20  }.        }.  . 
32160 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63         /* This c
32170 61 73 65 20 72 75 6e 73 20 69 66 20 74 68 65 20  ase runs if the 
32180 61 67 67 72 65 67 61 74 65 20 68 61 73 20 6e 6f  aggregate has no
32190 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
321a0 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a  .  The.        *
321b0 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 69 73 20  * processing is 
321c0 6d 75 63 68 20 73 69 6d 70 6c 65 72 20 73 69 6e  much simpler sin
321d0 63 65 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79  ce there is only
321e0 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 0a 20 20   a single row.  
321f0 20 20 20 20 20 20 2a 2a 20 6f 66 20 6f 75 74 70        ** of outp
32200 75 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ut..        */. 
32210 20 20 20 20 20 20 20 72 65 73 65 74 41 63 63 75         resetAccu
32220 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20  mulator(pParse, 
32230 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
32240 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c      pWInfo = sql
32250 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70  ite3WhereBegin(p
32260 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
32270 20 70 57 68 65 72 65 2c 20 70 4d 69 6e 4d 61 78   pWhere, pMinMax
32280 2c 30 2c 66 6c 61 67 2c 30 29 3b 0a 20 20 20 20  ,0,flag,0);.    
32290 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d      if( pWInfo==
322a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
322b0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
322c0 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a  lete(db, pDel);.
322d0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73            goto s
322e0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
322f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75 70 64     }.        upd
32300 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70  ateAccumulator(p
32310 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
32320 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
32330 74 28 20 70 4d 69 6e 4d 61 78 3d 3d 30 20 7c 7c  t( pMinMax==0 ||
32340 20 70 4d 69 6e 4d 61 78 2d 3e 6e 45 78 70 72 3d   pMinMax->nExpr=
32350 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  =1 );.        if
32360 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73  ( sqlite3WhereIs
32370 4f 72 64 65 72 65 64 28 70 57 49 6e 66 6f 29 3e  Ordered(pWInfo)>
32380 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
32390 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
323a0 2c 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 72  , sqlite3WhereBr
323b0 65 61 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29  eakLabel(pWInfo)
323c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62  );.          Vdb
323d0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
323e0 28 29 20 62 79 20 69 6e 64 65 78 22 2c 0a 20 20  () by index",.  
323f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 66                (f
32400 6c 61 67 3d 3d 57 48 45 52 45 5f 4f 52 44 45 52  lag==WHERE_ORDER
32410 42 59 5f 4d 49 4e 3f 22 6d 69 6e 22 3a 22 6d 61  BY_MIN?"min":"ma
32420 78 22 29 29 29 3b 0a 20 20 20 20 20 20 20 20 7d  x")));.        }
32430 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
32440 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29  WhereEnd(pWInfo)
32450 3b 0a 20 20 20 20 20 20 20 20 66 69 6e 61 6c 69  ;.        finali
32460 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70  zeAggFunctions(p
32470 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
32480 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
32490 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79    sSort.pOrderBy
324a0 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 0;.      sqli
324b0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
324c0 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20  Parse, pHaving, 
324d0 61 64 64 72 45 6e 64 2c 20 53 51 4c 49 54 45 5f  addrEnd, SQLITE_
324e0 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
324f0 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f     selectInnerLo
32500 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  op(pParse, p, p-
32510 3e 70 45 4c 69 73 74 2c 20 2d 31 2c 20 30 2c 20  >pEList, -1, 0, 
32520 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  0, .            
32530 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2c            pDest,
32540 20 61 64 64 72 45 6e 64 2c 20 61 64 64 72 45 6e   addrEnd, addrEn
32550 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
32560 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
32570 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20 20 20 7d  db, pDel);.    }
32580 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
32590 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
325a0 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 0a 20  addrEnd);.    . 
325b0 20 7d 20 2f 2a 20 65 6e 64 69 66 20 61 67 67 72   } /* endif aggr
325c0 65 67 61 74 65 20 71 75 65 72 79 20 2a 2f 0a 0a  egate query */..
325d0 20 20 69 66 28 20 73 44 69 73 74 69 6e 63 74 2e    if( sDistinct.
325e0 65 54 6e 63 74 54 79 70 65 3d 3d 57 48 45 52 45  eTnctType==WHERE
325f0 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45  _DISTINCT_UNORDE
32600 52 45 44 20 29 7b 0a 20 20 20 20 65 78 70 6c 61  RED ){.    expla
32610 69 6e 54 65 6d 70 54 61 62 6c 65 28 70 50 61 72  inTempTable(pPar
32620 73 65 2c 20 22 44 49 53 54 49 4e 43 54 22 29 3b  se, "DISTINCT");
32630 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
32640 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ere is an ORDER 
32650 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20  BY clause, then 
32660 77 65 20 6e 65 65 64 20 74 6f 20 73 6f 72 74 20  we need to sort 
32670 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a  the results.  **
32680 20 61 6e 64 20 73 65 6e 64 20 74 68 65 6d 20 74   and send them t
32690 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f  o the callback o
326a0 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a  ne by one..  */.
326b0 20 20 69 66 28 20 73 53 6f 72 74 2e 70 4f 72 64    if( sSort.pOrd
326c0 65 72 42 79 20 29 7b 0a 20 20 20 20 65 78 70 6c  erBy ){.    expl
326d0 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 70 50 61  ainTempTable(pPa
326e0 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rse,.           
326f0 20 20 20 20 20 20 20 20 20 20 73 53 6f 72 74 2e            sSort.
32700 6e 4f 42 53 61 74 3e 30 20 3f 20 22 52 49 47 48  nOBSat>0 ? "RIGH
32710 54 20 50 41 52 54 20 4f 46 20 4f 52 44 45 52 20  T PART OF ORDER 
32720 42 59 22 3a 22 4f 52 44 45 52 20 42 59 22 29 3b  BY":"ORDER BY");
32730 0a 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72  .    generateSor
32740 74 54 61 69 6c 28 70 50 61 72 73 65 2c 20 70 2c  tTail(pParse, p,
32750 20 26 73 53 6f 72 74 2c 20 70 45 4c 69 73 74 2d   &sSort, pEList-
32760 3e 6e 45 78 70 72 2c 20 70 44 65 73 74 29 3b 0a  >nExpr, pDest);.
32770 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68    }..  /* Jump h
32780 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68 69 73  ere to skip this
32790 20 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71   query.  */.  sq
327a0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
327b0 4c 61 62 65 6c 28 76 2c 20 69 45 6e 64 29 3b 0a  Label(v, iEnd);.
327c0 0a 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54  .  /* The SELECT
327d0 20 68 61 73 20 62 65 65 6e 20 63 6f 64 65 64 2e   has been coded.
327e0 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   If there is an 
327f0 65 72 72 6f 72 20 69 6e 20 74 68 65 20 50 61 72  error in the Par
32800 73 65 20 73 74 72 75 63 74 75 72 65 2c 0a 20 20  se structure,.  
32810 2a 2a 20 73 65 74 20 74 68 65 20 72 65 74 75 72  ** set the retur
32820 6e 20 63 6f 64 65 20 74 6f 20 31 2e 20 4f 74 68  n code to 1. Oth
32830 65 72 77 69 73 65 20 30 2e 20 2a 2f 0a 20 20 72  erwise 0. */.  r
32840 63 20 3d 20 28 70 50 61 72 73 65 2d 3e 6e 45 72  c = (pParse->nEr
32850 72 3e 30 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74  r>0);..  /* Cont
32860 72 6f 6c 20 6a 75 6d 70 73 20 74 6f 20 68 65 72  rol jumps to her
32870 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73  e if an error is
32880 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 62 6f   encountered abo
32890 76 65 2c 20 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a  ve, or upon.  **
328a0 20 73 75 63 63 65 73 73 66 75 6c 20 63 6f 64 69   successful codi
328b0 6e 67 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  ng of the SELECT
328c0 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e  ..  */.select_en
328d0 64 3a 0a 20 20 65 78 70 6c 61 69 6e 53 65 74 49  d:.  explainSetI
328e0 6e 74 65 67 65 72 28 70 50 61 72 73 65 2d 3e 69  nteger(pParse->i
328f0 53 65 6c 65 63 74 49 64 2c 20 69 52 65 73 74 6f  SelectId, iResto
32900 72 65 53 65 6c 65 63 74 49 64 29 3b 0a 0a 20 20  reSelectId);..  
32910 2f 2a 20 49 64 65 6e 74 69 66 79 20 63 6f 6c 75  /* Identify colu
32920 6d 6e 20 6e 61 6d 65 73 20 69 66 20 72 65 73 75  mn names if resu
32930 6c 74 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43  lts of the SELEC
32940 54 20 61 72 65 20 74 6f 20 62 65 20 6f 75 74 70  T are to be outp
32950 75 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  ut..  */.  if( r
32960 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
32970 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
32980 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20  T_Output ){.    
32990 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
329a0 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  mes(pParse, pTab
329b0 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 20  List, pEList);. 
329c0 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 44 62 46   }..  sqlite3DbF
329d0 72 65 65 28 64 62 2c 20 73 41 67 67 49 6e 66 6f  ree(db, sAggInfo
329e0 2e 61 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65  .aCol);.  sqlite
329f0 33 44 62 46 72 65 65 28 64 62 2c 20 73 41 67 67  3DbFree(db, sAgg
32a00 49 6e 66 6f 2e 61 46 75 6e 63 29 3b 0a 23 69 66  Info.aFunc);.#if
32a10 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
32a20 42 4c 45 44 0a 20 20 53 45 4c 45 43 54 54 52 41  BLED.  SELECTTRA
32a30 43 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 28 22  CE(1,pParse,p,("
32a40 65 6e 64 20 70 72 6f 63 65 73 73 69 6e 67 5c 6e  end processing\n
32a50 22 29 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  "));.  pParse->n
32a60 53 65 6c 65 63 74 49 6e 64 65 6e 74 2d 2d 3b 0a  SelectIndent--;.
32a70 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
32a80 72 63 3b 0a 7d 0a                                rc;.}.