/ Hex Artifact Content
Login

Artifact 9fa0db382f43217e207a145b8c6cec26e85cd1a42a8428ee8b3df5870dfea0f4:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f 75 74 70  /*.** Trace outp
0210: 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a 23 69 66  ut macros.*/.#if
0220: 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
0230: 42 4c 45 44 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73  BLED./***/ int s
0240: 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
0250: 65 20 3d 20 30 3b 0a 23 20 64 65 66 69 6e 65 20  e = 0;.# define 
0260: 53 45 4c 45 43 54 54 52 41 43 45 28 4b 2c 50 2c  SELECTTRACE(K,P,
0270: 53 2c 58 29 20 20 5c 0a 20 20 69 66 28 73 71 6c  S,X)  \.  if(sql
0280: 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 26  ite3SelectTrace&
0290: 28 4b 29 29 20 20 20 5c 0a 20 20 20 20 73 71 6c  (K))   \.    sql
02a0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
02b0: 22 25 2a 73 25 73 2e 25 70 3a 20 22 2c 28 50 29  "%*s%s.%p: ",(P)
02c0: 2d 3e 6e 53 65 6c 65 63 74 49 6e 64 65 6e 74 2a  ->nSelectIndent*
02d0: 32 2d 32 2c 22 22 2c 5c 0a 20 20 20 20 20 20 20  2-2,"",\.       
02e0: 20 28 53 29 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 28   (S)->zSelName,(
02f0: 53 29 29 2c 5c 0a 20 20 20 20 73 71 6c 69 74 65  S)),\.    sqlite
0300: 33 44 65 62 75 67 50 72 69 6e 74 66 20 58 0a 23  3DebugPrintf X.#
0310: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 53 45  else.# define SE
0320: 4c 45 43 54 54 52 41 43 45 28 4b 2c 50 2c 53 2c  LECTTRACE(K,P,S,
0330: 58 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  X).#endif.../*.*
0340: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
0350: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f   the following o
0360: 62 6a 65 63 74 20 69 73 20 75 73 65 64 20 74 6f  bject is used to
0370: 20 72 65 63 6f 72 64 20 69 6e 66 6f 72 6d 61 74   record informat
0380: 69 6f 6e 20 61 62 6f 75 74 0a 2a 2a 20 68 6f 77  ion about.** how
0390: 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20   to process the 
03a0: 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
03b0: 2c 20 74 6f 20 73 69 6d 70 6c 69 66 79 20 70 61  , to simplify pa
03c0: 73 73 69 6e 67 20 74 68 61 74 20 69 6e 66 6f 72  ssing that infor
03d0: 6d 61 74 69 6f 6e 0a 2a 2a 20 69 6e 74 6f 20 74  mation.** into t
03e0: 68 65 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  he selectInnerLo
03f0: 6f 70 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  op() routine..*/
0400: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0410: 44 69 73 74 69 6e 63 74 43 74 78 20 44 69 73 74  DistinctCtx Dist
0420: 69 6e 63 74 43 74 78 3b 0a 73 74 72 75 63 74 20  inctCtx;.struct 
0430: 44 69 73 74 69 6e 63 74 43 74 78 20 7b 0a 20 20  DistinctCtx {.  
0440: 75 38 20 69 73 54 6e 63 74 3b 20 20 20 20 20 20  u8 isTnct;      
0450: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 44  /* True if the D
0460: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
0470: 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  is present */.  
0480: 75 38 20 65 54 6e 63 74 54 79 70 65 3b 20 20 20  u8 eTnctType;   
0490: 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 48  /* One of the WH
04a0: 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 2a 20 6f  ERE_DISTINCT_* o
04b0: 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 69 6e  perators */.  in
04c0: 74 20 74 61 62 54 6e 63 74 3b 20 20 20 20 2f 2a  t tabTnct;    /*
04d0: 20 45 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   Ephemeral table
04e0: 20 75 73 65 64 20 66 6f 72 20 44 49 53 54 49 4e   used for DISTIN
04f0: 43 54 20 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f  CT processing */
0500: 0a 20 20 69 6e 74 20 61 64 64 72 54 6e 63 74 3b  .  int addrTnct;
0510: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
0520: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
0530: 6c 20 6f 70 63 6f 64 65 20 66 6f 72 20 74 61 62  l opcode for tab
0540: 54 6e 63 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  Tnct */.};../*.*
0550: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
0560: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f   the following o
0570: 62 6a 65 63 74 20 69 73 20 75 73 65 64 20 74 6f  bject is used to
0580: 20 72 65 63 6f 72 64 20 69 6e 66 6f 72 6d 61 74   record informat
0590: 69 6f 6e 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65  ion about.** the
05a0: 20 4f 52 44 45 52 20 42 59 20 28 6f 72 20 47 52   ORDER BY (or GR
05b0: 4f 55 50 20 42 59 29 20 63 6c 61 75 73 65 20 6f  OUP BY) clause o
05c0: 66 20 71 75 65 72 79 20 69 73 20 62 65 69 6e 67  f query is being
05d0: 20 63 6f 64 65 64 2e 0a 2a 2f 0a 74 79 70 65 64   coded..*/.typed
05e0: 65 66 20 73 74 72 75 63 74 20 53 6f 72 74 43 74  ef struct SortCt
05f0: 78 20 53 6f 72 74 43 74 78 3b 0a 73 74 72 75 63  x SortCtx;.struc
0600: 74 20 53 6f 72 74 43 74 78 20 7b 0a 20 20 45 78  t SortCtx {.  Ex
0610: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
0620: 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52  ;   /* The ORDER
0630: 20 42 59 20 28 6f 72 20 47 52 4f 55 50 20 42 59   BY (or GROUP BY
0640: 20 63 6c 61 75 73 65 29 20 2a 2f 0a 20 20 69 6e   clause) */.  in
0650: 74 20 6e 4f 42 53 61 74 3b 20 20 20 20 20 20 20  t nOBSat;       
0660: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
0670: 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
0680: 73 61 74 69 73 66 69 65 64 20 62 79 20 69 6e 64  satisfied by ind
0690: 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45  ices */.  int iE
06a0: 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20 20 20  Cursor;         
06b0: 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
06c0: 20 66 6f 72 20 74 68 65 20 73 6f 72 74 65 72 20   for the sorter 
06d0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 74 75  */.  int regRetu
06e0: 72 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 65  rn;        /* Re
06f0: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 62  gister holding b
0700: 6c 6f 63 6b 2d 6f 75 74 70 75 74 20 72 65 74 75  lock-output retu
0710: 72 6e 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20  rn address */.  
0720: 69 6e 74 20 6c 61 62 65 6c 42 6b 4f 75 74 3b 20  int labelBkOut; 
0730: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6c        /* Start l
0740: 61 62 65 6c 20 66 6f 72 20 74 68 65 20 62 6c 6f  abel for the blo
0750: 63 6b 2d 6f 75 74 70 75 74 20 73 75 62 72 6f 75  ck-output subrou
0760: 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
0770: 64 72 53 6f 72 74 49 6e 64 65 78 3b 20 20 20 20  drSortIndex;    
0780: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
0790: 65 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 20  e OP_SorterOpen 
07a0: 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  or OP_OpenEpheme
07b0: 72 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62  ral */.  int lab
07c0: 65 6c 44 6f 6e 65 3b 20 20 20 20 20 20 20 20 2f  elDone;        /
07d0: 2a 20 4a 75 6d 70 20 68 65 72 65 20 77 68 65 6e  * Jump here when
07e0: 20 64 6f 6e 65 2c 20 65 78 3a 20 4c 49 4d 49 54   done, ex: LIMIT
07f0: 20 72 65 61 63 68 65 64 20 2a 2f 0a 20 20 75 38   reached */.  u8
0800: 20 73 6f 72 74 46 6c 61 67 73 3b 20 20 20 20 20   sortFlags;     
0810: 20 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d      /* Zero or m
0820: 6f 72 65 20 53 4f 52 54 46 4c 41 47 5f 2a 20 62  ore SORTFLAG_* b
0830: 69 74 73 20 2a 2f 0a 20 20 75 38 20 62 4f 72 64  its */.  u8 bOrd
0840: 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 3b 20 2f  eredInnerLoop; /
0850: 2a 20 4f 52 44 45 52 20 42 59 20 63 6f 72 72 65  * ORDER BY corre
0860: 63 74 6c 79 20 73 6f 72 74 73 20 74 68 65 20 69  ctly sorts the i
0870: 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 7d 3b 0a  nner loop */.};.
0880: 23 64 65 66 69 6e 65 20 53 4f 52 54 46 4c 41 47  #define SORTFLAG
0890: 5f 55 73 65 53 6f 72 74 65 72 20 20 30 78 30 31  _UseSorter  0x01
08a0: 20 20 20 2f 2a 20 55 73 65 20 53 6f 72 74 65 72     /* Use Sorter
08b0: 4f 70 65 6e 20 69 6e 73 74 65 61 64 20 6f 66 20  Open instead of 
08c0: 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 2a 2f  OpenEphemeral */
08d0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
08e0: 6c 6c 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ll the content o
08f0: 66 20 61 20 53 65 6c 65 63 74 20 73 74 72 75 63  f a Select struc
0900: 74 75 72 65 2e 20 20 44 65 61 6c 6c 6f 63 61 74  ture.  Deallocat
0910: 65 20 74 68 65 20 73 74 72 75 63 74 75 72 65 0a  e the structure.
0920: 2a 2a 20 69 74 73 65 6c 66 20 6f 6e 6c 79 20 69  ** itself only i
0930: 66 20 62 46 72 65 65 20 69 73 20 74 72 75 65 2e  f bFree is true.
0940: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
0950: 63 6c 65 61 72 53 65 6c 65 63 74 28 73 71 6c 69  clearSelect(sqli
0960: 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20  te3 *db, Select 
0970: 2a 70 2c 20 69 6e 74 20 62 46 72 65 65 29 7b 0a  *p, int bFree){.
0980: 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
0990: 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72    Select *pPrior
09a0: 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
09b0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
09c0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
09d0: 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69  EList);.    sqli
09e0: 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
09f0: 28 64 62 2c 20 70 2d 3e 70 53 72 63 29 3b 0a 20  (db, p->pSrc);. 
0a00: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
0a10: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 57 68 65  lete(db, p->pWhe
0a20: 72 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  re);.    sqlite3
0a30: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
0a40: 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b  b, p->pGroupBy);
0a50: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
0a60: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 48  Delete(db, p->pH
0a70: 61 76 69 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69  aving);.    sqli
0a80: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
0a90: 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  e(db, p->pOrderB
0aa0: 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  y);.    sqlite3E
0ab0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
0ac0: 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 73 71  >pLimit);.    sq
0ad0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
0ae0: 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b  db, p->pOffset);
0af0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 57 69 74  .    if( p->pWit
0b00: 68 20 29 20 73 71 6c 69 74 65 33 57 69 74 68 44  h ) sqlite3WithD
0b10: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 57 69  elete(db, p->pWi
0b20: 74 68 29 3b 0a 20 20 20 20 69 66 28 20 62 46 72  th);.    if( bFr
0b30: 65 65 20 29 20 73 71 6c 69 74 65 33 44 62 46 72  ee ) sqlite3DbFr
0b40: 65 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 20 20 20  eeNN(db, p);.   
0b50: 20 70 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20   p = pPrior;.   
0b60: 20 62 46 72 65 65 20 3d 20 31 3b 0a 20 20 7d 0a   bFree = 1;.  }.
0b70: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
0b80: 69 7a 65 20 61 20 53 65 6c 65 63 74 44 65 73 74  ize a SelectDest
0b90: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76   structure..*/.v
0ba0: 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
0bb0: 74 44 65 73 74 49 6e 69 74 28 53 65 6c 65 63 74  tDestInit(Select
0bc0: 44 65 73 74 20 2a 70 44 65 73 74 2c 20 69 6e 74  Dest *pDest, int
0bd0: 20 65 44 65 73 74 2c 20 69 6e 74 20 69 50 61 72   eDest, int iPar
0be0: 6d 29 7b 0a 20 20 70 44 65 73 74 2d 3e 65 44 65  m){.  pDest->eDe
0bf0: 73 74 20 3d 20 28 75 38 29 65 44 65 73 74 3b 0a  st = (u8)eDest;.
0c00: 20 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d    pDest->iSDParm
0c10: 20 3d 20 69 50 61 72 6d 3b 0a 20 20 70 44 65 73   = iParm;.  pDes
0c20: 74 2d 3e 7a 41 66 66 53 64 73 74 20 3d 20 30 3b  t->zAffSdst = 0;
0c30: 0a 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20  .  pDest->iSdst 
0c40: 3d 20 30 3b 0a 20 20 70 44 65 73 74 2d 3e 6e 53  = 0;.  pDest->nS
0c50: 64 73 74 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a  dst = 0;.}.../*.
0c60: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  ** Allocate a ne
0c70: 77 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75  w Select structu
0c80: 72 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  re and return a 
0c90: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 61 74 0a  pointer to that.
0ca0: 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  ** structure..*/
0cb0: 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33  .Select *sqlite3
0cc0: 53 65 6c 65 63 74 4e 65 77 28 0a 20 20 50 61 72  SelectNew(.  Par
0cd0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
0ce0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
0cf0: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
0d00: 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20  ist *pEList,    
0d10: 20 2f 2a 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e   /* which column
0d20: 73 20 74 6f 20 69 6e 63 6c 75 64 65 20 69 6e 20  s to include in 
0d30: 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20  the result */.  
0d40: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20  SrcList *pSrc,  
0d50: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f        /* the FRO
0d60: 4d 20 63 6c 61 75 73 65 20 2d 2d 20 77 68 69 63  M clause -- whic
0d70: 68 20 74 61 62 6c 65 73 20 74 6f 20 73 63 61 6e  h tables to scan
0d80: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
0d90: 72 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74  re,         /* t
0da0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
0db0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
0dc0: 47 72 6f 75 70 42 79 2c 20 20 20 2f 2a 20 74 68  GroupBy,   /* th
0dd0: 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  e GROUP BY claus
0de0: 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61  e */.  Expr *pHa
0df0: 76 69 6e 67 2c 20 20 20 20 20 20 20 20 2f 2a 20  ving,        /* 
0e00: 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73  the HAVING claus
0e10: 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
0e20: 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20  *pOrderBy,   /* 
0e30: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
0e40: 75 73 65 20 2a 2f 0a 20 20 75 33 32 20 73 65 6c  use */.  u32 sel
0e50: 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 2f  Flags,         /
0e60: 2a 20 46 6c 61 67 20 70 61 72 61 6d 65 74 65 72  * Flag parameter
0e70: 73 2c 20 73 75 63 68 20 61 73 20 53 46 5f 44 69  s, such as SF_Di
0e80: 73 74 69 6e 63 74 20 2a 2f 0a 20 20 45 78 70 72  stinct */.  Expr
0e90: 20 2a 70 4c 69 6d 69 74 2c 20 20 20 20 20 20 20   *pLimit,       
0ea0: 20 20 2f 2a 20 4c 49 4d 49 54 20 76 61 6c 75 65    /* LIMIT value
0eb0: 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 6e 6f  .  NULL means no
0ec0: 74 20 75 73 65 64 20 2a 2f 0a 20 20 45 78 70 72  t used */.  Expr
0ed0: 20 2a 70 4f 66 66 73 65 74 20 20 20 20 20 20 20   *pOffset       
0ee0: 20 20 2f 2a 20 4f 46 46 53 45 54 20 76 61 6c 75    /* OFFSET valu
0ef0: 65 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 6e  e.  NULL means n
0f00: 6f 20 6f 66 66 73 65 74 20 2a 2f 0a 29 7b 0a 20  o offset */.){. 
0f10: 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20   Select *pNew;. 
0f20: 20 53 65 6c 65 63 74 20 73 74 61 6e 64 69 6e 3b   Select standin;
0f30: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
0f40: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 70  3DbMallocRawNN(p
0f50: 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f  Parse->db, sizeo
0f60: 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66  f(*pNew) );.  if
0f70: 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
0f80: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
0f90: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
0fa0: 64 20 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  d );.    pNew = 
0fb0: 26 73 74 61 6e 64 69 6e 3b 0a 20 20 7d 0a 20 20  &standin;.  }.  
0fc0: 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 29 7b  if( pEList==0 ){
0fd0: 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20 73 71  .    pEList = sq
0fe0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
0ff0: 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 73  end(pParse, 0, s
1000: 71 6c 69 74 65 33 45 78 70 72 28 70 50 61 72 73  qlite3Expr(pPars
1010: 65 2d 3e 64 62 2c 54 4b 5f 41 53 54 45 52 49 53  e->db,TK_ASTERIS
1020: 4b 2c 30 29 29 3b 0a 20 20 7d 0a 20 20 70 4e 65  K,0));.  }.  pNe
1030: 77 2d 3e 70 45 4c 69 73 74 20 3d 20 70 45 4c 69  w->pEList = pELi
1040: 73 74 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d  st;.  pNew->op =
1050: 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 70 4e   TK_SELECT;.  pN
1060: 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20 73  ew->selFlags = s
1070: 65 6c 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d  elFlags;.  pNew-
1080: 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70  >iLimit = 0;.  p
1090: 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30  New->iOffset = 0
10a0: 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  ;.#if SELECTTRAC
10b0: 45 5f 45 4e 41 42 4c 45 44 0a 20 20 70 4e 65 77  E_ENABLED.  pNew
10c0: 2d 3e 7a 53 65 6c 4e 61 6d 65 5b 30 5d 20 3d 20  ->zSelName[0] = 
10d0: 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70 4e 65 77  0;.#endif.  pNew
10e0: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
10f0: 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e  ] = -1;.  pNew->
1100: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20  addrOpenEphm[1] 
1110: 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53  = -1;.  pNew->nS
1120: 65 6c 65 63 74 52 6f 77 20 3d 20 30 3b 0a 20 20  electRow = 0;.  
1130: 69 66 28 20 70 53 72 63 3d 3d 30 20 29 20 70 53  if( pSrc==0 ) pS
1140: 72 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  rc = sqlite3DbMa
1150: 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d  llocZero(pParse-
1160: 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 53 72  >db, sizeof(*pSr
1170: 63 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 72  c));.  pNew->pSr
1180: 63 20 3d 20 70 53 72 63 3b 0a 20 20 70 4e 65 77  c = pSrc;.  pNew
1190: 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65 72  ->pWhere = pWher
11a0: 65 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75  e;.  pNew->pGrou
11b0: 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a  pBy = pGroupBy;.
11c0: 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20    pNew->pHaving 
11d0: 3d 20 70 48 61 76 69 6e 67 3b 0a 20 20 70 4e 65  = pHaving;.  pNe
11e0: 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  w->pOrderBy = pO
11f0: 72 64 65 72 42 79 3b 0a 20 20 70 4e 65 77 2d 3e  rderBy;.  pNew->
1200: 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70 4e  pPrior = 0;.  pN
1210: 65 77 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20  ew->pNext = 0;. 
1220: 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20   pNew->pLimit = 
1230: 70 4c 69 6d 69 74 3b 0a 20 20 70 4e 65 77 2d 3e  pLimit;.  pNew->
1240: 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65  pOffset = pOffse
1250: 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 69 74 68  t;.  pNew->pWith
1260: 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
1270: 70 4f 66 66 73 65 74 3d 3d 30 20 7c 7c 20 70 4c  pOffset==0 || pL
1280: 69 6d 69 74 21 3d 30 20 7c 7c 20 70 50 61 72 73  imit!=0 || pPars
1290: 65 2d 3e 6e 45 72 72 3e 30 20 7c 7c 20 70 50 61  e->nErr>0 || pPa
12a0: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
12b0: 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69 66  ailed!=0 );.  if
12c0: 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  ( pParse->db->ma
12d0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 7b 0a 20  llocFailed ) {. 
12e0: 20 20 20 63 6c 65 61 72 53 65 6c 65 63 74 28 70     clearSelect(p
12f0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 65 77 2c  Parse->db, pNew,
1300: 20 70 4e 65 77 21 3d 26 73 74 61 6e 64 69 6e 29   pNew!=&standin)
1310: 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a  ;.    pNew = 0;.
1320: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
1330: 65 72 74 28 20 70 4e 65 77 2d 3e 70 53 72 63 21  ert( pNew->pSrc!
1340: 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  =0 || pParse->nE
1350: 72 72 3e 30 20 29 3b 0a 20 20 7d 0a 20 20 61 73  rr>0 );.  }.  as
1360: 73 65 72 74 28 20 70 4e 65 77 21 3d 26 73 74 61  sert( pNew!=&sta
1370: 6e 64 69 6e 20 29 3b 0a 20 20 72 65 74 75 72 6e  ndin );.  return
1380: 20 70 4e 65 77 3b 0a 7d 0a 0a 23 69 66 20 53 45   pNew;.}..#if SE
1390: 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45  LECTTRACE_ENABLE
13a0: 44 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  D./*.** Set the 
13b0: 6e 61 6d 65 20 6f 66 20 61 20 53 65 6c 65 63 74  name of a Select
13c0: 20 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69 64 20   object.*/.void 
13d0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 53 65 74  sqlite3SelectSet
13e0: 4e 61 6d 65 28 53 65 6c 65 63 74 20 2a 70 2c 20  Name(Select *p, 
13f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
1400: 65 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20 7a  e){.  if( p && z
1410: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Name ){.    sqli
1420: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
1430: 65 6f 66 28 70 2d 3e 7a 53 65 6c 4e 61 6d 65 29  eof(p->zSelName)
1440: 2c 20 70 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 20 22  , p->zSelName, "
1450: 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d  %s", zName);.  }
1460: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
1470: 2a 20 44 65 6c 65 74 65 20 74 68 65 20 67 69 76  * Delete the giv
1480: 65 6e 20 53 65 6c 65 63 74 20 73 74 72 75 63 74  en Select struct
1490: 75 72 65 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69  ure and all of i
14a0: 74 73 20 73 75 62 73 74 72 75 63 74 75 72 65 73  ts substructures
14b0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
14c0: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 73 71  3SelectDelete(sq
14d0: 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63  lite3 *db, Selec
14e0: 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29  t *p){.  if( p )
14f0: 20 63 6c 65 61 72 53 65 6c 65 63 74 28 64 62 2c   clearSelect(db,
1500: 20 70 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   p, 1);.}../*.**
1510: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
1520: 72 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d  r to the right-m
1530: 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ost SELECT state
1540: 6d 65 6e 74 20 69 6e 20 61 20 63 6f 6d 70 6f 75  ment in a compou
1550: 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 65  nd..*/.static Se
1560: 6c 65 63 74 20 2a 66 69 6e 64 52 69 67 68 74 6d  lect *findRightm
1570: 6f 73 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a  ost(Select *p){.
1580: 20 20 77 68 69 6c 65 28 20 70 2d 3e 70 4e 65 78    while( p->pNex
1590: 74 20 29 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74  t ) p = p->pNext
15a0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  ;.  return p;.}.
15b0: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 31 20 74  ./*.** Given 1 t
15c0: 6f 20 33 20 69 64 65 6e 74 69 66 69 65 72 73 20  o 3 identifiers 
15d0: 70 72 65 63 65 64 69 6e 67 20 74 68 65 20 4a 4f  preceding the JO
15e0: 49 4e 20 6b 65 79 77 6f 72 64 2c 20 64 65 74 65  IN keyword, dete
15f0: 72 6d 69 6e 65 20 74 68 65 0a 2a 2a 20 74 79 70  rmine the.** typ
1600: 65 20 6f 66 20 6a 6f 69 6e 2e 20 20 52 65 74 75  e of join.  Retu
1610: 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f  rn an integer co
1620: 6e 73 74 61 6e 74 20 74 68 61 74 20 65 78 70 72  nstant that expr
1630: 65 73 73 65 73 20 74 68 61 74 20 74 79 70 65 0a  esses that type.
1640: 2a 2a 20 69 6e 20 74 65 72 6d 73 20 6f 66 20 74  ** in terms of t
1650: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 69 74  he following bit
1660: 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   values:.**.**  
1670: 20 20 20 4a 54 5f 49 4e 4e 45 52 0a 2a 2a 20 20     JT_INNER.**  
1680: 20 20 20 4a 54 5f 43 52 4f 53 53 0a 2a 2a 20 20     JT_CROSS.**  
1690: 20 20 20 4a 54 5f 4f 55 54 45 52 0a 2a 2a 20 20     JT_OUTER.**  
16a0: 20 20 20 4a 54 5f 4e 41 54 55 52 41 4c 0a 2a 2a     JT_NATURAL.**
16b0: 20 20 20 20 20 4a 54 5f 4c 45 46 54 0a 2a 2a 20       JT_LEFT.** 
16c0: 20 20 20 20 4a 54 5f 52 49 47 48 54 0a 2a 2a 0a      JT_RIGHT.**.
16d0: 2a 2a 20 41 20 66 75 6c 6c 20 6f 75 74 65 72 20  ** A full outer 
16e0: 6a 6f 69 6e 20 69 73 20 74 68 65 20 63 6f 6d 62  join is the comb
16f0: 69 6e 61 74 69 6f 6e 20 6f 66 20 4a 54 5f 4c 45  ination of JT_LE
1700: 46 54 20 61 6e 64 20 4a 54 5f 52 49 47 48 54 2e  FT and JT_RIGHT.
1710: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6c 6c  .**.** If an ill
1720: 65 67 61 6c 20 6f 72 20 75 6e 73 75 70 70 6f 72  egal or unsuppor
1730: 74 65 64 20 6a 6f 69 6e 20 74 79 70 65 20 69 73  ted join type is
1740: 20 73 65 65 6e 2c 20 74 68 65 6e 20 73 74 69 6c   seen, then stil
1750: 6c 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20 6a 6f  l return.** a jo
1760: 69 6e 20 74 79 70 65 2c 20 62 75 74 20 70 75 74  in type, but put
1770: 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 74 68 65   an error in the
1780: 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72   pParse structur
1790: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
17a0: 33 4a 6f 69 6e 54 79 70 65 28 50 61 72 73 65 20  3JoinType(Parse 
17b0: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
17c0: 70 41 2c 20 54 6f 6b 65 6e 20 2a 70 42 2c 20 54  pA, Token *pB, T
17d0: 6f 6b 65 6e 20 2a 70 43 29 7b 0a 20 20 69 6e 74  oken *pC){.  int
17e0: 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20   jointype = 0;. 
17f0: 20 54 6f 6b 65 6e 20 2a 61 70 41 6c 6c 5b 33 5d   Token *apAll[3]
1800: 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 3b 0a 20 20  ;.  Token *p;.  
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1820: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20             /*   
1830: 30 31 32 33 34 35 36 37 38 39 20 31 32 33 34 35  0123456789 12345
1840: 36 37 38 39 20 31 32 33 34 35 36 37 38 39 20 31  6789 123456789 1
1850: 32 33 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63  23 */.  static c
1860: 6f 6e 73 74 20 63 68 61 72 20 7a 4b 65 79 54 65  onst char zKeyTe
1870: 78 74 5b 5d 20 3d 20 22 6e 61 74 75 72 61 6c 65  xt[] = "naturale
1880: 66 74 6f 75 74 65 72 69 67 68 74 66 75 6c 6c 69  ftouterightfulli
1890: 6e 6e 65 72 63 72 6f 73 73 22 3b 0a 20 20 73 74  nnercross";.  st
18a0: 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
18b0: 74 20 7b 0a 20 20 20 20 75 38 20 69 3b 20 20 20  t {.    u8 i;   
18c0: 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e       /* Beginnin
18d0: 67 20 6f 66 20 6b 65 79 77 6f 72 64 20 74 65 78  g of keyword tex
18e0: 74 20 69 6e 20 7a 4b 65 79 54 65 78 74 5b 5d 20  t in zKeyText[] 
18f0: 2a 2f 0a 20 20 20 20 75 38 20 6e 43 68 61 72 3b  */.    u8 nChar;
1900: 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66      /* Length of
1910: 20 74 68 65 20 6b 65 79 77 6f 72 64 20 69 6e 20   the keyword in 
1920: 63 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20  characters */.  
1930: 20 20 75 38 20 63 6f 64 65 3b 20 20 20 20 20 2f    u8 code;     /
1940: 2a 20 4a 6f 69 6e 20 74 79 70 65 20 6d 61 73 6b  * Join type mask
1950: 20 2a 2f 0a 20 20 7d 20 61 4b 65 79 77 6f 72 64   */.  } aKeyword
1960: 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a 20 6e 61  [] = {.    /* na
1970: 74 75 72 61 6c 20 2a 2f 20 7b 20 30 2c 20 20 37  tural */ { 0,  7
1980: 2c 20 4a 54 5f 4e 41 54 55 52 41 4c 20 20 20 20  , JT_NATURAL    
1990: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
19a0: 20 20 20 2f 2a 20 6c 65 66 74 20 20 20 20 2a 2f     /* left    */
19b0: 20 7b 20 36 2c 20 20 34 2c 20 4a 54 5f 4c 45 46   { 6,  4, JT_LEF
19c0: 54 7c 4a 54 5f 4f 55 54 45 52 20 20 20 20 20 20  T|JT_OUTER      
19d0: 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 6f 75      },.    /* ou
19e0: 74 65 72 20 20 20 2a 2f 20 7b 20 31 30 2c 20 35  ter   */ { 10, 5
19f0: 2c 20 4a 54 5f 4f 55 54 45 52 20 20 20 20 20 20  , JT_OUTER      
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
1a10: 20 20 20 2f 2a 20 72 69 67 68 74 20 20 20 2a 2f     /* right   */
1a20: 20 7b 20 31 34 2c 20 35 2c 20 4a 54 5f 52 49 47   { 14, 5, JT_RIG
1a30: 48 54 7c 4a 54 5f 4f 55 54 45 52 20 20 20 20 20  HT|JT_OUTER     
1a40: 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 66 75      },.    /* fu
1a50: 6c 6c 20 20 20 20 2a 2f 20 7b 20 31 39 2c 20 34  ll    */ { 19, 4
1a60: 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52 49 47  , JT_LEFT|JT_RIG
1a70: 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20  HT|JT_OUTER },. 
1a80: 20 20 20 2f 2a 20 69 6e 6e 65 72 20 20 20 2a 2f     /* inner   */
1a90: 20 7b 20 32 33 2c 20 35 2c 20 4a 54 5f 49 4e 4e   { 23, 5, JT_INN
1aa0: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ER              
1ab0: 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 63 72      },.    /* cr
1ac0: 6f 73 73 20 20 20 2a 2f 20 7b 20 32 38 2c 20 35  oss   */ { 28, 5
1ad0: 2c 20 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 43 52  , JT_INNER|JT_CR
1ae0: 4f 53 53 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  OSS         },. 
1af0: 20 7d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a   };.  int i, j;.
1b00: 20 20 61 70 41 6c 6c 5b 30 5d 20 3d 20 70 41 3b    apAll[0] = pA;
1b10: 0a 20 20 61 70 41 6c 6c 5b 31 5d 20 3d 20 70 42  .  apAll[1] = pB
1b20: 3b 0a 20 20 61 70 41 6c 6c 5b 32 5d 20 3d 20 70  ;.  apAll[2] = p
1b30: 43 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  C;.  for(i=0; i<
1b40: 33 20 26 26 20 61 70 41 6c 6c 5b 69 5d 3b 20 69  3 && apAll[i]; i
1b50: 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61 70 41  ++){.    p = apA
1b60: 6c 6c 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28 6a  ll[i];.    for(j
1b70: 3d 30 3b 20 6a 3c 41 72 72 61 79 53 69 7a 65 28  =0; j<ArraySize(
1b80: 61 4b 65 79 77 6f 72 64 29 3b 20 6a 2b 2b 29 7b  aKeyword); j++){
1b90: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 3d  .      if( p->n=
1ba0: 3d 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 6e 43 68  =aKeyword[j].nCh
1bb0: 61 72 20 0a 20 20 20 20 20 20 20 20 20 20 26 26  ar .          &&
1bc0: 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70   sqlite3StrNICmp
1bd0: 28 28 63 68 61 72 2a 29 70 2d 3e 7a 2c 20 26 7a  ((char*)p->z, &z
1be0: 4b 65 79 54 65 78 74 5b 61 4b 65 79 77 6f 72 64  KeyText[aKeyword
1bf0: 5b 6a 5d 2e 69 5d 2c 20 70 2d 3e 6e 29 3d 3d 30  [j].i], p->n)==0
1c00: 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 6f 69 6e   ){.        join
1c10: 74 79 70 65 20 7c 3d 20 61 4b 65 79 77 6f 72 64  type |= aKeyword
1c20: 5b 6a 5d 2e 63 6f 64 65 3b 0a 20 20 20 20 20 20  [j].code;.      
1c30: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
1c40: 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63  .    }.    testc
1c50: 61 73 65 28 20 6a 3d 3d 30 20 7c 7c 20 6a 3d 3d  ase( j==0 || j==
1c60: 31 20 7c 7c 20 6a 3d 3d 32 20 7c 7c 20 6a 3d 3d  1 || j==2 || j==
1c70: 33 20 7c 7c 20 6a 3d 3d 34 20 7c 7c 20 6a 3d 3d  3 || j==4 || j==
1c80: 35 20 7c 7c 20 6a 3d 3d 36 20 29 3b 0a 20 20 20  5 || j==6 );.   
1c90: 20 69 66 28 20 6a 3e 3d 41 72 72 61 79 53 69 7a   if( j>=ArraySiz
1ca0: 65 28 61 4b 65 79 77 6f 72 64 29 20 29 7b 0a 20  e(aKeyword) ){. 
1cb0: 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d       jointype |=
1cc0: 20 4a 54 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20   JT_ERROR;.     
1cd0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1ce0: 7d 0a 20 20 69 66 28 0a 20 20 20 20 20 28 6a 6f  }.  if(.     (jo
1cf0: 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 49 4e 4e  intype & (JT_INN
1d00: 45 52 7c 4a 54 5f 4f 55 54 45 52 29 29 3d 3d 28  ER|JT_OUTER))==(
1d10: 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45  JT_INNER|JT_OUTE
1d20: 52 29 20 7c 7c 0a 20 20 20 20 20 28 6a 6f 69 6e  R) ||.     (join
1d30: 74 79 70 65 20 26 20 4a 54 5f 45 52 52 4f 52 29  type & JT_ERROR)
1d40: 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 63 6f 6e  !=0.  ){.    con
1d50: 73 74 20 63 68 61 72 20 2a 7a 53 70 20 3d 20 22  st char *zSp = "
1d60: 20 22 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ";.    assert( 
1d70: 70 42 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  pB!=0 );.    if(
1d80: 20 70 43 3d 3d 30 20 29 7b 20 7a 53 70 2b 2b 3b   pC==0 ){ zSp++;
1d90: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72   }.    sqlite3Er
1da0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1db0: 75 6e 6b 6e 6f 77 6e 20 6f 72 20 75 6e 73 75 70  unknown or unsup
1dc0: 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70 65  ported join type
1dd0: 3a 20 22 0a 20 20 20 20 20 20 20 22 25 54 20 25  : ".       "%T %
1de0: 54 25 73 25 54 22 2c 20 70 41 2c 20 70 42 2c 20  T%s%T", pA, pB, 
1df0: 7a 53 70 2c 20 70 43 29 3b 0a 20 20 20 20 6a 6f  zSp, pC);.    jo
1e00: 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45  intype = JT_INNE
1e10: 52 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28  R;.  }else if( (
1e20: 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55  jointype & JT_OU
1e30: 54 45 52 29 21 3d 30 20 0a 20 20 20 20 20 20 20  TER)!=0 .       
1e40: 20 20 26 26 20 28 6a 6f 69 6e 74 79 70 65 20 26    && (jointype &
1e50: 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52 49 47   (JT_LEFT|JT_RIG
1e60: 48 54 29 29 21 3d 4a 54 5f 4c 45 46 54 20 29 7b  HT))!=JT_LEFT ){
1e70: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
1e80: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
1e90: 20 20 20 20 22 52 49 47 48 54 20 61 6e 64 20 46      "RIGHT and F
1ea0: 55 4c 4c 20 4f 55 54 45 52 20 4a 4f 49 4e 73 20  ULL OUTER JOINs 
1eb0: 61 72 65 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c  are not currentl
1ec0: 79 20 73 75 70 70 6f 72 74 65 64 22 29 3b 0a 20  y supported");. 
1ed0: 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54     jointype = JT
1ee0: 5f 49 4e 4e 45 52 3b 0a 20 20 7d 0a 20 20 72 65  _INNER;.  }.  re
1ef0: 74 75 72 6e 20 6a 6f 69 6e 74 79 70 65 3b 0a 7d  turn jointype;.}
1f00: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1f10: 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 63 6f  he index of a co
1f20: 6c 75 6d 6e 20 69 6e 20 61 20 74 61 62 6c 65 2e  lumn in a table.
1f30: 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66 20 74    Return -1 if t
1f40: 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 73 20  he column.** is 
1f50: 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  not contained in
1f60: 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73   the table..*/.s
1f70: 74 61 74 69 63 20 69 6e 74 20 63 6f 6c 75 6d 6e  tatic int column
1f80: 49 6e 64 65 78 28 54 61 62 6c 65 20 2a 70 54 61  Index(Table *pTa
1f90: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
1fa0: 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Col){.  int i;. 
1fb0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
1fc0: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
1fd0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
1fe0: 49 43 6d 70 28 70 54 61 62 2d 3e 61 43 6f 6c 5b  ICmp(pTab->aCol[
1ff0: 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d  i].zName, zCol)=
2000: 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20  =0 ) return i;. 
2010: 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a   }.  return -1;.
2020: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20  }../*.** Search 
2030: 74 68 65 20 66 69 72 73 74 20 4e 20 74 61 62 6c  the first N tabl
2040: 65 73 20 69 6e 20 70 53 72 63 2c 20 66 72 6f 6d  es in pSrc, from
2050: 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2c 20   left to right, 
2060: 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 0a 2a 2a  looking for a.**
2070: 20 74 61 62 6c 65 20 74 68 61 74 20 68 61 73 20   table that has 
2080: 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 7a  a column named z
2090: 43 6f 6c 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65  Col.  .**.** Whe
20a0: 6e 20 66 6f 75 6e 64 2c 20 73 65 74 20 2a 70 69  n found, set *pi
20b0: 54 61 62 20 61 6e 64 20 2a 70 69 43 6f 6c 20 74  Tab and *piCol t
20c0: 6f 20 74 68 65 20 74 61 62 6c 65 20 69 6e 64 65  o the table inde
20d0: 78 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 69 6e 64  x and column ind
20e0: 65 78 0a 2a 2a 20 6f 66 20 74 68 65 20 6d 61 74  ex.** of the mat
20f0: 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 61 6e 64  ching column and
2100: 20 72 65 74 75 72 6e 20 54 52 55 45 2e 0a 2a 2a   return TRUE..**
2110: 0a 2a 2a 20 49 66 20 6e 6f 74 20 66 6f 75 6e 64  .** If not found
2120: 2c 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 0a  , return FALSE..
2130: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 61  */.static int ta
2140: 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65  bleAndColumnInde
2150: 78 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  x(.  SrcList *pS
2160: 72 63 2c 20 20 20 20 20 20 20 2f 2a 20 41 72 72  rc,       /* Arr
2170: 61 79 20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20  ay of tables to 
2180: 73 65 61 72 63 68 20 2a 2f 0a 20 20 69 6e 74 20  search */.  int 
2190: 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N,              
21a0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 61   /* Number of ta
21b0: 62 6c 65 73 20 69 6e 20 70 53 72 63 2d 3e 61 5b  bles in pSrc->a[
21c0: 5d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20  ] to search */. 
21d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
21e0: 6c 2c 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  l,    /* Name of
21f0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 77 65 20 61   the column we a
2200: 72 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 2a  re looking for *
2210: 2f 0a 20 20 69 6e 74 20 2a 70 69 54 61 62 2c 20  /.  int *piTab, 
2220: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
2230: 65 20 69 6e 64 65 78 20 6f 66 20 70 53 72 63 2d  e index of pSrc-
2240: 3e 61 5b 5d 20 68 65 72 65 20 2a 2f 0a 20 20 69  >a[] here */.  i
2250: 6e 74 20 2a 70 69 43 6f 6c 20 20 20 20 20 20 20  nt *piCol       
2260: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 69 6e 64      /* Write ind
2270: 65 78 20 6f 66 20 70 53 72 63 2d 3e 61 5b 2a 70  ex of pSrc->a[*p
2280: 69 54 61 62 5d 2e 70 54 61 62 2d 3e 61 43 6f 6c  iTab].pTab->aCol
2290: 5b 5d 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  [] here */.){.  
22a0: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
22b0: 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
22c0: 69 6e 67 20 6f 76 65 72 20 74 61 62 6c 65 73 20  ing over tables 
22d0: 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e 74  in pSrc */.  int
22e0: 20 69 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   iCol;          
22f0: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f    /* Index of co
2300: 6c 75 6d 6e 20 6d 61 74 63 68 69 6e 67 20 7a 43  lumn matching zC
2310: 6f 6c 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ol */..  assert(
2320: 20 28 70 69 54 61 62 3d 3d 30 29 3d 3d 28 70 69   (piTab==0)==(pi
2330: 43 6f 6c 3d 3d 30 29 20 29 3b 20 20 2f 2a 20 42  Col==0) );  /* B
2340: 6f 74 68 20 6f 72 20 6e 65 69 74 68 65 72 20 61  oth or neither a
2350: 72 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 66 6f 72  re NULL */.  for
2360: 28 69 3d 30 3b 20 69 3c 4e 3b 20 69 2b 2b 29 7b  (i=0; i<N; i++){
2370: 0a 20 20 20 20 69 43 6f 6c 20 3d 20 63 6f 6c 75  .    iCol = colu
2380: 6d 6e 49 6e 64 65 78 28 70 53 72 63 2d 3e 61 5b  mnIndex(pSrc->a[
2390: 69 5d 2e 70 54 61 62 2c 20 7a 43 6f 6c 29 3b 0a  i].pTab, zCol);.
23a0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20      if( iCol>=0 
23b0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 69 54  ){.      if( piT
23c0: 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  ab ){.        *p
23d0: 69 54 61 62 20 3d 20 69 3b 0a 20 20 20 20 20 20  iTab = i;.      
23e0: 20 20 2a 70 69 43 6f 6c 20 3d 20 69 43 6f 6c 3b    *piCol = iCol;
23f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
2400: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
2410: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
2420: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
2430: 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
2440: 20 61 64 64 20 74 65 72 6d 73 20 69 6d 70 6c 69   add terms impli
2450: 65 64 20 62 79 20 4a 4f 49 4e 20 73 79 6e 74 61  ed by JOIN synta
2460: 78 20 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52  x to the.** WHER
2470: 45 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73  E clause express
2480: 69 6f 6e 20 6f 66 20 61 20 53 45 4c 45 43 54 20  ion of a SELECT 
2490: 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 65 20 6e  statement. The n
24a0: 65 77 20 74 65 72 6d 2c 20 77 68 69 63 68 0a 2a  ew term, which.*
24b0: 2a 20 69 73 20 41 4e 44 65 64 20 77 69 74 68 20  * is ANDed with 
24c0: 74 68 65 20 65 78 69 73 74 69 6e 67 20 57 48 45  the existing WHE
24d0: 52 45 20 63 6c 61 75 73 65 2c 20 69 73 20 6f 66  RE clause, is of
24e0: 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a   the form:.**.**
24f0: 20 20 20 20 28 74 61 62 31 2e 63 6f 6c 31 20 3d      (tab1.col1 =
2500: 20 74 61 62 32 2e 63 6f 6c 32 29 0a 2a 2a 0a 2a   tab2.col2).**.*
2510: 2a 20 77 68 65 72 65 20 74 61 62 31 20 69 73 20  * where tab1 is 
2520: 74 68 65 20 69 53 72 63 27 74 68 20 74 61 62 6c  the iSrc'th tabl
2530: 65 20 69 6e 20 53 72 63 4c 69 73 74 20 70 53 72  e in SrcList pSr
2540: 63 20 61 6e 64 20 74 61 62 32 20 69 73 20 74 68  c and tab2 is th
2550: 65 20 0a 2a 2a 20 28 69 53 72 63 2b 31 29 27 74  e .** (iSrc+1)'t
2560: 68 2e 20 43 6f 6c 75 6d 6e 20 63 6f 6c 31 20 69  h. Column col1 i
2570: 73 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 4c 65 66  s column iColLef
2580: 74 20 6f 66 20 74 61 62 31 2c 20 61 6e 64 20 63  t of tab1, and c
2590: 6f 6c 32 20 69 73 0a 2a 2a 20 63 6f 6c 75 6d 6e  ol2 is.** column
25a0: 20 69 43 6f 6c 52 69 67 68 74 20 6f 66 20 74 61   iColRight of ta
25b0: 62 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  b2..*/.static vo
25c0: 69 64 20 61 64 64 57 68 65 72 65 54 65 72 6d 28  id addWhereTerm(
25d0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
25e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
25f0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
2600: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69  ntext */.  SrcLi
2610: 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20  st *pSrc,       
2620: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
2630: 73 74 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20  st of tables in 
2640: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
2650: 20 69 6e 74 20 69 4c 65 66 74 2c 20 20 20 20 20   int iLeft,     
2660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2670: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72   /* Index of fir
2680: 73 74 20 74 61 62 6c 65 20 74 6f 20 6a 6f 69 6e  st table to join
2690: 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e   in pSrc */.  in
26a0: 74 20 69 43 6f 6c 4c 65 66 74 2c 20 20 20 20 20  t iColLeft,     
26b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26c0: 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e   Index of column
26d0: 20 69 6e 20 66 69 72 73 74 20 74 61 62 6c 65 20   in first table 
26e0: 2a 2f 0a 20 20 69 6e 74 20 69 52 69 67 68 74 2c  */.  int iRight,
26f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2700: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
2710: 20 73 65 63 6f 6e 64 20 74 61 62 6c 65 20 69 6e   second table in
2720: 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e 74 20 69   pSrc */.  int i
2730: 43 6f 6c 52 69 67 68 74 2c 20 20 20 20 20 20 20  ColRight,       
2740: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2750: 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e  dex of column in
2760: 20 73 65 63 6f 6e 64 20 74 61 62 6c 65 20 2a 2f   second table */
2770: 0a 20 20 69 6e 74 20 69 73 4f 75 74 65 72 4a 6f  .  int isOuterJo
2780: 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  in,             
2790: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
27a0: 69 73 20 69 73 20 61 6e 20 4f 55 54 45 52 20 6a  is is an OUTER j
27b0: 6f 69 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a  oin */.  Expr **
27c0: 70 70 57 68 65 72 65 20 20 20 20 20 20 20 20 20  ppWhere         
27d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
27e0: 55 54 3a 20 54 68 65 20 57 48 45 52 45 20 63 6c  UT: The WHERE cl
27f0: 61 75 73 65 20 74 6f 20 61 64 64 20 74 6f 20 2a  ause to add to *
2800: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
2810: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
2820: 0a 20 20 45 78 70 72 20 2a 70 45 31 3b 0a 20 20  .  Expr *pE1;.  
2830: 45 78 70 72 20 2a 70 45 32 3b 0a 20 20 45 78 70  Expr *pE2;.  Exp
2840: 72 20 2a 70 45 71 3b 0a 0a 20 20 61 73 73 65 72  r *pEq;..  asser
2850: 74 28 20 69 4c 65 66 74 3c 69 52 69 67 68 74 20  t( iLeft<iRight 
2860: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72  );.  assert( pSr
2870: 63 2d 3e 6e 53 72 63 3e 69 52 69 67 68 74 20 29  c->nSrc>iRight )
2880: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63  ;.  assert( pSrc
2890: 2d 3e 61 5b 69 4c 65 66 74 5d 2e 70 54 61 62 20  ->a[iLeft].pTab 
28a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72  );.  assert( pSr
28b0: 63 2d 3e 61 5b 69 52 69 67 68 74 5d 2e 70 54 61  c->a[iRight].pTa
28c0: 62 20 29 3b 0a 0a 20 20 70 45 31 20 3d 20 73 71  b );..  pE1 = sq
28d0: 6c 69 74 65 33 43 72 65 61 74 65 43 6f 6c 75 6d  lite3CreateColum
28e0: 6e 45 78 70 72 28 64 62 2c 20 70 53 72 63 2c 20  nExpr(db, pSrc, 
28f0: 69 4c 65 66 74 2c 20 69 43 6f 6c 4c 65 66 74 29  iLeft, iColLeft)
2900: 3b 0a 20 20 70 45 32 20 3d 20 73 71 6c 69 74 65  ;.  pE2 = sqlite
2910: 33 43 72 65 61 74 65 43 6f 6c 75 6d 6e 45 78 70  3CreateColumnExp
2920: 72 28 64 62 2c 20 70 53 72 63 2c 20 69 52 69 67  r(db, pSrc, iRig
2930: 68 74 2c 20 69 43 6f 6c 52 69 67 68 74 29 3b 0a  ht, iColRight);.
2940: 0a 20 20 70 45 71 20 3d 20 73 71 6c 69 74 65 33  .  pEq = sqlite3
2950: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
2960: 5f 45 51 2c 20 70 45 31 2c 20 70 45 32 29 3b 0a  _EQ, pE1, pE2);.
2970: 20 20 69 66 28 20 70 45 71 20 26 26 20 69 73 4f    if( pEq && isO
2980: 75 74 65 72 4a 6f 69 6e 20 29 7b 0a 20 20 20 20  uterJoin ){.    
2990: 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
29a0: 70 45 71 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  pEq, EP_FromJoin
29b0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
29c0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
29d0: 70 45 71 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  pEq, EP_TokenOnl
29e0: 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b  y|EP_Reduced) );
29f0: 0a 20 20 20 20 45 78 70 72 53 65 74 56 56 41 50  .    ExprSetVVAP
2a00: 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50 5f  roperty(pEq, EP_
2a10: 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20 70  NoReduce);.    p
2a20: 45 71 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61  Eq->iRightJoinTa
2a30: 62 6c 65 20 3d 20 28 69 31 36 29 70 45 32 2d 3e  ble = (i16)pE2->
2a40: 69 54 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 2a 70  iTable;.  }.  *p
2a50: 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
2a60: 45 78 70 72 41 6e 64 28 64 62 2c 20 2a 70 70 57  ExprAnd(db, *ppW
2a70: 68 65 72 65 2c 20 70 45 71 29 3b 0a 7d 0a 0a 2f  here, pEq);.}../
2a80: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 50 5f  *.** Set the EP_
2a90: 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74  FromJoin propert
2aa0: 79 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f  y on all terms o
2ab0: 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  f the given expr
2ac0: 65 73 73 69 6f 6e 2e 0a 2a 2a 20 41 6e 64 20 73  ession..** And s
2ad0: 65 74 20 74 68 65 20 45 78 70 72 2e 69 52 69 67  et the Expr.iRig
2ae0: 68 74 4a 6f 69 6e 54 61 62 6c 65 20 74 6f 20 69  htJoinTable to i
2af0: 54 61 62 6c 65 20 66 6f 72 20 65 76 65 72 79 20  Table for every 
2b00: 74 65 72 6d 20 69 6e 20 74 68 65 0a 2a 2a 20 65  term in the.** e
2b10: 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  xpression..**.**
2b20: 20 54 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e   The EP_FromJoin
2b30: 20 70 72 6f 70 65 72 74 79 20 69 73 20 75 73 65   property is use
2b40: 64 20 6f 6e 20 74 65 72 6d 73 20 6f 66 20 61 6e  d on terms of an
2b50: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 74   expression to t
2b60: 65 6c 6c 0a 2a 2a 20 74 68 65 20 4c 45 46 54 20  ell.** the LEFT 
2b70: 4f 55 54 45 52 20 4a 4f 49 4e 20 70 72 6f 63 65  OUTER JOIN proce
2b80: 73 73 69 6e 67 20 6c 6f 67 69 63 20 74 68 61 74  ssing logic that
2b90: 20 74 68 69 73 20 74 65 72 6d 20 69 73 20 70 61   this term is pa
2ba0: 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 6a 6f 69  rt of the.** joi
2bb0: 6e 20 72 65 73 74 72 69 63 74 69 6f 6e 20 73 70  n restriction sp
2bc0: 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 4f  ecified in the O
2bd0: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
2be0: 65 20 61 6e 64 20 6e 6f 74 20 61 20 70 61 72 74  e and not a part
2bf0: 0a 2a 2a 20 6f 66 20 74 68 65 20 6d 6f 72 65 20  .** of the more 
2c00: 67 65 6e 65 72 61 6c 20 57 48 45 52 45 20 63 6c  general WHERE cl
2c10: 61 75 73 65 2e 20 20 54 68 65 73 65 20 74 65 72  ause.  These ter
2c20: 6d 73 20 61 72 65 20 6d 6f 76 65 64 20 6f 76 65  ms are moved ove
2c30: 72 20 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52  r to the.** WHER
2c40: 45 20 63 6c 61 75 73 65 20 64 75 72 69 6e 67 20  E clause during 
2c50: 6a 6f 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  join processing 
2c60: 62 75 74 20 77 65 20 6e 65 65 64 20 74 6f 20 72  but we need to r
2c70: 65 6d 65 6d 62 65 72 20 74 68 61 74 20 74 68 65  emember that the
2c80: 79 0a 2a 2a 20 6f 72 69 67 69 6e 61 74 65 64 20  y.** originated 
2c90: 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49  in the ON or USI
2ca0: 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  NG clause..**.**
2cb0: 20 54 68 65 20 45 78 70 72 2e 69 52 69 67 68 74   The Expr.iRight
2cc0: 4a 6f 69 6e 54 61 62 6c 65 20 74 65 6c 6c 73 20  JoinTable tells 
2cd0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
2ce0: 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68 61 74   processing that
2cf0: 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69   the.** expressi
2d00: 6f 6e 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 61  on depends on ta
2d10: 62 6c 65 20 69 52 69 67 68 74 4a 6f 69 6e 54 61  ble iRightJoinTa
2d20: 62 6c 65 20 65 76 65 6e 20 69 66 20 74 68 61 74  ble even if that
2d30: 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a   table is not.**
2d40: 20 65 78 70 6c 69 63 69 74 6c 79 20 6d 65 6e 74   explicitly ment
2d50: 69 6f 6e 65 64 20 69 6e 20 74 68 65 20 65 78 70  ioned in the exp
2d60: 72 65 73 73 69 6f 6e 2e 20 20 54 68 61 74 20 69  ression.  That i
2d70: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65  nformation is ne
2d80: 65 64 65 64 0a 2a 2a 20 66 6f 72 20 63 61 73 65  eded.** for case
2d90: 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  s like this:.**.
2da0: 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  **    SELECT * F
2db0: 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e  ROM t1 LEFT JOIN
2dc0: 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 62   t2 ON t1.a=t2.b
2dd0: 20 41 4e 44 20 74 31 2e 78 3d 35 0a 2a 2a 0a 2a   AND t1.x=5.**.*
2de0: 2a 20 54 68 65 20 77 68 65 72 65 20 63 6c 61 75  * The where clau
2df0: 73 65 20 6e 65 65 64 73 20 74 6f 20 64 65 66 65  se needs to defe
2e00: 72 20 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f  r the handling o
2e10: 66 20 74 68 65 20 74 31 2e 78 3d 35 0a 2a 2a 20  f the t1.x=5.** 
2e20: 74 65 72 6d 20 75 6e 74 69 6c 20 61 66 74 65 72  term until after
2e30: 20 74 68 65 20 74 32 20 6c 6f 6f 70 20 6f 66 20   the t2 loop of 
2e40: 74 68 65 20 6a 6f 69 6e 2e 20 20 49 6e 20 74 68  the join.  In th
2e50: 61 74 20 77 61 79 2c 20 61 0a 2a 2a 20 4e 55 4c  at way, a.** NUL
2e60: 4c 20 74 32 20 72 6f 77 20 77 69 6c 6c 20 62 65  L t2 row will be
2e70: 20 69 6e 73 65 72 74 65 64 20 77 68 65 6e 65 76   inserted whenev
2e80: 65 72 20 74 31 2e 78 21 3d 35 2e 20 20 49 66 20  er t1.x!=5.  If 
2e90: 77 65 20 64 6f 20 6e 6f 74 0a 2a 2a 20 64 65 66  we do not.** def
2ea0: 65 72 20 74 68 65 20 68 61 6e 64 6c 69 6e 67 20  er the handling 
2eb0: 6f 66 20 74 31 2e 78 3d 35 2c 20 69 74 20 77 69  of t1.x=5, it wi
2ec0: 6c 6c 20 62 65 20 70 72 6f 63 65 73 73 65 64 20  ll be processed 
2ed0: 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 61  immediately.** a
2ee0: 66 74 65 72 20 74 68 65 20 74 31 20 6c 6f 6f 70  fter the t1 loop
2ef0: 20 61 6e 64 20 72 6f 77 73 20 77 69 74 68 20 74   and rows with t
2f00: 31 2e 78 21 3d 35 20 77 69 6c 6c 20 6e 65 76 65  1.x!=5 will neve
2f10: 72 20 61 70 70 65 61 72 20 69 6e 0a 2a 2a 20 74  r appear in.** t
2f20: 68 65 20 6f 75 74 70 75 74 2c 20 77 68 69 63 68  he output, which
2f30: 20 69 73 20 69 6e 63 6f 72 72 65 63 74 2e 0a 2a   is incorrect..*
2f40: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
2f50: 74 4a 6f 69 6e 45 78 70 72 28 45 78 70 72 20 2a  tJoinExpr(Expr *
2f60: 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a  p, int iTable){.
2f70: 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
2f80: 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74    ExprSetPropert
2f90: 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  y(p, EP_FromJoin
2fa0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
2fb0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
2fc0: 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  p, EP_TokenOnly|
2fd0: 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20  EP_Reduced) );. 
2fe0: 20 20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f     ExprSetVVAPro
2ff0: 70 65 72 74 79 28 70 2c 20 45 50 5f 4e 6f 52 65  perty(p, EP_NoRe
3000: 64 75 63 65 29 3b 0a 20 20 20 20 70 2d 3e 69 52  duce);.    p->iR
3010: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20  ightJoinTable = 
3020: 28 69 31 36 29 69 54 61 62 6c 65 3b 0a 20 20 20  (i16)iTable;.   
3030: 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46   if( p->op==TK_F
3040: 55 4e 43 54 49 4f 4e 20 26 26 20 70 2d 3e 78 2e  UNCTION && p->x.
3050: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 69  pList ){.      i
3060: 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt i;.      for(
3070: 69 3d 30 3b 20 69 3c 70 2d 3e 78 2e 70 4c 69 73  i=0; i<p->x.pLis
3080: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
3090: 20 20 20 20 20 20 20 20 73 65 74 4a 6f 69 6e 45          setJoinE
30a0: 78 70 72 28 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e  xpr(p->x.pList->
30b0: 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62  a[i].pExpr, iTab
30c0: 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  le);.      }.   
30d0: 20 7d 0a 20 20 20 20 73 65 74 4a 6f 69 6e 45 78   }.    setJoinEx
30e0: 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61  pr(p->pLeft, iTa
30f0: 62 6c 65 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d  ble);.    p = p-
3100: 3e 70 52 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a  >pRight;.  } .}.
3110: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
3120: 69 6e 65 20 70 72 6f 63 65 73 73 65 73 20 74 68  ine processes th
3130: 65 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61 74 69  e join informati
3140: 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45 43 54 20  on for a SELECT 
3150: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e  statement..** ON
3160: 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
3170: 65 73 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64  es are converted
3180: 20 69 6e 74 6f 20 65 78 74 72 61 20 74 65 72 6d   into extra term
3190: 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
31a0: 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41 54 55 52 41  lause..** NATURA
31b0: 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f 20 63 72 65  L joins also cre
31c0: 61 74 65 20 65 78 74 72 61 20 57 48 45 52 45 20  ate extra WHERE 
31d0: 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a  clause terms..**
31e0: 0a 2a 2a 20 54 68 65 20 74 65 72 6d 73 20 6f 66  .** The terms of
31f0: 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61   a FROM clause a
3200: 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  re contained in 
3210: 74 68 65 20 53 65 6c 65 63 74 2e 70 53 72 63 20  the Select.pSrc 
3220: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68  structure..** Th
3230: 65 20 6c 65 66 74 20 6d 6f 73 74 20 74 61 62 6c  e left most tabl
3240: 65 20 69 73 20 74 68 65 20 66 69 72 73 74 20 65  e is the first e
3250: 6e 74 72 79 20 69 6e 20 53 65 6c 65 63 74 2e 70  ntry in Select.p
3260: 53 72 63 2e 20 20 54 68 65 20 72 69 67 68 74 2d  Src.  The right-
3270: 6d 6f 73 74 0a 2a 2a 20 74 61 62 6c 65 20 69 73  most.** table is
3280: 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2e   the last entry.
3290: 20 20 54 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61    The join opera
32a0: 74 6f 72 20 69 73 20 68 65 6c 64 20 69 6e 20 74  tor is held in t
32b0: 68 65 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74  he entry to.** t
32c0: 68 65 20 6c 65 66 74 2e 20 20 54 68 75 73 20 65  he left.  Thus e
32d0: 6e 74 72 79 20 30 20 63 6f 6e 74 61 69 6e 73 20  ntry 0 contains 
32e0: 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f  the join operato
32f0: 72 20 66 6f 72 20 74 68 65 20 6a 6f 69 6e 20 62  r for the join b
3300: 65 74 77 65 65 6e 0a 2a 2a 20 65 6e 74 72 69 65  etween.** entrie
3310: 73 20 30 20 61 6e 64 20 31 2e 20 20 41 6e 79 20  s 0 and 1.  Any 
3320: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
3330: 73 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ses associated w
3340: 69 74 68 20 74 68 65 20 6a 6f 69 6e 20 61 72 65  ith the join are
3350: 0a 2a 2a 20 61 6c 73 6f 20 61 74 74 61 63 68 65  .** also attache
3360: 64 20 74 6f 20 74 68 65 20 6c 65 66 74 20 65 6e  d to the left en
3370: 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  try..**.** This 
3380: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
3390: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
33a0: 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  rors encountered
33b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
33c0: 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69  sqliteProcessJoi
33d0: 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
33e0: 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53   Select *p){.  S
33f0: 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20  rcList *pSrc;   
3400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3410: 2a 20 41 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  * All tables in 
3420: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
3430: 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  */.  int i, j;  
3440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3450: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
3460: 6e 74 65 72 73 20 2a 2f 0a 20 20 73 74 72 75 63  nters */.  struc
3470: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
3480: 70 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20 4c 65  pLeft;     /* Le
3490: 66 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a  ft table being j
34a0: 6f 69 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63  oined */.  struc
34b0: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
34c0: 70 52 69 67 68 74 3b 20 20 20 20 2f 2a 20 52 69  pRight;    /* Ri
34d0: 67 68 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20  ght table being 
34e0: 6a 6f 69 6e 65 64 20 2a 2f 0a 0a 20 20 70 53 72  joined */..  pSr
34f0: 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70  c = p->pSrc;.  p
3500: 4c 65 66 74 20 3d 20 26 70 53 72 63 2d 3e 61 5b  Left = &pSrc->a[
3510: 30 5d 3b 0a 20 20 70 52 69 67 68 74 20 3d 20 26  0];.  pRight = &
3520: 70 4c 65 66 74 5b 31 5d 3b 0a 20 20 66 6f 72 28  pLeft[1];.  for(
3530: 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72  i=0; i<pSrc->nSr
3540: 63 2d 31 3b 20 69 2b 2b 2c 20 70 52 69 67 68 74  c-1; i++, pRight
3550: 2b 2b 2c 20 70 4c 65 66 74 2b 2b 29 7b 0a 20 20  ++, pLeft++){.  
3560: 20 20 54 61 62 6c 65 20 2a 70 4c 65 66 74 54 61    Table *pLeftTa
3570: 62 20 3d 20 70 4c 65 66 74 2d 3e 70 54 61 62 3b  b = pLeft->pTab;
3580: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 52 69 67  .    Table *pRig
3590: 68 74 54 61 62 20 3d 20 70 52 69 67 68 74 2d 3e  htTab = pRight->
35a0: 70 54 61 62 3b 0a 20 20 20 20 69 6e 74 20 69 73  pTab;.    int is
35b0: 4f 75 74 65 72 3b 0a 0a 20 20 20 20 69 66 28 20  Outer;..    if( 
35c0: 4e 45 56 45 52 28 70 4c 65 66 74 54 61 62 3d 3d  NEVER(pLeftTab==
35d0: 30 20 7c 7c 20 70 52 69 67 68 74 54 61 62 3d 3d  0 || pRightTab==
35e0: 30 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  0) ) continue;. 
35f0: 20 20 20 69 73 4f 75 74 65 72 20 3d 20 28 70 52     isOuter = (pR
3600: 69 67 68 74 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70  ight->fg.jointyp
3610: 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30  e & JT_OUTER)!=0
3620: 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 74  ;..    /* When t
3630: 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f  he NATURAL keywo
3640: 72 64 20 69 73 20 70 72 65 73 65 6e 74 2c 20 61  rd is present, a
3650: 64 64 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  dd WHERE clause 
3660: 74 65 72 6d 73 20 66 6f 72 0a 20 20 20 20 2a 2a  terms for.    **
3670: 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 74 68   every column th
3680: 61 74 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65  at the two table
3690: 73 20 68 61 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e  s have in common
36a0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
36b0: 20 70 52 69 67 68 74 2d 3e 66 67 2e 6a 6f 69 6e   pRight->fg.join
36c0: 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41  type & JT_NATURA
36d0: 4c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  L ){.      if( p
36e0: 52 69 67 68 74 2d 3e 70 4f 6e 20 7c 7c 20 70 52  Right->pOn || pR
36f0: 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a  ight->pUsing ){.
3700: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
3710: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
3720: 22 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 20  "a NATURAL join 
3730: 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 22 0a 20  may not have ". 
3740: 20 20 20 20 20 20 20 20 20 20 22 61 6e 20 4f 4e            "an ON
3750: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
3760: 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72  ", 0);.        r
3770: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
3780: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
3790: 6a 3c 70 52 69 67 68 74 54 61 62 2d 3e 6e 43 6f  j<pRightTab->nCo
37a0: 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
37b0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20   char *zName;   
37c0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 75 6d  /* Name of colum
37d0: 6e 20 69 6e 20 74 68 65 20 72 69 67 68 74 20 74  n in the right t
37e0: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
37f0: 69 6e 74 20 69 4c 65 66 74 3b 20 20 20 20 20 2f  int iLeft;     /
3800: 2a 20 4d 61 74 63 68 69 6e 67 20 6c 65 66 74 20  * Matching left 
3810: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  table */.       
3820: 20 69 6e 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20   int iLeftCol;  
3830: 2f 2a 20 4d 61 74 63 68 69 6e 67 20 63 6f 6c 75  /* Matching colu
3840: 6d 6e 20 69 6e 20 74 68 65 20 6c 65 66 74 20 74  mn in the left t
3850: 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20  able */..       
3860: 20 7a 4e 61 6d 65 20 3d 20 70 52 69 67 68 74 54   zName = pRightT
3870: 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  ab->aCol[j].zNam
3880: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 74  e;.        if( t
3890: 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64  ableAndColumnInd
38a0: 65 78 28 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e  ex(pSrc, i+1, zN
38b0: 61 6d 65 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c  ame, &iLeft, &iL
38c0: 65 66 74 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20  eftCol) ){.     
38d0: 20 20 20 20 20 61 64 64 57 68 65 72 65 54 65 72       addWhereTer
38e0: 6d 28 70 50 61 72 73 65 2c 20 70 53 72 63 2c 20  m(pParse, pSrc, 
38f0: 69 4c 65 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c  iLeft, iLeftCol,
3900: 20 69 2b 31 2c 20 6a 2c 0a 20 20 20 20 20 20 20   i+1, j,.       
3910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3920: 69 73 4f 75 74 65 72 2c 20 26 70 2d 3e 70 57 68  isOuter, &p->pWh
3930: 65 72 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ere);.        }.
3940: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
3950: 20 20 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 62     /* Disallow b
3960: 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  oth ON and USING
3970: 20 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20   clauses in the 
3980: 73 61 6d 65 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f  same join.    */
3990: 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d  .    if( pRight-
39a0: 3e 70 4f 6e 20 26 26 20 70 52 69 67 68 74 2d 3e  >pOn && pRight->
39b0: 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  pUsing ){.      
39c0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
39d0: 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20  pParse, "cannot 
39e0: 68 61 76 65 20 62 6f 74 68 20 4f 4e 20 61 6e 64  have both ON and
39f0: 20 55 53 49 4e 47 20 22 0a 20 20 20 20 20 20 20   USING ".       
3a00: 20 22 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65   "clauses in the
3a10: 20 73 61 6d 65 20 6a 6f 69 6e 22 29 3b 0a 20 20   same join");.  
3a20: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
3a30: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20    }..    /* Add 
3a40: 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 74 6f  the ON clause to
3a50: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
3a60: 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 63 6f  WHERE clause, co
3a70: 6e 6e 65 63 74 65 64 20 62 79 0a 20 20 20 20 2a  nnected by.    *
3a80: 2a 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f  * an AND operato
3a90: 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  r..    */.    if
3aa0: 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 29 7b  ( pRight->pOn ){
3ab0: 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f 75 74  .      if( isOut
3ac0: 65 72 20 29 20 73 65 74 4a 6f 69 6e 45 78 70 72  er ) setJoinExpr
3ad0: 28 70 52 69 67 68 74 2d 3e 70 4f 6e 2c 20 70 52  (pRight->pOn, pR
3ae0: 69 67 68 74 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  ight->iCursor);.
3af0: 20 20 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20        p->pWhere 
3b00: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
3b10: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e  (pParse->db, p->
3b20: 70 57 68 65 72 65 2c 20 70 52 69 67 68 74 2d 3e  pWhere, pRight->
3b30: 70 4f 6e 29 3b 0a 20 20 20 20 20 20 70 52 69 67  pOn);.      pRig
3b40: 68 74 2d 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20 20  ht->pOn = 0;.   
3b50: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74   }..    /* Creat
3b60: 65 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f 6e  e extra terms on
3b70: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
3b80: 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  e for each colum
3b90: 6e 20 6e 61 6d 65 64 0a 20 20 20 20 2a 2a 20 69  n named.    ** i
3ba0: 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  n the USING clau
3bb0: 73 65 2e 20 20 45 78 61 6d 70 6c 65 3a 20 49 66  se.  Example: If
3bc0: 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20   the two tables 
3bd0: 74 6f 20 62 65 20 6a 6f 69 6e 65 64 20 61 72 65  to be joined are
3be0: 20 0a 20 20 20 20 2a 2a 20 41 20 61 6e 64 20 42   .    ** A and B
3bf0: 20 61 6e 64 20 74 68 65 20 55 53 49 4e 47 20 63   and the USING c
3c00: 6c 61 75 73 65 20 6e 61 6d 65 73 20 58 2c 20 59  lause names X, Y
3c10: 2c 20 61 6e 64 20 5a 2c 20 74 68 65 6e 20 61 64  , and Z, then ad
3c20: 64 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 74 6f  d this.    ** to
3c30: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
3c40: 65 3a 20 20 20 20 41 2e 58 3d 42 2e 58 20 41 4e  e:    A.X=B.X AN
3c50: 44 20 41 2e 59 3d 42 2e 59 20 41 4e 44 20 41 2e  D A.Y=B.Y AND A.
3c60: 5a 3d 42 2e 5a 0a 20 20 20 20 2a 2a 20 52 65 70  Z=B.Z.    ** Rep
3c70: 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20  ort an error if 
3c80: 61 6e 79 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69  any column menti
3c90: 6f 6e 65 64 20 69 6e 20 74 68 65 20 55 53 49 4e  oned in the USIN
3ca0: 47 20 63 6c 61 75 73 65 20 69 73 0a 20 20 20 20  G clause is.    
3cb0: 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64  ** not contained
3cc0: 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 20   in both tables 
3cd0: 74 6f 20 62 65 20 6a 6f 69 6e 65 64 2e 0a 20 20  to be joined..  
3ce0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69    */.    if( pRi
3cf0: 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20  ght->pUsing ){. 
3d00: 20 20 20 20 20 49 64 4c 69 73 74 20 2a 70 4c 69       IdList *pLi
3d10: 73 74 20 3d 20 70 52 69 67 68 74 2d 3e 70 55 73  st = pRight->pUs
3d20: 69 6e 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  ing;.      for(j
3d30: 3d 30 3b 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64  =0; j<pList->nId
3d40: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
3d50: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20  char *zName;    
3d60: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
3d70: 74 65 72 6d 20 69 6e 20 74 68 65 20 55 53 49 4e  term in the USIN
3d80: 47 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  G clause */.    
3d90: 20 20 20 20 69 6e 74 20 69 4c 65 66 74 3b 20 20      int iLeft;  
3da0: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6f 6e       /* Table on
3db0: 20 74 68 65 20 6c 65 66 74 20 77 69 74 68 20 6d   the left with m
3dc0: 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e  atching column n
3dd0: 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ame */.        i
3de0: 6e 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20 20 20  nt iLeftCol;    
3df0: 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  /* Column number
3e00: 20 6f 66 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c   of matching col
3e10: 75 6d 6e 20 6f 6e 20 74 68 65 20 6c 65 66 74 20  umn on the left 
3e20: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
3e30: 52 69 67 68 74 43 6f 6c 3b 20 20 20 2f 2a 20 43  RightCol;   /* C
3e40: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20  olumn number of 
3e50: 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20  matching column 
3e60: 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a  on the right */.
3e70: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
3e80: 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61   pList->a[j].zNa
3e90: 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 52 69 67  me;.        iRig
3ea0: 68 74 43 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e  htCol = columnIn
3eb0: 64 65 78 28 70 52 69 67 68 74 54 61 62 2c 20 7a  dex(pRightTab, z
3ec0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Name);.        i
3ed0: 66 28 20 69 52 69 67 68 74 43 6f 6c 3c 30 0a 20  f( iRightCol<0. 
3ee0: 20 20 20 20 20 20 20 20 7c 7c 20 21 74 61 62 6c          || !tabl
3ef0: 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28  eAndColumnIndex(
3f00: 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65  pSrc, i+1, zName
3f10: 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c 65 66 74  , &iLeft, &iLeft
3f20: 43 6f 6c 29 0a 20 20 20 20 20 20 20 20 29 7b 0a  Col).        ){.
3f30: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
3f40: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
3f50: 2c 20 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75  , "cannot join u
3f60: 73 69 6e 67 20 63 6f 6c 75 6d 6e 20 25 73 20 2d  sing column %s -
3f70: 20 63 6f 6c 75 6d 6e 20 22 0a 20 20 20 20 20 20   column ".      
3f80: 20 20 20 20 20 20 22 6e 6f 74 20 70 72 65 73 65        "not prese
3f90: 6e 74 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65  nt in both table
3fa0: 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
3fb0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
3fc0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3fd0: 20 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 70    addWhereTerm(p
3fe0: 50 61 72 73 65 2c 20 70 53 72 63 2c 20 69 4c 65  Parse, pSrc, iLe
3ff0: 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b  ft, iLeftCol, i+
4000: 31 2c 20 69 52 69 67 68 74 43 6f 6c 2c 0a 20 20  1, iRightCol,.  
4010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4020: 20 20 20 69 73 4f 75 74 65 72 2c 20 26 70 2d 3e     isOuter, &p->
4030: 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20 7d  pWhere);.      }
4040: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
4050: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72  urn 0;.}../* For
4060: 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a  ward reference *
4070: 2f 0a 73 74 61 74 69 63 20 4b 65 79 49 6e 66 6f  /.static KeyInfo
4080: 20 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70   *keyInfoFromExp
4090: 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a  rList(.  Parse *
40a0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
40b0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
40c0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
40d0: 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 46 6f  pList,     /* Fo
40e0: 72 6d 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6f  rm the KeyInfo o
40f0: 62 6a 65 63 74 20 66 72 6f 6d 20 74 68 69 73 20  bject from this 
4100: 45 78 70 72 4c 69 73 74 20 2a 2f 0a 20 20 69 6e  ExprList */.  in
4110: 74 20 69 53 74 61 72 74 2c 20 20 20 20 20 20 20  t iStart,       
4120: 20 20 20 2f 2a 20 42 65 67 69 6e 20 77 69 74 68     /* Begin with
4130: 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 6f 66 20   this column of 
4140: 70 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  pList */.  int n
4150: 45 78 74 72 61 20 20 20 20 20 20 20 20 20 20 20  Extra           
4160: 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79  /* Add this many
4170: 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20 74   extra columns t
4180: 6f 20 74 68 65 20 65 6e 64 20 2a 2f 0a 29 3b 0a  o the end */.);.
4190: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
41a0: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 70  code that will p
41b0: 75 73 68 20 74 68 65 20 72 65 63 6f 72 64 20 69  ush the record i
41c0: 6e 20 72 65 67 69 73 74 65 72 73 20 72 65 67 44  n registers regD
41d0: 61 74 61 0a 2a 2a 20 74 68 72 6f 75 67 68 20 72  ata.** through r
41e0: 65 67 44 61 74 61 2b 6e 44 61 74 61 2d 31 20 6f  egData+nData-1 o
41f0: 6e 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 0a  nto the sorter..
4200: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
4210: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20  ushOntoSorter(. 
4220: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
4230: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
4240: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
4250: 6f 72 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20  ortCtx *pSort,  
4260: 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61        /* Informa
4270: 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 4f  tion about the O
4280: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
4290: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
42a0: 65 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  ect,       /* Th
42b0: 65 20 77 68 6f 6c 65 20 53 45 4c 45 43 54 20 73  e whole SELECT s
42c0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e  tatement */.  in
42d0: 74 20 72 65 67 44 61 74 61 2c 20 20 20 20 20 20  t regData,      
42e0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 72 65       /* First re
42f0: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 64  gister holding d
4300: 61 74 61 20 74 6f 20 62 65 20 73 6f 72 74 65 64  ata to be sorted
4310: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 72 69   */.  int regOri
4320: 67 44 61 74 61 2c 20 20 20 20 20 20 20 2f 2a 20  gData,       /* 
4330: 46 69 72 73 74 20 72 65 67 69 73 74 65 72 20 68  First register h
4340: 6f 6c 64 69 6e 67 20 64 61 74 61 20 62 65 66 6f  olding data befo
4350: 72 65 20 70 61 63 6b 69 6e 67 20 2a 2f 0a 20 20  re packing */.  
4360: 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 20 20 20  int nData,      
4370: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
4380: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20   of elements in 
4390: 74 68 65 20 64 61 74 61 20 61 72 72 61 79 20 2a  the data array *
43a0: 2f 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78 52  /.  int nPrefixR
43b0: 65 67 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  eg         /* No
43c0: 2e 20 6f 66 20 72 65 67 20 70 72 69 6f 72 20 74  . of reg prior t
43d0: 6f 20 72 65 67 44 61 74 61 20 61 76 61 69 6c 61  o regData availa
43e0: 62 6c 65 20 66 6f 72 20 75 73 65 20 2a 2f 0a 29  ble for use */.)
43f0: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
4400: 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20  arse->pVdbe;    
4410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4420: 20 20 20 20 20 2f 2a 20 53 74 6d 74 20 75 6e 64       /* Stmt und
4430: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
4440: 2a 2f 0a 20 20 69 6e 74 20 62 53 65 71 20 3d 20  */.  int bSeq = 
4450: 28 28 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61  ((pSort->sortFla
4460: 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73  gs & SORTFLAG_Us
4470: 65 53 6f 72 74 65 72 29 3d 3d 30 29 3b 0a 20 20  eSorter)==0);.  
4480: 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 53 6f 72  int nExpr = pSor
4490: 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  t->pOrderBy->nEx
44a0: 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pr;             
44b0: 20 2f 2a 20 4e 6f 2e 20 6f 66 20 4f 52 44 45 52   /* No. of ORDER
44c0: 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 69   BY terms */.  i
44d0: 6e 74 20 6e 42 61 73 65 20 3d 20 6e 45 78 70 72  nt nBase = nExpr
44e0: 20 2b 20 62 53 65 71 20 2b 20 6e 44 61 74 61 3b   + bSeq + nData;
44f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4500: 2f 2a 20 46 69 65 6c 64 73 20 69 6e 20 73 6f 72  /* Fields in sor
4510: 74 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ter record */.  
4520: 69 6e 74 20 72 65 67 42 61 73 65 3b 20 20 20 20  int regBase;    
4530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4550: 20 2f 2a 20 52 65 67 73 20 66 6f 72 20 73 6f 72   /* Regs for sor
4560: 74 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ter record */.  
4570: 69 6e 74 20 72 65 67 52 65 63 6f 72 64 20 3d 20  int regRecord = 
4580: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20  ++pParse->nMem; 
4590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45a0: 20 2f 2a 20 41 73 73 65 6d 62 6c 65 64 20 73 6f   /* Assembled so
45b0: 72 74 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20  rter record */. 
45c0: 20 69 6e 74 20 6e 4f 42 53 61 74 20 3d 20 70 53   int nOBSat = pS
45d0: 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 20 20 20 20  ort->nOBSat;    
45e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45f0: 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 74 65    /* ORDER BY te
4600: 72 6d 73 20 74 6f 20 73 6b 69 70 20 2a 2f 0a 20  rms to skip */. 
4610: 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20   int op;        
4620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4630: 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20 74 6f      /* Opcode to
4640: 20 61 64 64 20 73 6f 72 74 65 72 20 72 65 63 6f   add sorter reco
4650: 72 64 20 74 6f 20 73 6f 72 74 65 72 20 2a 2f 0a  rd to sorter */.
4660: 20 20 69 6e 74 20 69 4c 69 6d 69 74 3b 20 20 20    int iLimit;   
4670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4680: 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54 20 63 6f       /* LIMIT co
4690: 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65  unter */..  asse
46a0: 72 74 28 20 62 53 65 71 3d 3d 30 20 7c 7c 20 62  rt( bSeq==0 || b
46b0: 53 65 71 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  Seq==1 );.  asse
46c0: 72 74 28 20 6e 44 61 74 61 3d 3d 31 20 7c 7c 20  rt( nData==1 || 
46d0: 72 65 67 44 61 74 61 3d 3d 72 65 67 4f 72 69 67  regData==regOrig
46e0: 44 61 74 61 20 7c 7c 20 72 65 67 4f 72 69 67 44  Data || regOrigD
46f0: 61 74 61 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ata==0 );.  if( 
4700: 6e 50 72 65 66 69 78 52 65 67 20 29 7b 0a 20 20  nPrefixReg ){.  
4710: 20 20 61 73 73 65 72 74 28 20 6e 50 72 65 66 69    assert( nPrefi
4720: 78 52 65 67 3d 3d 6e 45 78 70 72 2b 62 53 65 71  xReg==nExpr+bSeq
4730: 20 29 3b 0a 20 20 20 20 72 65 67 42 61 73 65 20   );.    regBase 
4740: 3d 20 72 65 67 44 61 74 61 20 2d 20 6e 45 78 70  = regData - nExp
4750: 72 20 2d 20 62 53 65 71 3b 0a 20 20 7d 65 6c 73  r - bSeq;.  }els
4760: 65 7b 0a 20 20 20 20 72 65 67 42 61 73 65 20 3d  e{.    regBase =
4770: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20   pParse->nMem + 
4780: 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  1;.    pParse->n
4790: 4d 65 6d 20 2b 3d 20 6e 42 61 73 65 3b 0a 20 20  Mem += nBase;.  
47a0: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 53 65 6c  }.  assert( pSel
47b0: 65 63 74 2d 3e 69 4f 66 66 73 65 74 3d 3d 30 20  ect->iOffset==0 
47c0: 7c 7c 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d  || pSelect->iLim
47d0: 69 74 21 3d 30 20 29 3b 0a 20 20 69 4c 69 6d 69  it!=0 );.  iLimi
47e0: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66  t = pSelect->iOf
47f0: 66 73 65 74 20 3f 20 70 53 65 6c 65 63 74 2d 3e  fset ? pSelect->
4800: 69 4f 66 66 73 65 74 2b 31 20 3a 20 70 53 65 6c  iOffset+1 : pSel
4810: 65 63 74 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 70  ect->iLimit;.  p
4820: 53 6f 72 74 2d 3e 6c 61 62 65 6c 44 6f 6e 65 20  Sort->labelDone 
4830: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
4840: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 73 71 6c  eLabel(v);.  sql
4850: 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
4860: 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 6f  List(pParse, pSo
4870: 72 74 2d 3e 70 4f 72 64 65 72 42 79 2c 20 72 65  rt->pOrderBy, re
4880: 67 42 61 73 65 2c 20 72 65 67 4f 72 69 67 44 61  gBase, regOrigDa
4890: 74 61 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ta,.            
48a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
48b0: 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 20 7c 20  LITE_ECEL_DUP | 
48c0: 28 72 65 67 4f 72 69 67 44 61 74 61 3f 20 53 51  (regOrigData? SQ
48d0: 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 20 3a 20  LITE_ECEL_REF : 
48e0: 30 29 29 3b 0a 20 20 69 66 28 20 62 53 65 71 20  0));.  if( bSeq 
48f0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
4900: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
4910: 65 71 75 65 6e 63 65 2c 20 70 53 6f 72 74 2d 3e  equence, pSort->
4920: 69 45 43 75 72 73 6f 72 2c 20 72 65 67 42 61 73  iECursor, regBas
4930: 65 2b 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20  e+nExpr);.  }.  
4940: 69 66 28 20 6e 50 72 65 66 69 78 52 65 67 3d 3d  if( nPrefixReg==
4950: 30 20 26 26 20 6e 44 61 74 61 3e 30 20 29 7b 0a  0 && nData>0 ){.
4960: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
4970: 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20  odeMove(pParse, 
4980: 72 65 67 44 61 74 61 2c 20 72 65 67 42 61 73 65  regData, regBase
4990: 2b 6e 45 78 70 72 2b 62 53 65 71 2c 20 6e 44 61  +nExpr+bSeq, nDa
49a0: 74 61 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ta);.  }.  sqlit
49b0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
49c0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
49d0: 65 67 42 61 73 65 2b 6e 4f 42 53 61 74 2c 20 6e  egBase+nOBSat, n
49e0: 42 61 73 65 2d 6e 4f 42 53 61 74 2c 20 72 65 67  Base-nOBSat, reg
49f0: 52 65 63 6f 72 64 29 3b 0a 20 20 69 66 28 20 6e  Record);.  if( n
4a00: 4f 42 53 61 74 3e 30 20 29 7b 0a 20 20 20 20 69  OBSat>0 ){.    i
4a10: 6e 74 20 72 65 67 50 72 65 76 4b 65 79 3b 20 20  nt regPrevKey;  
4a20: 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 6e 4f   /* The first nO
4a30: 42 53 61 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  BSat columns of 
4a40: 74 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77  the previous row
4a50: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
4a60: 46 69 72 73 74 3b 20 20 20 20 2f 2a 20 41 64 64  First;    /* Add
4a70: 72 65 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 49  ress of the OP_I
4a80: 66 4e 6f 74 20 6f 70 63 6f 64 65 20 2a 2f 0a 20  fNot opcode */. 
4a90: 20 20 20 69 6e 74 20 61 64 64 72 4a 6d 70 3b 20     int addrJmp; 
4aa0: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
4ab0: 6f 66 20 74 68 65 20 4f 50 5f 4a 75 6d 70 20 6f  of the OP_Jump o
4ac0: 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 56 64 62  pcode */.    Vdb
4ad0: 65 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20 20 2f  eOp *pOp;      /
4ae0: 2a 20 4f 70 63 6f 64 65 20 74 68 61 74 20 6f 70  * Opcode that op
4af0: 65 6e 73 20 74 68 65 20 73 6f 72 74 65 72 20 2a  ens the sorter *
4b00: 2f 0a 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b 20  /.    int nKey; 
4b10: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
4b20: 72 20 6f 66 20 73 6f 72 74 69 6e 67 20 6b 65 79  r of sorting key
4b30: 20 63 6f 6c 75 6d 6e 73 2c 20 69 6e 63 6c 75 64   columns, includ
4b40: 69 6e 67 20 4f 50 5f 53 65 71 75 65 6e 63 65 20  ing OP_Sequence 
4b50: 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  */.    KeyInfo *
4b60: 70 4b 49 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67  pKI;     /* Orig
4b70: 69 6e 61 6c 20 4b 65 79 49 6e 66 6f 20 6f 6e 20  inal KeyInfo on 
4b80: 74 68 65 20 73 6f 72 74 65 72 20 74 61 62 6c 65  the sorter table
4b90: 20 2a 2f 0a 0a 20 20 20 20 72 65 67 50 72 65 76   */..    regPrev
4ba0: 4b 65 79 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Key = pParse->nM
4bb0: 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65  em+1;.    pParse
4bc0: 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 53 6f 72 74 2d  ->nMem += pSort-
4bd0: 3e 6e 4f 42 53 61 74 3b 0a 20 20 20 20 6e 4b 65  >nOBSat;.    nKe
4be0: 79 20 3d 20 6e 45 78 70 72 20 2d 20 70 53 6f 72  y = nExpr - pSor
4bf0: 74 2d 3e 6e 4f 42 53 61 74 20 2b 20 62 53 65 71  t->nOBSat + bSeq
4c00: 3b 0a 20 20 20 20 69 66 28 20 62 53 65 71 20 29  ;.    if( bSeq )
4c10: 7b 0a 20 20 20 20 20 20 61 64 64 72 46 69 72 73  {.      addrFirs
4c20: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  t = sqlite3VdbeA
4c30: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f  ddOp1(v, OP_IfNo
4c40: 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72  t, regBase+nExpr
4c50: 29 3b 20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ); .    }else{. 
4c60: 20 20 20 20 20 61 64 64 72 46 69 72 73 74 20 3d       addrFirst =
4c70: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4c80: 70 31 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63  p1(v, OP_Sequenc
4c90: 65 54 65 73 74 2c 20 70 53 6f 72 74 2d 3e 69 45  eTest, pSort->iE
4ca0: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 20  Cursor);.    }. 
4cb0: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
4cc0: 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
4cd0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
4ce0: 43 6f 6d 70 61 72 65 2c 20 72 65 67 50 72 65 76  Compare, regPrev
4cf0: 4b 65 79 2c 20 72 65 67 42 61 73 65 2c 20 70 53  Key, regBase, pS
4d00: 6f 72 74 2d 3e 6e 4f 42 53 61 74 29 3b 0a 20 20  ort->nOBSat);.  
4d10: 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56    pOp = sqlite3V
4d20: 64 62 65 47 65 74 4f 70 28 76 2c 20 70 53 6f 72  dbeGetOp(v, pSor
4d30: 74 2d 3e 61 64 64 72 53 6f 72 74 49 6e 64 65 78  t->addrSortIndex
4d40: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73  );.    if( pPars
4d50: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
4d60: 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
4d70: 20 20 70 4f 70 2d 3e 70 32 20 3d 20 6e 4b 65 79    pOp->p2 = nKey
4d80: 20 2b 20 6e 44 61 74 61 3b 0a 20 20 20 20 70 4b   + nData;.    pK
4d90: 49 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79  I = pOp->p4.pKey
4da0: 49 6e 66 6f 3b 0a 20 20 20 20 6d 65 6d 73 65 74  Info;.    memset
4db0: 28 70 4b 49 2d 3e 61 53 6f 72 74 4f 72 64 65 72  (pKI->aSortOrder
4dc0: 2c 20 30 2c 20 70 4b 49 2d 3e 6e 4b 65 79 46 69  , 0, pKI->nKeyFi
4dd0: 65 6c 64 29 3b 20 2f 2a 20 4d 61 6b 65 73 20 4f  eld); /* Makes O
4de0: 50 5f 4a 75 6d 70 20 74 65 73 74 61 62 6c 65 20  P_Jump testable 
4df0: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
4e00: 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31  beChangeP4(v, -1
4e10: 2c 20 28 63 68 61 72 2a 29 70 4b 49 2c 20 50 34  , (char*)pKI, P4
4e20: 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 74  _KEYINFO);.    t
4e30: 65 73 74 63 61 73 65 28 20 70 4b 49 2d 3e 6e 41  estcase( pKI->nA
4e40: 6c 6c 46 69 65 6c 64 20 3e 20 70 4b 49 2d 3e 6e  llField > pKI->n
4e50: 4b 65 79 46 69 65 6c 64 2b 32 20 29 3b 0a 20 20  KeyField+2 );.  
4e60: 20 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e    pOp->p4.pKeyIn
4e70: 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d  fo = keyInfoFrom
4e80: 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
4e90: 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79   pSort->pOrderBy
4ea0: 2c 20 6e 4f 42 53 61 74 2c 0a 20 20 20 20 20 20  , nOBSat,.      
4eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ed0: 20 20 20 20 20 70 4b 49 2d 3e 6e 41 6c 6c 46 69       pKI->nAllFi
4ee0: 65 6c 64 2d 70 4b 49 2d 3e 6e 4b 65 79 46 69 65  eld-pKI->nKeyFie
4ef0: 6c 64 2d 31 29 3b 0a 20 20 20 20 61 64 64 72 4a  ld-1);.    addrJ
4f00: 6d 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  mp = sqlite3Vdbe
4f10: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
4f20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4f30: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70  ddOp3(v, OP_Jump
4f40: 2c 20 61 64 64 72 4a 6d 70 2b 31 2c 20 30 2c 20  , addrJmp+1, 0, 
4f50: 61 64 64 72 4a 6d 70 2b 31 29 3b 20 56 64 62 65  addrJmp+1); Vdbe
4f60: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
4f70: 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f   pSort->labelBkO
4f80: 75 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ut = sqlite3Vdbe
4f90: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
4fa0: 20 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75    pSort->regRetu
4fb0: 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rn = ++pParse->n
4fc0: 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Mem;.    sqlite3
4fd0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
4fe0: 5f 47 6f 73 75 62 2c 20 70 53 6f 72 74 2d 3e 72  _Gosub, pSort->r
4ff0: 65 67 52 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d  egReturn, pSort-
5000: 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20  >labelBkOut);.  
5010: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5020: 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73 65 74 53  Op1(v, OP_ResetS
5030: 6f 72 74 65 72 2c 20 70 53 6f 72 74 2d 3e 69 45  orter, pSort->iE
5040: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 69 66 28  Cursor);.    if(
5050: 20 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20   iLimit ){.     
5060: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5070: 70 32 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20  p2(v, OP_IfNot, 
5080: 69 4c 69 6d 69 74 2c 20 70 53 6f 72 74 2d 3e 6c  iLimit, pSort->l
5090: 61 62 65 6c 44 6f 6e 65 29 3b 0a 20 20 20 20 20  abelDone);.     
50a0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
50b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
50c0: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
50d0: 76 2c 20 61 64 64 72 46 69 72 73 74 29 3b 0a 20  v, addrFirst);. 
50e0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
50f0: 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72  deMove(pParse, r
5100: 65 67 42 61 73 65 2c 20 72 65 67 50 72 65 76 4b  egBase, regPrevK
5110: 65 79 2c 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61  ey, pSort->nOBSa
5120: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
5130: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
5140: 64 64 72 4a 6d 70 29 3b 0a 20 20 7d 0a 20 20 69  ddrJmp);.  }.  i
5150: 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c  f( pSort->sortFl
5160: 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55  ags & SORTFLAG_U
5170: 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20  seSorter ){.    
5180: 6f 70 20 3d 20 4f 50 5f 53 6f 72 74 65 72 49 6e  op = OP_SorterIn
5190: 73 65 72 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  sert;.  }else{. 
51a0: 20 20 20 6f 70 20 3d 20 4f 50 5f 49 64 78 49 6e     op = OP_IdxIn
51b0: 73 65 72 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  sert;.  }.  sqli
51c0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
51d0: 28 76 2c 20 6f 70 2c 20 70 53 6f 72 74 2d 3e 69  (v, op, pSort->i
51e0: 45 43 75 72 73 6f 72 2c 20 72 65 67 52 65 63 6f  ECursor, regReco
51f0: 72 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rd,.            
5200: 20 20 20 20 20 20 20 20 20 20 20 72 65 67 42 61             regBa
5210: 73 65 2b 6e 4f 42 53 61 74 2c 20 6e 42 61 73 65  se+nOBSat, nBase
5220: 2d 6e 4f 42 53 61 74 29 3b 0a 20 20 69 66 28 20  -nOBSat);.  if( 
5230: 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 69 6e  iLimit ){.    in
5240: 74 20 61 64 64 72 3b 0a 20 20 20 20 69 6e 74 20  t addr;.    int 
5250: 72 31 20 3d 20 30 3b 0a 20 20 20 20 2f 2a 20 46  r1 = 0;.    /* F
5260: 69 6c 6c 20 74 68 65 20 73 6f 72 74 65 72 20 75  ill the sorter u
5270: 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73  ntil it contains
5280: 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 20 65 6e   LIMIT+OFFSET en
5290: 74 72 69 65 73 2e 20 20 28 54 68 65 20 69 4c 69  tries.  (The iLi
52a0: 6d 69 74 0a 20 20 20 20 2a 2a 20 72 65 67 69 73  mit.    ** regis
52b0: 74 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  ter is initializ
52c0: 65 64 20 77 69 74 68 20 76 61 6c 75 65 20 6f 66  ed with value of
52d0: 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 2e 29 20   LIMIT+OFFSET.) 
52e0: 20 41 66 74 65 72 20 74 68 65 20 73 6f 72 74 65   After the sorte
52f0: 72 0a 20 20 20 20 2a 2a 20 66 69 6c 6c 73 20 75  r.    ** fills u
5300: 70 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c 65  p, delete the le
5310: 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
5320: 20 73 6f 72 74 65 72 20 61 66 74 65 72 20 65 61   sorter after ea
5330: 63 68 20 69 6e 73 65 72 74 2e 0a 20 20 20 20 2a  ch insert..    *
5340: 2a 20 54 68 75 73 20 77 65 20 6e 65 76 65 72 20  * Thus we never 
5350: 68 6f 6c 64 20 6d 6f 72 65 20 74 68 61 6e 20 74  hold more than t
5360: 68 65 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 20  he LIMIT+OFFSET 
5370: 72 6f 77 73 20 69 6e 20 6d 65 6d 6f 72 79 20 61  rows in memory a
5380: 74 20 6f 6e 63 65 20 2a 2f 0a 20 20 20 20 61 64  t once */.    ad
5390: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
53a0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e  AddOp1(v, OP_IfN
53b0: 6f 74 5a 65 72 6f 2c 20 69 4c 69 6d 69 74 29 3b  otZero, iLimit);
53c0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
53d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
53e0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4c 61  eAddOp1(v, OP_La
53f0: 73 74 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72  st, pSort->iECur
5400: 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 70 53  sor);.    if( pS
5410: 6f 72 74 2d 3e 62 4f 72 64 65 72 65 64 49 6e 6e  ort->bOrderedInn
5420: 65 72 4c 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20  erLoop ){.      
5430: 72 31 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  r1 = ++pParse->n
5440: 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Mem;.      sqlit
5450: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
5460: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 53 6f 72 74  OP_Column, pSort
5470: 2d 3e 69 45 43 75 72 73 6f 72 2c 20 6e 45 78 70  ->iECursor, nExp
5480: 72 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64  r, r1);.      Vd
5490: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73  beComment((v, "s
54a0: 65 71 22 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  eq"));.    }.   
54b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
54c0: 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c  p1(v, OP_Delete,
54d0: 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72   pSort->iECursor
54e0: 29 3b 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74  );.    if( pSort
54f0: 2d 3e 62 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c  ->bOrderedInnerL
5500: 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  oop ){.      /* 
5510: 49 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  If the inner loo
5520: 70 20 69 73 20 64 72 69 76 65 6e 20 62 79 20 61  p is driven by a
5530: 6e 20 69 6e 64 65 78 20 73 75 63 68 20 74 68 61  n index such tha
5540: 74 20 76 61 6c 75 65 73 20 66 72 6f 6d 0a 20 20  t values from.  
5550: 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20      ** the same 
5560: 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iteration of the
5570: 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 61 72 65 20   inner loop are 
5580: 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 2c  in sorted order,
5590: 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 69   then.      ** i
55a0: 6d 6d 65 64 69 61 74 65 6c 79 20 6a 75 6d 70 20  mmediately jump 
55b0: 74 6f 20 74 68 65 20 6e 65 78 74 20 69 74 65 72  to the next iter
55c0: 61 74 69 6f 6e 20 6f 66 20 61 6e 20 69 6e 6e 65  ation of an inne
55d0: 72 20 6c 6f 6f 70 20 69 66 20 74 68 65 0a 20 20  r loop if the.  
55e0: 20 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 72 6f      ** entry fro
55f0: 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 74  m the current it
5600: 65 72 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  eration does not
5610: 20 66 69 74 20 69 6e 74 6f 20 74 68 65 20 74 6f   fit into the to
5620: 70 0a 20 20 20 20 20 20 2a 2a 20 4c 49 4d 49 54  p.      ** LIMIT
5630: 2b 4f 46 46 53 45 54 20 65 6e 74 72 69 65 73 20  +OFFSET entries 
5640: 6f 66 20 74 68 65 20 73 6f 72 74 65 72 2e 20 2a  of the sorter. *
5650: 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 42 72 6b  /.      int iBrk
5660: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
5670: 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 32  rrentAddr(v) + 2
5680: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
5690: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
56a0: 45 71 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70  Eq, regBase+nExp
56b0: 72 2c 20 69 42 72 6b 2c 20 72 31 29 3b 0a 20 20  r, iBrk, r1);.  
56c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
56d0: 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54  hangeP5(v, SQLIT
56e0: 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
56f0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
5700: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
5710: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
5720: 76 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a  v, addr);.  }.}.
5730: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20  ./*.** Add code 
5740: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
5750: 20 4f 46 46 53 45 54 0a 2a 2f 0a 73 74 61 74 69   OFFSET.*/.stati
5760: 63 20 76 6f 69 64 20 63 6f 64 65 4f 66 66 73 65  c void codeOffse
5770: 74 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20  t(.  Vdbe *v,   
5780: 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
5790: 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69  te code into thi
57a0: 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f  s VM */.  int iO
57b0: 66 66 73 65 74 2c 20 20 20 20 20 20 2f 2a 20 52  ffset,      /* R
57c0: 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
57d0: 74 68 65 20 6f 66 66 73 65 74 20 63 6f 75 6e 74  the offset count
57e0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e  er */.  int iCon
57f0: 74 69 6e 75 65 20 20 20 20 20 2f 2a 20 4a 75 6d  tinue     /* Jum
5800: 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74  p here to skip t
5810: 68 65 20 63 75 72 72 65 6e 74 20 72 65 63 6f 72  he current recor
5820: 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69 4f  d */.){.  if( iO
5830: 66 66 73 65 74 3e 30 20 29 7b 0a 20 20 20 20 73  ffset>0 ){.    s
5840: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
5850: 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4f  (v, OP_IfPos, iO
5860: 66 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65  ffset, iContinue
5870: 2c 20 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61  , 1); VdbeCovera
5880: 67 65 28 76 29 3b 0a 20 20 20 20 56 64 62 65 43  ge(v);.    VdbeC
5890: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46 46 53  omment((v, "OFFS
58a0: 45 54 22 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ET"));.  }.}../*
58b0: 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 68 61  .** Add code tha
58c0: 74 20 77 69 6c 6c 20 63 68 65 63 6b 20 74 6f 20  t will check to 
58d0: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 4e 20  make sure the N 
58e0: 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69  registers starti
58f0: 6e 67 20 61 74 20 69 4d 65 6d 0a 2a 2a 20 66 6f  ng at iMem.** fo
5900: 72 6d 20 61 20 64 69 73 74 69 6e 63 74 20 65 6e  rm a distinct en
5910: 74 72 79 2e 20 20 69 54 61 62 20 69 73 20 61 20  try.  iTab is a 
5920: 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68  sorting index th
5930: 61 74 20 68 6f 6c 64 73 20 70 72 65 76 69 6f 75  at holds previou
5940: 73 6c 79 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d 62  sly.** seen comb
5950: 69 6e 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20  inations of the 
5960: 4e 20 76 61 6c 75 65 73 2e 20 20 41 20 6e 65 77  N values.  A new
5970: 20 65 6e 74 72 79 20 69 73 20 6d 61 64 65 20 69   entry is made i
5980: 6e 20 69 54 61 62 0a 2a 2a 20 69 66 20 74 68 65  n iTab.** if the
5990: 20 63 75 72 72 65 6e 74 20 4e 20 76 61 6c 75 65   current N value
59a0: 73 20 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a  s are new..**.**
59b0: 20 41 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 52   A jump to addrR
59c0: 65 70 65 61 74 20 69 73 20 6d 61 64 65 20 61 6e  epeat is made an
59d0: 64 20 74 68 65 20 4e 2b 31 20 76 61 6c 75 65 73  d the N+1 values
59e0: 20 61 72 65 20 70 6f 70 70 65 64 20 66 72 6f 6d   are popped from
59f0: 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 66   the.** stack if
5a00: 20 74 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d 65   the top N eleme
5a10: 6e 74 73 20 61 72 65 20 6e 6f 74 20 64 69 73 74  nts are not dist
5a20: 69 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  inct..*/.static 
5a30: 76 6f 69 64 20 63 6f 64 65 44 69 73 74 69 6e 63  void codeDistinc
5a40: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
5a50: 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69  se,     /* Parsi
5a60: 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  ng and code gene
5a70: 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
5a80: 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20 20  /.  int iTab,   
5a90: 20 20 20 20 20 20 20 2f 2a 20 41 20 73 6f 72 74         /* A sort
5aa0: 69 6e 67 20 69 6e 64 65 78 20 75 73 65 64 20 74  ing index used t
5ab0: 6f 20 74 65 73 74 20 66 6f 72 20 64 69 73 74 69  o test for disti
5ac0: 6e 63 74 6e 65 73 73 20 2a 2f 0a 20 20 69 6e 74  nctness */.  int
5ad0: 20 61 64 64 72 52 65 70 65 61 74 2c 20 20 20 20   addrRepeat,    
5ae0: 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20  /* Jump to here 
5af0: 69 66 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 20  if not distinct 
5b00: 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20  */.  int N,     
5b10: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
5b20: 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 2a 2f  r of elements */
5b30: 0a 20 20 69 6e 74 20 69 4d 65 6d 20 20 20 20 20  .  int iMem     
5b40: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 65        /* First e
5b50: 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56  lement */.){.  V
5b60: 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 72 31  dbe *v;.  int r1
5b70: 3b 0a 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d  ;..  v = pParse-
5b80: 3e 70 56 64 62 65 3b 0a 20 20 72 31 20 3d 20 73  >pVdbe;.  r1 = s
5b90: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
5ba0: 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69  (pParse);.  sqli
5bb0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
5bc0: 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 54  (v, OP_Found, iT
5bd0: 61 62 2c 20 61 64 64 72 52 65 70 65 61 74 2c 20  ab, addrRepeat, 
5be0: 69 4d 65 6d 2c 20 4e 29 3b 20 56 64 62 65 43 6f  iMem, N); VdbeCo
5bf0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c  verage(v);.  sql
5c00: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
5c10: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
5c20: 20 69 4d 65 6d 2c 20 4e 2c 20 72 31 29 3b 0a 20   iMem, N, r1);. 
5c30: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5c40: 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49  p4Int(v, OP_IdxI
5c50: 6e 73 65 72 74 2c 20 69 54 61 62 2c 20 72 31 2c  nsert, iTab, r1,
5c60: 20 69 4d 65 6d 2c 20 4e 29 3b 0a 20 20 73 71 6c   iMem, N);.  sql
5c70: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
5c80: 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45  (v, OPFLAG_USESE
5c90: 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73 71 6c  EKRESULT);.  sql
5ca0: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
5cb0: 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
5cc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
5cd0: 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
5ce0: 74 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  the code for the
5cf0: 20 69 6e 73 69 64 65 20 6f 66 20 74 68 65 20 69   inside of the i
5d00: 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20  nner loop.** of 
5d10: 61 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20  a SELECT..**.** 
5d20: 49 66 20 73 72 63 54 61 62 20 69 73 20 6e 65 67  If srcTab is neg
5d30: 61 74 69 76 65 2c 20 74 68 65 6e 20 74 68 65 20  ative, then the 
5d40: 70 2d 3e 70 45 4c 69 73 74 20 65 78 70 72 65 73  p->pEList expres
5d50: 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 65 76 61  sions.** are eva
5d60: 6c 75 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20  luated in order 
5d70: 74 6f 20 67 65 74 20 74 68 65 20 64 61 74 61 20  to get the data 
5d80: 66 6f 72 20 74 68 69 73 20 72 6f 77 2e 20 20 49  for this row.  I
5d90: 66 20 73 72 63 54 61 62 20 69 73 0a 2a 2a 20 7a  f srcTab is.** z
5da0: 65 72 6f 20 6f 72 20 6d 6f 72 65 2c 20 74 68 65  ero or more, the
5db0: 6e 20 64 61 74 61 20 69 73 20 70 75 6c 6c 65 64  n data is pulled
5dc0: 20 66 72 6f 6d 20 73 72 63 54 61 62 20 61 6e 64   from srcTab and
5dd0: 20 70 2d 3e 70 45 4c 69 73 74 20 69 73 20 75 73   p->pEList is us
5de0: 65 64 20 6f 6e 6c 79 20 0a 2a 2a 20 74 6f 20 67  ed only .** to g
5df0: 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  et the number of
5e00: 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74 68 65   columns and the
5e10: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
5e20: 6e 63 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  nce for each col
5e30: 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  umn..*/.static v
5e40: 6f 69 64 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c  oid selectInnerL
5e50: 6f 6f 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50  oop(.  Parse *pP
5e60: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
5e70: 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
5e80: 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
5e90: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
5ea0: 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74    /* The complet
5eb0: 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  e select stateme
5ec0: 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a  nt being coded *
5ed0: 2f 0a 20 20 69 6e 74 20 73 72 63 54 61 62 2c 20  /.  int srcTab, 
5ee0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
5ef0: 75 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68  ull data from th
5f00: 69 73 20 74 61 62 6c 65 20 69 66 20 6e 6f 6e 2d  is table if non-
5f10: 6e 65 67 61 74 69 76 65 20 2a 2f 0a 20 20 53 6f  negative */.  So
5f20: 72 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20  rtCtx *pSort,   
5f30: 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20        /* If not 
5f40: 4e 55 4c 4c 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f  NULL, info on ho
5f50: 77 20 74 6f 20 70 72 6f 63 65 73 73 20 4f 52 44  w to process ORD
5f60: 45 52 20 42 59 20 2a 2f 0a 20 20 44 69 73 74 69  ER BY */.  Disti
5f70: 6e 63 74 43 74 78 20 2a 70 44 69 73 74 69 6e 63  nctCtx *pDistinc
5f80: 74 2c 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c  t, /* If not NUL
5f90: 4c 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f 77 20 74  L, info on how t
5fa0: 6f 20 70 72 6f 63 65 73 73 20 44 49 53 54 49 4e  o process DISTIN
5fb0: 43 54 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  CT */.  SelectDe
5fc0: 73 74 20 2a 70 44 65 73 74 2c 20 20 20 20 20 20  st *pDest,      
5fd0: 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73  /* How to dispos
5fe0: 65 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 73  e of the results
5ff0: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69   */.  int iConti
6000: 6e 75 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  nue,          /*
6010: 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 63 6f   Jump here to co
6020: 6e 74 69 6e 75 65 20 77 69 74 68 20 6e 65 78 74  ntinue with next
6030: 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 42   row */.  int iB
6040: 72 65 61 6b 20 20 20 20 20 20 20 20 20 20 20 20  reak            
6050: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
6060: 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74  o break out of t
6070: 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f  he inner loop */
6080: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
6090: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
60a0: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 68 61   int i;.  int ha
60b0: 73 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20  sDistinct;      
60c0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
60d0: 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65   the DISTINCT ke
60e0: 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74  yword is present
60f0: 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 20   */.  int eDest 
6100: 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 20  = pDest->eDest; 
6110: 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70    /* How to disp
6120: 6f 73 65 20 6f 66 20 72 65 73 75 6c 74 73 20 2a  ose of results *
6130: 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20  /.  int iParm = 
6140: 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 3b 20  pDest->iSDParm; 
6150: 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e  /* First argumen
6160: 74 20 74 6f 20 64 69 73 70 6f 73 61 6c 20 6d 65  t to disposal me
6170: 74 68 6f 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  thod */.  int nR
6180: 65 73 75 6c 74 43 6f 6c 3b 20 20 20 20 20 20 20  esultCol;       
6190: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
61a0: 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
61b0: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 65 66  s */.  int nPref
61c0: 69 78 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20  ixReg = 0;      
61d0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
61e0: 65 78 74 72 61 20 72 65 67 69 73 74 65 72 73 20  extra registers 
61f0: 62 65 66 6f 72 65 20 72 65 67 52 65 73 75 6c 74  before regResult
6200: 20 2a 2f 0a 0a 20 20 2f 2a 20 55 73 75 61 6c 6c   */..  /* Usuall
6210: 79 2c 20 72 65 67 52 65 73 75 6c 74 20 69 73 20  y, regResult is 
6220: 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 69  the first cell i
6230: 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 6d 65  n an array of me
6240: 6d 6f 72 79 20 63 65 6c 6c 73 0a 20 20 2a 2a 20  mory cells.  ** 
6250: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
6260: 75 72 72 65 6e 74 20 72 65 73 75 6c 74 20 72 6f  urrent result ro
6270: 77 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  w. In this case 
6280: 72 65 67 4f 72 69 67 20 69 73 20 73 65 74 20 74  regOrig is set t
6290: 6f 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20  o the.  ** same 
62a0: 76 61 6c 75 65 2e 20 48 6f 77 65 76 65 72 2c 20  value. However, 
62b0: 69 66 20 74 68 65 20 72 65 73 75 6c 74 73 20 61  if the results a
62c0: 72 65 20 62 65 69 6e 67 20 73 65 6e 74 20 74 6f  re being sent to
62d0: 20 74 68 65 20 73 6f 72 74 65 72 2c 20 74 68 65   the sorter, the
62e0: 0a 20 20 2a 2a 20 76 61 6c 75 65 73 20 66 6f 72  .  ** values for
62f0: 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 73   any expressions
6300: 20 74 68 61 74 20 61 72 65 20 61 6c 73 6f 20 70   that are also p
6310: 61 72 74 20 6f 66 20 74 68 65 20 73 6f 72 74 2d  art of the sort-
6320: 6b 65 79 20 61 72 65 20 6f 6d 69 74 74 65 64 0a  key are omitted.
6330: 20 20 2a 2a 20 66 72 6f 6d 20 74 68 69 73 20 61    ** from this a
6340: 72 72 61 79 2e 20 49 6e 20 74 68 69 73 20 63 61  rray. In this ca
6350: 73 65 20 72 65 67 4f 72 69 67 20 69 73 20 73 65  se regOrig is se
6360: 74 20 74 6f 20 7a 65 72 6f 2e 20 20 2a 2f 0a 20  t to zero.  */. 
6370: 20 69 6e 74 20 72 65 67 52 65 73 75 6c 74 3b 20   int regResult; 
6380: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6390: 53 74 61 72 74 20 6f 66 20 6d 65 6d 6f 72 79 20  Start of memory 
63a0: 68 6f 6c 64 69 6e 67 20 63 75 72 72 65 6e 74 20  holding current 
63b0: 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74  results */.  int
63c0: 20 72 65 67 4f 72 69 67 3b 20 20 20 20 20 20 20   regOrig;       
63d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72           /* Star
63e0: 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 6f 6c 64  t of memory hold
63f0: 69 6e 67 20 66 75 6c 6c 20 72 65 73 75 6c 74 20  ing full result 
6400: 28 6f 72 20 30 29 20 2a 2f 0a 0a 20 20 61 73 73  (or 0) */..  ass
6410: 65 72 74 28 20 76 20 29 3b 0a 20 20 61 73 73 65  ert( v );.  asse
6420: 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30  rt( p->pEList!=0
6430: 20 29 3b 0a 20 20 68 61 73 44 69 73 74 69 6e 63   );.  hasDistinc
6440: 74 20 3d 20 70 44 69 73 74 69 6e 63 74 20 3f 20  t = pDistinct ? 
6450: 70 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74  pDistinct->eTnct
6460: 54 79 70 65 20 3a 20 57 48 45 52 45 5f 44 49 53  Type : WHERE_DIS
6470: 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20 69 66  TINCT_NOOP;.  if
6480: 28 20 70 53 6f 72 74 20 26 26 20 70 53 6f 72 74  ( pSort && pSort
6490: 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20  ->pOrderBy==0 ) 
64a0: 70 53 6f 72 74 20 3d 20 30 3b 0a 20 20 69 66 28  pSort = 0;.  if(
64b0: 20 70 53 6f 72 74 3d 3d 30 20 26 26 20 21 68 61   pSort==0 && !ha
64c0: 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  sDistinct ){.   
64d0: 20 61 73 73 65 72 74 28 20 69 43 6f 6e 74 69 6e   assert( iContin
64e0: 75 65 21 3d 30 20 29 3b 0a 20 20 20 20 63 6f 64  ue!=0 );.    cod
64f0: 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f  eOffset(v, p->iO
6500: 66 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65  ffset, iContinue
6510: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c  );.  }..  /* Pul
6520: 6c 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  l the requested 
6530: 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20  columns..  */.  
6540: 6e 52 65 73 75 6c 74 43 6f 6c 20 3d 20 70 2d 3e  nResultCol = p->
6550: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a  pEList->nExpr;..
6560: 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69 53 64    if( pDest->iSd
6570: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  st==0 ){.    if(
6580: 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20   pSort ){.      
6590: 6e 50 72 65 66 69 78 52 65 67 20 3d 20 70 53 6f  nPrefixReg = pSo
65a0: 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  rt->pOrderBy->nE
65b0: 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 21  xpr;.      if( !
65c0: 28 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67  (pSort->sortFlag
65d0: 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65  s & SORTFLAG_Use
65e0: 53 6f 72 74 65 72 29 20 29 20 6e 50 72 65 66 69  Sorter) ) nPrefi
65f0: 78 52 65 67 2b 2b 3b 0a 20 20 20 20 20 20 70 50  xReg++;.      pP
6600: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 50  arse->nMem += nP
6610: 72 65 66 69 78 52 65 67 3b 0a 20 20 20 20 7d 0a  refixReg;.    }.
6620: 20 20 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74      pDest->iSdst
6630: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
6640: 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  1;.    pParse->n
6650: 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f  Mem += nResultCo
6660: 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  l;.  }else if( p
6670: 44 65 73 74 2d 3e 69 53 64 73 74 2b 6e 52 65 73  Dest->iSdst+nRes
6680: 75 6c 74 43 6f 6c 20 3e 20 70 50 61 72 73 65 2d  ultCol > pParse-
6690: 3e 6e 4d 65 6d 20 29 7b 0a 20 20 20 20 2f 2a 20  >nMem ){.    /* 
66a0: 54 68 69 73 20 69 73 20 61 6e 20 65 72 72 6f 72  This is an error
66b0: 20 63 6f 6e 64 69 74 69 6f 6e 20 74 68 61 74 20   condition that 
66c0: 63 61 6e 20 72 65 73 75 6c 74 2c 20 66 6f 72 20  can result, for 
66d0: 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 61 20  example, when a 
66e0: 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20 6f 6e  SELECT.    ** on
66f0: 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   the right-hand 
6700: 73 69 64 65 20 6f 66 20 61 6e 20 49 4e 53 45 52  side of an INSER
6710: 54 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20  T contains more 
6720: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 74  result columns t
6730: 68 61 6e 0a 20 20 20 20 2a 2a 20 74 68 65 72 65  han.    ** there
6740: 20 61 72 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   are columns in 
6750: 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74 68 65  the table on the
6760: 20 6c 65 66 74 2e 20 20 54 68 65 20 65 72 72 6f   left.  The erro
6770: 72 20 77 69 6c 6c 20 62 65 20 63 61 75 67 68 74  r will be caught
6780: 0a 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 70 6f  .    ** and repo
6790: 72 74 65 64 20 6c 61 74 65 72 2e 20 20 42 75 74  rted later.  But
67a0: 20 77 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65   we need to make
67b0: 20 73 75 72 65 20 65 6e 6f 75 67 68 20 6d 65 6d   sure enough mem
67c0: 6f 72 79 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ory is allocated
67d0: 0a 20 20 20 20 2a 2a 20 74 6f 20 61 76 6f 69 64  .    ** to avoid
67e0: 20 6f 74 68 65 72 20 73 70 75 72 69 6f 75 73 20   other spurious 
67f0: 65 72 72 6f 72 73 20 69 6e 20 74 68 65 20 6d 65  errors in the me
6800: 61 6e 74 69 6d 65 2e 20 2a 2f 0a 20 20 20 20 70  antime. */.    p
6810: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
6820: 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d 0a 20  ResultCol;.  }. 
6830: 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20   pDest->nSdst = 
6840: 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 72 65  nResultCol;.  re
6850: 67 4f 72 69 67 20 3d 20 72 65 67 52 65 73 75 6c  gOrig = regResul
6860: 74 20 3d 20 70 44 65 73 74 2d 3e 69 53 64 73 74  t = pDest->iSdst
6870: 3b 0a 20 20 69 66 28 20 73 72 63 54 61 62 3e 3d  ;.  if( srcTab>=
6880: 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  0 ){.    for(i=0
6890: 3b 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b 20  ; i<nResultCol; 
68a0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
68b0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
68c0: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54   OP_Column, srcT
68d0: 61 62 2c 20 69 2c 20 72 65 67 52 65 73 75 6c 74  ab, i, regResult
68e0: 2b 69 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  +i);.      VdbeC
68f0: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c  omment((v, "%s",
6900: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d   p->pEList->a[i]
6910: 2e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a  .zName));.    }.
6920: 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73    }else if( eDes
6930: 74 21 3d 53 52 54 5f 45 78 69 73 74 73 20 29 7b  t!=SRT_Exists ){
6940: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64  .    /* If the d
6950: 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 61 6e  estination is an
6960: 20 45 58 49 53 54 53 28 2e 2e 2e 29 20 65 78 70   EXISTS(...) exp
6970: 72 65 73 73 69 6f 6e 2c 20 74 68 65 20 61 63 74  ression, the act
6980: 75 61 6c 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65  ual.    ** value
6990: 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  s returned by th
69a0: 65 20 53 45 4c 45 43 54 20 61 72 65 20 6e 6f 74  e SELECT are not
69b0: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a   required..    *
69c0: 2f 0a 20 20 20 20 75 38 20 65 63 65 6c 46 6c 61  /.    u8 ecelFla
69d0: 67 73 3b 0a 20 20 20 20 69 66 28 20 65 44 65 73  gs;.    if( eDes
69e0: 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44  t==SRT_Mem || eD
69f0: 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
6a00: 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f  || eDest==SRT_Co
6a10: 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 20  routine ){.     
6a20: 20 65 63 65 6c 46 6c 61 67 73 20 3d 20 53 51 4c   ecelFlags = SQL
6a30: 49 54 45 5f 45 43 45 4c 5f 44 55 50 3b 0a 20 20  ITE_ECEL_DUP;.  
6a40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 65    }else{.      e
6a50: 63 65 6c 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20  celFlags = 0;.  
6a60: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 6f 72    }.    if( pSor
6a70: 74 20 26 26 20 68 61 73 44 69 73 74 69 6e 63 74  t && hasDistinct
6a80: 3d 3d 30 20 26 26 20 65 44 65 73 74 21 3d 53 52  ==0 && eDest!=SR
6a90: 54 5f 45 70 68 65 6d 54 61 62 20 26 26 20 65 44  T_EphemTab && eD
6aa0: 65 73 74 21 3d 53 52 54 5f 54 61 62 6c 65 20 29  est!=SRT_Table )
6ab0: 7b 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 65  {.      /* For e
6ac0: 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ach expression i
6ad0: 6e 20 70 2d 3e 70 45 4c 69 73 74 20 74 68 61 74  n p->pEList that
6ae0: 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 61 6e   is a copy of an
6af0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 0a 20   expression in. 
6b00: 20 20 20 20 20 2a 2a 20 74 68 65 20 4f 52 44 45       ** the ORDE
6b10: 52 20 42 59 20 63 6c 61 75 73 65 20 28 70 53 6f  R BY clause (pSo
6b20: 72 74 2d 3e 70 4f 72 64 65 72 42 79 29 2c 20 73  rt->pOrderBy), s
6b30: 65 74 20 74 68 65 20 61 73 73 6f 63 69 61 74 65  et the associate
6b40: 64 20 0a 20 20 20 20 20 20 2a 2a 20 69 4f 72 64  d .      ** iOrd
6b50: 65 72 42 79 43 6f 6c 20 76 61 6c 75 65 20 74 6f  erByCol value to
6b60: 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 20 74   one more than t
6b70: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
6b80: 4f 52 44 45 52 20 42 59 20 0a 20 20 20 20 20 20  ORDER BY .      
6b90: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69  ** expression wi
6ba0: 74 68 69 6e 20 74 68 65 20 73 6f 72 74 2d 6b 65  thin the sort-ke
6bb0: 79 20 74 68 61 74 20 70 75 73 68 4f 6e 74 6f 53  y that pushOntoS
6bc0: 6f 72 74 65 72 28 29 20 77 69 6c 6c 20 67 65 6e  orter() will gen
6bd0: 65 72 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a 20  erate..      ** 
6be0: 54 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20  This allows the 
6bf0: 70 2d 3e 70 45 4c 69 73 74 20 66 69 65 6c 64 20  p->pEList field 
6c00: 74 6f 20 62 65 20 6f 6d 69 74 74 65 64 20 66 72  to be omitted fr
6c10: 6f 6d 20 74 68 65 20 73 6f 72 74 65 64 20 72 65  om the sorted re
6c20: 63 6f 72 64 2c 0a 20 20 20 20 20 20 2a 2a 20 73  cord,.      ** s
6c30: 61 76 69 6e 67 20 73 70 61 63 65 20 61 6e 64 20  aving space and 
6c40: 43 50 55 20 63 79 63 6c 65 73 2e 20 20 2a 2f 0a  CPU cycles.  */.
6c50: 20 20 20 20 20 20 65 63 65 6c 46 6c 61 67 73 20        ecelFlags 
6c60: 7c 3d 20 28 53 51 4c 49 54 45 5f 45 43 45 4c 5f  |= (SQLITE_ECEL_
6c70: 4f 4d 49 54 52 45 46 7c 53 51 4c 49 54 45 5f 45  OMITREF|SQLITE_E
6c80: 43 45 4c 5f 52 45 46 29 3b 0a 20 20 20 20 20 20  CEL_REF);.      
6c90: 66 6f 72 28 69 3d 70 53 6f 72 74 2d 3e 6e 4f 42  for(i=pSort->nOB
6ca0: 53 61 74 3b 20 69 3c 70 53 6f 72 74 2d 3e 70 4f  Sat; i<pSort->pO
6cb0: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
6cc0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ++){.        int
6cd0: 20 6a 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   j;.        if( 
6ce0: 28 6a 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64  (j = pSort->pOrd
6cf0: 65 72 42 79 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69  erBy->a[i].u.x.i
6d00: 4f 72 64 65 72 42 79 43 6f 6c 29 3e 30 20 29 7b  OrderByCol)>0 ){
6d10: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 45  .          p->pE
6d20: 4c 69 73 74 2d 3e 61 5b 6a 2d 31 5d 2e 75 2e 78  List->a[j-1].u.x
6d30: 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 69  .iOrderByCol = i
6d40: 2b 31 2d 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74  +1-pSort->nOBSat
6d50: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6d60: 20 20 7d 0a 20 20 20 20 20 20 72 65 67 4f 72 69    }.      regOri
6d70: 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73  g = 0;.      ass
6d80: 65 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ert( eDest==SRT_
6d90: 53 65 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52  Set || eDest==SR
6da0: 54 5f 4d 65 6d 20 0a 20 20 20 20 20 20 20 20 20  T_Mem .         
6db0: 20 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f    || eDest==SRT_
6dc0: 43 6f 72 6f 75 74 69 6e 65 20 7c 7c 20 65 44 65  Coroutine || eDe
6dd0: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
6de0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 52 65 73  ;.    }.    nRes
6df0: 75 6c 74 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33  ultCol = sqlite3
6e00: 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
6e10: 28 70 50 61 72 73 65 2c 70 2d 3e 70 45 4c 69 73  (pParse,p->pELis
6e20: 74 2c 72 65 67 52 65 73 75 6c 74 2c 30 2c 65 63  t,regResult,0,ec
6e30: 65 6c 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20  elFlags);.  }.. 
6e40: 20 2f 2a 20 49 66 20 74 68 65 20 44 49 53 54 49   /* If the DISTI
6e50: 4e 43 54 20 6b 65 79 77 6f 72 64 20 77 61 73 20  NCT keyword was 
6e60: 70 72 65 73 65 6e 74 20 6f 6e 20 74 68 65 20 53  present on the S
6e70: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a  ELECT statement.
6e80: 20 20 2a 2a 20 61 6e 64 20 74 68 69 73 20 72 6f    ** and this ro
6e90: 77 20 68 61 73 20 62 65 65 6e 20 73 65 65 6e 20  w has been seen 
6ea0: 62 65 66 6f 72 65 2c 20 74 68 65 6e 20 64 6f 20  before, then do 
6eb0: 6e 6f 74 20 6d 61 6b 65 20 74 68 69 73 20 72 6f  not make this ro
6ec0: 77 0a 20 20 2a 2a 20 70 61 72 74 20 6f 66 20 74  w.  ** part of t
6ed0: 68 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a  he result..  */.
6ee0: 20 20 69 66 28 20 68 61 73 44 69 73 74 69 6e 63    if( hasDistinc
6ef0: 74 20 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28  t ){.    switch(
6f00: 20 70 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63   pDistinct->eTnc
6f10: 74 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63  tType ){.      c
6f20: 61 73 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e  ase WHERE_DISTIN
6f30: 43 54 5f 4f 52 44 45 52 45 44 3a 20 7b 0a 20 20  CT_ORDERED: {.  
6f40: 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f        VdbeOp *pO
6f50: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p;            /*
6f60: 20 4e 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75 69   No longer requi
6f70: 72 65 64 20 4f 70 65 6e 45 70 68 65 6d 65 72 61  red OpenEphemera
6f80: 6c 20 69 6e 73 74 72 2e 20 2a 2f 0a 20 20 20 20  l instr. */.    
6f90: 20 20 20 20 69 6e 74 20 69 4a 75 6d 70 3b 20 20      int iJump;  
6fa0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
6fb0: 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  ump destination 
6fc0: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  */.        int r
6fd0: 65 67 50 72 65 76 3b 20 20 20 20 20 20 20 20 20  egPrev;         
6fe0: 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72     /* Previous r
6ff0: 6f 77 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20  ow content */.. 
7000: 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61         /* Alloca
7010: 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65  te space for the
7020: 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20 2a 2f   previous row */
7030: 0a 20 20 20 20 20 20 20 20 72 65 67 50 72 65 76  .        regPrev
7040: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
7050: 31 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  1;.        pPars
7060: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75  e->nMem += nResu
7070: 6c 74 43 6f 6c 3b 0a 0a 20 20 20 20 20 20 20 20  ltCol;..        
7080: 2f 2a 20 43 68 61 6e 67 65 20 74 68 65 20 4f 50  /* Change the OP
7090: 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 63  _OpenEphemeral c
70a0: 6f 64 65 64 20 65 61 72 6c 69 65 72 20 74 6f 20  oded earlier to 
70b0: 61 6e 20 4f 50 5f 4e 75 6c 6c 0a 20 20 20 20 20  an OP_Null.     
70c0: 20 20 20 2a 2a 20 73 65 74 73 20 74 68 65 20 4d     ** sets the M
70d0: 45 4d 5f 43 6c 65 61 72 65 64 20 62 69 74 20 6f  EM_Cleared bit o
70e0: 6e 20 74 68 65 20 66 69 72 73 74 20 72 65 67 69  n the first regi
70f0: 73 74 65 72 20 6f 66 20 74 68 65 0a 20 20 20 20  ster of the.    
7100: 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20      ** previous 
7110: 76 61 6c 75 65 2e 20 20 54 68 69 73 20 77 69 6c  value.  This wil
7120: 6c 20 63 61 75 73 65 20 74 68 65 20 4f 50 5f 4e  l cause the OP_N
7130: 65 20 62 65 6c 6f 77 20 74 6f 20 61 6c 77 61 79  e below to alway
7140: 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 61 69  s.        ** fai
7150: 6c 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 69  l on the first i
7160: 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
7170: 6c 6f 6f 70 20 65 76 65 6e 20 69 66 20 74 68 65  loop even if the
7180: 20 66 69 72 73 74 0a 20 20 20 20 20 20 20 20 2a   first.        *
7190: 2a 20 72 6f 77 20 69 73 20 61 6c 6c 20 4e 55 4c  * row is all NUL
71a0: 4c 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  Ls..        */. 
71b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
71c0: 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76  beChangeToNoop(v
71d0: 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64 64  , pDistinct->add
71e0: 72 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20 20  rTnct);.        
71f0: 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  pOp = sqlite3Vdb
7200: 65 47 65 74 4f 70 28 76 2c 20 70 44 69 73 74 69  eGetOp(v, pDisti
7210: 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a  nct->addrTnct);.
7220: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63          pOp->opc
7230: 6f 64 65 20 3d 20 4f 50 5f 4e 75 6c 6c 3b 0a 20  ode = OP_Null;. 
7240: 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d         pOp->p1 =
7250: 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d   1;.        pOp-
7260: 3e 70 32 20 3d 20 72 65 67 50 72 65 76 3b 0a 0a  >p2 = regPrev;..
7270: 20 20 20 20 20 20 20 20 69 4a 75 6d 70 20 3d 20          iJump = 
7280: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
7290: 6e 74 41 64 64 72 28 76 29 20 2b 20 6e 52 65 73  ntAddr(v) + nRes
72a0: 75 6c 74 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  ultCol;.        
72b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 73 75  for(i=0; i<nResu
72c0: 6c 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  ltCol; i++){.   
72d0: 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a         CollSeq *
72e0: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
72f0: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
7300: 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  e, p->pEList->a[
7310: 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
7320: 20 20 20 20 20 69 66 28 20 69 3c 6e 52 65 73 75       if( i<nResu
7330: 6c 74 43 6f 6c 2d 31 20 29 7b 0a 20 20 20 20 20  ltCol-1 ){.     
7340: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
7350: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e  beAddOp3(v, OP_N
7360: 65 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 2c 20  e, regResult+i, 
7370: 69 4a 75 6d 70 2c 20 72 65 67 50 72 65 76 2b 69  iJump, regPrev+i
7380: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 56  );.            V
7390: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
73a0: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
73b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
73c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
73d0: 2c 20 4f 50 5f 45 71 2c 20 72 65 67 52 65 73 75  , OP_Eq, regResu
73e0: 6c 74 2b 69 2c 20 69 43 6f 6e 74 69 6e 75 65 2c  lt+i, iContinue,
73f0: 20 72 65 67 50 72 65 76 2b 69 29 3b 0a 20 20 20   regPrev+i);.   
7400: 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76           VdbeCov
7410: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
7420: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
7430: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
7440: 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 6f 6e  geP4(v, -1, (con
7450: 73 74 20 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c  st char *)pColl,
7460: 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20   P4_COLLSEQ);.  
7470: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
7480: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53  dbeChangeP5(v, S
7490: 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
74a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
74b0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
74c0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
74d0: 76 29 3d 3d 69 4a 75 6d 70 20 7c 7c 20 70 50 61  v)==iJump || pPa
74e0: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
74f0: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20  ailed );.       
7500: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7510: 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72  p3(v, OP_Copy, r
7520: 65 67 52 65 73 75 6c 74 2c 20 72 65 67 50 72 65  egResult, regPre
7530: 76 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2d 31 29  v, nResultCol-1)
7540: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
7550: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
7560: 63 61 73 65 20 57 48 45 52 45 5f 44 49 53 54 49  case WHERE_DISTI
7570: 4e 43 54 5f 55 4e 49 51 55 45 3a 20 7b 0a 20 20  NCT_UNIQUE: {.  
7580: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7590: 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c  eChangeToNoop(v,
75a0: 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64 64 72   pDistinct->addr
75b0: 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20 20 62  Tnct);.        b
75c0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
75d0: 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a       default: {.
75e0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
75f0: 70 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74  pDistinct->eTnct
7600: 54 79 70 65 3d 3d 57 48 45 52 45 5f 44 49 53 54  Type==WHERE_DIST
7610: 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 20 29  INCT_UNORDERED )
7620: 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 44 69  ;.        codeDi
7630: 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c 20 70  stinct(pParse, p
7640: 44 69 73 74 69 6e 63 74 2d 3e 74 61 62 54 6e 63  Distinct->tabTnc
7650: 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6e 52  t, iContinue, nR
7660: 65 73 75 6c 74 43 6f 6c 2c 0a 20 20 20 20 20 20  esultCol,.      
7670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
7680: 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20  egResult);.     
7690: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
76a0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
76b0: 70 53 6f 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pSort==0 ){.    
76c0: 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
76d0: 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e  p->iOffset, iCon
76e0: 74 69 6e 75 65 29 3b 0a 20 20 20 20 7d 0a 20 20  tinue);.    }.  
76f0: 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 65 44 65  }..  switch( eDe
7700: 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20  st ){.    /* In 
7710: 74 68 69 73 20 6d 6f 64 65 2c 20 77 72 69 74 65  this mode, write
7720: 20 65 61 63 68 20 71 75 65 72 79 20 72 65 73 75   each query resu
7730: 6c 74 20 74 6f 20 74 68 65 20 6b 65 79 20 6f 66  lt to the key of
7740: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20   the temporary. 
7750: 20 20 20 2a 2a 20 74 61 62 6c 65 20 69 50 61 72     ** table iPar
7760: 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65  m..    */.#ifnde
7770: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
7780: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20  MPOUND_SELECT.  
7790: 20 20 63 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e    case SRT_Union
77a0: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  : {.      int r1
77b0: 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
77c0: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
77d0: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
77e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
77f0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
7800: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65  , regResult, nRe
7810: 73 75 6c 74 43 6f 6c 2c 20 72 31 29 3b 0a 20 20  sultCol, r1);.  
7820: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7830: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49  ddOp4Int(v, OP_I
7840: 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  dxInsert, iParm,
7850: 20 72 31 2c 20 72 65 67 52 65 73 75 6c 74 2c 20   r1, regResult, 
7860: 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20  nResultCol);.   
7870: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
7880: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
7890: 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61   r1);.      brea
78a0: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
78b0: 20 43 6f 6e 73 74 72 75 63 74 20 61 20 72 65 63   Construct a rec
78c0: 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 71 75 65  ord from the que
78d0: 72 79 20 72 65 73 75 6c 74 2c 20 62 75 74 20 69  ry result, but i
78e0: 6e 73 74 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a  nstead of.    **
78f0: 20 73 61 76 69 6e 67 20 74 68 61 74 20 72 65 63   saving that rec
7900: 6f 72 64 2c 20 75 73 65 20 69 74 20 61 73 20 61  ord, use it as a
7910: 20 6b 65 79 20 74 6f 20 64 65 6c 65 74 65 20 65   key to delete e
7920: 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20 20 20  lements from.   
7930: 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72   ** the temporar
7940: 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20  y table iParm.. 
7950: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
7960: 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a 20 20 20  RT_Except: {.   
7970: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7980: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78 44 65  dOp3(v, OP_IdxDe
7990: 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20 72 65 67  lete, iParm, reg
79a0: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
79b0: 6f 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ol);.      break
79c0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
79d0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  * SQLITE_OMIT_CO
79e0: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f  MPOUND_SELECT */
79f0: 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74  ..    /* Store t
7a00: 68 65 20 72 65 73 75 6c 74 20 61 73 20 64 61 74  he result as dat
7a10: 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65  a using a unique
7a20: 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   key..    */.   
7a30: 20 63 61 73 65 20 53 52 54 5f 46 69 66 6f 3a 0a   case SRT_Fifo:.
7a40: 20 20 20 20 63 61 73 65 20 53 52 54 5f 44 69 73      case SRT_Dis
7a50: 74 46 69 66 6f 3a 0a 20 20 20 20 63 61 73 65 20  tFifo:.    case 
7a60: 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63  SRT_Table:.    c
7a70: 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62  ase SRT_EphemTab
7a80: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  : {.      int r1
7a90: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
7aa0: 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
7ab0: 50 72 65 66 69 78 52 65 67 2b 31 29 3b 0a 20 20  PrefixReg+1);.  
7ac0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
7ad0: 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29  est==SRT_Table )
7ae0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
7af0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68  ( eDest==SRT_Eph
7b00: 65 6d 54 61 62 20 29 3b 0a 20 20 20 20 20 20 74  emTab );.      t
7b10: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
7b20: 53 52 54 5f 46 69 66 6f 20 29 3b 0a 20 20 20 20  SRT_Fifo );.    
7b30: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
7b40: 74 3d 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20  t==SRT_DistFifo 
7b50: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
7b60: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
7b70: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
7b80: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
7b90: 6f 6c 2c 20 72 31 2b 6e 50 72 65 66 69 78 52 65  ol, r1+nPrefixRe
7ba0: 67 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  g);.#ifndef SQLI
7bb0: 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20  TE_OMIT_CTE.    
7bc0: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
7bd0: 5f 44 69 73 74 46 69 66 6f 20 29 7b 0a 20 20 20  _DistFifo ){.   
7be0: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64       /* If the d
7bf0: 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 44 69  estination is Di
7c00: 73 74 46 69 66 6f 2c 20 74 68 65 6e 20 63 75 72  stFifo, then cur
7c10: 73 6f 72 20 28 69 50 61 72 6d 2b 31 29 20 69 73  sor (iParm+1) is
7c20: 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   open.        **
7c30: 20 6f 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c   on an ephemeral
7c40: 20 69 6e 64 65 78 2e 20 49 66 20 74 68 65 20 63   index. If the c
7c50: 75 72 72 65 6e 74 20 72 6f 77 20 69 73 20 61 6c  urrent row is al
7c60: 72 65 61 64 79 20 70 72 65 73 65 6e 74 0a 20 20  ready present.  
7c70: 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20        ** in the 
7c80: 69 6e 64 65 78 2c 20 64 6f 20 6e 6f 74 20 77 72  index, do not wr
7c90: 69 74 65 20 69 74 20 74 6f 20 74 68 65 20 6f 75  ite it to the ou
7ca0: 74 70 75 74 2e 20 49 66 20 6e 6f 74 2c 20 61 64  tput. If not, ad
7cb0: 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  d the.        **
7cc0: 20 63 75 72 72 65 6e 74 20 72 6f 77 20 74 6f 20   current row to 
7cd0: 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 70 72  the index and pr
7ce0: 6f 63 65 65 64 20 77 69 74 68 20 77 72 69 74 69  oceed with writi
7cf0: 6e 67 20 69 74 20 74 6f 20 74 68 65 0a 20 20 20  ng it to the.   
7d00: 20 20 20 20 20 2a 2a 20 6f 75 74 70 75 74 20 74       ** output t
7d10: 61 62 6c 65 20 61 73 20 77 65 6c 6c 2e 20 20 2a  able as well.  *
7d20: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64  /.        int ad
7d30: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
7d40: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b  CurrentAddr(v) +
7d50: 20 34 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   4;.        sqli
7d60: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
7d70: 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 50  (v, OP_Found, iP
7d80: 61 72 6d 2b 31 2c 20 61 64 64 72 2c 20 72 31 2c  arm+1, addr, r1,
7d90: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62   0);.        Vdb
7da0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
7db0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7dc0: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
7dd0: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72  _IdxInsert, iPar
7de0: 6d 2b 31 2c 20 72 31 2c 72 65 67 52 65 73 75 6c  m+1, r1,regResul
7df0: 74 2c 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20  t,nResultCol);. 
7e00: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
7e10: 53 6f 72 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Sort==0 );.     
7e20: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
7e30: 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20  if( pSort ){.   
7e40: 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72       pushOntoSor
7e50: 74 65 72 28 70 50 61 72 73 65 2c 20 70 53 6f 72  ter(pParse, pSor
7e60: 74 2c 20 70 2c 20 72 31 2b 6e 50 72 65 66 69 78  t, p, r1+nPrefix
7e70: 52 65 67 2c 72 65 67 52 65 73 75 6c 74 2c 31 2c  Reg,regResult,1,
7e80: 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20  nPrefixReg);.   
7e90: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7ea0: 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74    int r2 = sqlit
7eb0: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
7ec0: 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
7ed0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
7ee0: 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20  v, OP_NewRowid, 
7ef0: 69 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20  iParm, r2);.    
7f00: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7f10: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65  ddOp3(v, OP_Inse
7f20: 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20 72  rt, iParm, r1, r
7f30: 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  2);.        sqli
7f40: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
7f50: 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44  v, OPFLAG_APPEND
7f60: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
7f70: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
7f80: 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20  (pParse, r2);.  
7f90: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
7fa0: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
7fb0: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20  nge(pParse, r1, 
7fc0: 6e 50 72 65 66 69 78 52 65 67 2b 31 29 3b 0a 20  nPrefixReg+1);. 
7fd0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7fe0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
7ff0: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
8000: 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65      /* If we are
8010: 20 63 72 65 61 74 69 6e 67 20 61 20 73 65 74 20   creating a set 
8020: 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20  for an "expr IN 
8030: 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f  (SELECT ...)" co
8040: 6e 73 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20  nstruct,.    ** 
8050: 74 68 65 6e 20 74 68 65 72 65 20 73 68 6f 75 6c  then there shoul
8060: 64 20 62 65 20 61 20 73 69 6e 67 6c 65 20 69 74  d be a single it
8070: 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  em on the stack.
8080: 20 20 57 72 69 74 65 20 74 68 69 73 0a 20 20 20    Write this.   
8090: 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74 68   ** item into th
80a0: 65 20 73 65 74 20 74 61 62 6c 65 20 77 69 74 68  e set table with
80b0: 20 62 6f 67 75 73 20 64 61 74 61 2e 0a 20 20 20   bogus data..   
80c0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
80d0: 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 69 66  _Set: {.      if
80e0: 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20  ( pSort ){.     
80f0: 20 20 20 2f 2a 20 41 74 20 66 69 72 73 74 20 67     /* At first g
8100: 6c 61 6e 63 65 20 79 6f 75 20 77 6f 75 6c 64 20  lance you would 
8110: 74 68 69 6e 6b 20 77 65 20 63 6f 75 6c 64 20 6f  think we could o
8120: 70 74 69 6d 69 7a 65 20 6f 75 74 20 74 68 65 0a  ptimize out the.
8130: 20 20 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52          ** ORDER
8140: 20 42 59 20 69 6e 20 74 68 69 73 20 63 61 73 65   BY in this case
8150: 20 73 69 6e 63 65 20 74 68 65 20 6f 72 64 65 72   since the order
8160: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74   of entries in t
8170: 68 65 20 73 65 74 0a 20 20 20 20 20 20 20 20 2a  he set.        *
8180: 2a 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65  * does not matte
8190: 72 2e 20 20 42 75 74 20 74 68 65 72 65 20 6d 69  r.  But there mi
81a0: 67 68 74 20 62 65 20 61 20 4c 49 4d 49 54 20 63  ght be a LIMIT c
81b0: 6c 61 75 73 65 2c 20 69 6e 20 77 68 69 63 68 0a  lause, in which.
81c0: 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20          ** case 
81d0: 74 68 65 20 6f 72 64 65 72 20 64 6f 65 73 20 6d  the order does m
81e0: 61 74 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 20  atter */.       
81f0: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
8200: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61  .            pPa
8210: 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72  rse, pSort, p, r
8220: 65 67 52 65 73 75 6c 74 2c 20 72 65 67 4f 72 69  egResult, regOri
8230: 67 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 6e  g, nResultCol, n
8240: 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20 20  PrefixReg);.    
8250: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
8260: 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65   int r1 = sqlite
8270: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
8280: 73 65 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  se);.        ass
8290: 65 72 74 28 20 73 71 6c 69 74 65 33 53 74 72 6c  ert( sqlite3Strl
82a0: 65 6e 33 30 28 70 44 65 73 74 2d 3e 7a 41 66 66  en30(pDest->zAff
82b0: 53 64 73 74 29 3d 3d 6e 52 65 73 75 6c 74 43 6f  Sdst)==nResultCo
82c0: 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  l );.        sql
82d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
82e0: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
82f0: 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73   regResult, nRes
8300: 75 6c 74 43 6f 6c 2c 20 0a 20 20 20 20 20 20 20  ultCol, .       
8310: 20 20 20 20 20 72 31 2c 20 70 44 65 73 74 2d 3e       r1, pDest->
8320: 7a 41 66 66 53 64 73 74 2c 20 6e 52 65 73 75 6c  zAffSdst, nResul
8330: 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  tCol);.        s
8340: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
8350: 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
8360: 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c  arse, regResult,
8370: 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20   nResultCol);.  
8380: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8390: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
83a0: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72  _IdxInsert, iPar
83b0: 6d 2c 20 72 31 2c 20 72 65 67 52 65 73 75 6c 74  m, r1, regResult
83c0: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20  , nResultCol);. 
83d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
83e0: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
83f0: 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
8400: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
8410: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
8420: 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20 69 6e  any row exist in
8430: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c   the result set,
8440: 20 72 65 63 6f 72 64 20 74 68 61 74 20 66 61 63   record that fac
8450: 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20  t and abort..   
8460: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
8470: 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20 20 20  _Exists: {.     
8480: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8490: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
84a0: 2c 20 31 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20  , 1, iParm);.   
84b0: 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20     /* The LIMIT 
84c0: 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d  clause will term
84d0: 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66  inate the loop f
84e0: 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62  or us */.      b
84f0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
8500: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
8510: 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74   scalar select t
8520: 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61  hat is part of a
8530: 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68  n expression, th
8540: 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20  en.    ** store 
8550: 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74  the results in t
8560: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d  he appropriate m
8570: 65 6d 6f 72 79 20 63 65 6c 6c 20 6f 72 20 61 72  emory cell or ar
8580: 72 61 79 20 6f 66 20 0a 20 20 20 20 2a 2a 20 6d  ray of .    ** m
8590: 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 6e 64 20  emory cells and 
85a0: 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65  break out of the
85b0: 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20   scan loop..    
85c0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
85d0: 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  Mem: {.      if(
85e0: 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20   pSort ){.      
85f0: 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 75 6c    assert( nResul
8600: 74 43 6f 6c 3c 3d 70 44 65 73 74 2d 3e 6e 53 64  tCol<=pDest->nSd
8610: 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70 75  st );.        pu
8620: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20  shOntoSorter(.  
8630: 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
8640: 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52  , pSort, p, regR
8650: 65 73 75 6c 74 2c 20 72 65 67 4f 72 69 67 2c 20  esult, regOrig, 
8660: 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 6e 50 72 65  nResultCol, nPre
8670: 66 69 78 52 65 67 29 3b 0a 20 20 20 20 20 20 7d  fixReg);.      }
8680: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
8690: 73 65 72 74 28 20 6e 52 65 73 75 6c 74 43 6f 6c  sert( nResultCol
86a0: 3d 3d 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 29  ==pDest->nSdst )
86b0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
86c0: 28 20 72 65 67 52 65 73 75 6c 74 3d 3d 69 50 61  ( regResult==iPa
86d0: 72 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a  rm );.        /*
86e0: 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73   The LIMIT claus
86f0: 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20  e will jump out 
8700: 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20  of the loop for 
8710: 75 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  us */.      }.  
8720: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
8730: 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64  .#endif /* #ifnd
8740: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
8750: 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20  UBQUERY */..    
8760: 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75 74 69  case SRT_Corouti
8770: 6e 65 3a 20 20 20 20 20 20 20 2f 2a 20 53 65 6e  ne:       /* Sen
8780: 64 20 64 61 74 61 20 74 6f 20 61 20 63 6f 2d 72  d data to a co-r
8790: 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 63 61  outine */.    ca
87a0: 73 65 20 53 52 54 5f 4f 75 74 70 75 74 3a 20 7b  se SRT_Output: {
87b0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
87c0: 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f  n the results */
87d0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
87e0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f   eDest==SRT_Coro
87f0: 75 74 69 6e 65 20 29 3b 0a 20 20 20 20 20 20 74  utine );.      t
8800: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
8810: 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20  SRT_Output );.  
8820: 20 20 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b      if( pSort ){
8830: 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74  .        pushOnt
8840: 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20  oSorter(pParse, 
8850: 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52 65 73  pSort, p, regRes
8860: 75 6c 74 2c 20 72 65 67 4f 72 69 67 2c 20 6e 52  ult, regOrig, nR
8870: 65 73 75 6c 74 43 6f 6c 2c 0a 20 20 20 20 20 20  esultCol,.      
8880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8890: 20 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20   nPrefixReg);.  
88a0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44      }else if( eD
88b0: 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69  est==SRT_Corouti
88c0: 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ne ){.        sq
88d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
88e0: 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65  v, OP_Yield, pDe
88f0: 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20  st->iSDParm);.  
8900: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8910: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8920: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(v, OP_Resul
8930: 74 52 6f 77 2c 20 72 65 67 52 65 73 75 6c 74 2c  tRow, regResult,
8940: 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20   nResultCol);.  
8950: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
8960: 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
8970: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67  ange(pParse, reg
8980: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
8990: 6f 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ol);.      }.   
89a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
89b0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
89c0: 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20 2f 2a 20  OMIT_CTE.    /* 
89d0: 57 72 69 74 65 20 74 68 65 20 72 65 73 75 6c 74  Write the result
89e0: 73 20 69 6e 74 6f 20 61 20 70 72 69 6f 72 69 74  s into a priorit
89f0: 79 20 71 75 65 75 65 20 74 68 61 74 20 69 73 20  y queue that is 
8a00: 6f 72 64 65 72 20 61 63 63 6f 72 64 69 6e 67 20  order according 
8a10: 74 6f 0a 20 20 20 20 2a 2a 20 70 44 65 73 74 2d  to.    ** pDest-
8a20: 3e 70 4f 72 64 65 72 42 79 20 28 69 6e 20 70 53  >pOrderBy (in pS
8a30: 4f 29 2e 20 20 70 44 65 73 74 2d 3e 69 53 44 50  O).  pDest->iSDP
8a40: 61 72 6d 20 28 69 6e 20 69 50 61 72 6d 29 20 69  arm (in iParm) i
8a50: 73 20 74 68 65 20 63 75 72 73 6f 72 20 66 6f 72  s the cursor for
8a60: 20 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78   an.    ** index
8a70: 20 77 69 74 68 20 70 53 4f 2d 3e 6e 45 78 70 72   with pSO->nExpr
8a80: 2b 32 20 63 6f 6c 75 6d 6e 73 2e 20 20 42 75 69  +2 columns.  Bui
8a90: 6c 64 20 61 20 6b 65 79 20 75 73 69 6e 67 20 70  ld a key using p
8aa0: 53 4f 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  SO for the first
8ab0: 0a 20 20 20 20 2a 2a 20 70 53 4f 2d 3e 6e 45 78  .    ** pSO->nEx
8ac0: 70 72 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e  pr columns, then
8ad0: 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 6b   make sure all k
8ae0: 65 79 73 20 61 72 65 20 75 6e 69 71 75 65 20 62  eys are unique b
8af0: 79 20 61 64 64 69 6e 67 20 61 0a 20 20 20 20 2a  y adding a.    *
8b00: 2a 20 66 69 6e 61 6c 20 4f 50 5f 53 65 71 75 65  * final OP_Seque
8b10: 6e 63 65 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65  nce column.  The
8b20: 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20   last column is 
8b30: 74 68 65 20 72 65 63 6f 72 64 20 61 73 20 61 20  the record as a 
8b40: 62 6c 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  blob..    */.   
8b50: 20 63 61 73 65 20 53 52 54 5f 44 69 73 74 51 75   case SRT_DistQu
8b60: 65 75 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52  eue:.    case SR
8b70: 54 5f 51 75 65 75 65 3a 20 7b 0a 20 20 20 20 20  T_Queue: {.     
8b80: 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 20 20 20   int nKey;.     
8b90: 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 3b   int r1, r2, r3;
8ba0: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54  .      int addrT
8bb0: 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 45  est = 0;.      E
8bc0: 78 70 72 4c 69 73 74 20 2a 70 53 4f 3b 0a 20 20  xprList *pSO;.  
8bd0: 20 20 20 20 70 53 4f 20 3d 20 70 44 65 73 74 2d      pSO = pDest-
8be0: 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20  >pOrderBy;.     
8bf0: 20 61 73 73 65 72 74 28 20 70 53 4f 20 29 3b 0a   assert( pSO );.
8c00: 20 20 20 20 20 20 6e 4b 65 79 20 3d 20 70 53 4f        nKey = pSO
8c10: 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 72  ->nExpr;.      r
8c20: 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
8c30: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
8c40: 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
8c50: 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
8c60: 61 72 73 65 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20  arse, nKey+2);. 
8c70: 20 20 20 20 20 72 33 20 3d 20 72 32 2b 6e 4b 65       r3 = r2+nKe
8c80: 79 2b 31 3b 0a 20 20 20 20 20 20 69 66 28 20 65  y+1;.      if( e
8c90: 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 51 75  Dest==SRT_DistQu
8ca0: 65 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  eue ){.        /
8cb0: 2a 20 49 66 20 74 68 65 20 64 65 73 74 69 6e 61  * If the destina
8cc0: 74 69 6f 6e 20 69 73 20 44 69 73 74 51 75 65 75  tion is DistQueu
8cd0: 65 2c 20 74 68 65 6e 20 63 75 72 73 6f 72 20 28  e, then cursor (
8ce0: 69 50 61 72 6d 2b 31 29 20 69 73 20 6f 70 65 6e  iParm+1) is open
8cf0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 61  .        ** on a
8d00: 20 73 65 63 6f 6e 64 20 65 70 68 65 6d 65 72 61   second ephemera
8d10: 6c 20 69 6e 64 65 78 20 74 68 61 74 20 68 6f 6c  l index that hol
8d20: 64 73 20 61 6c 6c 20 76 61 6c 75 65 73 20 65 76  ds all values ev
8d30: 65 72 79 20 70 72 65 76 69 6f 75 73 6c 79 0a 20  ery previously. 
8d40: 20 20 20 20 20 20 20 2a 2a 20 61 64 64 65 64 20         ** added 
8d50: 74 6f 20 74 68 65 20 71 75 65 75 65 2e 20 2a 2f  to the queue. */
8d60: 0a 20 20 20 20 20 20 20 20 61 64 64 72 54 65 73  .        addrTes
8d70: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  t = sqlite3VdbeA
8d80: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46  ddOp4Int(v, OP_F
8d90: 6f 75 6e 64 2c 20 69 50 61 72 6d 2b 31 2c 20 30  ound, iParm+1, 0
8da0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
8db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8dc0: 20 20 20 20 20 20 20 20 20 20 20 72 65 67 52 65             regRe
8dd0: 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  sult, nResultCol
8de0: 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
8df0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
8e00: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
8e10: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
8e20: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
8e30: 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74  gResult, nResult
8e40: 43 6f 6c 2c 20 72 33 29 3b 0a 20 20 20 20 20 20  Col, r3);.      
8e50: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44  if( eDest==SRT_D
8e60: 69 73 74 51 75 65 75 65 20 29 7b 0a 20 20 20 20  istQueue ){.    
8e70: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8e80: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
8e90: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2b 31 2c 20  nsert, iParm+1, 
8ea0: 72 33 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  r3);.        sql
8eb0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
8ec0: 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45  (v, OPFLAG_USESE
8ed0: 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 20 20 20  EKRESULT);.     
8ee0: 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30   }.      for(i=0
8ef0: 3b 20 69 3c 6e 4b 65 79 3b 20 69 2b 2b 29 7b 0a  ; i<nKey; i++){.
8f00: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
8f10: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
8f20: 53 43 6f 70 79 2c 0a 20 20 20 20 20 20 20 20 20  SCopy,.         
8f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f40: 20 72 65 67 52 65 73 75 6c 74 20 2b 20 70 53 4f   regResult + pSO
8f50: 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65  ->a[i].u.x.iOrde
8f60: 72 42 79 43 6f 6c 20 2d 20 31 2c 0a 20 20 20 20  rByCol - 1,.    
8f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f80: 20 20 20 20 20 20 72 32 2b 69 29 3b 0a 20 20 20        r2+i);.   
8f90: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
8fa0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
8fb0: 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 69 50 61  OP_Sequence, iPa
8fc0: 72 6d 2c 20 72 32 2b 6e 4b 65 79 29 3b 0a 20 20  rm, r2+nKey);.  
8fd0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8fe0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
8ff0: 52 65 63 6f 72 64 2c 20 72 32 2c 20 6e 4b 65 79  Record, r2, nKey
9000: 2b 32 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  +2, r1);.      s
9010: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
9020: 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Int(v, OP_IdxIns
9030: 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20  ert, iParm, r1, 
9040: 72 32 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20 20 20  r2, nKey+2);.   
9050: 20 20 20 69 66 28 20 61 64 64 72 54 65 73 74 20     if( addrTest 
9060: 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d  ) sqlite3VdbeJum
9070: 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 65 73  pHere(v, addrTes
9080: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
9090: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
90a0: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
90b0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
90c0: 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
90d0: 65 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 29 3b 0a  e, r2, nKey+2);.
90e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
90f0: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
9100: 49 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a  ITE_OMIT_CTE */.
9110: 0a 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  ...#if !defined(
9120: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
9130: 47 45 52 29 0a 20 20 20 20 2f 2a 20 44 69 73 63  GER).    /* Disc
9140: 61 72 64 20 74 68 65 20 72 65 73 75 6c 74 73 2e  ard the results.
9150: 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66    This is used f
9160: 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  or SELECT statem
9170: 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20 20 20  ents inside.    
9180: 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61  ** the body of a
9190: 20 54 52 49 47 47 45 52 2e 20 20 54 68 65 20 70   TRIGGER.  The p
91a0: 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68 20 73  urpose of such s
91b0: 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63 61 6c  elects is to cal
91c0: 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d 64 65  l.    ** user-de
91d0: 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20  fined functions 
91e0: 74 68 61 74 20 68 61 76 65 20 73 69 64 65 20 65  that have side e
91f0: 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f 20 6e  ffects.  We do n
9200: 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 61  ot care.    ** a
9210: 62 6f 75 74 20 74 68 65 20 61 63 74 75 61 6c 20  bout the actual 
9220: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73  results of the s
9230: 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  elect..    */.  
9240: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
9250: 20 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74     assert( eDest
9260: 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20 29 3b  ==SRT_Discard );
9270: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
9280: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a    }.#endif.  }..
9290: 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65    /* Jump to the
92a0: 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70   end of the loop
92b0: 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73   if the LIMIT is
92c0: 20 72 65 61 63 68 65 64 2e 20 20 45 78 63 65 70   reached.  Excep
92d0: 74 2c 20 69 66 0a 20 20 2a 2a 20 74 68 65 72 65  t, if.  ** there
92e0: 20 69 73 20 61 20 73 6f 72 74 65 72 2c 20 69 6e   is a sorter, in
92f0: 20 77 68 69 63 68 20 63 61 73 65 20 74 68 65 20   which case the 
9300: 73 6f 72 74 65 72 20 68 61 73 20 61 6c 72 65 61  sorter has alrea
9310: 64 79 20 6c 69 6d 69 74 65 64 0a 20 20 2a 2a 20  dy limited.  ** 
9320: 74 68 65 20 6f 75 74 70 75 74 20 66 6f 72 20 75  the output for u
9330: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  s..  */.  if( pS
9340: 6f 72 74 3d 3d 30 20 26 26 20 70 2d 3e 69 4c 69  ort==0 && p->iLi
9350: 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  mit ){.    sqlit
9360: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
9370: 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c  OP_DecrJumpZero,
9380: 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65   p->iLimit, iBre
9390: 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ak); VdbeCoverag
93a0: 65 28 76 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  e(v);.  }.}../*.
93b0: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 4b 65  ** Allocate a Ke
93c0: 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 73 75 66  yInfo object suf
93d0: 66 69 63 69 65 6e 74 20 66 6f 72 20 61 6e 20 69  ficient for an i
93e0: 6e 64 65 78 20 6f 66 20 4e 20 6b 65 79 20 63 6f  ndex of N key co
93f0: 6c 75 6d 6e 73 20 61 6e 64 0a 2a 2a 20 58 20 65  lumns and.** X e
9400: 78 74 72 61 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f  xtra columns..*/
9410: 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65  .KeyInfo *sqlite
9420: 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 73 71  3KeyInfoAlloc(sq
9430: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e  lite3 *db, int N
9440: 2c 20 69 6e 74 20 58 29 7b 0a 20 20 69 6e 74 20  , int X){.  int 
9450: 6e 45 78 74 72 61 20 3d 20 28 4e 2b 58 29 2a 28  nExtra = (N+X)*(
9460: 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29  sizeof(CollSeq*)
9470: 2b 31 29 20 2d 20 73 69 7a 65 6f 66 28 43 6f 6c  +1) - sizeof(Col
9480: 6c 53 65 71 2a 29 3b 0a 20 20 4b 65 79 49 6e 66  lSeq*);.  KeyInf
9490: 6f 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 44 62  o *p = sqlite3Db
94a0: 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20  MallocRawNN(db, 
94b0: 73 69 7a 65 6f 66 28 4b 65 79 49 6e 66 6f 29 20  sizeof(KeyInfo) 
94c0: 2b 20 6e 45 78 74 72 61 29 3b 0a 20 20 69 66 28  + nExtra);.  if(
94d0: 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61 53 6f   p ){.    p->aSo
94e0: 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26  rtOrder = (u8*)&
94f0: 70 2d 3e 61 43 6f 6c 6c 5b 4e 2b 58 5d 3b 0a 20  p->aColl[N+X];. 
9500: 20 20 20 70 2d 3e 6e 4b 65 79 46 69 65 6c 64 20     p->nKeyField 
9510: 3d 20 28 75 31 36 29 4e 3b 0a 20 20 20 20 70 2d  = (u16)N;.    p-
9520: 3e 6e 41 6c 6c 46 69 65 6c 64 20 3d 20 28 75 31  >nAllField = (u1
9530: 36 29 28 4e 2b 58 29 3b 0a 20 20 20 20 70 2d 3e  6)(N+X);.    p->
9540: 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20  enc = ENC(db);. 
9550: 20 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20     p->db = db;. 
9560: 20 20 20 70 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a     p->nRef = 1;.
9570: 20 20 20 20 6d 65 6d 73 65 74 28 26 70 5b 31 5d      memset(&p[1]
9580: 2c 20 30 2c 20 6e 45 78 74 72 61 29 3b 0a 20 20  , 0, nExtra);.  
9590: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
95a0: 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a  e3OomFault(db);.
95b0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
95c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63  }../*.** Dealloc
95d0: 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62  ate a KeyInfo ob
95e0: 6a 65 63 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ject.*/.void sql
95f0: 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66  ite3KeyInfoUnref
9600: 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 0a 20 20  (KeyInfo *p){.  
9610: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 61 73 73  if( p ){.    ass
9620: 65 72 74 28 20 70 2d 3e 6e 52 65 66 3e 30 20 29  ert( p->nRef>0 )
9630: 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2d 2d 3b  ;.    p->nRef--;
9640: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 52 65 66  .    if( p->nRef
9650: 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 44 62 46  ==0 ) sqlite3DbF
9660: 72 65 65 4e 4e 28 70 2d 3e 64 62 2c 20 70 29 3b  reeNN(p->db, p);
9670: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  .  }.}../*.** Ma
9680: 6b 65 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72  ke a new pointer
9690: 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62   to a KeyInfo ob
96a0: 6a 65 63 74 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20  ject.*/.KeyInfo 
96b0: 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52  *sqlite3KeyInfoR
96c0: 65 66 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 0a  ef(KeyInfo *p){.
96d0: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 61    if( p ){.    a
96e0: 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3e 30  ssert( p->nRef>0
96f0: 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2b   );.    p->nRef+
9700: 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  +;.  }.  return 
9710: 70 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  p;.}..#ifdef SQL
9720: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
9730: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 61  Return TRUE if a
9740: 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20   KeyInfo object 
9750: 63 61 6e 20 62 65 20 63 68 61 6e 67 65 2e 20 20  can be change.  
9760: 54 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65  The KeyInfo obje
9770: 63 74 0a 2a 2a 20 63 61 6e 20 6f 6e 6c 79 20 62  ct.** can only b
9780: 65 20 63 68 61 6e 67 65 64 20 69 66 20 74 68 69  e changed if thi
9790: 73 20 69 73 20 6a 75 73 74 20 61 20 73 69 6e 67  s is just a sing
97a0: 6c 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  le reference to 
97b0: 74 68 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a  the object..**.*
97c0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
97d0: 73 20 75 73 65 64 20 6f 6e 6c 79 20 69 6e 73 69  s used only insi
97e0: 64 65 20 6f 66 20 61 73 73 65 72 74 28 29 20 73  de of assert() s
97f0: 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e  tatements..*/.in
9800: 74 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  t sqlite3KeyInfo
9810: 49 73 57 72 69 74 65 61 62 6c 65 28 4b 65 79 49  IsWriteable(KeyI
9820: 6e 66 6f 20 2a 70 29 7b 20 72 65 74 75 72 6e 20  nfo *p){ return 
9830: 70 2d 3e 6e 52 65 66 3d 3d 31 3b 20 7d 0a 23 65  p->nRef==1; }.#e
9840: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44  ndif /* SQLITE_D
9850: 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47  EBUG */../*.** G
9860: 69 76 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69  iven an expressi
9870: 6f 6e 20 6c 69 73 74 2c 20 67 65 6e 65 72 61 74  on list, generat
9880: 65 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  e a KeyInfo stru
9890: 63 74 75 72 65 20 74 68 61 74 20 72 65 63 6f 72  cture that recor
98a0: 64 73 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c 61 74  ds.** the collat
98b0: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
98c0: 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e   each expression
98d0: 20 69 6e 20 74 68 61 74 20 65 78 70 72 65 73 73   in that express
98e0: 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ion list..**.** 
98f0: 49 66 20 74 68 65 20 45 78 70 72 4c 69 73 74 20  If the ExprList 
9900: 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f  is an ORDER BY o
9910: 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  r GROUP BY claus
9920: 65 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  e then the resul
9930: 74 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e 66 6f 20  ting.** KeyInfo 
9940: 73 74 72 75 63 74 75 72 65 20 69 73 20 61 70 70  structure is app
9950: 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e 69  ropriate for ini
9960: 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69 72 74  tializing a virt
9970: 75 61 6c 20 69 6e 64 65 78 20 74 6f 0a 2a 2a 20  ual index to.** 
9980: 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61 74 20 63  implement that c
9990: 6c 61 75 73 65 2e 20 20 49 66 20 74 68 65 20 45  lause.  If the E
99a0: 78 70 72 4c 69 73 74 20 69 73 20 74 68 65 20 72  xprList is the r
99b0: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20 53  esult set of a S
99c0: 45 4c 45 43 54 0a 2a 2a 20 74 68 65 6e 20 74 68  ELECT.** then th
99d0: 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  e KeyInfo struct
99e0: 75 72 65 20 69 73 20 61 70 70 72 6f 70 72 69 61  ure is appropria
99f0: 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a  te for initializ
9a00: 69 6e 67 20 61 20 76 69 72 74 75 61 6c 0a 2a 2a  ing a virtual.**
9a10: 20 69 6e 64 65 78 20 74 6f 20 69 6d 70 6c 65 6d   index to implem
9a20: 65 6e 74 20 61 20 44 49 53 54 49 4e 43 54 20 74  ent a DISTINCT t
9a30: 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65  est..**.** Space
9a40: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b 65 79   to hold the Key
9a50: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  Info structure i
9a60: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
9a70: 6d 61 6c 6c 6f 63 2e 20 20 54 68 65 20 63 61 6c  malloc.  The cal
9a80: 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ling.** function
9a90: 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
9aa0: 66 6f 72 20 73 65 65 69 6e 67 20 74 68 61 74 20  for seeing that 
9ab0: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69  this structure i
9ac0: 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20  s eventually.** 
9ad0: 66 72 65 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  freed..*/.static
9ae0: 20 4b 65 79 49 6e 66 6f 20 2a 6b 65 79 49 6e 66   KeyInfo *keyInf
9af0: 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20  oFromExprList(. 
9b00: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
9b10: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
9b20: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
9b30: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
9b40: 20 20 20 2f 2a 20 46 6f 72 6d 20 74 68 65 20 4b     /* Form the K
9b50: 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 66 72  eyInfo object fr
9b60: 6f 6d 20 74 68 69 73 20 45 78 70 72 4c 69 73 74  om this ExprList
9b70: 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 74   */.  int iStart
9b80: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65  ,          /* Be
9b90: 67 69 6e 20 77 69 74 68 20 74 68 69 73 20 63 6f  gin with this co
9ba0: 6c 75 6d 6e 20 6f 66 20 70 4c 69 73 74 20 2a 2f  lumn of pList */
9bb0: 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20 20 20  .  int nExtra   
9bc0: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74          /* Add t
9bd0: 68 69 73 20 6d 61 6e 79 20 65 78 74 72 61 20 63  his many extra c
9be0: 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20 65 6e  olumns to the en
9bf0: 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45  d */.){.  int nE
9c00: 78 70 72 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  xpr;.  KeyInfo *
9c10: 70 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20  pInfo;.  struct 
9c20: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
9c30: 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20  Item;.  sqlite3 
9c40: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
9c50: 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 6e 45  ;.  int i;..  nE
9c60: 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  xpr = pList->nEx
9c70: 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d 20 73 71  pr;.  pInfo = sq
9c80: 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f  lite3KeyInfoAllo
9c90: 63 28 64 62 2c 20 6e 45 78 70 72 2d 69 53 74 61  c(db, nExpr-iSta
9ca0: 72 74 2c 20 6e 45 78 74 72 61 2b 31 29 3b 0a 20  rt, nExtra+1);. 
9cb0: 20 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20   if( pInfo ){.  
9cc0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
9cd0: 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61  3KeyInfoIsWritea
9ce0: 62 6c 65 28 70 49 6e 66 6f 29 20 29 3b 0a 20 20  ble(pInfo) );.  
9cf0: 20 20 66 6f 72 28 69 3d 69 53 74 61 72 74 2c 20    for(i=iStart, 
9d00: 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2b 69  pItem=pList->a+i
9d10: 53 74 61 72 74 3b 20 69 3c 6e 45 78 70 72 3b 20  Start; i<nExpr; 
9d20: 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
9d30: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
9d40: 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c  oll;.      pColl
9d50: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
9d60: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 49  llSeq(pParse, pI
9d70: 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  tem->pExpr);.   
9d80: 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20     if( !pColl ) 
9d90: 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c  pColl = db->pDfl
9da0: 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 49 6e  tColl;.      pIn
9db0: 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 2d 69 53 74 61  fo->aColl[i-iSta
9dc0: 72 74 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20  rt] = pColl;.   
9dd0: 20 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f     pInfo->aSortO
9de0: 72 64 65 72 5b 69 2d 69 53 74 61 72 74 5d 20 3d  rder[i-iStart] =
9df0: 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65   pItem->sortOrde
9e00: 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  r;.    }.  }.  r
9e10: 65 74 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a  eturn pInfo;.}..
9e20: 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20 74 68  /*.** Name of th
9e30: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65  e connection ope
9e40: 72 61 74 6f 72 2c 20 75 73 65 64 20 66 6f 72 20  rator, used for 
9e50: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a  error messages..
9e60: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
9e70: 63 68 61 72 20 2a 73 65 6c 65 63 74 4f 70 4e 61  char *selectOpNa
9e80: 6d 65 28 69 6e 74 20 69 64 29 7b 0a 20 20 63 68  me(int id){.  ch
9e90: 61 72 20 2a 7a 3b 0a 20 20 73 77 69 74 63 68 28  ar *z;.  switch(
9ea0: 20 69 64 20 29 7b 0a 20 20 20 20 63 61 73 65 20   id ){.    case 
9eb0: 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 20 20 7a 20  TK_ALL:       z 
9ec0: 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20  = "UNION ALL";  
9ed0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
9ee0: 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20 7a   TK_INTERSECT: z
9ef0: 20 3d 20 22 49 4e 54 45 52 53 45 43 54 22 3b 20   = "INTERSECT"; 
9f00: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
9f10: 65 20 54 4b 5f 45 58 43 45 50 54 3a 20 20 20 20  e TK_EXCEPT:    
9f20: 7a 20 3d 20 22 45 58 43 45 50 54 22 3b 20 20 20  z = "EXCEPT";   
9f30: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65     break;.    de
9f40: 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20 20 20  fault:          
9f50: 20 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b 20 20 20   z = "UNION";   
9f60: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20      break;.  }. 
9f70: 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 23 69   return z;.}..#i
9f80: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
9f90: 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20  T_EXPLAIN./*.** 
9fa0: 55 6e 6c 65 73 73 20 61 6e 20 22 45 58 50 4c 41  Unless an "EXPLA
9fb0: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 22 20 63  IN QUERY PLAN" c
9fc0: 6f 6d 6d 61 6e 64 20 69 73 20 62 65 69 6e 67 20  ommand is being 
9fd0: 70 72 6f 63 65 73 73 65 64 2c 20 74 68 69 73 20  processed, this 
9fe0: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61  function.** is a
9ff0: 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73   no-op. Otherwis
a000: 65 2c 20 69 74 20 61 64 64 73 20 61 20 73 69 6e  e, it adds a sin
a010: 67 6c 65 20 72 6f 77 20 6f 66 20 6f 75 74 70 75  gle row of outpu
a020: 74 20 74 6f 20 74 68 65 20 45 51 50 20 72 65 73  t to the EQP res
a030: 75 6c 74 2c 0a 2a 2a 20 77 68 65 72 65 20 74 68  ult,.** where th
a040: 65 20 63 61 70 74 69 6f 6e 20 69 73 20 6f 66 20  e caption is of 
a050: 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  the form:.**.** 
a060: 20 20 22 55 53 45 20 54 45 4d 50 20 42 2d 54 52    "USE TEMP B-TR
a070: 45 45 20 46 4f 52 20 78 78 78 22 0a 2a 2a 0a 2a  EE FOR xxx".**.*
a080: 2a 20 77 68 65 72 65 20 78 78 78 20 69 73 20 6f  * where xxx is o
a090: 6e 65 20 6f 66 20 22 44 49 53 54 49 4e 43 54 22  ne of "DISTINCT"
a0a0: 2c 20 22 4f 52 44 45 52 20 42 59 22 20 6f 72 20  , "ORDER BY" or 
a0b0: 22 47 52 4f 55 50 20 42 59 22 2e 20 45 78 61 63  "GROUP BY". Exac
a0c0: 74 6c 79 20 77 68 69 63 68 0a 2a 2a 20 69 73 20  tly which.** is 
a0d0: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
a0e0: 65 20 7a 55 73 61 67 65 20 61 72 67 75 6d 65 6e  e zUsage argumen
a0f0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
a100: 64 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62  d explainTempTab
a110: 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
a120: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55  , const char *zU
a130: 73 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61  sage){.  if( pPa
a140: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20  rse->explain==2 
a150: 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d  ){.    Vdbe *v =
a160: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
a170: 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d      char *zMsg =
a180: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
a190: 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 55 53 45  pParse->db, "USE
a1a0: 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f 52   TEMP B-TREE FOR
a1b0: 20 25 73 22 2c 20 7a 55 73 61 67 65 29 3b 0a 20   %s", zUsage);. 
a1c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a1d0: 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61  dOp4(v, OP_Expla
a1e0: 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  in, pParse->iSel
a1f0: 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73  ectId, 0, 0, zMs
a200: 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a  g, P4_DYNAMIC);.
a210: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73    }.}../*.** Ass
a220: 69 67 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 62  ign expression b
a230: 20 74 6f 20 6c 76 61 6c 75 65 20 61 2e 20 41 20   to lvalue a. A 
a240: 73 65 63 6f 6e 64 2c 20 6e 6f 2d 6f 70 2c 20 76  second, no-op, v
a250: 65 72 73 69 6f 6e 20 6f 66 20 74 68 69 73 20 6d  ersion of this m
a260: 61 63 72 6f 0a 2a 2a 20 69 73 20 70 72 6f 76 69  acro.** is provi
a270: 64 65 64 20 77 68 65 6e 20 53 51 4c 49 54 45 5f  ded when SQLITE_
a280: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69 73 20  OMIT_EXPLAIN is 
a290: 64 65 66 69 6e 65 64 2e 20 54 68 69 73 20 61 6c  defined. This al
a2a0: 6c 6f 77 73 20 74 68 65 20 63 6f 64 65 0a 2a 2a  lows the code.**
a2b0: 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63   in sqlite3Selec
a2c0: 74 28 29 20 74 6f 20 61 73 73 69 67 6e 20 76 61  t() to assign va
a2d0: 6c 75 65 73 20 74 6f 20 73 74 72 75 63 74 75 72  lues to structur
a2e0: 65 20 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c  e member variabl
a2f0: 65 73 20 74 68 61 74 0a 2a 2a 20 6f 6e 6c 79 20  es that.** only 
a300: 65 78 69 73 74 20 69 66 20 53 51 4c 49 54 45 5f  exist if SQLITE_
a310: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69 73 20  OMIT_EXPLAIN is 
a320: 6e 6f 74 20 64 65 66 69 6e 65 64 20 77 69 74 68  not defined with
a330: 6f 75 74 20 70 6f 6c 6c 75 74 69 6e 67 20 74 68  out polluting th
a340: 65 0a 2a 2a 20 63 6f 64 65 20 77 69 74 68 20 23  e.** code with #
a350: 69 66 6e 64 65 66 20 64 69 72 65 63 74 69 76 65  ifndef directive
a360: 73 2e 0a 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65  s..*/.# define e
a370: 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
a380: 28 61 2c 20 62 29 20 61 20 3d 20 62 0a 0a 23 65  (a, b) a = b..#e
a390: 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72  lse./* No-op ver
a3a0: 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 65 78 70  sions of the exp
a3b0: 6c 61 69 6e 58 58 58 28 29 20 66 75 6e 63 74 69  lainXXX() functi
a3c0: 6f 6e 73 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20  ons and macros. 
a3d0: 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c  */.# define expl
a3e0: 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 79 2c 7a  ainTempTable(y,z
a3f0: 29 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61  ).# define expla
a400: 69 6e 53 65 74 49 6e 74 65 67 65 72 28 79 2c 7a  inSetInteger(y,z
a410: 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64  ).#endif..#if !d
a420: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
a430: 49 54 5f 45 58 50 4c 41 49 4e 29 20 26 26 20 21  IT_EXPLAIN) && !
a440: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
a450: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
a460: 45 43 54 29 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73  ECT)./*.** Unles
a470: 73 20 61 6e 20 22 45 58 50 4c 41 49 4e 20 51 55  s an "EXPLAIN QU
a480: 45 52 59 20 50 4c 41 4e 22 20 63 6f 6d 6d 61 6e  ERY PLAN" comman
a490: 64 20 69 73 20 62 65 69 6e 67 20 70 72 6f 63 65  d is being proce
a4a0: 73 73 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74  ssed, this funct
a4b0: 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f  ion.** is a no-o
a4c0: 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  p. Otherwise, it
a4d0: 20 61 64 64 73 20 61 20 73 69 6e 67 6c 65 20 72   adds a single r
a4e0: 6f 77 20 6f 66 20 6f 75 74 70 75 74 20 74 6f 20  ow of output to 
a4f0: 74 68 65 20 45 51 50 20 72 65 73 75 6c 74 2c 0a  the EQP result,.
a500: 2a 2a 20 77 68 65 72 65 20 74 68 65 20 63 61 70  ** where the cap
a510: 74 69 6f 6e 20 69 73 20 6f 66 20 6f 6e 65 20 6f  tion is of one o
a520: 66 20 74 68 65 20 74 77 6f 20 66 6f 72 6d 73 3a  f the two forms:
a530: 0a 2a 2a 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f 53  .**.**   "COMPOS
a540: 49 54 45 20 53 55 42 51 55 45 52 49 45 53 20 69  ITE SUBQUERIES i
a550: 53 75 62 31 20 61 6e 64 20 69 53 75 62 32 20 28  Sub1 and iSub2 (
a560: 6f 70 29 22 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f  op)".**   "COMPO
a570: 53 49 54 45 20 53 55 42 51 55 45 52 49 45 53 20  SITE SUBQUERIES 
a580: 69 53 75 62 31 20 61 6e 64 20 69 53 75 62 32 20  iSub1 and iSub2 
a590: 55 53 49 4e 47 20 54 45 4d 50 20 42 2d 54 52 45  USING TEMP B-TRE
a5a0: 45 20 28 6f 70 29 22 0a 2a 2a 0a 2a 2a 20 77 68  E (op)".**.** wh
a5b0: 65 72 65 20 69 53 75 62 31 20 61 6e 64 20 69 53  ere iSub1 and iS
a5c0: 75 62 32 20 61 72 65 20 74 68 65 20 69 6e 74 65  ub2 are the inte
a5d0: 67 65 72 73 20 70 61 73 73 65 64 20 61 73 20 74  gers passed as t
a5e0: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
a5f0: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 70 61 72  .** function par
a600: 61 6d 65 74 65 72 73 2c 20 61 6e 64 20 6f 70 20  ameters, and op 
a610: 69 73 20 74 68 65 20 74 65 78 74 20 72 65 70 72  is the text repr
a620: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
a630: 65 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f  e parameter.** o
a640: 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e  f the same name.
a650: 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 22   The parameter "
a660: 6f 70 22 20 6d 75 73 74 20 62 65 20 6f 6e 65 20  op" must be one 
a670: 6f 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f  of TK_UNION, TK_
a680: 45 58 43 45 50 54 2c 0a 2a 2a 20 54 4b 5f 49 4e  EXCEPT,.** TK_IN
a690: 54 45 52 53 45 43 54 20 6f 72 20 54 4b 5f 41 4c  TERSECT or TK_AL
a6a0: 4c 2e 20 54 68 65 20 66 69 72 73 74 20 66 6f 72  L. The first for
a6b0: 6d 20 69 73 20 75 73 65 64 20 69 66 20 61 72 67  m is used if arg
a6c0: 75 6d 65 6e 74 20 62 55 73 65 54 6d 70 20 69 73  ument bUseTmp is
a6d0: 20 0a 2a 2a 20 66 61 6c 73 65 2c 20 6f 72 20 74   .** false, or t
a6e0: 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69  he second form i
a6f0: 66 20 69 74 20 69 73 20 74 72 75 65 2e 0a 2a 2f  f it is true..*/
a700: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
a710: 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 0a 20  lainComposite(. 
a720: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
a730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a740: 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78   /* Parse contex
a750: 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20  t */.  int op,  
a760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a770: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
a780: 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58   TK_UNION, TK_EX
a790: 43 45 50 54 20 65 74 63 2e 20 2a 2f 0a 20 20 69  CEPT etc. */.  i
a7a0: 6e 74 20 69 53 75 62 31 2c 20 20 20 20 20 20 20  nt iSub1,       
a7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a7c0: 2a 20 53 75 62 71 75 65 72 79 20 69 64 20 31 20  * Subquery id 1 
a7d0: 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 2c 20  */.  int iSub2, 
a7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7f0: 20 20 20 20 20 2f 2a 20 53 75 62 71 75 65 72 79       /* Subquery
a800: 20 69 64 20 32 20 2a 2f 0a 20 20 69 6e 74 20 62   id 2 */.  int b
a810: 55 73 65 54 6d 70 20 20 20 20 20 20 20 20 20 20  UseTmp          
a820: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
a830: 75 65 20 69 66 20 61 20 74 65 6d 70 20 74 61 62  ue if a temp tab
a840: 6c 65 20 77 61 73 20 75 73 65 64 20 2a 2f 0a 29  le was used */.)
a850: 7b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d  {.  assert( op==
a860: 54 4b 5f 55 4e 49 4f 4e 20 7c 7c 20 6f 70 3d 3d  TK_UNION || op==
a870: 54 4b 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d  TK_EXCEPT || op=
a880: 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 7c 7c  =TK_INTERSECT ||
a890: 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 3b 0a 20   op==TK_ALL );. 
a8a0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
a8b0: 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 56  lain==2 ){.    V
a8c0: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
a8d0: 3e 70 56 64 62 65 3b 0a 20 20 20 20 63 68 61 72  >pVdbe;.    char
a8e0: 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33   *zMsg = sqlite3
a8f0: 4d 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  MPrintf(.       
a900: 20 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 43 4f   pParse->db, "CO
a910: 4d 50 4f 55 4e 44 20 53 55 42 51 55 45 52 49 45  MPOUND SUBQUERIE
a920: 53 20 25 64 20 41 4e 44 20 25 64 20 25 73 28 25  S %d AND %d %s(%
a930: 73 29 22 2c 20 69 53 75 62 31 2c 20 69 53 75 62  s)", iSub1, iSub
a940: 32 2c 0a 20 20 20 20 20 20 20 20 62 55 73 65 54  2,.        bUseT
a950: 6d 70 3f 22 55 53 49 4e 47 20 54 45 4d 50 20 42  mp?"USING TEMP B
a960: 2d 54 52 45 45 20 22 3a 22 22 2c 20 73 65 6c 65  -TREE ":"", sele
a970: 63 74 4f 70 4e 61 6d 65 28 6f 70 29 0a 20 20 20  ctOpName(op).   
a980: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
a990: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
a9a0: 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d  Explain, pParse-
a9b0: 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30  >iSelectId, 0, 0
a9c0: 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d  , zMsg, P4_DYNAM
a9d0: 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65  IC);.  }.}.#else
a9e0: 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72 73 69 6f  ./* No-op versio
a9f0: 6e 73 20 6f 66 20 74 68 65 20 65 78 70 6c 61 69  ns of the explai
aa00: 6e 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73  nXXX() functions
aa10: 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a   and macros. */.
aa20: 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e  # define explain
aa30: 43 6f 6d 70 6f 73 69 74 65 28 76 2c 77 2c 78 2c  Composite(v,w,x,
aa40: 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  y,z).#endif../*.
aa50: 2a 2a 20 49 66 20 74 68 65 20 69 6e 6e 65 72 20  ** If the inner 
aa60: 6c 6f 6f 70 20 77 61 73 20 67 65 6e 65 72 61 74  loop was generat
aa70: 65 64 20 75 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e  ed using a non-n
aa80: 75 6c 6c 20 70 4f 72 64 65 72 42 79 20 61 72 67  ull pOrderBy arg
aa90: 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20 74  ument,.** then t
aaa0: 68 65 20 72 65 73 75 6c 74 73 20 77 65 72 65 20  he results were 
aab0: 70 6c 61 63 65 64 20 69 6e 20 61 20 73 6f 72 74  placed in a sort
aac0: 65 72 2e 20 20 41 66 74 65 72 20 74 68 65 20 6c  er.  After the l
aad0: 6f 6f 70 20 69 73 20 74 65 72 6d 69 6e 61 74 65  oop is terminate
aae0: 64 0a 2a 2a 20 77 65 20 6e 65 65 64 20 74 6f 20  d.** we need to 
aaf0: 72 75 6e 20 74 68 65 20 73 6f 72 74 65 72 20 61  run the sorter a
ab00: 6e 64 20 6f 75 74 70 75 74 20 74 68 65 20 72 65  nd output the re
ab10: 73 75 6c 74 73 2e 20 20 54 68 65 20 66 6f 6c 6c  sults.  The foll
ab20: 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e 65  owing.** routine
ab30: 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63   generates the c
ab40: 6f 64 65 20 6e 65 65 64 65 64 20 74 6f 20 64 6f  ode needed to do
ab50: 20 74 68 61 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   that..*/.static
ab60: 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 53 6f   void generateSo
ab70: 72 74 54 61 69 6c 28 0a 20 20 50 61 72 73 65 20  rtTail(.  Parse 
ab80: 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
ab90: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
aba0: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
abb0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
abc0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
abd0: 0a 20 20 53 6f 72 74 43 74 78 20 2a 70 53 6f 72  .  SortCtx *pSor
abe0: 74 2c 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74  t,   /* Informat
abf0: 69 6f 6e 20 6f 6e 20 74 68 65 20 4f 52 44 45 52  ion on the ORDER
ac00: 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
ac10: 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20  int nColumn,    
ac20: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
ac30: 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a  olumns of data *
ac40: 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
ac50: 70 44 65 73 74 20 2f 2a 20 57 72 69 74 65 20 74  pDest /* Write t
ac60: 68 65 20 73 6f 72 74 65 64 20 72 65 73 75 6c 74  he sorted result
ac70: 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 56  s here */.){.  V
ac80: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
ac90: 3e 70 56 64 62 65 3b 20 20 20 20 20 20 20 20 20  >pVdbe;         
aca0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
acb0: 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
acc0: 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 61  ement */.  int a
acd0: 64 64 72 42 72 65 61 6b 20 3d 20 70 53 6f 72 74  ddrBreak = pSort
ace0: 2d 3e 6c 61 62 65 6c 44 6f 6e 65 3b 20 20 20 20  ->labelDone;    
acf0: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
ad00: 68 65 72 65 20 74 6f 20 65 78 69 74 20 6c 6f 6f  here to exit loo
ad10: 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43  p */.  int addrC
ad20: 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65  ontinue = sqlite
ad30: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
ad40: 29 3b 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  );  /* Jump here
ad50: 20 66 6f 72 20 6e 65 78 74 20 63 79 63 6c 65 20   for next cycle 
ad60: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20  */.  int addr;. 
ad70: 20 69 6e 74 20 61 64 64 72 4f 6e 63 65 20 3d 20   int addrOnce = 
ad80: 30 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20  0;.  int iTab;. 
ad90: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
ada0: 72 42 79 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72  rBy = pSort->pOr
adb0: 64 65 72 42 79 3b 0a 20 20 69 6e 74 20 65 44 65  derBy;.  int eDe
adc0: 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73  st = pDest->eDes
add0: 74 3b 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d  t;.  int iParm =
ade0: 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 3b   pDest->iSDParm;
adf0: 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 3b 0a 20  .  int regRow;. 
ae00: 20 69 6e 74 20 72 65 67 52 6f 77 69 64 3b 0a 20   int regRowid;. 
ae10: 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 69 6e 74   int iCol;.  int
ae20: 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 69 53 6f   nKey;.  int iSo
ae30: 72 74 54 61 62 3b 20 20 20 20 20 20 20 20 20 20  rtTab;          
ae40: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 72 74           /* Sort
ae50: 65 72 20 63 75 72 73 6f 72 20 74 6f 20 72 65 61  er cursor to rea
ae60: 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  d from */.  int 
ae70: 6e 53 6f 72 74 44 61 74 61 3b 20 20 20 20 20 20  nSortData;      
ae80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
ae90: 72 61 69 6c 69 6e 67 20 76 61 6c 75 65 73 20 74  railing values t
aea0: 6f 20 72 65 61 64 20 66 72 6f 6d 20 73 6f 72 74  o read from sort
aeb0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a 20  er */.  int i;. 
aec0: 20 69 6e 74 20 62 53 65 71 3b 20 20 20 20 20 20   int bSeq;      
aed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aee0: 20 2f 2a 20 54 72 75 65 20 69 66 20 73 6f 72 74   /* True if sort
aef0: 65 72 20 72 65 63 6f 72 64 20 69 6e 63 6c 75 64  er record includ
af00: 65 73 20 73 65 71 2e 20 6e 6f 2e 20 2a 2f 0a 20  es seq. no. */. 
af10: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
af20: 5f 69 74 65 6d 20 2a 61 4f 75 74 45 78 20 3d 20  _item *aOutEx = 
af30: 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a 0a 20  p->pEList->a;.. 
af40: 20 61 73 73 65 72 74 28 20 61 64 64 72 42 72 65   assert( addrBre
af50: 61 6b 3c 30 20 29 3b 0a 20 20 69 66 28 20 70 53  ak<0 );.  if( pS
af60: 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 20  ort->labelBkOut 
af70: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
af80: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
af90: 6f 73 75 62 2c 20 70 53 6f 72 74 2d 3e 72 65 67  osub, pSort->reg
afa0: 52 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d 3e 6c  Return, pSort->l
afb0: 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20 20 20  abelBkOut);.    
afc0: 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
afd0: 76 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20  v, addrBreak);. 
afe0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
aff0: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 53  solveLabel(v, pS
b000: 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29  ort->labelBkOut)
b010: 3b 0a 20 20 7d 0a 20 20 69 54 61 62 20 3d 20 70  ;.  }.  iTab = p
b020: 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 3b 0a  Sort->iECursor;.
b030: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
b040: 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73 74  _Output || eDest
b050: 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20  ==SRT_Coroutine 
b060: 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65  || eDest==SRT_Me
b070: 6d 20 29 7b 0a 20 20 20 20 72 65 67 52 6f 77 69  m ){.    regRowi
b080: 64 20 3d 20 30 3b 0a 20 20 20 20 72 65 67 52 6f  d = 0;.    regRo
b090: 77 20 3d 20 70 44 65 73 74 2d 3e 69 53 64 73 74  w = pDest->iSdst
b0a0: 3b 0a 20 20 20 20 6e 53 6f 72 74 44 61 74 61 20  ;.    nSortData 
b0b0: 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7d 65 6c  = nColumn;.  }el
b0c0: 73 65 7b 0a 20 20 20 20 72 65 67 52 6f 77 69 64  se{.    regRowid
b0d0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
b0e0: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
b0f0: 20 20 72 65 67 52 6f 77 20 3d 20 73 71 6c 69 74    regRow = sqlit
b100: 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
b110: 50 61 72 73 65 2c 20 6e 43 6f 6c 75 6d 6e 29 3b  Parse, nColumn);
b120: 0a 20 20 20 20 6e 53 6f 72 74 44 61 74 61 20 3d  .    nSortData =
b130: 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7d 0a 20 20   nColumn;.  }.  
b140: 6e 4b 65 79 20 3d 20 70 4f 72 64 65 72 42 79 2d  nKey = pOrderBy-
b150: 3e 6e 45 78 70 72 20 2d 20 70 53 6f 72 74 2d 3e  >nExpr - pSort->
b160: 6e 4f 42 53 61 74 3b 0a 20 20 69 66 28 20 70 53  nOBSat;.  if( pS
b170: 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26  ort->sortFlags &
b180: 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72   SORTFLAG_UseSor
b190: 74 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ter ){.    int r
b1a0: 65 67 53 6f 72 74 4f 75 74 20 3d 20 2b 2b 70 50  egSortOut = ++pP
b1b0: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
b1c0: 69 53 6f 72 74 54 61 62 20 3d 20 70 50 61 72 73  iSortTab = pPars
b1d0: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 69  e->nTab++;.    i
b1e0: 66 28 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42  f( pSort->labelB
b1f0: 6b 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 61 64  kOut ){.      ad
b200: 64 72 4f 6e 63 65 20 3d 20 73 71 6c 69 74 65 33  drOnce = sqlite3
b210: 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
b220: 5f 4f 6e 63 65 29 3b 20 56 64 62 65 43 6f 76 65  _Once); VdbeCove
b230: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20  rage(v);.    }. 
b240: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b250: 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50  dOp3(v, OP_OpenP
b260: 73 65 75 64 6f 2c 20 69 53 6f 72 74 54 61 62 2c  seudo, iSortTab,
b270: 20 72 65 67 53 6f 72 74 4f 75 74 2c 20 6e 4b 65   regSortOut, nKe
b280: 79 2b 31 2b 6e 53 6f 72 74 44 61 74 61 29 3b 0a  y+1+nSortData);.
b290: 20 20 20 20 69 66 28 20 61 64 64 72 4f 6e 63 65      if( addrOnce
b2a0: 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75   ) sqlite3VdbeJu
b2b0: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 4f 6e  mpHere(v, addrOn
b2c0: 63 65 29 3b 0a 20 20 20 20 61 64 64 72 20 3d 20  ce);.    addr = 
b2d0: 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 + sqlite3VdbeA
b2e0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp2(v, OP_Sort
b2f0: 65 72 53 6f 72 74 2c 20 69 54 61 62 2c 20 61 64  erSort, iTab, ad
b300: 64 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 56 64  drBreak);.    Vd
b310: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
b320: 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c     codeOffset(v,
b330: 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 61 64 64   p->iOffset, add
b340: 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20  rContinue);.    
b350: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b360: 33 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61  3(v, OP_SorterDa
b370: 74 61 2c 20 69 54 61 62 2c 20 72 65 67 53 6f 72  ta, iTab, regSor
b380: 74 4f 75 74 2c 20 69 53 6f 72 74 54 61 62 29 3b  tOut, iSortTab);
b390: 0a 20 20 20 20 62 53 65 71 20 3d 20 30 3b 0a 20  .    bSeq = 0;. 
b3a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64 72   }else{.    addr
b3b0: 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64   = 1 + sqlite3Vd
b3c0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
b3d0: 6f 72 74 2c 20 69 54 61 62 2c 20 61 64 64 72 42  ort, iTab, addrB
b3e0: 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72  reak); VdbeCover
b3f0: 61 67 65 28 76 29 3b 0a 20 20 20 20 63 6f 64 65  age(v);.    code
b400: 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66  Offset(v, p->iOf
b410: 66 73 65 74 2c 20 61 64 64 72 43 6f 6e 74 69 6e  fset, addrContin
b420: 75 65 29 3b 0a 20 20 20 20 69 53 6f 72 74 54 61  ue);.    iSortTa
b430: 62 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 62 53  b = iTab;.    bS
b440: 65 71 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 66 6f  eq = 1;.  }.  fo
b450: 72 28 69 3d 30 2c 20 69 43 6f 6c 3d 6e 4b 65 79  r(i=0, iCol=nKey
b460: 2b 62 53 65 71 3b 20 69 3c 6e 53 6f 72 74 44 61  +bSeq; i<nSortDa
b470: 74 61 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  ta; i++){.    in
b480: 74 20 69 52 65 61 64 3b 0a 20 20 20 20 69 66 28  t iRead;.    if(
b490: 20 61 4f 75 74 45 78 5b 69 5d 2e 75 2e 78 2e 69   aOutEx[i].u.x.i
b4a0: 4f 72 64 65 72 42 79 43 6f 6c 20 29 7b 0a 20 20  OrderByCol ){.  
b4b0: 20 20 20 20 69 52 65 61 64 20 3d 20 61 4f 75 74      iRead = aOut
b4c0: 45 78 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72  Ex[i].u.x.iOrder
b4d0: 42 79 43 6f 6c 2d 31 3b 0a 20 20 20 20 7d 65 6c  ByCol-1;.    }el
b4e0: 73 65 7b 0a 20 20 20 20 20 20 69 52 65 61 64 20  se{.      iRead 
b4f0: 3d 20 69 43 6f 6c 2b 2b 3b 0a 20 20 20 20 7d 0a  = iCol++;.    }.
b500: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b510: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
b520: 6d 6e 2c 20 69 53 6f 72 74 54 61 62 2c 20 69 52  mn, iSortTab, iR
b530: 65 61 64 2c 20 72 65 67 52 6f 77 2b 69 29 3b 0a  ead, regRow+i);.
b540: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
b550: 28 76 2c 20 22 25 73 22 2c 20 61 4f 75 74 45 78  (v, "%s", aOutEx
b560: 5b 69 5d 2e 7a 4e 61 6d 65 20 3f 20 61 4f 75 74  [i].zName ? aOut
b570: 45 78 5b 69 5d 2e 7a 4e 61 6d 65 20 3a 20 61 4f  Ex[i].zName : aO
b580: 75 74 45 78 5b 69 5d 2e 7a 53 70 61 6e 29 29 3b  utEx[i].zSpan));
b590: 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 65  .  }.  switch( e
b5a0: 44 65 73 74 20 29 7b 0a 20 20 20 20 63 61 73 65  Dest ){.    case
b5b0: 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20   SRT_Table:.    
b5c0: 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61  case SRT_EphemTa
b5d0: 62 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  b: {.      sqlit
b5e0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
b5f0: 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50 61  OP_NewRowid, iPa
b600: 72 6d 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20  rm, regRowid);. 
b610: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b620: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73  AddOp3(v, OP_Ins
b630: 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67 52  ert, iParm, regR
b640: 6f 77 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20  ow, regRowid);. 
b650: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b660: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
b670: 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20  AG_APPEND);.    
b680: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
b690: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
b6a0: 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
b6b0: 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a  case SRT_Set: {.
b6c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
b6d0: 6f 6c 75 6d 6e 3d 3d 73 71 6c 69 74 65 33 53 74  olumn==sqlite3St
b6e0: 72 6c 65 6e 33 30 28 70 44 65 73 74 2d 3e 7a 41  rlen30(pDest->zA
b6f0: 66 66 53 64 73 74 29 20 29 3b 0a 20 20 20 20 20  ffSdst) );.     
b700: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b710: 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p4(v, OP_MakeRec
b720: 6f 72 64 2c 20 72 65 67 52 6f 77 2c 20 6e 43 6f  ord, regRow, nCo
b730: 6c 75 6d 6e 2c 20 72 65 67 52 6f 77 69 64 2c 0a  lumn, regRowid,.
b740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b750: 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 7a          pDest->z
b760: 41 66 66 53 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e  AffSdst, nColumn
b770: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
b780: 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
b790: 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
b7a0: 72 65 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 29  regRow, nColumn)
b7b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
b7c0: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
b7d0: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50  OP_IdxInsert, iP
b7e0: 61 72 6d 2c 20 72 65 67 52 6f 77 69 64 2c 20 72  arm, regRowid, r
b7f0: 65 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 29 3b  egRow, nColumn);
b800: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
b810: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 52 54    }.    case SRT
b820: 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  _Mem: {.      /*
b830: 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73   The LIMIT claus
b840: 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65  e will terminate
b850: 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73   the loop for us
b860: 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
b870: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
b880: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
b890: 20 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74     assert( eDest
b8a0: 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20  ==SRT_Output || 
b8b0: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
b8c0: 74 69 6e 65 20 29 3b 20 0a 20 20 20 20 20 20 74  tine ); .      t
b8d0: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
b8e0: 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20  SRT_Output );.  
b8f0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
b900: 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69  est==SRT_Corouti
b910: 6e 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ne );.      if( 
b920: 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
b930: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
b940: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
b950: 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  , OP_ResultRow, 
b960: 70 44 65 73 74 2d 3e 69 53 64 73 74 2c 20 6e 43  pDest->iSdst, nC
b970: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20  olumn);.        
b980: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
b990: 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
b9a0: 50 61 72 73 65 2c 20 70 44 65 73 74 2d 3e 69 53  Parse, pDest->iS
b9b0: 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  dst, nColumn);. 
b9c0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
b9d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b9e0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
b9f0: 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  d, pDest->iSDPar
ba00: 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  m);.      }.    
ba10: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
ba20: 20 7d 0a 20 20 69 66 28 20 72 65 67 52 6f 77 69   }.  if( regRowi
ba30: 64 20 29 7b 0a 20 20 20 20 69 66 28 20 65 44 65  d ){.    if( eDe
ba40: 73 74 3d 3d 53 52 54 5f 53 65 74 20 29 7b 0a 20  st==SRT_Set ){. 
ba50: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
ba60: 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
ba70: 72 73 65 2c 20 72 65 67 52 6f 77 2c 20 6e 43 6f  rse, regRow, nCo
ba80: 6c 75 6d 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65  lumn);.    }else
ba90: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  {.      sqlite3R
baa0: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
bab0: 61 72 73 65 2c 20 72 65 67 52 6f 77 29 3b 0a 20  arse, regRow);. 
bac0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
bad0: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
bae0: 50 61 72 73 65 2c 20 72 65 67 52 6f 77 69 64 29  Parse, regRowid)
baf0: 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20 62  ;.  }.  /* The b
bb00: 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f  ottom of the loo
bb10: 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  p.  */.  sqlite3
bb20: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
bb30: 28 76 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65  (v, addrContinue
bb40: 29 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e  );.  if( pSort->
bb50: 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54  sortFlags & SORT
bb60: 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 20 29  FLAG_UseSorter )
bb70: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
bb80: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f  eAddOp2(v, OP_So
bb90: 72 74 65 72 4e 65 78 74 2c 20 69 54 61 62 2c 20  rterNext, iTab, 
bba0: 61 64 64 72 29 3b 20 56 64 62 65 43 6f 76 65 72  addr); VdbeCover
bbb0: 61 67 65 28 76 29 3b 0a 20 20 7d 65 6c 73 65 7b  age(v);.  }else{
bbc0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
bbd0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
bbe0: 74 2c 20 69 54 61 62 2c 20 61 64 64 72 29 3b 20  t, iTab, addr); 
bbf0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
bc00: 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 6f 72 74  .  }.  if( pSort
bc10: 2d 3e 72 65 67 52 65 74 75 72 6e 20 29 20 73 71  ->regReturn ) sq
bc20: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
bc30: 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 70 53  v, OP_Return, pS
bc40: 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b  ort->regReturn);
bc50: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
bc60: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
bc70: 64 72 42 72 65 61 6b 29 3b 0a 7d 0a 0a 2f 2a 0a  drBreak);.}../*.
bc80: 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
bc90: 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e 67 20  ter to a string 
bca0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 27  containing the '
bcb0: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
bcc0: 27 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70 72  ' of the.** expr
bcd0: 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 54 68  ession pExpr. Th
bce0: 65 20 73 74 72 69 6e 67 20 6d 61 79 20 62 65 20  e string may be 
bcf0: 74 72 65 61 74 65 64 20 61 73 20 73 74 61 74 69  treated as stati
bd00: 63 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e  c by the caller.
bd10: 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 74 72 79 20  .**.** Also try 
bd20: 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65 20  to estimate the 
bd30: 73 69 7a 65 20 6f 66 20 74 68 65 20 72 65 74 75  size of the retu
bd40: 72 6e 65 64 20 76 61 6c 75 65 20 61 6e 64 20 72  rned value and r
bd50: 65 74 75 72 6e 20 74 68 61 74 0a 2a 2a 20 72 65  eturn that.** re
bd60: 73 75 6c 74 20 69 6e 20 2a 70 45 73 74 57 69 64  sult in *pEstWid
bd70: 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65  th..**.** The de
bd80: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 69  claration type i
bd90: 73 20 74 68 65 20 65 78 61 63 74 20 64 61 74 61  s the exact data
bda0: 74 79 70 65 20 64 65 66 69 6e 69 74 69 6f 6e 20  type definition 
bdb0: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74  extracted from t
bdc0: 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 43  he.** original C
bdd0: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
bde0: 65 6d 65 6e 74 20 69 66 20 74 68 65 20 65 78 70  ement if the exp
bdf0: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c  ression is a col
be00: 75 6d 6e 2e 20 54 68 65 0a 2a 2a 20 64 65 63 6c  umn. The.** decl
be10: 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72  aration type for
be20: 20 61 20 52 4f 57 49 44 20 66 69 65 6c 64 20 69   a ROWID field i
be30: 73 20 49 4e 54 45 47 45 52 2e 20 45 78 61 63 74  s INTEGER. Exact
be40: 6c 79 20 77 68 65 6e 20 61 6e 20 65 78 70 72 65  ly when an expre
be50: 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73  ssion.** is cons
be60: 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20  idered a column 
be70: 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65 78 20 69  can be complex i
be80: 6e 20 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f  n the presence o
be90: 66 20 73 75 62 71 75 65 72 69 65 73 2e 20 54 68  f subqueries. Th
bea0: 65 0a 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20  e.** result-set 
beb0: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6c  expression in al
bec0: 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  l of the followi
bed0: 6e 67 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ng SELECT statem
bee0: 65 6e 74 73 20 69 73 20 0a 2a 2a 20 63 6f 6e 73  ents is .** cons
bef0: 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20  idered a column 
bf00: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
bf10: 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54  ..**.**   SELECT
bf20: 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a   col FROM tbl;.*
bf30: 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45  *   SELECT (SELE
bf40: 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b  CT col FROM tbl;
bf50: 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45  .**   SELECT (SE
bf60: 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62  LECT col FROM tb
bf70: 6c 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  l);.**   SELECT 
bf80: 61 62 63 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  abc FROM (SELECT
bf90: 20 63 6f 6c 20 41 53 20 61 62 63 20 46 52 4f 4d   col AS abc FROM
bfa0: 20 74 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68   tbl);.** .** Th
bfb0: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
bfc0: 70 65 20 66 6f 72 20 61 6e 79 20 65 78 70 72 65  pe for any expre
bfd0: 73 73 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e  ssion other than
bfe0: 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c   a column is NUL
bff0: 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  L..**.** This ro
c000: 75 74 69 6e 65 20 68 61 73 20 65 69 74 68 65 72  utine has either
c010: 20 33 20 6f 72 20 36 20 70 61 72 61 6d 65 74 65   3 or 6 paramete
c020: 72 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  rs depending on 
c030: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a  whether or not.*
c040: 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41  * the SQLITE_ENA
c050: 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44  BLE_COLUMN_METAD
c060: 41 54 41 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65  ATA compile-time
c070: 20 6f 70 74 69 6f 6e 20 69 73 20 75 73 65 64 2e   option is used.
c080: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
c090: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
c0a0: 4d 45 54 41 44 41 54 41 0a 23 20 64 65 66 69 6e  METADATA.# defin
c0b0: 65 20 63 6f 6c 75 6d 6e 54 79 70 65 28 41 2c 42  e columnType(A,B
c0c0: 2c 43 2c 44 2c 45 2c 46 29 20 63 6f 6c 75 6d 6e  ,C,D,E,F) column
c0d0: 54 79 70 65 49 6d 70 6c 28 41 2c 42 2c 43 2c 44  TypeImpl(A,B,C,D
c0e0: 2c 45 2c 46 29 0a 23 65 6c 73 65 20 2f 2a 20 69  ,E,F).#else /* i
c0f0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
c100: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
c110: 4d 45 54 41 44 41 54 41 29 20 2a 2f 0a 23 20 64  METADATA) */.# d
c120: 65 66 69 6e 65 20 63 6f 6c 75 6d 6e 54 79 70 65  efine columnType
c130: 28 41 2c 42 2c 43 2c 44 2c 45 2c 46 29 20 63 6f  (A,B,C,D,E,F) co
c140: 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28 41 2c 42  lumnTypeImpl(A,B
c150: 2c 46 29 0a 23 65 6e 64 69 66 0a 73 74 61 74 69  ,F).#endif.stati
c160: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f  c const char *co
c170: 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28 0a 20 20  lumnTypeImpl(.  
c180: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
c190: 2c 20 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  , .  Expr *pExpr
c1a0: 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ,.#ifdef SQLITE_
c1b0: 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45  ENABLE_COLUMN_ME
c1c0: 54 41 44 41 54 41 0a 20 20 63 6f 6e 73 74 20 63  TADATA.  const c
c1d0: 68 61 72 20 2a 2a 70 7a 4f 72 69 67 44 62 2c 0a  har **pzOrigDb,.
c1e0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70    const char **p
c1f0: 7a 4f 72 69 67 54 61 62 2c 0a 20 20 63 6f 6e 73  zOrigTab,.  cons
c200: 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 43  t char **pzOrigC
c210: 6f 6c 2c 0a 23 65 6e 64 69 66 0a 20 20 75 38 20  ol,.#endif.  u8 
c220: 2a 70 45 73 74 57 69 64 74 68 0a 29 7b 0a 20 20  *pEstWidth.){.  
c230: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 79 70  char const *zTyp
c240: 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a  e = 0;.  int j;.
c250: 20 20 75 38 20 65 73 74 57 69 64 74 68 20 3d 20    u8 estWidth = 
c260: 31 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  1;.#ifdef SQLITE
c270: 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
c280: 45 54 41 44 41 54 41 0a 20 20 63 68 61 72 20 63  ETADATA.  char c
c290: 6f 6e 73 74 20 2a 7a 4f 72 69 67 44 62 20 3d 20  onst *zOrigDb = 
c2a0: 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  0;.  char const 
c2b0: 2a 7a 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a 20  *zOrigTab = 0;. 
c2c0: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72   char const *zOr
c2d0: 69 67 43 6f 6c 20 3d 20 30 3b 0a 23 65 6e 64 69  igCol = 0;.#endi
c2e0: 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  f..  assert( pEx
c2f0: 70 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  pr!=0 );.  asser
c300: 74 28 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74  t( pNC->pSrcList
c310: 21 3d 30 20 29 3b 0a 20 20 73 77 69 74 63 68 28  !=0 );.  switch(
c320: 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
c330: 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f    case TK_AGG_CO
c340: 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  LUMN:.    case T
c350: 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  K_COLUMN: {.    
c360: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
c370: 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e  ion is a column.
c380: 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c   Locate the tabl
c390: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20  e the column is 
c3a0: 62 65 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 65  being.      ** e
c3b0: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69 6e  xtracted from in
c3c0: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 70 53 72   NameContext.pSr
c3d0: 63 4c 69 73 74 2e 20 54 68 69 73 20 74 61 62 6c  cList. This tabl
c3e0: 65 20 6d 61 79 20 62 65 20 72 65 61 6c 0a 20 20  e may be real.  
c3f0: 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
c400: 74 61 62 6c 65 20 6f 72 20 61 20 73 75 62 71 75  table or a subqu
c410: 65 72 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ery..      */.  
c420: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
c430: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
c440: 2f 2a 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  /* Table structu
c450: 72 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74  re column is ext
c460: 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20  racted from */. 
c470: 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20       Select *pS 
c480: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
c490: 20 2f 2a 20 53 65 6c 65 63 74 20 74 68 65 20 63   /* Select the c
c4a0: 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74  olumn is extract
c4b0: 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20  ed from */.     
c4c0: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78 70   int iCol = pExp
c4d0: 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20 20 2f 2a 20  r->iColumn;  /* 
c4e0: 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20  Index of column 
c4f0: 69 6e 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 20  in pTab */.     
c500: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
c510: 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op==TK_AGG_COL
c520: 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73  UMN );.      tes
c530: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
c540: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  ==TK_COLUMN );. 
c550: 20 20 20 20 20 77 68 69 6c 65 28 20 70 4e 43 20       while( pNC 
c560: 26 26 20 21 70 54 61 62 20 29 7b 0a 20 20 20 20  && !pTab ){.    
c570: 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61      SrcList *pTa
c580: 62 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72  bList = pNC->pSr
c590: 63 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 66  cList;.        f
c5a0: 6f 72 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c 69 73  or(j=0;j<pTabLis
c5b0: 74 2d 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c  t->nSrc && pTabL
c5c0: 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f  ist->a[j].iCurso
c5d0: 72 21 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  r!=pExpr->iTable
c5e0: 3b 6a 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 69  ;j++);.        i
c5f0: 66 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  f( j<pTabList->n
c600: 53 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Src ){.         
c610: 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74   pTab = pTabList
c620: 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20  ->a[j].pTab;.   
c630: 20 20 20 20 20 20 20 70 53 20 3d 20 70 54 61 62         pS = pTab
c640: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 53 65 6c 65  List->a[j].pSele
c650: 63 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ct;.        }els
c660: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 43  e{.          pNC
c670: 20 3d 20 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20   = pNC->pNext;. 
c680: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
c690: 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ..      if( pTab
c6a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
c6b0: 2a 20 41 74 20 6f 6e 65 20 74 69 6d 65 2c 20 63  * At one time, c
c6c0: 6f 64 65 20 73 75 63 68 20 61 73 20 22 53 45 4c  ode such as "SEL
c6d0: 45 43 54 20 6e 65 77 2e 78 22 20 77 69 74 68 69  ECT new.x" withi
c6e0: 6e 20 61 20 74 72 69 67 67 65 72 20 77 6f 75 6c  n a trigger woul
c6f0: 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 75  d.        ** cau
c700: 73 65 20 74 68 69 73 20 63 6f 6e 64 69 74 69 6f  se this conditio
c710: 6e 20 74 6f 20 72 75 6e 2e 20 20 53 69 6e 63 65  n to run.  Since
c720: 20 74 68 65 6e 2c 20 77 65 20 68 61 76 65 20 72   then, we have r
c730: 65 73 74 72 75 63 74 75 72 65 64 20 68 6f 77 0a  estructured how.
c740: 20 20 20 20 20 20 20 20 2a 2a 20 74 72 69 67 67          ** trigg
c750: 65 72 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72  er code is gener
c760: 61 74 65 64 20 61 6e 64 20 73 6f 20 74 68 69 73  ated and so this
c770: 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 6e 6f   condition is no
c780: 20 6c 6f 6e 67 65 72 20 0a 20 20 20 20 20 20 20   longer .       
c790: 20 2a 2a 20 70 6f 73 73 69 62 6c 65 2e 20 48 6f   ** possible. Ho
c7a0: 77 65 76 65 72 2c 20 69 74 20 63 61 6e 20 73 74  wever, it can st
c7b0: 69 6c 6c 20 62 65 20 74 72 75 65 20 66 6f 72 20  ill be true for 
c7c0: 73 74 61 74 65 6d 65 6e 74 73 20 6c 69 6b 65 0a  statements like.
c7d0: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66          ** the f
c7e0: 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20 20 20 20  ollowing:.      
c7f0: 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
c800: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
c810: 31 28 63 6f 6c 20 49 4e 54 45 47 45 52 29 3b 0a  1(col INTEGER);.
c820: 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c          **   SEL
c830: 45 43 54 20 28 53 45 4c 45 43 54 20 74 31 2e 63  ECT (SELECT t1.c
c840: 6f 6c 29 20 46 52 4f 4d 20 46 52 4f 4d 20 74 31  ol) FROM FROM t1
c850: 3b 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ;.        **.   
c860: 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6c       ** when col
c870: 75 6d 6e 54 79 70 65 28 29 20 69 73 20 63 61 6c  umnType() is cal
c880: 6c 65 64 20 6f 6e 20 74 68 65 20 65 78 70 72 65  led on the expre
c890: 73 73 69 6f 6e 20 22 74 31 2e 63 6f 6c 22 20 69  ssion "t1.col" i
c8a0: 6e 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a  n the .        *
c8b0: 2a 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 49 6e  * sub-select. In
c8c0: 20 74 68 69 73 20 63 61 73 65 2c 20 73 65 74 20   this case, set 
c8d0: 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20  the column type 
c8e0: 74 6f 20 4e 55 4c 4c 2c 20 65 76 65 6e 0a 20 20  to NULL, even.  
c8f0: 20 20 20 20 20 20 2a 2a 20 74 68 6f 75 67 68 20        ** though 
c900: 69 74 20 73 68 6f 75 6c 64 20 72 65 61 6c 6c 79  it should really
c910: 20 62 65 20 22 49 4e 54 45 47 45 52 22 2e 0a 20   be "INTEGER".. 
c920: 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
c930: 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74    ** This is not
c940: 20 61 20 70 72 6f 62 6c 65 6d 2c 20 61 73 20 74   a problem, as t
c950: 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6f  he column type o
c960: 66 20 22 74 31 2e 63 6f 6c 22 20 69 73 20 6e 65  f "t1.col" is ne
c970: 76 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 75  ver.        ** u
c980: 73 65 64 2e 20 57 68 65 6e 20 63 6f 6c 75 6d 6e  sed. When column
c990: 54 79 70 65 28 29 20 69 73 20 63 61 6c 6c 65 64  Type() is called
c9a0: 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69   on the expressi
c9b0: 6f 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 22  on .        ** "
c9c0: 28 53 45 4c 45 43 54 20 74 31 2e 63 6f 6c 29 22  (SELECT t1.col)"
c9d0: 2c 20 74 68 65 20 63 6f 72 72 65 63 74 20 74 79  , the correct ty
c9e0: 70 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 28  pe is returned (
c9f0: 73 65 65 20 74 68 65 20 54 4b 5f 53 45 4c 45 43  see the TK_SELEC
ca00: 54 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 72 61  T.        ** bra
ca10: 6e 63 68 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20  nch below.  */. 
ca20: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
ca30: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73      }..      ass
ca40: 65 72 74 28 20 70 54 61 62 20 26 26 20 70 45 78  ert( pTab && pEx
ca50: 70 72 2d 3e 70 54 61 62 3d 3d 70 54 61 62 20 29  pr->pTab==pTab )
ca60: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 20 29  ;.      if( pS )
ca70: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
ca80: 20 22 74 61 62 6c 65 22 20 69 73 20 61 63 74 75   "table" is actu
ca90: 61 6c 6c 79 20 61 20 73 75 62 2d 73 65 6c 65 63  ally a sub-selec
caa0: 74 20 6f 72 20 61 20 76 69 65 77 20 69 6e 20 74  t or a view in t
cab0: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20  he FROM clause. 
cac0: 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65         ** of the
cad0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
cae0: 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65  t. Return the de
caf0: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 61  claration type a
cb00: 6e 64 20 6f 72 69 67 69 6e 0a 20 20 20 20 20 20  nd origin.      
cb10: 20 20 2a 2a 20 64 61 74 61 20 66 6f 72 20 74 68    ** data for th
cb20: 65 20 72 65 73 75 6c 74 2d 73 65 74 20 63 6f 6c  e result-set col
cb30: 75 6d 6e 20 6f 66 20 74 68 65 20 73 75 62 2d 73  umn of the sub-s
cb40: 65 6c 65 63 74 2e 0a 20 20 20 20 20 20 20 20 2a  elect..        *
cb50: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43  /.        if( iC
cb60: 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 53  ol>=0 && iCol<pS
cb70: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
cb80: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
cb90: 49 66 20 69 43 6f 6c 20 69 73 20 6c 65 73 73 20  If iCol is less 
cba0: 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
cbb0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72  the expression r
cbc0: 65 71 75 65 73 74 73 20 74 68 65 0a 20 20 20 20  equests the.    
cbd0: 20 20 20 20 20 20 2a 2a 20 72 6f 77 69 64 20 6f        ** rowid o
cbe0: 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74  f the sub-select
cbf0: 20 6f 72 20 76 69 65 77 2e 20 54 68 69 73 20 65   or view. This e
cc00: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6c 65 67  xpression is leg
cc10: 61 6c 20 28 73 65 65 20 0a 20 20 20 20 20 20 20  al (see .       
cc20: 20 20 20 2a 2a 20 74 65 73 74 20 63 61 73 65 20     ** test case 
cc30: 6d 69 73 63 32 2e 32 2e 32 29 20 2d 20 69 74 20  misc2.2.2) - it 
cc40: 61 6c 77 61 79 73 20 65 76 61 6c 75 61 74 65 73  always evaluates
cc50: 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20   to NULL..      
cc60: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
cc70: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
cc80: 3b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72  ;.          Expr
cc90: 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74   *p = pS->pEList
cca0: 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 3b  ->a[iCol].pExpr;
ccb0: 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70  .          sNC.p
ccc0: 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53  SrcList = pS->pS
ccd0: 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e  rc;.          sN
cce0: 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20  C.pNext = pNC;. 
ccf0: 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 50 61           sNC.pPa
cd00: 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  rse = pNC->pPars
cd10: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79  e;.          zTy
cd20: 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28  pe = columnType(
cd30: 26 73 4e 43 2c 20 70 2c 26 7a 4f 72 69 67 44 62  &sNC, p,&zOrigDb
cd40: 2c 26 7a 4f 72 69 67 54 61 62 2c 26 7a 4f 72 69  ,&zOrigTab,&zOri
cd50: 67 43 6f 6c 2c 20 26 65 73 74 57 69 64 74 68 29  gCol, &estWidth)
cd60: 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ; .        }.   
cd70: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 61     }else if( pTa
cd80: 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  b->pSchema ){.  
cd90: 20 20 20 20 20 20 2f 2a 20 41 20 72 65 61 6c 20        /* A real 
cda0: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  table */.       
cdb0: 20 61 73 73 65 72 74 28 20 21 70 53 20 29 3b 0a   assert( !pS );.
cdc0: 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
cdd0: 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62  <0 ) iCol = pTab
cde0: 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20  ->iPKey;.       
cdf0: 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d   assert( iCol==-
ce00: 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26  1 || (iCol>=0 &&
ce10: 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
ce20: 29 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ) );.#ifdef SQLI
ce30: 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
ce40: 5f 4d 45 54 41 44 41 54 41 0a 20 20 20 20 20 20  _METADATA.      
ce50: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a    if( iCol<0 ){.
ce60: 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20            zType 
ce70: 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20  = "INTEGER";.   
ce80: 20 20 20 20 20 20 20 7a 4f 72 69 67 43 6f 6c 20         zOrigCol 
ce90: 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20  = "rowid";.     
cea0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ceb0: 20 20 20 20 7a 4f 72 69 67 43 6f 6c 20 3d 20 70      zOrigCol = p
cec0: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
ced0: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  zName;.         
cee0: 20 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33   zType = sqlite3
cef0: 43 6f 6c 75 6d 6e 54 79 70 65 28 26 70 54 61 62  ColumnType(&pTab
cf00: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2c 30 29 3b  ->aCol[iCol],0);
cf10: 0a 20 20 20 20 20 20 20 20 20 20 65 73 74 57 69  .          estWi
cf20: 64 74 68 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  dth = pTab->aCol
cf30: 5b 69 43 6f 6c 5d 2e 73 7a 45 73 74 3b 0a 20 20  [iCol].szEst;.  
cf40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
cf50: 7a 4f 72 69 67 54 61 62 20 3d 20 70 54 61 62 2d  zOrigTab = pTab-
cf60: 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  >zName;.        
cf70: 69 66 28 20 70 4e 43 2d 3e 70 50 61 72 73 65 20  if( pNC->pParse 
cf80: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
cf90: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
cfa0: 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 4e 43 2d  hemaToIndex(pNC-
cfb0: 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  >pParse->db, pTa
cfc0: 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
cfd0: 20 20 20 20 20 20 20 7a 4f 72 69 67 44 62 20 3d         zOrigDb =
cfe0: 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62   pNC->pParse->db
cff0: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e  ->aDb[iDb].zDbSN
d000: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23  ame;.        }.#
d010: 65 6c 73 65 0a 20 20 20 20 20 20 20 20 69 66 28  else.        if(
d020: 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20   iCol<0 ){.     
d030: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e       zType = "IN
d040: 54 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20 20  TEGER";.        
d050: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
d060: 20 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33   zType = sqlite3
d070: 43 6f 6c 75 6d 6e 54 79 70 65 28 26 70 54 61 62  ColumnType(&pTab
d080: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2c 30 29 3b  ->aCol[iCol],0);
d090: 0a 20 20 20 20 20 20 20 20 20 20 65 73 74 57 69  .          estWi
d0a0: 64 74 68 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  dth = pTab->aCol
d0b0: 5b 69 43 6f 6c 5d 2e 73 7a 45 73 74 3b 0a 20 20  [iCol].szEst;.  
d0c0: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
d0d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
d0e0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
d0f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
d100: 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20  BQUERY.    case 
d110: 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20  TK_SELECT: {.   
d120: 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
d130: 73 69 6f 6e 20 69 73 20 61 20 73 75 62 2d 73 65  sion is a sub-se
d140: 6c 65 63 74 2e 20 52 65 74 75 72 6e 20 74 68 65  lect. Return the
d150: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
d160: 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 6f  e and.      ** o
d170: 72 69 67 69 6e 20 69 6e 66 6f 20 66 6f 72 20 74  rigin info for t
d180: 68 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e  he single column
d190: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
d1a0: 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  et of the SELECT
d1b0: 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d  .      ** statem
d1c0: 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ent..      */.  
d1d0: 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20      NameContext 
d1e0: 73 4e 43 3b 0a 20 20 20 20 20 20 53 65 6c 65 63  sNC;.      Selec
d1f0: 74 20 2a 70 53 20 3d 20 70 45 78 70 72 2d 3e 78  t *pS = pExpr->x
d200: 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  .pSelect;.      
d210: 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45  Expr *p = pS->pE
d220: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
d230: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
d240: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
d250: 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
d260: 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 73 4e  ect) );.      sN
d270: 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d  C.pSrcList = pS-
d280: 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 73 4e 43  >pSrc;.      sNC
d290: 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20  .pNext = pNC;.  
d2a0: 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d      sNC.pParse =
d2b0: 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20   pNC->pParse;.  
d2c0: 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75      zType = colu
d2d0: 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20  mnType(&sNC, p, 
d2e0: 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69 67  &zOrigDb, &zOrig
d2f0: 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 2c 20  Tab, &zOrigCol, 
d300: 26 65 73 74 57 69 64 74 68 29 3b 20 0a 20 20 20  &estWidth); .   
d310: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
d320: 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 64  #endif.  }..#ifd
d330: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
d340: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
d350: 20 20 0a 20 20 69 66 28 20 70 7a 4f 72 69 67 44    .  if( pzOrigD
d360: 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  b ){.    assert(
d370: 20 70 7a 4f 72 69 67 54 61 62 20 26 26 20 70 7a   pzOrigTab && pz
d380: 4f 72 69 67 43 6f 6c 20 29 3b 0a 20 20 20 20 2a  OrigCol );.    *
d390: 70 7a 4f 72 69 67 44 62 20 3d 20 7a 4f 72 69 67  pzOrigDb = zOrig
d3a0: 44 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 54  Db;.    *pzOrigT
d3b0: 61 62 20 3d 20 7a 4f 72 69 67 54 61 62 3b 0a 20  ab = zOrigTab;. 
d3c0: 20 20 20 2a 70 7a 4f 72 69 67 43 6f 6c 20 3d 20     *pzOrigCol = 
d3d0: 7a 4f 72 69 67 43 6f 6c 3b 0a 20 20 7d 0a 23 65  zOrigCol;.  }.#e
d3e0: 6e 64 69 66 0a 20 20 69 66 28 20 70 45 73 74 57  ndif.  if( pEstW
d3f0: 69 64 74 68 20 29 20 2a 70 45 73 74 57 69 64 74  idth ) *pEstWidt
d400: 68 20 3d 20 65 73 74 57 69 64 74 68 3b 0a 20 20  h = estWidth;.  
d410: 72 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a  return zType;.}.
d420: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
d430: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74  code that will t
d440: 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68 65  ell the VDBE the
d450: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
d460: 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a  es of columns.**
d470: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
d480: 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  et..*/.static vo
d490: 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d  id generateColum
d4a0: 6e 54 79 70 65 73 28 0a 20 20 50 61 72 73 65 20  nTypes(.  Parse 
d4b0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a  *pParse,      /*
d4c0: 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   Parser context 
d4d0: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
d4e0: 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74  abList,  /* List
d4f0: 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20   of tables */.  
d500: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
d510: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
d520: 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20  ns defining the 
d530: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b  result set */.){
d540: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
d550: 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a 20 20  OMIT_DECLTYPE.  
d560: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
d570: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
d580: 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  ;.  NameContext 
d590: 73 4e 43 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c  sNC;.  sNC.pSrcL
d5a0: 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a  ist = pTabList;.
d5b0: 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70    sNC.pParse = p
d5c0: 50 61 72 73 65 3b 0a 20 20 73 4e 43 2e 70 4e 65  Parse;.  sNC.pNe
d5d0: 78 74 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d  xt = 0;.  for(i=
d5e0: 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
d5f0: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
d600: 70 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e  pr *p = pEList->
d610: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
d620: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
d630: 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  e;.#ifdef SQLITE
d640: 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
d650: 45 54 41 44 41 54 41 0a 20 20 20 20 63 6f 6e 73  ETADATA.    cons
d660: 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 44 62 20  t char *zOrigDb 
d670: 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  = 0;.    const c
d680: 68 61 72 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20  har *zOrigTab = 
d690: 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  0;.    const cha
d6a0: 72 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b  r *zOrigCol = 0;
d6b0: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c  .    zType = col
d6c0: 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c  umnType(&sNC, p,
d6d0: 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69   &zOrigDb, &zOri
d6e0: 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 2c  gTab, &zOrigCol,
d6f0: 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65   0);..    /* The
d700: 20 76 64 62 65 20 6d 75 73 74 20 6d 61 6b 65 20   vdbe must make 
d710: 69 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20  its own copy of 
d720: 74 68 65 20 63 6f 6c 75 6d 6e 2d 74 79 70 65 20  the column-type 
d730: 61 6e 64 20 6f 74 68 65 72 20 0a 20 20 20 20 2a  and other .    *
d740: 2a 20 63 6f 6c 75 6d 6e 20 73 70 65 63 69 66 69  * column specifi
d750: 63 20 73 74 72 69 6e 67 73 2c 20 69 6e 20 63 61  c strings, in ca
d760: 73 65 20 74 68 65 20 73 63 68 65 6d 61 20 69 73  se the schema is
d770: 20 72 65 73 65 74 20 62 65 66 6f 72 65 20 74 68   reset before th
d780: 69 73 0a 20 20 20 20 2a 2a 20 76 69 72 74 75 61  is.    ** virtua
d790: 6c 20 6d 61 63 68 69 6e 65 20 69 73 20 64 65 6c  l machine is del
d7a0: 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eted..    */.   
d7b0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
d7c0: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
d7d0: 4e 41 4d 45 5f 44 41 54 41 42 41 53 45 2c 20 7a  NAME_DATABASE, z
d7e0: 4f 72 69 67 44 62 2c 20 53 51 4c 49 54 45 5f 54  OrigDb, SQLITE_T
d7f0: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73  RANSIENT);.    s
d800: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
d810: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
d820: 4d 45 5f 54 41 42 4c 45 2c 20 7a 4f 72 69 67 54  ME_TABLE, zOrigT
d830: 61 62 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  ab, SQLITE_TRANS
d840: 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74  IENT);.    sqlit
d850: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
d860: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 43  (v, i, COLNAME_C
d870: 4f 4c 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f 6c 2c  OLUMN, zOrigCol,
d880: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
d890: 54 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 7a 54  T);.#else.    zT
d8a0: 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65  ype = columnType
d8b0: 28 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20  (&sNC, p, 0, 0, 
d8c0: 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  0, 0);.#endif.  
d8d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
d8e0: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
d8f0: 4c 4e 41 4d 45 5f 44 45 43 4c 54 59 50 45 2c 20  LNAME_DECLTYPE, 
d900: 7a 54 79 70 65 2c 20 53 51 4c 49 54 45 5f 54 52  zType, SQLITE_TR
d910: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 23 65  ANSIENT);.  }.#e
d920: 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
d930: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43  (SQLITE_OMIT_DEC
d940: 4c 54 59 50 45 29 20 2a 2f 0a 7d 0a 0a 0a 2f 2a  LTYPE) */.}.../*
d950: 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20  .** Compute the 
d960: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72  column names for
d970: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
d980: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  ent..**.** The o
d990: 6e 6c 79 20 67 75 61 72 61 6e 74 65 65 20 74 68  nly guarantee th
d9a0: 61 74 20 53 51 4c 69 74 65 20 6d 61 6b 65 73 20  at SQLite makes 
d9b0: 61 62 6f 75 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d  about column nam
d9c0: 65 73 20 69 73 20 74 68 61 74 20 69 66 20 74 68  es is that if th
d9d0: 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 68 61 73 20  e.** column has 
d9e0: 61 6e 20 41 53 20 63 6c 61 75 73 65 20 61 73 73  an AS clause ass
d9f0: 69 67 6e 69 6e 67 20 69 74 20 61 20 6e 61 6d 65  igning it a name
da00: 2c 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 74  , that will be t
da10: 68 65 20 6e 61 6d 65 20 75 73 65 64 2e 0a 2a 2a  he name used..**
da20: 20 54 68 61 74 20 69 73 20 74 68 65 20 6f 6e 6c   That is the onl
da30: 79 20 64 6f 63 75 6d 65 6e 74 65 64 20 67 75 61  y documented gua
da40: 72 61 6e 74 65 65 2e 20 20 48 6f 77 65 76 65 72  rantee.  However
da50: 2c 20 63 6f 75 6e 74 6c 65 73 73 20 61 70 70 6c  , countless appl
da60: 69 63 61 74 69 6f 6e 73 0a 2a 2a 20 64 65 76 65  ications.** deve
da70: 6c 6f 70 65 64 20 6f 76 65 72 20 74 68 65 20 79  loped over the y
da80: 65 61 72 73 20 68 61 76 65 20 6d 61 64 65 20 62  ears have made b
da90: 61 73 65 6c 65 73 73 20 61 73 73 75 6d 70 74 69  aseless assumpti
daa0: 6f 6e 73 20 61 62 6f 75 74 20 63 6f 6c 75 6d 6e  ons about column
dab0: 20 6e 61 6d 65 73 0a 2a 2a 20 61 6e 64 20 77 69   names.** and wi
dac0: 6c 6c 20 62 72 65 61 6b 20 69 66 20 74 68 6f 73  ll break if thos
dad0: 65 20 61 73 73 75 6d 70 74 69 6f 6e 73 20 63 68  e assumptions ch
dae0: 61 6e 67 65 73 2e 20 20 48 65 6e 63 65 2c 20 75  anges.  Hence, u
daf0: 73 65 20 65 78 74 72 65 6d 65 20 63 61 75 74 69  se extreme cauti
db00: 6f 6e 0a 2a 2a 20 77 68 65 6e 20 6d 6f 64 69 66  on.** when modif
db10: 79 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ying this routin
db20: 65 20 74 6f 20 61 76 6f 69 64 20 62 72 65 61 6b  e to avoid break
db30: 69 6e 67 20 6c 65 67 61 63 79 2e 0a 2a 2a 0a 2a  ing legacy..**.*
db40: 2a 20 53 65 65 20 41 6c 73 6f 3a 20 73 71 6c 69  * See Also: sqli
db50: 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78  te3ColumnsFromEx
db60: 70 72 4c 69 73 74 28 29 0a 2a 2a 0a 2a 2a 20 54  prList().**.** T
db70: 68 65 20 50 52 41 47 4d 41 20 73 68 6f 72 74 5f  he PRAGMA short_
db80: 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 20 61 6e 64  column_names and
db90: 20 50 52 41 47 4d 41 20 66 75 6c 6c 5f 63 6f 6c   PRAGMA full_col
dba0: 75 6d 6e 5f 6e 61 6d 65 73 20 73 65 74 74 69 6e  umn_names settin
dbb0: 67 73 20 61 72 65 0a 2a 2a 20 64 65 70 72 65 63  gs are.** deprec
dbc0: 61 74 65 64 2e 20 20 54 68 65 20 64 65 66 61 75  ated.  The defau
dbd0: 6c 74 20 73 65 74 74 69 6e 67 20 69 73 20 73 68  lt setting is sh
dbe0: 6f 72 74 3d 4f 4e 2c 20 66 75 6c 6c 3d 4f 46 46  ort=ON, full=OFF
dbf0: 2e 20 20 39 39 2e 39 25 20 6f 66 20 61 6c 6c 0a  .  99.9% of all.
dc00: 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 20  ** applications 
dc10: 73 68 6f 75 6c 64 20 6f 70 65 72 61 74 65 20 74  should operate t
dc20: 68 69 73 20 77 61 79 2e 20 20 4e 65 76 65 72 74  his way.  Nevert
dc30: 68 65 6c 65 73 73 2c 20 77 65 20 6e 65 65 64 20  heless, we need 
dc40: 74 6f 20 73 75 70 70 6f 72 74 20 74 68 65 0a 2a  to support the.*
dc50: 2a 20 6f 74 68 65 72 20 6d 6f 64 65 73 20 66 6f  * other modes fo
dc60: 72 20 6c 65 67 61 63 79 3a 0a 2a 2a 0a 2a 2a 20  r legacy:.**.** 
dc70: 20 20 20 73 68 6f 72 74 3d 4f 46 46 2c 20 66 75     short=OFF, fu
dc80: 6c 6c 3d 4f 46 46 3a 20 20 20 20 20 20 43 6f 6c  ll=OFF:      Col
dc90: 75 6d 6e 20 6e 61 6d 65 20 69 73 20 74 68 65 20  umn name is the 
dca0: 74 65 78 74 20 6f 66 20 74 68 65 20 65 78 70 72  text of the expr
dcb0: 65 73 73 69 6f 6e 20 68 61 73 20 69 74 0a 2a 2a  ession has it.**
dcc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dcd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 72                or
dce0: 69 67 69 6e 61 6c 6c 79 20 61 70 70 65 61 72 73  iginally appears
dcf0: 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73   in the SELECT s
dd00: 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e 0a 2a 2a  tatement.  In.**
dd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 74                ot
dd30: 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 7a  her words, the z
dd40: 53 70 61 6e 20 6f 66 20 74 68 65 20 72 65 73 75  Span of the resu
dd50: 6c 74 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  lt expression..*
dd60: 2a 0a 2a 2a 20 20 20 20 73 68 6f 72 74 3d 4f 4e  *.**    short=ON
dd70: 2c 20 66 75 6c 6c 3d 4f 46 46 3a 20 20 20 20 20  , full=OFF:     
dd80: 20 20 28 54 68 69 73 20 69 73 20 74 68 65 20 64    (This is the d
dd90: 65 66 61 75 6c 74 20 73 65 74 74 69 6e 67 29 2e  efault setting).
dda0: 20 20 49 66 20 74 68 65 20 72 65 73 75 6c 74 0a    If the result.
ddb0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
ddc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddd0: 72 65 66 65 72 73 20 64 69 72 65 63 74 6c 79 20  refers directly 
dde0: 74 6f 20 61 20 74 61 62 6c 65 20 63 6f 6c 75 6d  to a table colum
ddf0: 6e 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  n, then the resu
de00: 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  lt.**           
de10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de20: 20 20 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69     column name i
de30: 73 20 6a 75 73 74 20 74 68 65 20 74 61 62 6c 65  s just the table
de40: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 43 4f   column name: CO
de50: 4c 55 4d 4e 2e 20 0a 2a 2a 20 20 20 20 20 20 20  LUMN. .**       
de60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de70: 20 20 20 20 20 20 20 4f 74 68 65 72 77 69 73 65         Otherwise
de80: 20 75 73 65 20 7a 53 70 61 6e 2e 0a 2a 2a 0a 2a   use zSpan..**.*
de90: 2a 20 20 20 20 66 75 6c 6c 3d 4f 4e 2c 20 73 68  *    full=ON, sh
dea0: 6f 72 74 3d 41 4e 59 3a 20 20 20 20 20 20 20 49  ort=ANY:       I
deb0: 66 20 74 68 65 20 72 65 73 75 6c 74 20 72 65 66  f the result ref
dec0: 65 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20  ers directly to 
ded0: 61 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2c 0a  a table column,.
dee0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
def0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df00: 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
df10: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 77 69 74 68  column name with
df20: 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 0a   the table name.
df30: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
df40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df50: 70 72 65 66 69 78 2c 20 65 78 3a 20 54 41 42 4c  prefix, ex: TABL
df60: 45 2e 43 4f 4c 55 4d 4e 2e 20 20 4f 74 68 65 72  E.COLUMN.  Other
df70: 77 69 73 65 20 75 73 65 20 7a 53 70 61 6e 2e 0a  wise use zSpan..
df80: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67  */.static void g
df90: 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
dfa0: 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  es(.  Parse *pPa
dfb0: 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72  rse,      /* Par
dfc0: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
dfd0: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
dfe0: 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
dff0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f   column names fo
e000: 72 20 74 68 69 73 20 53 45 4c 45 43 54 20 73 74  r this SELECT st
e010: 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  atement */.){.  
e020: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
e030: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
e040: 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  ;.  Table *pTab;
e050: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
e060: 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73 74  List;.  ExprList
e070: 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73 71 6c 69   *pEList;.  sqli
e080: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
e090: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c 6c  ->db;.  int full
e0a0: 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 54 41 42 4c  Name;    /* TABL
e0b0: 45 2e 43 4f 4c 55 4d 4e 20 69 66 20 6e 6f 20 41  E.COLUMN if no A
e0c0: 53 20 63 6c 61 75 73 65 20 61 6e 64 20 69 73 20  S clause and is 
e0d0: 61 20 64 69 72 65 63 74 20 74 61 62 6c 65 20 72  a direct table r
e0e0: 65 66 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 4e  ef */.  int srcN
e0f0: 61 6d 65 3b 20 20 20 20 20 2f 2a 20 43 4f 4c 55  ame;     /* COLU
e100: 4d 4e 20 6f 72 20 54 41 42 4c 45 2e 43 4f 4c 55  MN or TABLE.COLU
e110: 4d 4e 20 69 66 20 6e 6f 20 41 53 20 63 6c 61 75  MN if no AS clau
e120: 73 65 20 61 6e 64 20 69 73 20 64 69 72 65 63 74  se and is direct
e130: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
e140: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
e150: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
e160: 20 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b 69   an EXPLAIN, ski
e170: 70 20 74 68 69 73 20 73 74 65 70 20 2a 2f 0a 20  p this step */. 
e180: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
e190: 6c 61 69 6e 20 29 7b 0a 20 20 20 20 72 65 74 75  lain ){.    retu
e1a0: 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  rn;.  }.#endif..
e1b0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f    if( pParse->co
e1c0: 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20 64 62 2d  lNamesSet || db-
e1d0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
e1e0: 72 65 74 75 72 6e 3b 0a 20 20 2f 2a 20 43 6f 6c  return;.  /* Col
e1f0: 75 6d 6e 20 6e 61 6d 65 73 20 61 72 65 20 64 65  umn names are de
e200: 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
e210: 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f  left-most term o
e220: 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  f a compound sel
e230: 65 63 74 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  ect */.  while( 
e240: 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20  pSelect->pPrior 
e250: 29 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c  ) pSelect = pSel
e260: 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 70  ect->pPrior;.  p
e270: 54 61 62 4c 69 73 74 20 3d 20 70 53 65 6c 65 63  TabList = pSelec
e280: 74 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73  t->pSrc;.  pELis
e290: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c  t = pSelect->pEL
e2a0: 69 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20 76  ist;.  assert( v
e2b0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
e2c0: 20 70 54 61 62 4c 69 73 74 21 3d 30 20 29 3b 0a   pTabList!=0 );.
e2d0: 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d    pParse->colNam
e2e0: 65 73 53 65 74 20 3d 20 31 3b 0a 20 20 66 75 6c  esSet = 1;.  ful
e2f0: 6c 4e 61 6d 65 20 3d 20 28 64 62 2d 3e 66 6c 61  lName = (db->fla
e300: 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c  gs & SQLITE_Full
e310: 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20  ColNames)!=0;.  
e320: 73 72 63 4e 61 6d 65 20 3d 20 28 64 62 2d 3e 66  srcName = (db->f
e330: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68  lags & SQLITE_Sh
e340: 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 20  ortColNames)!=0 
e350: 7c 7c 20 66 75 6c 6c 4e 61 6d 65 3b 0a 20 20 73  || fullName;.  s
e360: 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d  qlite3VdbeSetNum
e370: 43 6f 6c 73 28 76 2c 20 70 45 4c 69 73 74 2d 3e  Cols(v, pEList->
e380: 6e 45 78 70 72 29 3b 0a 20 20 66 6f 72 28 69 3d  nExpr);.  for(i=
e390: 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
e3a0: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
e3b0: 70 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e  pr *p = pEList->
e3c0: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 0a 20 20 20  a[i].pExpr;..   
e3d0: 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b   assert( p!=0 );
e3e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
e3f0: 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op!=TK_AGG_COLUM
e400: 4e 20 29 3b 20 20 2f 2a 20 41 67 67 20 70 72 6f  N );  /* Agg pro
e410: 63 65 73 73 69 6e 67 20 68 61 73 20 6e 6f 74 20  cessing has not 
e420: 72 75 6e 20 79 65 74 20 2a 2f 0a 20 20 20 20 61  run yet */.    a
e430: 73 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b  ssert( p->op!=TK
e440: 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 2d 3e 70 54  _COLUMN || p->pT
e450: 61 62 21 3d 30 20 29 3b 20 2f 2a 20 43 6f 76 65  ab!=0 ); /* Cove
e460: 72 69 6e 67 20 69 6e 64 65 78 65 73 20 6e 6f 74  ring indexes not
e470: 20 79 65 74 20 63 6f 64 65 64 20 2a 2f 0a 20 20   yet coded */.  
e480: 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b    if( pEList->a[
e490: 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  i].zName ){.    
e4a0: 20 20 2f 2a 20 41 6e 20 41 53 20 63 6c 61 75 73    /* An AS claus
e4b0: 65 20 61 6c 77 61 79 73 20 74 61 6b 65 73 20 66  e always takes f
e4c0: 69 72 73 74 20 70 72 69 6f 72 69 74 79 20 2a 2f  irst priority */
e4d0: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61  .      char *zNa
e4e0: 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  me = pEList->a[i
e4f0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 73  ].zName;.      s
e500: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
e510: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
e520: 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20  ME_NAME, zName, 
e530: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
e540: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
e550: 20 73 72 63 4e 61 6d 65 20 26 26 20 70 2d 3e 6f   srcName && p->o
e560: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  p==TK_COLUMN ){.
e570: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c        char *zCol
e580: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  ;.      int iCol
e590: 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20   = p->iColumn;. 
e5a0: 20 20 20 20 20 70 54 61 62 20 3d 20 70 2d 3e 70       pTab = p->p
e5b0: 54 61 62 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Tab;.      asser
e5c0: 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20  t( pTab!=0 );.  
e5d0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
e5e0: 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50   iCol = pTab->iP
e5f0: 4b 65 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Key;.      asser
e600: 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28  t( iCol==-1 || (
e610: 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c  iCol>=0 && iCol<
e620: 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20  pTab->nCol) );. 
e630: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
e640: 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20  ){.        zCol 
e650: 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20  = "rowid";.     
e660: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
e670: 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f  zCol = pTab->aCo
e680: 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20  l[iCol].zName;. 
e690: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
e6a0: 20 66 75 6c 6c 4e 61 6d 65 20 29 7b 0a 20 20 20   fullName ){.   
e6b0: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
e6c0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a 4e   = 0;.        zN
e6d0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
e6e0: 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73 22  intf(db, "%s.%s"
e6f0: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a  , pTab->zName, z
e700: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Col);.        sq
e710: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
e720: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
e730: 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53  E_NAME, zName, S
e740: 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a  QLITE_DYNAMIC);.
e750: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
e760: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e770: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
e780: 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a   COLNAME_NAME, z
e790: 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  Col, SQLITE_TRAN
e7a0: 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 7d 0a  SIENT);.      }.
e7b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e7c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
e7d0: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53   pEList->a[i].zS
e7e0: 70 61 6e 3b 0a 20 20 20 20 20 20 7a 20 3d 20 7a  pan;.      z = z
e7f0: 3d 3d 30 20 3f 20 73 71 6c 69 74 65 33 4d 50 72  ==0 ? sqlite3MPr
e800: 69 6e 74 66 28 64 62 2c 20 22 63 6f 6c 75 6d 6e  intf(db, "column
e810: 25 64 22 2c 20 69 2b 31 29 20 3a 20 73 71 6c 69  %d", i+1) : sqli
e820: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
e830: 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  z);.      sqlite
e840: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
e850: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41  v, i, COLNAME_NA
e860: 4d 45 2c 20 7a 2c 20 53 51 4c 49 54 45 5f 44 59  ME, z, SQLITE_DY
e870: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20  NAMIC);.    }.  
e880: 7d 0a 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75  }.  generateColu
e890: 6d 6e 54 79 70 65 73 28 70 50 61 72 73 65 2c 20  mnTypes(pParse, 
e8a0: 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74  pTabList, pEList
e8b0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  );.}../*.** Give
e8c0: 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  n an expression 
e8d0: 6c 69 73 74 20 28 77 68 69 63 68 20 69 73 20 72  list (which is r
e8e0: 65 61 6c 6c 79 20 74 68 65 20 6c 69 73 74 20 6f  eally the list o
e8f0: 66 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  f expressions.**
e900: 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20 72   that form the r
e910: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20 53  esult set of a S
e920: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 29  ELECT statement)
e930: 20 63 6f 6d 70 75 74 65 20 61 70 70 72 6f 70 72   compute appropr
e940: 69 61 74 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6e  iate.** column n
e950: 61 6d 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65  ames for a table
e960: 20 74 68 61 74 20 77 6f 75 6c 64 20 68 6f 6c 64   that would hold
e970: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
e980: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  list..**.** All 
e990: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 77 69 6c  column names wil
e9a0: 6c 20 62 65 20 75 6e 69 71 75 65 2e 0a 2a 2a 0a  l be unique..**.
e9b0: 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 63 6f 6c 75  ** Only the colu
e9c0: 6d 6e 20 6e 61 6d 65 73 20 61 72 65 20 63 6f 6d  mn names are com
e9d0: 70 75 74 65 64 2e 20 20 43 6f 6c 75 6d 6e 2e 7a  puted.  Column.z
e9e0: 54 79 70 65 2c 20 43 6f 6c 75 6d 6e 2e 7a 43 6f  Type, Column.zCo
e9f0: 6c 6c 2c 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72  ll,.** and other
ea00: 20 66 69 65 6c 64 73 20 6f 66 20 43 6f 6c 75 6d   fields of Colum
ea10: 6e 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a  n are zeroed..**
ea20: 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
ea30: 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e  E_OK on success.
ea40: 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c    If a memory al
ea50: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f  location error o
ea60: 63 63 75 72 73 2c 0a 2a 2a 20 73 74 6f 72 65 20  ccurs,.** store 
ea70: 4e 55 4c 4c 20 69 6e 20 2a 70 61 43 6f 6c 20 61  NULL in *paCol a
ea80: 6e 64 20 30 20 69 6e 20 2a 70 6e 43 6f 6c 20 61  nd 0 in *pnCol a
ea90: 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
eaa0: 5f 4e 4f 4d 45 4d 2e 0a 2a 2a 0a 2a 2a 20 54 68  _NOMEM..**.** Th
eab0: 65 20 6f 6e 6c 79 20 67 75 61 72 61 6e 74 65 65  e only guarantee
eac0: 20 74 68 61 74 20 53 51 4c 69 74 65 20 6d 61 6b   that SQLite mak
ead0: 65 73 20 61 62 6f 75 74 20 63 6f 6c 75 6d 6e 20  es about column 
eae0: 6e 61 6d 65 73 20 69 73 20 74 68 61 74 20 69 66  names is that if
eaf0: 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 68   the.** column h
eb00: 61 73 20 61 6e 20 41 53 20 63 6c 61 75 73 65 20  as an AS clause 
eb10: 61 73 73 69 67 6e 69 6e 67 20 69 74 20 61 20 6e  assigning it a n
eb20: 61 6d 65 2c 20 74 68 61 74 20 77 69 6c 6c 20 62  ame, that will b
eb30: 65 20 74 68 65 20 6e 61 6d 65 20 75 73 65 64 2e  e the name used.
eb40: 0a 2a 2a 20 54 68 61 74 20 69 73 20 74 68 65 20  .** That is the 
eb50: 6f 6e 6c 79 20 64 6f 63 75 6d 65 6e 74 65 64 20  only documented 
eb60: 67 75 61 72 61 6e 74 65 65 2e 20 20 48 6f 77 65  guarantee.  Howe
eb70: 76 65 72 2c 20 63 6f 75 6e 74 6c 65 73 73 20 61  ver, countless a
eb80: 70 70 6c 69 63 61 74 69 6f 6e 73 0a 2a 2a 20 64  pplications.** d
eb90: 65 76 65 6c 6f 70 65 64 20 6f 76 65 72 20 74 68  eveloped over th
eba0: 65 20 79 65 61 72 73 20 68 61 76 65 20 6d 61 64  e years have mad
ebb0: 65 20 62 61 73 65 6c 65 73 73 20 61 73 73 75 6d  e baseless assum
ebc0: 70 74 69 6f 6e 73 20 61 62 6f 75 74 20 63 6f 6c  ptions about col
ebd0: 75 6d 6e 20 6e 61 6d 65 73 0a 2a 2a 20 61 6e 64  umn names.** and
ebe0: 20 77 69 6c 6c 20 62 72 65 61 6b 20 69 66 20 74   will break if t
ebf0: 68 6f 73 65 20 61 73 73 75 6d 70 74 69 6f 6e 73  hose assumptions
ec00: 20 63 68 61 6e 67 65 73 2e 20 20 48 65 6e 63 65   changes.  Hence
ec10: 2c 20 75 73 65 20 65 78 74 72 65 6d 65 20 63 61  , use extreme ca
ec20: 75 74 69 6f 6e 0a 2a 2a 20 77 68 65 6e 20 6d 6f  ution.** when mo
ec30: 64 69 66 79 69 6e 67 20 74 68 69 73 20 72 6f 75  difying this rou
ec40: 74 69 6e 65 20 74 6f 20 61 76 6f 69 64 20 62 72  tine to avoid br
ec50: 65 61 6b 69 6e 67 20 6c 65 67 61 63 79 2e 0a 2a  eaking legacy..*
ec60: 2a 0a 2a 2a 20 53 65 65 20 41 6c 73 6f 3a 20 67  *.** See Also: g
ec70: 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
ec80: 65 73 28 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  es().*/.int sqli
ec90: 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78  te3ColumnsFromEx
eca0: 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20  prList(.  Parse 
ecb0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
ecc0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
ecd0: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
ece0: 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20  st *pEList,     
ecf0: 20 20 2f 2a 20 45 78 70 72 20 6c 69 73 74 20 66    /* Expr list f
ed00: 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 64 65 72  rom which to der
ed10: 69 76 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  ive column names
ed20: 20 2a 2f 0a 20 20 69 31 36 20 2a 70 6e 43 6f 6c   */.  i16 *pnCol
ed30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
ed40: 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65   Write the numbe
ed50: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 68 65 72  r of columns her
ed60: 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 2a  e */.  Column **
ed70: 70 61 43 6f 6c 20 20 20 20 20 20 20 20 20 20 2f  paCol          /
ed80: 2a 20 57 72 69 74 65 20 74 68 65 20 6e 65 77 20  * Write the new 
ed90: 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 65 72 65  column list here
eda0: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
edb0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
edc0: 62 3b 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65  b;   /* Database
edd0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
ede0: 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
edf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ee00: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
ee10: 0a 20 20 75 33 32 20 63 6e 74 3b 20 20 20 20 20  .  u32 cnt;     
ee20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ee30: 2a 20 49 6e 64 65 78 20 61 64 64 65 64 20 74 6f  * Index added to
ee40: 20 6d 61 6b 65 20 74 68 65 20 6e 61 6d 65 20 75   make the name u
ee50: 6e 69 71 75 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d  nique */.  Colum
ee60: 6e 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 20  n *aCol, *pCol; 
ee70: 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
ee80: 6f 70 69 6e 67 20 6f 76 65 72 20 72 65 73 75 6c  oping over resul
ee90: 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69  t columns */.  i
eea0: 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20  nt nCol;        
eeb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
eec0: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
eed0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
eee0: 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61  t */.  char *zNa
eef0: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  me;             
ef00: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d     /* Column nam
ef10: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65  e */.  int nName
ef20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ef30: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6e 61     /* Size of na
ef40: 6d 65 20 69 6e 20 7a 4e 61 6d 65 5b 5d 20 2a 2f  me in zName[] */
ef50: 0a 20 20 48 61 73 68 20 68 74 3b 20 20 20 20 20  .  Hash ht;     
ef60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ef70: 2a 20 48 61 73 68 20 74 61 62 6c 65 20 6f 66 20  * Hash table of 
ef80: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a  column names */.
ef90: 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e  .  sqlite3HashIn
efa0: 69 74 28 26 68 74 29 3b 0a 20 20 69 66 28 20 70  it(&ht);.  if( p
efb0: 45 4c 69 73 74 20 29 7b 0a 20 20 20 20 6e 43 6f  EList ){.    nCo
efc0: 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  l = pEList->nExp
efd0: 72 3b 0a 20 20 20 20 61 43 6f 6c 20 3d 20 73 71  r;.    aCol = sq
efe0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
eff0: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 61 43 6f  o(db, sizeof(aCo
f000: 6c 5b 30 5d 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20  l[0])*nCol);.   
f010: 20 74 65 73 74 63 61 73 65 28 20 61 43 6f 6c 3d   testcase( aCol=
f020: 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  =0 );.  }else{. 
f030: 20 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20     nCol = 0;.   
f040: 20 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20   aCol = 0;.  }. 
f050: 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 3d 3d 28   assert( nCol==(
f060: 69 31 36 29 6e 43 6f 6c 20 29 3b 0a 20 20 2a 70  i16)nCol );.  *p
f070: 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 2a  nCol = nCol;.  *
f080: 70 61 43 6f 6c 20 3d 20 61 43 6f 6c 3b 0a 0a 20  paCol = aCol;.. 
f090: 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61   for(i=0, pCol=a
f0a0: 43 6f 6c 3b 20 69 3c 6e 43 6f 6c 20 26 26 20 21  Col; i<nCol && !
f0b0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
f0c0: 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; i++, pCol++){.
f0d0: 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 61 70      /* Get an ap
f0e0: 70 72 6f 70 72 69 61 74 65 20 6e 61 6d 65 20 66  propriate name f
f0f0: 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20  or the column.  
f100: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 7a 4e    */.    if( (zN
f110: 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  ame = pEList->a[
f120: 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a  i].zName)!=0 ){.
f130: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
f140: 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20  column contains 
f150: 61 6e 20 22 41 53 20 3c 6e 61 6d 65 3e 22 20 70  an "AS <name>" p
f160: 68 72 61 73 65 2c 20 75 73 65 20 3c 6e 61 6d 65  hrase, use <name
f170: 3e 20 61 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f  > as the name */
f180: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
f190: 20 20 45 78 70 72 20 2a 70 43 6f 6c 45 78 70 72    Expr *pColExpr
f1a0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
f1b0: 69 70 43 6f 6c 6c 61 74 65 28 70 45 4c 69 73 74  ipCollate(pEList
f1c0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
f1d0: 20 20 20 20 20 77 68 69 6c 65 28 20 70 43 6f 6c       while( pCol
f1e0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54  Expr->op==TK_DOT
f1f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c   ){.        pCol
f200: 45 78 70 72 20 3d 20 70 43 6f 6c 45 78 70 72 2d  Expr = pColExpr-
f210: 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20  >pRight;.       
f220: 20 61 73 73 65 72 74 28 20 70 43 6f 6c 45 78 70   assert( pColExp
f230: 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a  r!=0 );.      }.
f240: 20 20 20 20 20 20 69 66 28 20 28 70 43 6f 6c 45        if( (pColE
f250: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
f260: 4d 4e 20 7c 7c 20 70 43 6f 6c 45 78 70 72 2d 3e  MN || pColExpr->
f270: 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
f280: 4e 29 0a 20 20 20 20 20 20 20 26 26 20 70 43 6f  N).       && pCo
f290: 6c 45 78 70 72 2d 3e 70 54 61 62 21 3d 30 20 0a  lExpr->pTab!=0 .
f2a0: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
f2b0: 20 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e 73 20   /* For columns 
f2c0: 75 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  use the column n
f2d0: 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  ame name */.    
f2e0: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
f2f0: 43 6f 6c 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ColExpr->iColumn
f300: 3b 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65 20  ;.        Table 
f310: 2a 70 54 61 62 20 3d 20 70 43 6f 6c 45 78 70 72  *pTab = pColExpr
f320: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  ->pTab;.        
f330: 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f  if( iCol<0 ) iCo
f340: 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b  l = pTab->iPKey;
f350: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
f360: 20 69 43 6f 6c 3e 3d 30 20 3f 20 70 54 61 62 2d   iCol>=0 ? pTab-
f370: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d  >aCol[iCol].zNam
f380: 65 20 3a 20 22 72 6f 77 69 64 22 3b 0a 20 20 20  e : "rowid";.   
f390: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 6f     }else if( pCo
f3a0: 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44  lExpr->op==TK_ID
f3b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
f3c0: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
f3d0: 65 72 74 79 28 70 43 6f 6c 45 78 70 72 2c 20 45  erty(pColExpr, E
f3e0: 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
f3f0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70         zName = p
f400: 43 6f 6c 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  ColExpr->u.zToke
f410: 6e 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  n;.      }else{.
f420: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74          /* Use t
f430: 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 78 74  he original text
f440: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 65   of the column e
f450: 78 70 72 65 73 73 69 6f 6e 20 61 73 20 69 74 73  xpression as its
f460: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20   name */.       
f470: 20 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d   zName = pEList-
f480: 3e 61 5b 69 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20  >a[i].zSpan;.   
f490: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
f4a0: 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( zName ){.    
f4b0: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
f4c0: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a 4e  3DbStrDup(db, zN
f4d0: 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ame);.    }else{
f4e0: 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  .      zName = s
f4f0: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
f500: 2c 22 63 6f 6c 75 6d 6e 25 64 22 2c 69 2b 31 29  ,"column%d",i+1)
f510: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
f520: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 6f  Make sure the co
f530: 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 75 6e 69  lumn name is uni
f540: 71 75 65 2e 20 20 49 66 20 74 68 65 20 6e 61 6d  que.  If the nam
f550: 65 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 2c  e is not unique,
f560: 0a 20 20 20 20 2a 2a 20 61 70 70 65 6e 64 20 61  .    ** append a
f570: 6e 20 69 6e 74 65 67 65 72 20 74 6f 20 74 68 65  n integer to the
f580: 20 6e 61 6d 65 20 73 6f 20 74 68 61 74 20 69 74   name so that it
f590: 20 62 65 63 6f 6d 65 73 20 75 6e 69 71 75 65 2e   becomes unique.
f5a0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 6e 74 20  .    */.    cnt 
f5b0: 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  = 0;.    while( 
f5c0: 7a 4e 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33  zName && sqlite3
f5d0: 48 61 73 68 46 69 6e 64 28 26 68 74 2c 20 7a 4e  HashFind(&ht, zN
f5e0: 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ame)!=0 ){.     
f5f0: 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   nName = sqlite3
f600: 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b  Strlen30(zName);
f610: 0a 20 20 20 20 20 20 69 66 28 20 6e 4e 61 6d 65  .      if( nName
f620: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f  >0 ){.        fo
f630: 72 28 6a 3d 6e 4e 61 6d 65 2d 31 3b 20 6a 3e 30  r(j=nName-1; j>0
f640: 20 26 26 20 73 71 6c 69 74 65 33 49 73 64 69 67   && sqlite3Isdig
f650: 69 74 28 7a 4e 61 6d 65 5b 6a 5d 29 3b 20 6a 2d  it(zName[j]); j-
f660: 2d 29 7b 7d 0a 20 20 20 20 20 20 20 20 69 66 28  -){}.        if(
f670: 20 7a 4e 61 6d 65 5b 6a 5d 3d 3d 27 3a 27 20 29   zName[j]==':' )
f680: 20 6e 4e 61 6d 65 20 3d 20 6a 3b 0a 20 20 20 20   nName = j;.    
f690: 20 20 7d 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20    }.      zName 
f6a0: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
f6b0: 28 64 62 2c 20 22 25 2e 2a 7a 3a 25 75 22 2c 20  (db, "%.*z:%u", 
f6c0: 6e 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2b 2b  nName, zName, ++
f6d0: 63 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  cnt);.      if( 
f6e0: 63 6e 74 3e 33 20 29 20 73 71 6c 69 74 65 33 5f  cnt>3 ) sqlite3_
f6f0: 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f  randomness(sizeo
f700: 66 28 63 6e 74 29 2c 20 26 63 6e 74 29 3b 0a 20  f(cnt), &cnt);. 
f710: 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a     }.    pCol->z
f720: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
f730: 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 50    sqlite3ColumnP
f740: 72 6f 70 65 72 74 69 65 73 46 72 6f 6d 4e 61 6d  ropertiesFromNam
f750: 65 28 30 2c 20 70 43 6f 6c 29 3b 0a 20 20 20 20  e(0, pCol);.    
f760: 69 66 28 20 7a 4e 61 6d 65 20 26 26 20 73 71 6c  if( zName && sql
f770: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
f780: 68 74 2c 20 7a 4e 61 6d 65 2c 20 70 43 6f 6c 29  ht, zName, pCol)
f790: 3d 3d 70 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  ==pCol ){.      
f7a0: 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28  sqlite3OomFault(
f7b0: 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  db);.    }.  }. 
f7c0: 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61   sqlite3HashClea
f7d0: 72 28 26 68 74 29 3b 0a 20 20 69 66 28 20 64 62  r(&ht);.  if( db
f7e0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
f7f0: 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  {.    for(j=0; j
f800: 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  <i; j++){.      
f810: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
f820: 2c 20 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29  , aCol[j].zName)
f830: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
f840: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 61 43  te3DbFree(db, aC
f850: 6f 6c 29 3b 0a 20 20 20 20 2a 70 61 43 6f 6c 20  ol);.    *paCol 
f860: 3d 20 30 3b 0a 20 20 20 20 2a 70 6e 43 6f 6c 20  = 0;.    *pnCol 
f870: 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
f880: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
f890: 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  T;.  }.  return 
f8a0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
f8b0: 0a 2a 2a 20 41 64 64 20 74 79 70 65 20 61 6e 64  .** Add type and
f8c0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72   collation infor
f8d0: 6d 61 74 69 6f 6e 20 74 6f 20 61 20 63 6f 6c 75  mation to a colu
f8e0: 6d 6e 20 6c 69 73 74 20 62 61 73 65 64 20 6f 6e  mn list based on
f8f0: 0a 2a 2a 20 61 20 53 45 4c 45 43 54 20 73 74 61  .** a SELECT sta
f900: 74 65 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20 54  tement..** .** T
f910: 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 70  he column list p
f920: 72 65 73 75 6d 61 62 6c 79 20 63 61 6d 65 20 66  resumably came f
f930: 72 6f 6d 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e  rom selectColumn
f940: 4e 61 6d 65 73 46 72 6f 6d 45 78 70 72 4c 69 73  NamesFromExprLis
f950: 74 28 29 2e 0a 2a 2a 20 54 68 65 20 63 6f 6c 75  t()..** The colu
f960: 6d 6e 20 6c 69 73 74 20 68 61 73 20 6f 6e 6c 79  mn list has only
f970: 20 6e 61 6d 65 73 2c 20 6e 6f 74 20 74 79 70 65   names, not type
f980: 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e  s or collations.
f990: 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e    This.** routin
f9a0: 65 20 67 6f 65 73 20 74 68 72 6f 75 67 68 20 61  e goes through a
f9b0: 6e 64 20 61 64 64 73 20 74 68 65 20 74 79 70 65  nd adds the type
f9c0: 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73  s and collations
f9d0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
f9e0: 74 69 6e 65 20 72 65 71 75 69 72 65 73 20 74 68  tine requires th
f9f0: 61 74 20 61 6c 6c 20 69 64 65 6e 74 69 66 69 65  at all identifie
fa00: 72 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54  rs in the SELECT
fa10: 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 62 65  .** statement be
fa20: 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f 0a 76 6f   resolved..*/.vo
fa30: 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  id sqlite3Select
fa40: 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64  AddColumnTypeAnd
fa50: 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 50 61 72  Collation(.  Par
fa60: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
fa70: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
fa80: 6e 74 65 78 74 73 20 2a 2f 0a 20 20 54 61 62 6c  ntexts */.  Tabl
fa90: 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20  e *pTab,        
faa0: 20 20 2f 2a 20 41 64 64 20 63 6f 6c 75 6d 6e 20    /* Add column 
fab0: 74 79 70 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  type information
fac0: 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a   to this table *
fad0: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
fae0: 65 63 74 20 20 20 20 20 20 20 2f 2a 20 53 45 4c  ect       /* SEL
faf0: 45 43 54 20 75 73 65 64 20 74 6f 20 64 65 74 65  ECT used to dete
fb00: 72 6d 69 6e 65 20 74 79 70 65 73 20 61 6e 64 20  rmine types and 
fb10: 63 6f 6c 6c 61 74 69 6f 6e 73 20 2a 2f 0a 29 7b  collations */.){
fb20: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
fb30: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4e   pParse->db;.  N
fb40: 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a  ameContext sNC;.
fb50: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a    Column *pCol;.
fb60: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
fb70: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78 70  ;.  int i;.  Exp
fb80: 72 20 2a 70 3b 0a 20 20 73 74 72 75 63 74 20 45  r *p;.  struct E
fb90: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b  xprList_item *a;
fba0: 0a 20 20 75 36 34 20 73 7a 41 6c 6c 20 3d 20 30  .  u64 szAll = 0
fbb0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53 65  ;..  assert( pSe
fbc0: 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  lect!=0 );.  ass
fbd0: 65 72 74 28 20 28 70 53 65 6c 65 63 74 2d 3e 73  ert( (pSelect->s
fbe0: 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73  elFlags & SF_Res
fbf0: 6f 6c 76 65 64 29 21 3d 30 20 29 3b 0a 20 20 61  olved)!=0 );.  a
fc00: 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f  ssert( pTab->nCo
fc10: 6c 3d 3d 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  l==pSelect->pELi
fc20: 73 74 2d 3e 6e 45 78 70 72 20 7c 7c 20 64 62 2d  st->nExpr || db-
fc30: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
fc40: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
fc50: 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
fc60: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c  ;.  memset(&sNC,
fc70: 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29   0, sizeof(sNC))
fc80: 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74  ;.  sNC.pSrcList
fc90: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63   = pSelect->pSrc
fca0: 3b 0a 20 20 61 20 3d 20 70 53 65 6c 65 63 74 2d  ;.  a = pSelect-
fcb0: 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 66 6f  >pEList->a;.  fo
fcc0: 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62  r(i=0, pCol=pTab
fcd0: 2d 3e 61 43 6f 6c 3b 20 69 3c 70 54 61 62 2d 3e  ->aCol; i<pTab->
fce0: 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b  nCol; i++, pCol+
fcf0: 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  +){.    const ch
fd00: 61 72 20 2a 7a 54 79 70 65 3b 0a 20 20 20 20 69  ar *zType;.    i
fd10: 6e 74 20 6e 2c 20 6d 3b 0a 20 20 20 20 70 20 3d  nt n, m;.    p =
fd20: 20 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20   a[i].pExpr;.   
fd30: 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54   zType = columnT
fd40: 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c 20  ype(&sNC, p, 0, 
fd50: 30 2c 20 30 2c 20 26 70 43 6f 6c 2d 3e 73 7a 45  0, 0, &pCol->szE
fd60: 73 74 29 3b 0a 20 20 20 20 73 7a 41 6c 6c 20 2b  st);.    szAll +
fd70: 3d 20 70 43 6f 6c 2d 3e 73 7a 45 73 74 3b 0a 20  = pCol->szEst;. 
fd80: 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74     pCol->affinit
fd90: 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  y = sqlite3ExprA
fda0: 66 66 69 6e 69 74 79 28 70 29 3b 0a 20 20 20 20  ffinity(p);.    
fdb0: 69 66 28 20 7a 54 79 70 65 20 26 26 20 28 6d 20  if( zType && (m 
fdc0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
fdd0: 30 28 7a 54 79 70 65 29 29 3e 30 20 29 7b 0a 20  0(zType))>0 ){. 
fde0: 20 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33       n = sqlite3
fdf0: 53 74 72 6c 65 6e 33 30 28 70 43 6f 6c 2d 3e 7a  Strlen30(pCol->z
fe00: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 43 6f  Name);.      pCo
fe10: 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  l->zName = sqlit
fe20: 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65  e3DbReallocOrFre
fe30: 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d  e(db, pCol->zNam
fe40: 65 2c 20 6e 2b 6d 2b 32 29 3b 0a 20 20 20 20 20  e, n+m+2);.     
fe50: 20 69 66 28 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65   if( pCol->zName
fe60: 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   ){.        memc
fe70: 70 79 28 26 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 5b  py(&pCol->zName[
fe80: 6e 2b 31 5d 2c 20 7a 54 79 70 65 2c 20 6d 2b 31  n+1], zType, m+1
fe90: 29 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 2d  );.        pCol-
fea0: 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c  >colFlags |= COL
feb0: 46 4c 41 47 5f 48 41 53 54 59 50 45 3b 0a 20 20  FLAG_HASTYPE;.  
fec0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
fed0: 69 66 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  if( pCol->affini
fee0: 74 79 3d 3d 30 20 29 20 70 43 6f 6c 2d 3e 61 66  ty==0 ) pCol->af
fef0: 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f  finity = SQLITE_
ff00: 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 70 43  AFF_BLOB;.    pC
ff10: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
ff20: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
ff30: 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f   p);.    if( pCo
ff40: 6c 6c 20 26 26 20 70 43 6f 6c 2d 3e 7a 43 6f 6c  ll && pCol->zCol
ff50: 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 43  l==0 ){.      pC
ff60: 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69  ol->zColl = sqli
ff70: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
ff80: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pColl->zName);. 
ff90: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 54 61 62 2d     }.  }.  pTab-
ffa0: 3e 73 7a 54 61 62 52 6f 77 20 3d 20 73 71 6c 69  >szTabRow = sqli
ffb0: 74 65 33 4c 6f 67 45 73 74 28 73 7a 41 6c 6c 2a  te3LogEst(szAll*
ffc0: 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  4);.}../*.** Giv
ffd0: 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  en a SELECT stat
ffe0: 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65 20  ement, generate 
fff0: 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  a Table structur
10000 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
10010 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73  .** the result s
10020 65 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45 43  et of that SELEC
10030 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c  T..*/.Table *sql
10040 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
10050 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61  elect(Parse *pPa
10060 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  rse, Select *pSe
10070 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a  lect){.  Table *
10080 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 20  pTab;.  sqlite3 
10090 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
100a0 3b 0a 20 20 69 6e 74 20 73 61 76 65 64 46 6c 61  ;.  int savedFla
100b0 67 73 3b 0a 0a 20 20 73 61 76 65 64 46 6c 61 67  gs;..  savedFlag
100c0 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b 0a 20  s = db->flags;. 
100d0 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
100e0 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d  QLITE_FullColNam
100f0 65 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20  es;.  db->flags 
10100 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43  |= SQLITE_ShortC
10110 6f 6c 4e 61 6d 65 73 3b 0a 20 20 73 71 6c 69 74  olNames;.  sqlit
10120 65 33 53 65 6c 65 63 74 50 72 65 70 28 70 50 61  e3SelectPrep(pPa
10130 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 30 29  rse, pSelect, 0)
10140 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
10150 6e 45 72 72 20 29 20 72 65 74 75 72 6e 20 30 3b  nErr ) return 0;
10160 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65 63  .  while( pSelec
10170 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c  t->pPrior ) pSel
10180 65 63 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70  ect = pSelect->p
10190 50 72 69 6f 72 3b 0a 20 20 64 62 2d 3e 66 6c 61  Prior;.  db->fla
101a0 67 73 20 3d 20 73 61 76 65 64 46 6c 61 67 73 3b  gs = savedFlags;
101b0 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65  .  pTab = sqlite
101c0 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
101d0 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20  , sizeof(Table) 
101e0 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30  );.  if( pTab==0
101f0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
10200 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20 73  ;.  }.  /* The s
10210 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
10220 66 53 65 6c 65 63 74 28 29 20 69 73 20 6f 6e 6c  fSelect() is onl
10230 79 20 75 73 65 64 20 6e 20 63 6f 6e 74 65 78 74  y used n context
10240 73 20 77 68 65 72 65 20 6c 6f 6f 6b 61 73 69 64  s where lookasid
10250 65 0a 20 20 2a 2a 20 69 73 20 64 69 73 61 62 6c  e.  ** is disabl
10260 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ed */.  assert( 
10270 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44  db->lookaside.bD
10280 69 73 61 62 6c 65 20 29 3b 0a 20 20 70 54 61 62  isable );.  pTab
10290 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b 0a 20  ->nTabRef = 1;. 
102a0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30   pTab->zName = 0
102b0 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f  ;.  pTab->nRowLo
102c0 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65  gEst = 200; asse
102d0 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33  rt( 200==sqlite3
102e0 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36 29 20  LogEst(1048576) 
102f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c 75  );.  sqlite3Colu
10300 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  mnsFromExprList(
10310 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2d  pParse, pSelect-
10320 3e 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e  >pEList, &pTab->
10330 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f  nCol, &pTab->aCo
10340 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  l);.  sqlite3Sel
10350 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65  ectAddColumnType
10360 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61  AndCollation(pPa
10370 72 73 65 2c 20 70 54 61 62 2c 20 70 53 65 6c 65  rse, pTab, pSele
10380 63 74 29 3b 0a 20 20 70 54 61 62 2d 3e 69 50 4b  ct);.  pTab->iPK
10390 65 79 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 64  ey = -1;.  if( d
103a0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
103b0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
103c0 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 54  leteTable(db, pT
103d0 61 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ab);.    return 
103e0 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
103f0 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  pTab;.}../*.** G
10400 65 74 20 61 20 56 44 42 45 20 66 6f 72 20 74 68  et a VDBE for th
10410 65 20 67 69 76 65 6e 20 70 61 72 73 65 72 20 63  e given parser c
10420 6f 6e 74 65 78 74 2e 20 20 43 72 65 61 74 65 20  ontext.  Create 
10430 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63  a new one if nec
10440 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66 20 61 6e  essary..** If an
10450 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
10460 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c  eturn NULL and l
10470 65 61 76 65 20 61 20 6d 65 73 73 61 67 65 20 69  eave a message i
10480 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 56 64 62  n pParse..*/.Vdb
10490 65 20 2a 73 71 6c 69 74 65 33 47 65 74 56 64 62  e *sqlite3GetVdb
104a0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  e(Parse *pParse)
104b0 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  {.  if( pParse->
104c0 70 56 64 62 65 20 29 7b 0a 20 20 20 20 72 65 74  pVdbe ){.    ret
104d0 75 72 6e 20 70 50 61 72 73 65 2d 3e 70 56 64 62  urn pParse->pVdb
104e0 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  e;.  }.  if( pPa
104f0 72 73 65 2d 3e 70 54 6f 70 6c 65 76 65 6c 3d 3d  rse->pToplevel==
10500 30 0a 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61  0.   && Optimiza
10510 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70 50 61 72  tionEnabled(pPar
10520 73 65 2d 3e 64 62 2c 53 51 4c 49 54 45 5f 46 61  se->db,SQLITE_Fa
10530 63 74 6f 72 4f 75 74 43 6f 6e 73 74 29 0a 20 20  ctorOutConst).  
10540 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6f  ){.    pParse->o
10550 6b 43 6f 6e 73 74 46 61 63 74 6f 72 20 3d 20 31  kConstFactor = 1
10560 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73  ;.  }.  return s
10570 71 6c 69 74 65 33 56 64 62 65 43 72 65 61 74 65  qlite3VdbeCreate
10580 28 70 50 61 72 73 65 29 3b 0a 7d 0a 0a 0a 2f 2a  (pParse);.}.../*
10590 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20  .** Compute the 
105a0 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73  iLimit and iOffs
105b0 65 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  et fields of the
105c0 20 53 45 4c 45 43 54 20 62 61 73 65 64 20 6f 6e   SELECT based on
105d0 20 74 68 65 0a 2a 2a 20 70 4c 69 6d 69 74 20 61   the.** pLimit a
105e0 6e 64 20 70 4f 66 66 73 65 74 20 65 78 70 72 65  nd pOffset expre
105f0 73 73 69 6f 6e 73 2e 20 20 70 4c 69 6d 69 74 20  ssions.  pLimit 
10600 61 6e 64 20 70 4f 66 66 73 65 74 20 68 6f 6c 64  and pOffset hold
10610 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
10620 0a 2a 2a 20 74 68 61 74 20 61 70 70 65 61 72 20  .** that appear 
10630 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  in the original 
10640 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 66  SQL statement af
10650 74 65 72 20 74 68 65 20 4c 49 4d 49 54 20 61 6e  ter the LIMIT an
10660 64 20 4f 46 46 53 45 54 0a 2a 2a 20 6b 65 79 77  d OFFSET.** keyw
10670 6f 72 64 73 2e 20 20 4f 72 20 4e 55 4c 4c 20 69  ords.  Or NULL i
10680 66 20 74 68 6f 73 65 20 6b 65 79 77 6f 72 64 73  f those keywords
10690 20 61 72 65 20 6f 6d 69 74 74 65 64 2e 20 69 4c   are omitted. iL
106a0 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74  imit and iOffset
106b0 20 0a 2a 2a 20 61 72 65 20 74 68 65 20 69 6e 74   .** are the int
106c0 65 67 65 72 20 6d 65 6d 6f 72 79 20 72 65 67 69  eger memory regi
106d0 73 74 65 72 20 6e 75 6d 62 65 72 73 20 66 6f 72  ster numbers for
106e0 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20 74   counters used t
106f0 6f 20 63 6f 6d 70 75 74 65 20 0a 2a 2a 20 74 68  o compute .** th
10700 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73  e limit and offs
10710 65 74 2e 20 20 49 66 20 74 68 65 72 65 20 69 73  et.  If there is
10720 20 6e 6f 20 6c 69 6d 69 74 20 61 6e 64 2f 6f 72   no limit and/or
10730 20 6f 66 66 73 65 74 2c 20 74 68 65 6e 20 0a 2a   offset, then .*
10740 2a 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66  * iLimit and iOf
10750 66 73 65 74 20 61 72 65 20 6e 65 67 61 74 69 76  fset are negativ
10760 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
10770 75 74 69 6e 65 20 63 68 61 6e 67 65 73 20 74 68  utine changes th
10780 65 20 76 61 6c 75 65 73 20 6f 66 20 69 4c 69 6d  e values of iLim
10790 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 6f  it and iOffset o
107a0 6e 6c 79 20 69 66 0a 2a 2a 20 61 20 6c 69 6d 69  nly if.** a limi
107b0 74 20 6f 72 20 6f 66 66 73 65 74 20 69 73 20 64  t or offset is d
107c0 65 66 69 6e 65 64 20 62 79 20 70 4c 69 6d 69 74  efined by pLimit
107d0 20 61 6e 64 20 70 4f 66 66 73 65 74 2e 20 20 69   and pOffset.  i
107e0 4c 69 6d 69 74 20 61 6e 64 0a 2a 2a 20 69 4f 66  Limit and.** iOf
107f0 66 73 65 74 20 73 68 6f 75 6c 64 20 68 61 76 65  fset should have
10800 20 62 65 65 6e 20 70 72 65 73 65 74 20 74 6f 20   been preset to 
10810 61 70 70 72 6f 70 72 69 61 74 65 20 64 65 66 61  appropriate defa
10820 75 6c 74 20 76 61 6c 75 65 73 20 28 7a 65 72 6f  ult values (zero
10830 29 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61  ).** prior to ca
10840 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
10850 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 4f  ne..**.** The iO
10860 66 66 73 65 74 20 72 65 67 69 73 74 65 72 20 28  ffset register (
10870 69 66 20 69 74 20 65 78 69 73 74 73 29 20 69 73  if it exists) is
10880 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
10890 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20  the value.** of 
108a0 74 68 65 20 4f 46 46 53 45 54 2e 20 20 54 68 65  the OFFSET.  The
108b0 20 69 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72   iLimit register
108c0 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
108d0 74 6f 20 4c 49 4d 49 54 2e 20 20 52 65 67 69 73  to LIMIT.  Regis
108e0 74 65 72 0a 2a 2a 20 69 4f 66 66 73 65 74 2b 31  ter.** iOffset+1
108f0 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
10900 74 6f 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 2e  to LIMIT+OFFSET.
10910 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20 70  .**.** Only if p
10920 4c 69 6d 69 74 21 3d 30 20 6f 72 20 70 4f 66 66  Limit!=0 or pOff
10930 73 65 74 21 3d 30 20 64 6f 20 74 68 65 20 6c 69  set!=0 do the li
10940 6d 69 74 20 72 65 67 69 73 74 65 72 73 20 67 65  mit registers ge
10950 74 0a 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e 20  t.** redefined. 
10960 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f   The UNION ALL o
10970 70 65 72 61 74 6f 72 20 75 73 65 73 20 74 68 69  perator uses thi
10980 73 20 70 72 6f 70 65 72 74 79 20 74 6f 20 66 6f  s property to fo
10990 72 63 65 0a 2a 2a 20 74 68 65 20 72 65 75 73 65  rce.** the reuse
109a0 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6c 69 6d   of the same lim
109b0 69 74 20 61 6e 64 20 6f 66 66 73 65 74 20 72 65  it and offset re
109c0 67 69 73 74 65 72 73 20 61 63 72 6f 73 73 20 6d  gisters across m
109d0 75 6c 74 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43  ultiple.** SELEC
109e0 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f  T statements..*/
109f0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6d  .static void com
10a00 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
10a10 72 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  rs(Parse *pParse
10a20 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
10a30 20 69 42 72 65 61 6b 29 7b 0a 20 20 56 64 62 65   iBreak){.  Vdbe
10a40 20 2a 76 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69   *v = 0;.  int i
10a50 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74  Limit = 0;.  int
10a60 20 69 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74 20   iOffset;.  int 
10a70 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d  n;.  if( p->iLim
10a80 69 74 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  it ) return;..  
10a90 2f 2a 20 0a 20 20 2a 2a 20 22 4c 49 4d 49 54 20  /* .  ** "LIMIT 
10aa0 2d 31 22 20 61 6c 77 61 79 73 20 73 68 6f 77 73  -1" always shows
10ab0 20 61 6c 6c 20 72 6f 77 73 2e 20 20 54 68 65 72   all rows.  Ther
10ac0 65 20 69 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 63  e is some.  ** c
10ad0 6f 6e 74 72 6f 76 65 72 73 79 20 61 62 6f 75 74  ontroversy about
10ae0 20 77 68 61 74 20 74 68 65 20 63 6f 72 72 65 63   what the correc
10af0 74 20 62 65 68 61 76 69 6f 72 20 73 68 6f 75 6c  t behavior shoul
10b00 64 20 62 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63  d be..  ** The c
10b10 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74  urrent implement
10b20 61 74 69 6f 6e 20 69 6e 74 65 72 70 72 65 74 73  ation interprets
10b30 20 22 4c 49 4d 49 54 20 30 22 20 74 6f 20 6d 65   "LIMIT 0" to me
10b40 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e  an.  ** no rows.
10b50 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45  .  */.  sqlite3E
10b60 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
10b70 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28  arse);.  assert(
10b80 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20 7c   p->pOffset==0 |
10b90 7c 20 70 2d 3e 70 4c 69 6d 69 74 21 3d 30 20 29  | p->pLimit!=0 )
10ba0 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69  ;.  if( p->pLimi
10bb0 74 20 29 7b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d  t ){.    p->iLim
10bc0 69 74 20 3d 20 69 4c 69 6d 69 74 20 3d 20 2b 2b  it = iLimit = ++
10bd0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
10be0 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
10bf0 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
10c00 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
10c10 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
10c20 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
10c30 2d 3e 70 4c 69 6d 69 74 2c 20 26 6e 29 20 29 7b  ->pLimit, &n) ){
10c40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10c50 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
10c60 6e 74 65 67 65 72 2c 20 6e 2c 20 69 4c 69 6d 69  nteger, n, iLimi
10c70 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  t);.      VdbeCo
10c80 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54  mment((v, "LIMIT
10c90 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20   counter"));.   
10ca0 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20     if( n==0 ){. 
10cb0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
10cc0 62 65 47 6f 74 6f 28 76 2c 20 69 42 72 65 61 6b  beGoto(v, iBreak
10cd0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
10ce0 66 28 20 6e 3e 3d 30 20 26 26 20 70 2d 3e 6e 53  f( n>=0 && p->nS
10cf0 65 6c 65 63 74 52 6f 77 3e 73 71 6c 69 74 65 33  electRow>sqlite3
10d00 4c 6f 67 45 73 74 28 28 75 36 34 29 6e 29 20 29  LogEst((u64)n) )
10d10 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 65  {.        p->nSe
10d20 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65  lectRow = sqlite
10d30 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e 29 3b  3LogEst((u64)n);
10d40 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 65 6c 46  .        p->selF
10d50 6c 61 67 73 20 7c 3d 20 53 46 5f 46 69 78 65 64  lags |= SF_Fixed
10d60 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20  Limit;.      }. 
10d70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10d80 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
10d90 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c 69 6d 69  pParse, p->pLimi
10da0 74 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20  t, iLimit);.    
10db0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10dc0 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65  Op1(v, OP_MustBe
10dd0 49 6e 74 2c 20 69 4c 69 6d 69 74 29 3b 20 56 64  Int, iLimit); Vd
10de0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
10df0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
10e00 28 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e  ((v, "LIMIT coun
10e10 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20 73 71  ter"));.      sq
10e20 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
10e30 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 69 4c 69  v, OP_IfNot, iLi
10e40 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 20 56 64  mit, iBreak); Vd
10e50 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
10e60 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
10e70 70 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20  pOffset ){.     
10e80 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 69 4f   p->iOffset = iO
10e90 66 66 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65  ffset = ++pParse
10ea0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70 50  ->nMem;.      pP
10eb0 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20 20  arse->nMem++;   
10ec0 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20 65  /* Allocate an e
10ed0 78 74 72 61 20 72 65 67 69 73 74 65 72 20 66 6f  xtra register fo
10ee0 72 20 6c 69 6d 69 74 2b 6f 66 66 73 65 74 20 2a  r limit+offset *
10ef0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  /.      sqlite3E
10f00 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
10f10 70 2d 3e 70 4f 66 66 73 65 74 2c 20 69 4f 66 66  p->pOffset, iOff
10f20 73 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  set);.      sqli
10f30 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
10f40 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69   OP_MustBeInt, i
10f50 4f 66 66 73 65 74 29 3b 20 56 64 62 65 43 6f 76  Offset); VdbeCov
10f60 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
10f70 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
10f80 22 4f 46 46 53 45 54 20 63 6f 75 6e 74 65 72 22  "OFFSET counter"
10f90 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
10fa0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
10fb0 50 5f 4f 66 66 73 65 74 4c 69 6d 69 74 2c 20 69  P_OffsetLimit, i
10fc0 4c 69 6d 69 74 2c 20 69 4f 66 66 73 65 74 2b 31  Limit, iOffset+1
10fd0 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  , iOffset);.    
10fe0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
10ff0 2c 20 22 4c 49 4d 49 54 2b 4f 46 46 53 45 54 22  , "LIMIT+OFFSET"
11000 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ));.    }.  }.}.
11010 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
11020 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
11030 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  LECT./*.** Retur
11040 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  n the appropriat
11050 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
11060 65 6e 63 65 20 66 6f 72 20 74 68 65 20 69 43 6f  ence for the iCo
11070 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a  l-th column of.*
11080 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  * the result set
11090 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e   for the compoun
110a0 64 2d 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  d-select stateme
110b0 6e 74 20 22 70 22 2e 20 20 52 65 74 75 72 6e 20  nt "p".  Return 
110c0 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74 68 65 20 63  NULL if.** the c
110d0 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f 20 64 65 66  olumn has no def
110e0 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ault collating s
110f0 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54  equence..**.** T
11100 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
11110 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 63 6f  uence for the co
11120 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 69 73  mpound select is
11130 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68 65 0a   taken from the.
11140 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72  ** left-most ter
11150 6d 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20  m of the select 
11160 74 68 61 74 20 68 61 73 20 61 20 63 6f 6c 6c 61  that has a colla
11170 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a  ting sequence..*
11180 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53 65 71  /.static CollSeq
11190 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c   *multiSelectCol
111a0 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72  lSeq(Parse *pPar
111b0 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69  se, Select *p, i
111c0 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c  nt iCol){.  Coll
111d0 53 65 71 20 2a 70 52 65 74 3b 0a 20 20 69 66 28  Seq *pRet;.  if(
111e0 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20   p->pPrior ){.  
111f0 20 20 70 52 65 74 20 3d 20 6d 75 6c 74 69 53 65    pRet = multiSe
11200 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72  lectCollSeq(pPar
11210 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69  se, p->pPrior, i
11220 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Col);.  }else{. 
11230 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d     pRet = 0;.  }
11240 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e  .  assert( iCol>
11250 3d 30 20 29 3b 0a 20 20 2f 2a 20 69 43 6f 6c 20  =0 );.  /* iCol 
11260 6d 75 73 74 20 62 65 20 6c 65 73 73 20 74 68 61  must be less tha
11270 6e 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  n p->pEList->nEx
11280 70 72 2e 20 20 4f 74 68 65 72 77 69 73 65 20 61  pr.  Otherwise a
11290 6e 20 65 72 72 6f 72 20 77 6f 75 6c 64 0a 20 20  n error would.  
112a0 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 74 68 72  ** have been thr
112b0 6f 77 6e 20 64 75 72 69 6e 67 20 6e 61 6d 65 20  own during name 
112c0 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6e 64 20 77  resolution and w
112d0 65 20 77 6f 75 6c 64 20 6e 6f 74 20 68 61 76 65  e would not have
112e0 20 67 6f 74 74 65 6e 0a 20 20 2a 2a 20 74 68 69   gotten.  ** thi
112f0 73 20 66 61 72 20 2a 2f 0a 20 20 69 66 28 20 70  s far */.  if( p
11300 52 65 74 3d 3d 30 20 26 26 20 41 4c 57 41 59 53  Ret==0 && ALWAYS
11310 28 69 43 6f 6c 3c 70 2d 3e 70 45 4c 69 73 74 2d  (iCol<p->pEList-
11320 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20 70  >nExpr) ){.    p
11330 52 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Ret = sqlite3Exp
11340 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
11350 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43   p->pEList->a[iC
11360 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a  ol].pExpr);.  }.
11370 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
11380 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65  ../*.** The sele
11390 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73  ct statement pas
113a0 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
113b0 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61  d parameter is a
113c0 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
113d0 0a 2a 2a 20 77 69 74 68 20 61 6e 20 4f 52 44 45  .** with an ORDE
113e0 52 20 42 59 20 63 6c 61 75 73 65 2e 20 54 68 69  R BY clause. Thi
113f0 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63  s function alloc
11400 61 74 65 73 20 61 6e 64 20 72 65 74 75 72 6e 73  ates and returns
11410 20 61 20 4b 65 79 49 6e 66 6f 0a 2a 2a 20 73 74   a KeyInfo.** st
11420 72 75 63 74 75 72 65 20 73 75 69 74 61 62 6c 65  ructure suitable
11430 20 66 6f 72 20 69 6d 70 6c 65 6d 65 6e 74 69 6e   for implementin
11440 67 20 74 68 65 20 4f 52 44 45 52 20 42 59 2e 0a  g the ORDER BY..
11450 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68  **.** Space to h
11460 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  old the KeyInfo 
11470 73 74 72 75 63 74 75 72 65 20 69 73 20 6f 62 74  structure is obt
11480 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f  ained from mallo
11490 63 2e 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a  c. The calling.*
114a0 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65  * function is re
114b0 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 65 6e  sponsible for en
114c0 73 75 72 69 6e 67 20 74 68 61 74 20 74 68 69 73  suring that this
114d0 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65 76   structure is ev
114e0 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65  entually.** free
114f0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79  d..*/.static Key
11500 49 6e 66 6f 20 2a 6d 75 6c 74 69 53 65 6c 65 63  Info *multiSelec
11510 74 4f 72 64 65 72 42 79 4b 65 79 49 6e 66 6f 28  tOrderByKeyInfo(
11520 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
11530 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 6e 45  elect *p, int nE
11540 78 74 72 61 29 7b 0a 20 20 45 78 70 72 4c 69 73  xtra){.  ExprLis
11550 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 2d  t *pOrderBy = p-
11560 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e 74  >pOrderBy;.  int
11570 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70   nOrderBy = p->p
11580 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
11590 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
115a0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4b 65  pParse->db;.  Ke
115b0 79 49 6e 66 6f 20 2a 70 52 65 74 20 3d 20 73 71  yInfo *pRet = sq
115c0 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f  lite3KeyInfoAllo
115d0 63 28 64 62 2c 20 6e 4f 72 64 65 72 42 79 2b 6e  c(db, nOrderBy+n
115e0 45 78 74 72 61 2c 20 31 29 3b 0a 20 20 69 66 28  Extra, 1);.  if(
115f0 20 70 52 65 74 20 29 7b 0a 20 20 20 20 69 6e 74   pRet ){.    int
11600 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
11610 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b   i<nOrderBy; i++
11620 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
11630 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
11640 49 74 65 6d 20 3d 20 26 70 4f 72 64 65 72 42 79  Item = &pOrderBy
11650 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 45 78  ->a[i];.      Ex
11660 70 72 20 2a 70 54 65 72 6d 20 3d 20 70 49 74 65  pr *pTerm = pIte
11670 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
11680 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
11690 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
116a0 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c  ->flags & EP_Col
116b0 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  late ){.        
116c0 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
116d0 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
116e0 65 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20  e, pTerm);.     
116f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
11700 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c  pColl = multiSel
11710 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ectCollSeq(pPars
11720 65 2c 20 70 2c 20 70 49 74 65 6d 2d 3e 75 2e 78  e, p, pItem->u.x
11730 2e 69 4f 72 64 65 72 42 79 43 6f 6c 2d 31 29 3b  .iOrderByCol-1);
11740 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f  .        if( pCo
11750 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c 20 3d 20  ll==0 ) pColl = 
11760 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
11770 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d         pOrderBy-
11780 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 0a 20 20  >a[i].pExpr =.  
11790 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
117a0 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 53 74 72  xprAddCollateStr
117b0 69 6e 67 28 70 50 61 72 73 65 2c 20 70 54 65 72  ing(pParse, pTer
117c0 6d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29  m, pColl->zName)
117d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
117e0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b  assert( sqlite3K
117f0 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c  eyInfoIsWriteabl
11800 65 28 70 52 65 74 29 20 29 3b 0a 20 20 20 20 20  e(pRet) );.     
11810 20 70 52 65 74 2d 3e 61 43 6f 6c 6c 5b 69 5d 20   pRet->aColl[i] 
11820 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70  = pColl;.      p
11830 52 65 74 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  Ret->aSortOrder[
11840 69 5d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  i] = pOrderBy->a
11850 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  [i].sortOrder;. 
11860 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
11870 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23 69 66 6e  rn pRet;.}..#ifn
11880 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
11890 43 54 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  CTE./*.** This r
118a0 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
118b0 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20 63 6f   VDBE code to co
118c0 6d 70 75 74 65 20 74 68 65 20 63 6f 6e 74 65 6e  mpute the conten
118d0 74 20 6f 66 20 61 20 57 49 54 48 20 52 45 43 55  t of a WITH RECU
118e0 52 53 49 56 45 0a 2a 2a 20 71 75 65 72 79 20 6f  RSIVE.** query o
118f0 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  f the form:.**.*
11900 2a 20 20 20 3c 72 65 63 75 72 73 69 76 65 2d 74  *   <recursive-t
11910 61 62 6c 65 3e 20 41 53 20 28 3c 73 65 74 75 70  able> AS (<setup
11920 2d 71 75 65 72 79 3e 20 55 4e 49 4f 4e 20 5b 41  -query> UNION [A
11930 4c 4c 5d 20 3c 72 65 63 75 72 73 69 76 65 2d 71  LL] <recursive-q
11940 75 65 72 79 3e 29 0a 2a 2a 20 20 20 20 20 20 20  uery>).**       
11950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11960 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20    \___________/ 
11970 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f              \___
11980 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a  ____________/.**
11990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119a0 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50             p->pP
119b0 72 69 6f 72 20 20 20 20 20 20 20 20 20 20 20 20  rior            
119c0 20 20 20 20 20 20 20 20 20 20 70 0a 2a 2a 0a 2a            p.**.*
119d0 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 65 78  *.** There is ex
119e0 61 63 74 6c 79 20 6f 6e 65 20 72 65 66 65 72 65  actly one refere
119f0 6e 63 65 20 74 6f 20 74 68 65 20 72 65 63 75 72  nce to the recur
11a00 73 69 76 65 2d 74 61 62 6c 65 20 69 6e 20 74 68  sive-table in th
11a10 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a  e FROM clause.**
11a20 20 6f 66 20 72 65 63 75 72 73 69 76 65 2d 71 75   of recursive-qu
11a30 65 72 79 2c 20 6d 61 72 6b 65 64 20 77 69 74 68  ery, marked with
11a40 20 74 68 65 20 53 72 63 4c 69 73 74 2d 3e 61 5b   the SrcList->a[
11a50 5d 2e 66 67 2e 69 73 52 65 63 75 72 73 69 76 65  ].fg.isRecursive
11a60 20 66 6c 61 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   flag..**.** The
11a70 20 73 65 74 75 70 2d 71 75 65 72 79 20 72 75 6e   setup-query run
11a80 73 20 6f 6e 63 65 20 74 6f 20 67 65 6e 65 72 61  s once to genera
11a90 74 65 20 61 6e 20 69 6e 69 74 69 61 6c 20 73 65  te an initial se
11aa0 74 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 67  t of rows that g
11ab0 6f 0a 2a 2a 20 69 6e 74 6f 20 61 20 51 75 65 75  o.** into a Queu
11ac0 65 20 74 61 62 6c 65 2e 20 20 52 6f 77 73 20 61  e table.  Rows a
11ad0 72 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  re extracted fro
11ae0 6d 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c  m the Queue tabl
11af0 65 20 6f 6e 65 20 62 79 0a 2a 2a 20 6f 6e 65 2e  e one by.** one.
11b00 20 20 45 61 63 68 20 72 6f 77 20 65 78 74 72 61    Each row extra
11b10 63 74 65 64 20 66 72 6f 6d 20 51 75 65 75 65 20  cted from Queue 
11b20 69 73 20 6f 75 74 70 75 74 20 74 6f 20 70 44 65  is output to pDe
11b30 73 74 2e 20 20 54 68 65 6e 20 74 68 65 20 73 69  st.  Then the si
11b40 6e 67 6c 65 0a 2a 2a 20 65 78 74 72 61 63 74 65  ngle.** extracte
11b50 64 20 72 6f 77 20 28 6e 6f 77 20 69 6e 20 74 68  d row (now in th
11b60 65 20 69 43 75 72 72 65 6e 74 20 74 61 62 6c 65  e iCurrent table
11b70 29 20 62 65 63 6f 6d 65 73 20 74 68 65 20 63 6f  ) becomes the co
11b80 6e 74 65 6e 74 20 6f 66 20 74 68 65 0a 2a 2a 20  ntent of the.** 
11b90 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65 20  recursive-table 
11ba0 66 6f 72 20 61 20 72 65 63 75 72 73 69 76 65 2d  for a recursive-
11bb0 71 75 65 72 79 20 72 75 6e 2e 20 20 54 68 65 20  query run.  The 
11bc0 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20 72 65  output of the re
11bd0 63 75 72 73 69 76 65 2d 71 75 65 72 79 0a 2a 2a  cursive-query.**
11be0 20 69 73 20 61 64 64 65 64 20 62 61 63 6b 20 69   is added back i
11bf0 6e 74 6f 20 74 68 65 20 51 75 65 75 65 20 74 61  nto the Queue ta
11c00 62 6c 65 2e 20 20 54 68 65 6e 20 61 6e 6f 74 68  ble.  Then anoth
11c10 65 72 20 72 6f 77 20 69 73 20 65 78 74 72 61 63  er row is extrac
11c20 74 65 64 20 66 72 6f 6d 20 51 75 65 75 65 0a 2a  ted from Queue.*
11c30 2a 20 61 6e 64 20 74 68 65 20 69 74 65 72 61 74  * and the iterat
11c40 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 20 75 6e  ion continues un
11c50 74 69 6c 20 74 68 65 20 51 75 65 75 65 20 74 61  til the Queue ta
11c60 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a  ble is empty..**
11c70 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 70 6f  .** If the compo
11c80 75 6e 64 20 71 75 65 72 79 20 6f 70 65 72 61 74  und query operat
11c90 6f 72 20 69 73 20 55 4e 49 4f 4e 20 74 68 65 6e  or is UNION then
11ca0 20 6e 6f 20 64 75 70 6c 69 63 61 74 65 20 72 6f   no duplicate ro
11cb0 77 73 20 61 72 65 20 65 76 65 72 0a 2a 2a 20 69  ws are ever.** i
11cc0 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68 65  nserted into the
11cd0 20 51 75 65 75 65 20 74 61 62 6c 65 2e 20 20 54   Queue table.  T
11ce0 68 65 20 69 44 69 73 74 69 6e 63 74 20 74 61 62  he iDistinct tab
11cf0 6c 65 20 6b 65 65 70 73 20 61 20 63 6f 70 79 20  le keeps a copy 
11d00 6f 66 20 61 6c 6c 20 72 6f 77 73 0a 2a 2a 20 74  of all rows.** t
11d10 68 61 74 20 68 61 76 65 20 65 76 65 72 20 62 65  hat have ever be
11d20 65 6e 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  en inserted into
11d30 20 51 75 65 75 65 20 61 6e 64 20 63 61 75 73 65   Queue and cause
11d40 73 20 64 75 70 6c 69 63 61 74 65 73 20 74 6f 20  s duplicates to 
11d50 62 65 0a 2a 2a 20 64 69 73 63 61 72 64 65 64 2e  be.** discarded.
11d60 20 20 49 66 20 74 68 65 20 6f 70 65 72 61 74 6f    If the operato
11d70 72 20 69 73 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20  r is UNION ALL, 
11d80 74 68 65 6e 20 64 75 70 6c 69 63 61 74 65 73 20  then duplicates 
11d90 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2a 20  are allowed..** 
11da0 0a 2a 2a 20 49 66 20 74 68 65 20 71 75 65 72 79  .** If the query
11db0 20 68 61 73 20 61 6e 20 4f 52 44 45 52 20 42 59   has an ORDER BY
11dc0 2c 20 74 68 65 6e 20 65 6e 74 72 69 65 73 20 69  , then entries i
11dd0 6e 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c  n the Queue tabl
11de0 65 20 61 72 65 20 6b 65 70 74 20 69 6e 0a 2a 2a  e are kept in.**
11df0 20 4f 52 44 45 52 20 42 59 20 6f 72 64 65 72 20   ORDER BY order 
11e00 61 6e 64 20 74 68 65 20 66 69 72 73 74 20 65 6e  and the first en
11e10 74 72 79 20 69 73 20 65 78 74 72 61 63 74 65 64  try is extracted
11e20 20 66 6f 72 20 65 61 63 68 20 63 79 63 6c 65 2e   for each cycle.
11e30 20 20 57 69 74 68 6f 75 74 0a 2a 2a 20 61 6e 20    Without.** an 
11e40 4f 52 44 45 52 20 42 59 2c 20 74 68 65 20 51 75  ORDER BY, the Qu
11e50 65 75 65 20 74 61 62 6c 65 20 69 73 20 6a 75 73  eue table is jus
11e60 74 20 61 20 46 49 46 4f 2e 0a 2a 2a 0a 2a 2a 20  t a FIFO..**.** 
11e70 49 66 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73  If a LIMIT claus
11e80 65 20 69 73 20 70 72 6f 76 69 64 65 64 2c 20 74  e is provided, t
11e90 68 65 6e 20 74 68 65 20 69 74 65 72 61 74 69 6f  hen the iteratio
11ea0 6e 20 73 74 6f 70 73 20 61 66 74 65 72 20 4c 49  n stops after LI
11eb0 4d 49 54 20 72 6f 77 73 0a 2a 2a 20 68 61 76 65  MIT rows.** have
11ec0 20 62 65 65 6e 20 6f 75 74 70 75 74 20 74 6f 20   been output to 
11ed0 70 44 65 73 74 2e 20 20 41 20 4c 49 4d 49 54 20  pDest.  A LIMIT 
11ee0 6f 66 20 7a 65 72 6f 20 6d 65 61 6e 73 20 74 6f  of zero means to
11ef0 20 6f 75 74 70 75 74 20 6e 6f 20 72 6f 77 73 20   output no rows 
11f00 61 6e 64 20 61 0a 2a 2a 20 6e 65 67 61 74 69 76  and a.** negativ
11f10 65 20 4c 49 4d 49 54 20 6d 65 61 6e 73 20 74 6f  e LIMIT means to
11f20 20 6f 75 74 70 75 74 20 61 6c 6c 20 72 6f 77 73   output all rows
11f30 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20 61  .  If there is a
11f40 6c 73 6f 20 61 6e 20 4f 46 46 53 45 54 20 63 6c  lso an OFFSET cl
11f50 61 75 73 65 0a 2a 2a 20 77 69 74 68 20 61 20 70  ause.** with a p
11f60 6f 73 69 74 69 76 65 20 76 61 6c 75 65 2c 20 74  ositive value, t
11f70 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 4f 46  hen the first OF
11f80 46 53 45 54 20 6f 75 74 70 75 74 73 20 61 72 65  FSET outputs are
11f90 20 64 69 73 63 61 72 64 65 64 20 72 61 74 68 65   discarded rathe
11fa0 72 0a 2a 2a 20 74 68 61 6e 20 62 65 69 6e 67 20  r.** than being 
11fb0 73 65 6e 74 20 74 6f 20 70 44 65 73 74 2e 20 20  sent to pDest.  
11fc0 54 68 65 20 4c 49 4d 49 54 20 63 6f 75 6e 74 20  The LIMIT count 
11fd0 64 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 75  does not begin u
11fe0 6e 74 69 6c 20 61 66 74 65 72 20 4f 46 46 53 45  ntil after OFFSE
11ff0 54 0a 2a 2a 20 72 6f 77 73 20 68 61 76 65 20 62  T.** rows have b
12000 65 65 6e 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a  een skipped..*/.
12010 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65  static void gene
12020 72 61 74 65 57 69 74 68 52 65 63 75 72 73 69 76  rateWithRecursiv
12030 65 51 75 65 72 79 28 0a 20 20 50 61 72 73 65 20  eQuery(.  Parse 
12040 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
12050 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
12060 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
12070 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
12080 20 54 68 65 20 72 65 63 75 72 73 69 76 65 20 53   The recursive S
12090 45 4c 45 43 54 20 74 6f 20 62 65 20 63 6f 64 65  ELECT to be code
120a0 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  d */.  SelectDes
120b0 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20  t *pDest     /* 
120c0 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
120d0 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f  query results */
120e0 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  .){.  SrcList *p
120f0 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 20 20  Src = p->pSrc;  
12100 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20      /* The FROM 
12110 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 72 65  clause of the re
12120 63 75 72 73 69 76 65 20 71 75 65 72 79 20 2a 2f  cursive query */
12130 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 2d  .  int nCol = p-
12140 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  >pEList->nExpr; 
12150 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
12160 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 63  lumns in the rec
12170 75 72 73 69 76 65 20 74 61 62 6c 65 20 2a 2f 0a  ursive table */.
12180 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
12190 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20  se->pVdbe;      
121a0 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65 64 20  /* The prepared 
121b0 73 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20  statement under 
121c0 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
121d0 20 20 53 65 6c 65 63 74 20 2a 70 53 65 74 75 70    Select *pSetup
121e0 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 20 20 20   = p->pPrior;   
121f0 2f 2a 20 54 68 65 20 73 65 74 75 70 20 71 75 65  /* The setup que
12200 72 79 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ry */.  int addr
12210 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  Top;            
12220 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20        /* Top of 
12230 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e  the loop */.  in
12240 74 20 61 64 64 72 43 6f 6e 74 2c 20 61 64 64 72  t addrCont, addr
12250 42 72 65 61 6b 3b 20 20 20 20 20 20 2f 2a 20 43  Break;      /* C
12260 4f 4e 54 49 4e 55 45 20 61 6e 64 20 42 52 45 41  ONTINUE and BREA
12270 4b 20 61 64 64 72 65 73 73 65 73 20 2a 2f 0a 20  K addresses */. 
12280 20 69 6e 74 20 69 43 75 72 72 65 6e 74 20 3d 20   int iCurrent = 
12290 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
122a0 2a 20 54 68 65 20 43 75 72 72 65 6e 74 20 74 61  * The Current ta
122b0 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ble */.  int reg
122c0 43 75 72 72 65 6e 74 3b 20 20 20 20 20 20 20 20  Current;        
122d0 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
122e0 65 72 20 68 6f 6c 64 69 6e 67 20 43 75 72 72 65  er holding Curre
122f0 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  nt table */.  in
12300 74 20 69 51 75 65 75 65 3b 20 20 20 20 20 20 20  t iQueue;       
12310 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
12320 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 2a  he Queue table *
12330 2f 0a 20 20 69 6e 74 20 69 44 69 73 74 69 6e 63  /.  int iDistinc
12340 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
12350 20 20 2f 2a 20 54 6f 20 65 6e 73 75 72 65 20 75    /* To ensure u
12360 6e 69 71 75 65 20 72 65 73 75 6c 74 73 20 69 66  nique results if
12370 20 55 4e 49 4f 4e 20 2a 2f 0a 20 20 69 6e 74 20   UNION */.  int 
12380 65 44 65 73 74 20 3d 20 53 52 54 5f 46 69 66 6f  eDest = SRT_Fifo
12390 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77  ;         /* How
123a0 20 74 6f 20 77 72 69 74 65 20 74 6f 20 51 75 65   to write to Que
123b0 75 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ue */.  SelectDe
123c0 73 74 20 64 65 73 74 51 75 65 75 65 3b 20 20 20  st destQueue;   
123d0 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 44        /* SelectD
123e0 65 73 74 20 74 61 72 67 65 74 74 69 6e 67 20 74  est targetting t
123f0 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 2a  he Queue table *
12400 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
12410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12420 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
12430 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  r */.  int rc;  
12440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12450 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
12460 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ode */.  ExprLis
12470 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20  t *pOrderBy;    
12480 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52         /* The OR
12490 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
124a0 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c  .  Expr *pLimit,
124b0 20 2a 70 4f 66 66 73 65 74 3b 20 20 20 20 20 20   *pOffset;      
124c0 20 2f 2a 20 53 61 76 65 64 20 4c 49 4d 49 54 20   /* Saved LIMIT 
124d0 61 6e 64 20 4f 46 46 53 45 54 20 2a 2f 0a 20 20  and OFFSET */.  
124e0 69 6e 74 20 72 65 67 4c 69 6d 69 74 2c 20 72 65  int regLimit, re
124f0 67 4f 66 66 73 65 74 3b 20 20 20 20 20 20 2f 2a  gOffset;      /*
12500 20 52 65 67 69 73 74 65 72 73 20 75 73 65 64 20   Registers used 
12510 62 79 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  by LIMIT and OFF
12520 53 45 54 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 62 74  SET */..  /* Obt
12530 61 69 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f  ain authorizatio
12540 6e 20 74 6f 20 64 6f 20 61 20 72 65 63 75 72 73  n to do a recurs
12550 69 76 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  ive query */.  i
12560 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
12570 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
12580 54 45 5f 52 45 43 55 52 53 49 56 45 2c 20 30 2c  TE_RECURSIVE, 0,
12590 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b   0, 0) ) return;
125a0 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 74  ..  /* Process t
125b0 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  he LIMIT and OFF
125c0 53 45 54 20 63 6c 61 75 73 65 73 2c 20 69 66 20  SET clauses, if 
125d0 74 68 65 79 20 65 78 69 73 74 20 2a 2f 0a 20 20  they exist */.  
125e0 61 64 64 72 42 72 65 61 6b 20 3d 20 73 71 6c 69  addrBreak = sqli
125f0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
12600 28 76 29 3b 0a 20 20 70 2d 3e 6e 53 65 6c 65 63  (v);.  p->nSelec
12610 74 52 6f 77 20 3d 20 33 32 30 3b 20 20 2f 2a 20  tRow = 320;  /* 
12620 34 20 62 69 6c 6c 69 6f 6e 20 72 6f 77 73 20 2a  4 billion rows *
12630 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74  /.  computeLimit
12640 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65  Registers(pParse
12650 2c 20 70 2c 20 61 64 64 72 42 72 65 61 6b 29 3b  , p, addrBreak);
12660 0a 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70  .  pLimit = p->p
12670 4c 69 6d 69 74 3b 0a 20 20 70 4f 66 66 73 65 74  Limit;.  pOffset
12680 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20   = p->pOffset;. 
12690 20 72 65 67 4c 69 6d 69 74 20 3d 20 70 2d 3e 69   regLimit = p->i
126a0 4c 69 6d 69 74 3b 0a 20 20 72 65 67 4f 66 66 73  Limit;.  regOffs
126b0 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b  et = p->iOffset;
126c0 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70  .  p->pLimit = p
126d0 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->pOffset = 0;. 
126e0 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 2d 3e   p->iLimit = p->
126f0 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 70  iOffset = 0;.  p
12700 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
12710 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 4c 6f 63  derBy;..  /* Loc
12720 61 74 65 20 74 68 65 20 63 75 72 73 6f 72 20 6e  ate the cursor n
12730 75 6d 62 65 72 20 6f 66 20 74 68 65 20 43 75 72  umber of the Cur
12740 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20  rent table */.  
12750 66 6f 72 28 69 3d 30 3b 20 41 4c 57 41 59 53 28  for(i=0; ALWAYS(
12760 69 3c 70 53 72 63 2d 3e 6e 53 72 63 29 3b 20 69  i<pSrc->nSrc); i
12770 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 53 72  ++){.    if( pSr
12780 63 2d 3e 61 5b 69 5d 2e 66 67 2e 69 73 52 65 63  c->a[i].fg.isRec
12790 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20  ursive ){.      
127a0 69 43 75 72 72 65 6e 74 20 3d 20 70 53 72 63 2d  iCurrent = pSrc-
127b0 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3b 0a 20  >a[i].iCursor;. 
127c0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
127d0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  }.  }..  /* Allo
127e0 63 61 74 65 20 63 75 72 73 6f 72 73 20 6e 75 6d  cate cursors num
127f0 62 65 72 73 20 66 6f 72 20 51 75 65 75 65 20 61  bers for Queue a
12800 6e 64 20 44 69 73 74 69 6e 63 74 2e 20 20 54 68  nd Distinct.  Th
12810 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  e cursor number 
12820 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 44 69 73  for.  ** the Dis
12830 74 69 6e 63 74 20 74 61 62 6c 65 20 6d 75 73 74  tinct table must
12840 20 62 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20   be exactly one 
12850 67 72 65 61 74 65 72 20 74 68 61 6e 20 51 75 65  greater than Que
12860 75 65 20 69 6e 20 6f 72 64 65 72 0a 20 20 2a 2a  ue in order.  **
12870 20 66 6f 72 20 74 68 65 20 53 52 54 5f 44 69 73   for the SRT_Dis
12880 74 46 69 66 6f 20 61 6e 64 20 53 52 54 5f 44 69  tFifo and SRT_Di
12890 73 74 51 75 65 75 65 20 64 65 73 74 69 6e 61 74  stQueue destinat
128a0 69 6f 6e 73 20 74 6f 20 77 6f 72 6b 2e 20 2a 2f  ions to work. */
128b0 0a 20 20 69 51 75 65 75 65 20 3d 20 70 50 61 72  .  iQueue = pPar
128c0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 69 66  se->nTab++;.  if
128d0 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  ( p->op==TK_UNIO
128e0 4e 20 29 7b 0a 20 20 20 20 65 44 65 73 74 20 3d  N ){.    eDest =
128f0 20 70 4f 72 64 65 72 42 79 20 3f 20 53 52 54 5f   pOrderBy ? SRT_
12900 44 69 73 74 51 75 65 75 65 20 3a 20 53 52 54 5f  DistQueue : SRT_
12910 44 69 73 74 46 69 66 6f 3b 0a 20 20 20 20 69 44  DistFifo;.    iD
12920 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65  istinct = pParse
12930 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 7d 65 6c 73  ->nTab++;.  }els
12940 65 7b 0a 20 20 20 20 65 44 65 73 74 20 3d 20 70  e{.    eDest = p
12950 4f 72 64 65 72 42 79 20 3f 20 53 52 54 5f 51 75  OrderBy ? SRT_Qu
12960 65 75 65 20 3a 20 53 52 54 5f 46 69 66 6f 3b 0a  eue : SRT_Fifo;.
12970 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 65 6c    }.  sqlite3Sel
12980 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
12990 74 51 75 65 75 65 2c 20 65 44 65 73 74 2c 20 69  tQueue, eDest, i
129a0 51 75 65 75 65 29 3b 0a 0a 20 20 2f 2a 20 41 6c  Queue);..  /* Al
129b0 6c 6f 63 61 74 65 20 63 75 72 73 6f 72 73 20 66  locate cursors f
129c0 6f 72 20 43 75 72 72 65 6e 74 2c 20 51 75 65 75  or Current, Queu
129d0 65 2c 20 61 6e 64 20 44 69 73 74 69 6e 63 74 2e  e, and Distinct.
129e0 20 2a 2f 0a 20 20 72 65 67 43 75 72 72 65 6e 74   */.  regCurrent
129f0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
12a00 6d 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  m;.  sqlite3Vdbe
12a10 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65  AddOp3(v, OP_Ope
12a20 6e 50 73 65 75 64 6f 2c 20 69 43 75 72 72 65 6e  nPseudo, iCurren
12a30 74 2c 20 72 65 67 43 75 72 72 65 6e 74 2c 20 6e  t, regCurrent, n
12a40 43 6f 6c 29 3b 0a 20 20 69 66 28 20 70 4f 72 64  Col);.  if( pOrd
12a50 65 72 42 79 20 29 7b 0a 20 20 20 20 4b 65 79 49  erBy ){.    KeyI
12a60 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20  nfo *pKeyInfo = 
12a70 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72  multiSelectOrder
12a80 42 79 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65  ByKeyInfo(pParse
12a90 2c 20 70 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c  , p, 1);.    sql
12aa0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
12ab0 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
12ac0 61 6c 2c 20 69 51 75 65 75 65 2c 20 70 4f 72 64  al, iQueue, pOrd
12ad0 65 72 42 79 2d 3e 6e 45 78 70 72 2b 32 2c 20 30  erBy->nExpr+2, 0
12ae0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
12af0 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
12b00 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
12b10 4e 46 4f 29 3b 0a 20 20 20 20 64 65 73 74 51 75  NFO);.    destQu
12b20 65 75 65 2e 70 4f 72 64 65 72 42 79 20 3d 20 70  eue.pOrderBy = p
12b30 4f 72 64 65 72 42 79 3b 0a 20 20 7d 65 6c 73 65  OrderBy;.  }else
12b40 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
12b50 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
12b60 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69 51 75  enEphemeral, iQu
12b70 65 75 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 7d 0a  eue, nCol);.  }.
12b80 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
12b90 2c 20 22 51 75 65 75 65 20 74 61 62 6c 65 22 29  , "Queue table")
12ba0 29 3b 0a 20 20 69 66 28 20 69 44 69 73 74 69 6e  );.  if( iDistin
12bb0 63 74 20 29 7b 0a 20 20 20 20 70 2d 3e 61 64 64  ct ){.    p->add
12bc0 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 73  rOpenEphm[0] = s
12bd0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
12be0 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
12bf0 65 72 61 6c 2c 20 69 44 69 73 74 69 6e 63 74 2c  eral, iDistinct,
12c00 20 30 29 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46   0);.    p->selF
12c10 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45  lags |= SF_UsesE
12c20 70 68 65 6d 65 72 61 6c 3b 0a 20 20 7d 0a 0a 20  phemeral;.  }.. 
12c30 20 2f 2a 20 44 65 74 61 63 68 20 74 68 65 20 4f   /* Detach the O
12c40 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 66  RDER BY clause f
12c50 72 6f 6d 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64  rom the compound
12c60 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 70 2d 3e   SELECT */.  p->
12c70 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 0a 20  pOrderBy = 0;.. 
12c80 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65   /* Store the re
12c90 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 74  sults of the set
12ca0 75 70 2d 71 75 65 72 79 20 69 6e 20 51 75 65 75  up-query in Queu
12cb0 65 2e 20 2a 2f 0a 20 20 70 53 65 74 75 70 2d 3e  e. */.  pSetup->
12cc0 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 72 63 20  pNext = 0;.  rc 
12cd0 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
12ce0 70 50 61 72 73 65 2c 20 70 53 65 74 75 70 2c 20  pParse, pSetup, 
12cf0 26 64 65 73 74 51 75 65 75 65 29 3b 0a 20 20 70  &destQueue);.  p
12d00 53 65 74 75 70 2d 3e 70 4e 65 78 74 20 3d 20 70  Setup->pNext = p
12d10 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
12d20 6f 20 65 6e 64 5f 6f 66 5f 72 65 63 75 72 73 69  o end_of_recursi
12d30 76 65 5f 71 75 65 72 79 3b 0a 0a 20 20 2f 2a 20  ve_query;..  /* 
12d40 46 69 6e 64 20 74 68 65 20 6e 65 78 74 20 72 6f  Find the next ro
12d50 77 20 69 6e 20 74 68 65 20 51 75 65 75 65 20 61  w in the Queue a
12d60 6e 64 20 6f 75 74 70 75 74 20 74 68 61 74 20 72  nd output that r
12d70 6f 77 20 2a 2f 0a 20 20 61 64 64 72 54 6f 70 20  ow */.  addrTop 
12d80 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
12d90 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op2(v, OP_Rewind
12da0 2c 20 69 51 75 65 75 65 2c 20 61 64 64 72 42 72  , iQueue, addrBr
12db0 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61  eak); VdbeCovera
12dc0 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 54 72 61  ge(v);..  /* Tra
12dd0 6e 73 66 65 72 20 74 68 65 20 6e 65 78 74 20 72  nsfer the next r
12de0 6f 77 20 69 6e 20 51 75 65 75 65 20 6f 76 65 72  ow in Queue over
12df0 20 74 6f 20 43 75 72 72 65 6e 74 20 2a 2f 0a 20   to Current */. 
12e00 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12e10 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77  p1(v, OP_NullRow
12e20 2c 20 69 43 75 72 72 65 6e 74 29 3b 20 2f 2a 20  , iCurrent); /* 
12e30 54 6f 20 72 65 73 65 74 20 63 6f 6c 75 6d 6e 20  To reset column 
12e40 63 61 63 68 65 20 2a 2f 0a 20 20 69 66 28 20 70  cache */.  if( p
12e50 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73  OrderBy ){.    s
12e60 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
12e70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
12e80 51 75 65 75 65 2c 20 70 4f 72 64 65 72 42 79 2d  Queue, pOrderBy-
12e90 3e 6e 45 78 70 72 2b 31 2c 20 72 65 67 43 75 72  >nExpr+1, regCur
12ea0 72 65 6e 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  rent);.  }else{.
12eb0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12ec0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 44  ddOp2(v, OP_RowD
12ed0 61 74 61 2c 20 69 51 75 65 75 65 2c 20 72 65 67  ata, iQueue, reg
12ee0 43 75 72 72 65 6e 74 29 3b 0a 20 20 7d 0a 20 20  Current);.  }.  
12ef0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12f00 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20  1(v, OP_Delete, 
12f10 69 51 75 65 75 65 29 3b 0a 0a 20 20 2f 2a 20 4f  iQueue);..  /* O
12f20 75 74 70 75 74 20 74 68 65 20 73 69 6e 67 6c 65  utput the single
12f30 20 72 6f 77 20 69 6e 20 43 75 72 72 65 6e 74 20   row in Current 
12f40 2a 2f 0a 20 20 61 64 64 72 43 6f 6e 74 20 3d 20  */.  addrCont = 
12f50 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
12f60 61 62 65 6c 28 76 29 3b 0a 20 20 63 6f 64 65 4f  abel(v);.  codeO
12f70 66 66 73 65 74 28 76 2c 20 72 65 67 4f 66 66 73  ffset(v, regOffs
12f80 65 74 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a 20  et, addrCont);. 
12f90 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
12fa0 28 70 50 61 72 73 65 2c 20 70 2c 20 69 43 75 72  (pParse, p, iCur
12fb0 72 65 6e 74 2c 0a 20 20 20 20 20 20 30 2c 20 30  rent,.      0, 0
12fc0 2c 20 70 44 65 73 74 2c 20 61 64 64 72 43 6f 6e  , pDest, addrCon
12fd0 74 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20  t, addrBreak);. 
12fe0 20 69 66 28 20 72 65 67 4c 69 6d 69 74 20 29 7b   if( regLimit ){
12ff0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
13000 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63  AddOp2(v, OP_Dec
13010 72 4a 75 6d 70 5a 65 72 6f 2c 20 72 65 67 4c 69  rJumpZero, regLi
13020 6d 69 74 2c 20 61 64 64 72 42 72 65 61 6b 29 3b  mit, addrBreak);
13030 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
13040 65 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  e(v);.  }.  sqli
13050 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
13060 62 65 6c 28 76 2c 20 61 64 64 72 43 6f 6e 74 29  bel(v, addrCont)
13070 3b 0a 0a 20 20 2f 2a 20 45 78 65 63 75 74 65 20  ;..  /* Execute 
13080 74 68 65 20 72 65 63 75 72 73 69 76 65 20 53 45  the recursive SE
13090 4c 45 43 54 20 74 61 6b 69 6e 67 20 74 68 65 20  LECT taking the 
130a0 73 69 6e 67 6c 65 20 72 6f 77 20 69 6e 20 43 75  single row in Cu
130b0 72 72 65 6e 74 20 61 73 0a 20 20 2a 2a 20 74 68  rrent as.  ** th
130c0 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  e value for the 
130d0 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65 2e  recursive-table.
130e0 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   Store the resul
130f0 74 73 20 69 6e 20 74 68 65 20 51 75 65 75 65 2e  ts in the Queue.
13100 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73  .  */.  if( p->s
13110 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67  elFlags & SF_Agg
13120 72 65 67 61 74 65 20 29 7b 0a 20 20 20 20 73 71  regate ){.    sq
13130 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
13140 61 72 73 65 2c 20 22 72 65 63 75 72 73 69 76 65  arse, "recursive
13150 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69   aggregate queri
13160 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64  es not supported
13170 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ");.  }else{.   
13180 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
13190 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
131a0 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65  t(pParse, p, &de
131b0 73 74 51 75 65 75 65 29 3b 0a 20 20 20 20 61 73  stQueue);.    as
131c0 73 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d  sert( p->pPrior=
131d0 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70 50 72  =0 );.    p->pPr
131e0 69 6f 72 20 3d 20 70 53 65 74 75 70 3b 0a 20 20  ior = pSetup;.  
131f0 7d 0a 0a 20 20 2f 2a 20 4b 65 65 70 20 72 75 6e  }..  /* Keep run
13200 6e 69 6e 67 20 74 68 65 20 6c 6f 6f 70 20 75 6e  ning the loop un
13210 74 69 6c 20 74 68 65 20 51 75 65 75 65 20 69 73  til the Queue is
13220 20 65 6d 70 74 79 20 2a 2f 0a 20 20 73 71 6c 69   empty */.  sqli
13230 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61  te3VdbeGoto(v, a
13240 64 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c 69 74  ddrTop);.  sqlit
13250 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
13260 65 6c 28 76 2c 20 61 64 64 72 42 72 65 61 6b 29  el(v, addrBreak)
13270 3b 0a 0a 65 6e 64 5f 6f 66 5f 72 65 63 75 72 73  ;..end_of_recurs
13280 69 76 65 5f 71 75 65 72 79 3a 0a 20 20 73 71 6c  ive_query:.  sql
13290 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
132a0 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  te(pParse->db, p
132b0 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 70  ->pOrderBy);.  p
132c0 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  ->pOrderBy = pOr
132d0 64 65 72 42 79 3b 0a 20 20 70 2d 3e 70 4c 69 6d  derBy;.  p->pLim
132e0 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 70  it = pLimit;.  p
132f0 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66  ->pOffset = pOff
13300 73 65 74 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  set;.  return;.}
13310 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
13320 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a 2f  E_OMIT_CTE */../
13330 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
13340 6e 63 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 69  nces */.static i
13350 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72  nt multiSelectOr
13360 64 65 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a  derBy(.  Parse *
13370 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
13380 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
13390 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
133a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
133b0 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f  The right-most o
133c0 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20  f SELECTs to be 
133d0 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63  coded */.  Selec
133e0 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20  tDest *pDest    
133f0 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
13400 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74  ith query result
13410 73 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 48  s */.);../*.** H
13420 61 6e 64 6c 65 20 74 68 65 20 73 70 65 63 69 61  andle the specia
13430 6c 20 63 61 73 65 20 6f 66 20 61 20 63 6f 6d 70  l case of a comp
13440 6f 75 6e 64 2d 73 65 6c 65 63 74 20 74 68 61 74  ound-select that
13450 20 6f 72 69 67 69 6e 61 74 65 73 20 66 72 6f 6d   originates from
13460 20 61 0a 2a 2a 20 56 41 4c 55 45 53 20 63 6c 61   a.** VALUES cla
13470 75 73 65 2e 20 20 42 79 20 68 61 6e 64 6c 69 6e  use.  By handlin
13480 67 20 74 68 69 73 20 61 73 20 61 20 73 70 65 63  g this as a spec
13490 69 61 6c 20 63 61 73 65 2c 20 77 65 20 61 76 6f  ial case, we avo
134a0 69 64 20 64 65 65 70 0a 2a 2a 20 72 65 63 75 72  id deep.** recur
134b0 73 69 6f 6e 2c 20 61 6e 64 20 74 68 75 73 20 64  sion, and thus d
134c0 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 65 6e  o not need to en
134d0 66 6f 72 63 65 20 74 68 65 20 53 51 4c 49 54 45  force the SQLITE
134e0 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  _LIMIT_COMPOUND_
134f0 53 45 4c 45 43 54 0a 2a 2a 20 6f 6e 20 61 20 56  SELECT.** on a V
13500 41 4c 55 45 53 20 63 6c 61 75 73 65 2e 0a 2a 2a  ALUES clause..**
13510 0a 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65 20  .** Because the 
13520 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 20 6f 72  Select object or
13530 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 20 61 20  iginates from a 
13540 56 41 4c 55 45 53 20 63 6c 61 75 73 65 3a 0a 2a  VALUES clause:.*
13550 2a 20 20 20 28 31 29 20 49 74 20 68 61 73 20 6e  *   (1) It has n
13560 6f 20 4c 49 4d 49 54 20 6f 72 20 4f 46 46 53 45  o LIMIT or OFFSE
13570 54 0a 2a 2a 20 20 20 28 32 29 20 41 6c 6c 20 74  T.**   (2) All t
13580 65 72 6d 73 20 61 72 65 20 55 4e 49 4f 4e 20 41  erms are UNION A
13590 4c 4c 0a 2a 2a 20 20 20 28 33 29 20 54 68 65 72  LL.**   (3) Ther
135a0 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59  e is no ORDER BY
135b0 20 63 6c 61 75 73 65 0a 2a 2f 0a 73 74 61 74 69   clause.*/.stati
135c0 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63  c int multiSelec
135d0 74 56 61 6c 75 65 73 28 0a 20 20 50 61 72 73 65  tValues(.  Parse
135e0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
135f0 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
13600 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
13610 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
13620 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
13630 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62   of SELECTs to b
13640 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c  e coded */.  Sel
13650 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20  ectDest *pDest  
13660 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
13670 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75   with query resu
13680 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65  lts */.){.  Sele
13690 63 74 20 2a 70 50 72 69 6f 72 3b 0a 20 20 69 6e  ct *pPrior;.  in
136a0 74 20 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 69 6e  t nRow = 1;.  in
136b0 74 20 72 63 20 3d 20 30 3b 0a 20 20 61 73 73 65  t rc = 0;.  asse
136c0 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  rt( p->selFlags 
136d0 26 20 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65 20  & SF_MultiValue 
136e0 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 61 73 73  );.  do{.    ass
136f0 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73  ert( p->selFlags
13700 20 26 20 53 46 5f 56 61 6c 75 65 73 20 29 3b 0a   & SF_Values );.
13710 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f      assert( p->o
13720 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 28 70 2d  p==TK_ALL || (p-
13730 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 26  >op==TK_SELECT &
13740 26 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 29 20  & p->pPrior==0) 
13750 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
13760 2d 3e 70 4c 69 6d 69 74 3d 3d 30 20 29 3b 0a 20  ->pLimit==0 );. 
13770 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f     assert( p->pO
13780 66 66 73 65 74 3d 3d 30 20 29 3b 0a 20 20 20 20  ffset==0 );.    
13790 61 73 73 65 72 74 28 20 70 2d 3e 70 4e 65 78 74  assert( p->pNext
137a0 3d 3d 30 20 7c 7c 20 70 2d 3e 70 45 4c 69 73 74  ==0 || p->pEList
137b0 2d 3e 6e 45 78 70 72 3d 3d 70 2d 3e 70 4e 65 78  ->nExpr==p->pNex
137c0 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t->pEList->nExpr
137d0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70   );.    if( p->p
137e0 50 72 69 6f 72 3d 3d 30 20 29 20 62 72 65 61 6b  Prior==0 ) break
137f0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
13800 3e 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 3d 3d  >pPrior->pNext==
13810 70 20 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e  p );.    p = p->
13820 70 50 72 69 6f 72 3b 0a 20 20 20 20 6e 52 6f 77  pPrior;.    nRow
13830 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 31 29 3b  ++;.  }while(1);
13840 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20  .  while( p ){. 
13850 20 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70     pPrior = p->p
13860 50 72 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70 50  Prior;.    p->pP
13870 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 72 63  rior = 0;.    rc
13880 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
13890 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73  (pParse, p, pDes
138a0 74 29 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f  t);.    p->pPrio
138b0 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
138c0 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a  if( rc ) break;.
138d0 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f      p->nSelectRo
138e0 77 20 3d 20 6e 52 6f 77 3b 0a 20 20 20 20 70 20  w = nRow;.    p 
138f0 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  = p->pNext;.  }.
13900 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
13910 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
13920 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
13930 70 72 6f 63 65 73 73 20 61 20 63 6f 6d 70 6f 75  process a compou
13940 6e 64 20 71 75 65 72 79 20 66 6f 72 6d 20 66 72  nd query form fr
13950 6f 6d 0a 2a 2a 20 74 77 6f 20 6f 72 20 6d 6f 72  om.** two or mor
13960 65 20 73 65 70 61 72 61 74 65 20 71 75 65 72 69  e separate queri
13970 65 73 20 75 73 69 6e 67 20 55 4e 49 4f 4e 2c 20  es using UNION, 
13980 55 4e 49 4f 4e 20 41 4c 4c 2c 20 45 58 43 45 50  UNION ALL, EXCEP
13990 54 2c 20 6f 72 0a 2a 2a 20 49 4e 54 45 52 53 45  T, or.** INTERSE
139a0 43 54 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69  CT.**.** "p" poi
139b0 6e 74 73 20 74 6f 20 74 68 65 20 72 69 67 68 74  nts to the right
139c0 2d 6d 6f 73 74 20 6f 66 20 74 68 65 20 74 77 6f  -most of the two
139d0 20 71 75 65 72 69 65 73 2e 20 20 74 68 65 20 71   queries.  the q
139e0 75 65 72 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c  uery on the.** l
139f0 65 66 74 20 69 73 20 70 2d 3e 70 50 72 69 6f 72  eft is p->pPrior
13a00 2e 20 20 54 68 65 20 6c 65 66 74 20 71 75 65 72  .  The left quer
13a10 79 20 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20  y could also be 
13a20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  a compound query
13a30 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20 63 61 73  .** in which cas
13a40 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  e this routine w
13a50 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 72 65  ill be called re
13a60 63 75 72 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a  cursively. .**.*
13a70 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66  * The results of
13a80 20 74 68 65 20 74 6f 74 61 6c 20 71 75 65 72 79   the total query
13a90 20 61 72 65 20 74 6f 20 62 65 20 77 72 69 74 74   are to be writt
13aa0 65 6e 20 69 6e 74 6f 20 61 20 64 65 73 74 69 6e  en into a destin
13ab0 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70 65  ation.** of type
13ac0 20 65 44 65 73 74 20 77 69 74 68 20 70 61 72 61   eDest with para
13ad0 6d 65 74 65 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a  meter iParm..**.
13ae0 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20 20 43  ** Example 1:  C
13af0 6f 6e 73 69 64 65 72 20 61 20 74 68 72 65 65 2d  onsider a three-
13b00 77 61 79 20 63 6f 6d 70 6f 75 6e 64 20 53 51 4c  way compound SQL
13b10 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
13b20 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 20 46  *     SELECT a F
13b30 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c  ROM t1 UNION SEL
13b40 45 43 54 20 62 20 46 52 4f 4d 20 74 32 20 55 4e  ECT b FROM t2 UN
13b50 49 4f 4e 20 53 45 4c 45 43 54 20 63 20 46 52 4f  ION SELECT c FRO
13b60 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  M t3.**.** This 
13b70 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72  statement is par
13b80 73 65 64 20 75 70 20 61 73 20 66 6f 6c 6c 6f 77  sed up as follow
13b90 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  s:.**.**     SEL
13ba0 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a  ECT c FROM t3.**
13bb0 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
13bc0 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20  `----->  SELECT 
13bd0 62 20 46 52 4f 4d 20 74 32 0a 2a 2a 20 20 20 20  b FROM t2.**    
13be0 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
13bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c00 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54  `------>  SELECT
13c10 20 61 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a   a FROM t1.**.**
13c20 20 54 68 65 20 61 72 72 6f 77 73 20 69 6e 20 74   The arrows in t
13c30 68 65 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65  he diagram above
13c40 20 72 65 70 72 65 73 65 6e 74 20 74 68 65 20 53   represent the S
13c50 65 6c 65 63 74 2e 70 50 72 69 6f 72 20 70 6f 69  elect.pPrior poi
13c60 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20 69 66 20 74  nter..** So if t
13c70 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
13c80 61 6c 6c 65 64 20 77 69 74 68 20 70 20 65 71 75  alled with p equ
13c90 61 6c 20 74 6f 20 74 68 65 20 74 33 20 71 75 65  al to the t3 que
13ca0 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 70 50 72 69  ry, then.** pPri
13cb0 6f 72 20 77 69 6c 6c 20 62 65 20 74 68 65 20 74  or will be the t
13cc0 32 20 71 75 65 72 79 2e 20 20 70 2d 3e 6f 70 20  2 query.  p->op 
13cd0 77 69 6c 6c 20 62 65 20 54 4b 5f 55 4e 49 4f 4e  will be TK_UNION
13ce0 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
13cf0 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20 74 68 61 74  *.** Notice that
13d00 20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20   because of the 
13d10 77 61 79 20 53 51 4c 69 74 65 20 70 61 72 73 65  way SQLite parse
13d20 73 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  s compound SELEC
13d30 54 73 2c 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76  Ts, the.** indiv
13d40 69 64 75 61 6c 20 73 65 6c 65 63 74 73 20 61 6c  idual selects al
13d50 77 61 79 73 20 67 72 6f 75 70 20 66 72 6f 6d 20  ways group from 
13d60 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2e 0a 2a  left to right..*
13d70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c  /.static int mul
13d80 74 69 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73  tiSelect(.  Pars
13d90 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
13da0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
13db0 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
13dc0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
13dd0 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  /* The right-mos
13de0 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20  t of SELECTs to 
13df0 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65  be coded */.  Se
13e00 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20  lectDest *pDest 
13e10 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
13e20 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73  o with query res
13e30 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ults */.){.  int
13e40 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
13e50 20 20 20 2f 2a 20 53 75 63 63 65 73 73 20 63 6f     /* Success co
13e60 64 65 20 66 72 6f 6d 20 61 20 73 75 62 72 6f 75  de from a subrou
13e70 74 69 6e 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74  tine */.  Select
13e80 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20   *pPrior;       
13e90 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43  /* Another SELEC
13ea0 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  T immediately to
13eb0 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56   our left */.  V
13ec0 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
13ed0 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
13ee0 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44   code to this VD
13ef0 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  BE */.  SelectDe
13f00 73 74 20 64 65 73 74 3b 20 20 20 20 20 20 2f 2a  st dest;      /*
13f10 20 41 6c 74 65 72 6e 61 74 69 76 65 20 64 61 74   Alternative dat
13f20 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f  a destination */
13f30 0a 20 20 53 65 6c 65 63 74 20 2a 70 44 65 6c 65  .  Select *pDele
13f40 74 65 20 3d 20 30 3b 20 20 2f 2a 20 43 68 61 69  te = 0;  /* Chai
13f50 6e 20 6f 66 20 73 69 6d 70 6c 65 20 73 65 6c 65  n of simple sele
13f60 63 74 73 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f  cts to delete */
13f70 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
13f80 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
13f90 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
13fa0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
13fb0 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20  E_OMIT_EXPLAIN. 
13fc0 20 69 6e 74 20 69 53 75 62 31 20 3d 20 30 3b 20   int iSub1 = 0; 
13fd0 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64         /* EQP id
13fe0 20 6f 66 20 6c 65 66 74 2d 68 61 6e 64 20 71 75   of left-hand qu
13ff0 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75  ery */.  int iSu
14000 62 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  b2 = 0;        /
14010 2a 20 45 51 50 20 69 64 20 6f 66 20 72 69 67 68  * EQP id of righ
14020 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a  t-hand query */.
14030 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b  #endif..  /* Mak
14040 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20  e sure there is 
14050 6e 6f 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c  no ORDER BY or L
14060 49 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e 20 70  IMIT clause on p
14070 72 69 6f 72 20 53 45 4c 45 43 54 73 2e 20 20 4f  rior SELECTs.  O
14080 6e 6c 79 0a 20 20 2a 2a 20 74 68 65 20 6c 61 73  nly.  ** the las
14090 74 20 28 72 69 67 68 74 2d 6d 6f 73 74 29 20 53  t (right-most) S
140a0 45 4c 45 43 54 20 69 6e 20 74 68 65 20 73 65 72  ELECT in the ser
140b0 69 65 73 20 6d 61 79 20 68 61 76 65 20 61 6e 20  ies may have an 
140c0 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49  ORDER BY or LIMI
140d0 54 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  T..  */.  assert
140e0 28 20 70 20 26 26 20 70 2d 3e 70 50 72 69 6f 72  ( p && p->pPrior
140f0 20 29 3b 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20   );  /* Calling 
14100 66 75 6e 63 74 69 6f 6e 20 67 75 61 72 61 6e 74  function guarant
14110 65 65 73 20 74 68 69 73 20 6d 75 63 68 20 2a 2f  ees this much */
14120 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73  .  assert( (p->s
14130 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63  elFlags & SF_Rec
14140 75 72 73 69 76 65 29 3d 3d 30 20 7c 7c 20 70 2d  ursive)==0 || p-
14150 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70  >op==TK_ALL || p
14160 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29  ->op==TK_UNION )
14170 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ;.  db = pParse-
14180 3e 64 62 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20  >db;.  pPrior = 
14190 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64 65 73  p->pPrior;.  des
141a0 74 20 3d 20 2a 70 44 65 73 74 3b 0a 20 20 69 66  t = *pDest;.  if
141b0 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72  ( pPrior->pOrder
141c0 42 79 20 7c 7c 20 70 50 72 69 6f 72 2d 3e 70 4c  By || pPrior->pL
141d0 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  imit ){.    sqli
141e0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
141f0 73 65 2c 22 25 73 20 63 6c 61 75 73 65 20 73 68  se,"%s clause sh
14200 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20  ould come after 
14210 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a  %s not before",.
14220 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4f        pPrior->pO
14230 72 64 65 72 42 79 21 3d 30 20 3f 20 22 4f 52 44  rderBy!=0 ? "ORD
14240 45 52 20 42 59 22 20 3a 20 22 4c 49 4d 49 54 22  ER BY" : "LIMIT"
14250 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70  , selectOpName(p
14260 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d  ->op));.    rc =
14270 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c   1;.    goto mul
14280 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
14290 20 7d 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   }..  v = sqlite
142a0 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
142b0 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30  ;.  assert( v!=0
142c0 20 29 3b 20 20 2f 2a 20 54 68 65 20 56 44 42 45   );  /* The VDBE
142d0 20 61 6c 72 65 61 64 79 20 63 72 65 61 74 65 64   already created
142e0 20 62 79 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63   by calling func
142f0 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43 72  tion */..  /* Cr
14300 65 61 74 65 20 74 68 65 20 64 65 73 74 69 6e 61  eate the destina
14310 74 69 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20 74  tion temporary t
14320 61 62 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72  able if necessar
14330 79 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73  y.  */.  if( des
14340 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68  t.eDest==SRT_Eph
14350 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 61 73 73  emTab ){.    ass
14360 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
14370 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
14380 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
14390 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 64 65 73  enEphemeral, des
143a0 74 2e 69 53 44 50 61 72 6d 2c 20 70 2d 3e 70 45  t.iSDParm, p->pE
143b0 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
143c0 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53    dest.eDest = S
143d0 52 54 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20  RT_Table;.  }.. 
143e0 20 2f 2a 20 53 70 65 63 69 61 6c 20 68 61 6e 64   /* Special hand
143f0 6c 69 6e 67 20 66 6f 72 20 61 20 63 6f 6d 70 6f  ling for a compo
14400 75 6e 64 2d 73 65 6c 65 63 74 20 74 68 61 74 20  und-select that 
14410 6f 72 69 67 69 6e 61 74 65 73 20 61 73 20 61 20  originates as a 
14420 56 41 4c 55 45 53 20 63 6c 61 75 73 65 2e 0a 20  VALUES clause.. 
14430 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c   */.  if( p->sel
14440 46 6c 61 67 73 20 26 20 53 46 5f 4d 75 6c 74 69  Flags & SF_Multi
14450 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 72 63 20  Value ){.    rc 
14460 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 56 61 6c  = multiSelectVal
14470 75 65 73 28 70 50 61 72 73 65 2c 20 70 2c 20 26  ues(pParse, p, &
14480 64 65 73 74 29 3b 0a 20 20 20 20 67 6f 74 6f 20  dest);.    goto 
14490 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
144a0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
144b0 20 73 75 72 65 20 61 6c 6c 20 53 45 4c 45 43 54   sure all SELECT
144c0 73 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  s in the stateme
144d0 6e 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  nt have the same
144e0 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   number of eleme
144f0 6e 74 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 69  nts.  ** in thei
14500 72 20 72 65 73 75 6c 74 20 73 65 74 73 2e 0a 20  r result sets.. 
14510 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
14520 3e 70 45 4c 69 73 74 20 26 26 20 70 50 72 69 6f  >pEList && pPrio
14530 72 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 61  r->pEList );.  a
14540 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
14550 2d 3e 6e 45 78 70 72 3d 3d 70 50 72 69 6f 72 2d  ->nExpr==pPrior-
14560 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
14570 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
14580 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 69 66 28  E_OMIT_CTE.  if(
14590 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
145a0 46 5f 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20  F_Recursive ){. 
145b0 20 20 20 67 65 6e 65 72 61 74 65 57 69 74 68 52     generateWithR
145c0 65 63 75 72 73 69 76 65 51 75 65 72 79 28 70 50  ecursiveQuery(pP
145d0 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b  arse, p, &dest);
145e0 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a  .  }else.#endif.
145f0 0a 20 20 2f 2a 20 43 6f 6d 70 6f 75 6e 64 20 53  .  /* Compound S
14600 45 4c 45 43 54 73 20 74 68 61 74 20 68 61 76 65  ELECTs that have
14610 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
14620 75 73 65 20 61 72 65 20 68 61 6e 64 6c 65 64 20  use are handled 
14630 73 65 70 61 72 61 74 65 6c 79 2e 0a 20 20 2a 2f  separately..  */
14640 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72  .  if( p->pOrder
14650 42 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  By ){.    return
14660 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65   multiSelectOrde
14670 72 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70  rBy(pParse, p, p
14680 44 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a  Dest);.  }else..
14690 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
146a0 64 65 20 66 6f 72 20 74 68 65 20 6c 65 66 74 20  de for the left 
146b0 61 6e 64 20 72 69 67 68 74 20 53 45 4c 45 43 54  and right SELECT
146c0 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a   statements..  *
146d0 2f 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f  /.  switch( p->o
146e0 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
146f0 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e  _ALL: {.      in
14700 74 20 61 64 64 72 20 3d 20 30 3b 0a 20 20 20 20  t addr = 0;.    
14710 20 20 69 6e 74 20 6e 4c 69 6d 69 74 3b 0a 20 20    int nLimit;.  
14720 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 72      assert( !pPr
14730 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a 20  ior->pLimit );. 
14740 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69       pPrior->iLi
14750 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b  mit = p->iLimit;
14760 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 69  .      pPrior->i
14770 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66  Offset = p->iOff
14780 73 65 74 3b 0a 20 20 20 20 20 20 70 50 72 69 6f  set;.      pPrio
14790 72 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70  r->pLimit = p->p
147a0 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 50 72  Limit;.      pPr
147b0 69 6f 72 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70  ior->pOffset = p
147c0 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ->pOffset;.     
147d0 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
147e0 65 72 28 69 53 75 62 31 2c 20 70 50 61 72 73 65  er(iSub1, pParse
147f0 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29  ->iNextSelectId)
14800 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
14810 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
14820 65 2c 20 70 50 72 69 6f 72 2c 20 26 64 65 73 74  e, pPrior, &dest
14830 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d  );.      p->pLim
14840 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  it = 0;.      p-
14850 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >pOffset = 0;.  
14860 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
14870 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
14880 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
14890 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50     }.      p->pP
148a0 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rior = 0;.      
148b0 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72 69  p->iLimit = pPri
148c0 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20  or->iLimit;.    
148d0 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70    p->iOffset = p
148e0 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 3b 0a  Prior->iOffset;.
148f0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69 4c 69        if( p->iLi
14900 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61  mit ){.        a
14910 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
14920 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
14930 4e 6f 74 2c 20 70 2d 3e 69 4c 69 6d 69 74 29 3b  Not, p->iLimit);
14940 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
14950 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
14960 6d 6d 65 6e 74 28 28 76 2c 20 22 4a 75 6d 70 20  mment((v, "Jump 
14970 61 68 65 61 64 20 69 66 20 4c 49 4d 49 54 20 72  ahead if LIMIT r
14980 65 61 63 68 65 64 22 29 29 3b 0a 20 20 20 20 20  eached"));.     
14990 20 20 20 69 66 28 20 70 2d 3e 69 4f 66 66 73 65     if( p->iOffse
149a0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  t ){.          s
149b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
149c0 28 76 2c 20 4f 50 5f 4f 66 66 73 65 74 4c 69 6d  (v, OP_OffsetLim
149d0 69 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  it,.            
149e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
149f0 70 2d 3e 69 4c 69 6d 69 74 2c 20 70 2d 3e 69 4f  p->iLimit, p->iO
14a00 66 66 73 65 74 2b 31 2c 20 70 2d 3e 69 4f 66 66  ffset+1, p->iOff
14a10 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  set);.        }.
14a20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 78        }.      ex
14a30 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
14a40 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69  iSub2, pParse->i
14a50 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20  NextSelectId);. 
14a60 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
14a70 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
14a80 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20  p, &dest);.     
14a90 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
14aa0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
14ab0 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70    pDelete = p->p
14ac0 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e  Prior;.      p->
14ad0 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
14ae0 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63  .      p->nSelec
14af0 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f  tRow = sqlite3Lo
14b00 67 45 73 74 41 64 64 28 70 2d 3e 6e 53 65 6c 65  gEstAdd(p->nSele
14b10 63 74 52 6f 77 2c 20 70 50 72 69 6f 72 2d 3e 6e  ctRow, pPrior->n
14b20 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20 20 20  SelectRow);.    
14b30 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c    if( pPrior->pL
14b40 69 6d 69 74 0a 20 20 20 20 20 20 20 26 26 20 73  imit.       && s
14b50 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
14b60 67 65 72 28 70 50 72 69 6f 72 2d 3e 70 4c 69 6d  ger(pPrior->pLim
14b70 69 74 2c 20 26 6e 4c 69 6d 69 74 29 0a 20 20 20  it, &nLimit).   
14b80 20 20 20 20 26 26 20 6e 4c 69 6d 69 74 3e 30 20      && nLimit>0 
14b90 26 26 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  && p->nSelectRow
14ba0 20 3e 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   > sqlite3LogEst
14bb0 28 28 75 36 34 29 6e 4c 69 6d 69 74 29 20 0a 20  ((u64)nLimit) . 
14bc0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
14bd0 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
14be0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 28 75  sqlite3LogEst((u
14bf0 36 34 29 6e 4c 69 6d 69 74 29 3b 0a 20 20 20 20  64)nLimit);.    
14c00 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 64    }.      if( ad
14c10 64 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  dr ){.        sq
14c20 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
14c30 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20  e(v, addr);.    
14c40 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
14c50 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
14c60 54 4b 5f 45 58 43 45 50 54 3a 0a 20 20 20 20 63  TK_EXCEPT:.    c
14c70 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a  ase TK_UNION: {.
14c80 20 20 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e 54        int unionT
14c90 61 62 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  ab;    /* Cursor
14ca0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 74   number of the t
14cb0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 68  emporary table h
14cc0 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 20 2a 2f  olding result */
14cd0 0a 20 20 20 20 20 20 75 38 20 6f 70 20 3d 20 30  .      u8 op = 0
14ce0 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f  ;       /* One o
14cf0 66 20 74 68 65 20 53 52 54 5f 20 6f 70 65 72 61  f the SRT_ opera
14d00 74 69 6f 6e 73 20 74 6f 20 61 70 70 6c 79 20 74  tions to apply t
14d10 6f 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20 20 20  o self */.      
14d20 69 6e 74 20 70 72 69 6f 72 4f 70 3b 20 20 20 20  int priorOp;    
14d30 20 2f 2a 20 54 68 65 20 53 52 54 5f 20 6f 70 65   /* The SRT_ ope
14d40 72 61 74 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20  ration to apply 
14d50 74 6f 20 70 72 69 6f 72 20 73 65 6c 65 63 74 73  to prior selects
14d60 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a   */.      Expr *
14d70 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74  pLimit, *pOffset
14d80 3b 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65  ; /* Saved value
14d90 73 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74 20 61  s of p->nLimit a
14da0 6e 64 20 70 2d 3e 6e 4f 66 66 73 65 74 20 2a 2f  nd p->nOffset */
14db0 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
14dc0 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73  .      SelectDes
14dd0 74 20 75 6e 69 6f 6e 64 65 73 74 3b 0a 0a 20 20  t uniondest;..  
14de0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d      testcase( p-
14df0 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 29  >op==TK_EXCEPT )
14e00 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
14e10 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  ( p->op==TK_UNIO
14e20 4e 20 29 3b 0a 20 20 20 20 20 20 70 72 69 6f 72  N );.      prior
14e30 4f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a  Op = SRT_Union;.
14e40 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65        if( dest.e
14e50 44 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20 29 7b  Dest==priorOp ){
14e60 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 63  .        /* We c
14e70 61 6e 20 72 65 75 73 65 20 61 20 74 65 6d 70 6f  an reuse a tempo
14e80 72 61 72 79 20 74 61 62 6c 65 20 67 65 6e 65 72  rary table gener
14e90 61 74 65 64 20 62 79 20 61 20 53 45 4c 45 43 54  ated by a SELECT
14ea0 20 74 6f 20 6f 75 72 0a 20 20 20 20 20 20 20 20   to our.        
14eb0 2a 2a 20 72 69 67 68 74 2e 0a 20 20 20 20 20 20  ** right..      
14ec0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73    */.        ass
14ed0 65 72 74 28 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d  ert( p->pLimit==
14ee0 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 4e 6f 74  0 );      /* Not
14ef0 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74   allowed on left
14f00 77 61 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f  ward elements */
14f10 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
14f20 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20 29   p->pOffset==0 )
14f30 3b 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c  ;     /* Not all
14f40 6f 77 65 64 20 6f 6e 20 6c 65 66 74 77 61 72 64  owed on leftward
14f50 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20   elements */.   
14f60 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20       unionTab = 
14f70 64 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20  dest.iSDParm;.  
14f80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14f90 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 6e 65     /* We will ne
14fa0 65 64 20 74 6f 20 63 72 65 61 74 65 20 6f 75 72  ed to create our
14fb0 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72 79 20 74   own temporary t
14fc0 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  able to hold the
14fd0 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 65  .        ** inte
14fe0 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 73  rmediate results
14ff0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
15000 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20       unionTab = 
15010 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
15020 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
15030 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  p->pOrderBy==0 )
15040 3b 0a 20 20 20 20 20 20 20 20 61 64 64 72 20 3d  ;.        addr =
15050 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15060 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
15070 65 6d 65 72 61 6c 2c 20 75 6e 69 6f 6e 54 61 62  emeral, unionTab
15080 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61 73  , 0);.        as
15090 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65  sert( p->addrOpe
150a0 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29  nEphm[0] == -1 )
150b0 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 64 64  ;.        p->add
150c0 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61  rOpenEphm[0] = a
150d0 64 64 72 3b 0a 20 20 20 20 20 20 20 20 66 69 6e  ddr;.        fin
150e0 64 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e 73  dRightmost(p)->s
150f0 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73  elFlags |= SF_Us
15100 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20  esEphemeral;.   
15110 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
15120 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20  pEList );.      
15130 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  }..      /* Code
15140 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
15150 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20 6c 65  ements to our le
15160 66 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ft.      */.    
15170 20 20 61 73 73 65 72 74 28 20 21 70 50 72 69 6f    assert( !pPrio
15180 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 3b 0a 20  r->pOrderBy );. 
15190 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
151a0 63 74 44 65 73 74 49 6e 69 74 28 26 75 6e 69 6f  ctDestInit(&unio
151b0 6e 64 65 73 74 2c 20 70 72 69 6f 72 4f 70 2c 20  ndest, priorOp, 
151c0 75 6e 69 6f 6e 54 61 62 29 3b 0a 20 20 20 20 20  unionTab);.     
151d0 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
151e0 65 72 28 69 53 75 62 31 2c 20 70 50 61 72 73 65  er(iSub1, pParse
151f0 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29  ->iNextSelectId)
15200 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
15210 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
15220 65 2c 20 70 50 72 69 6f 72 2c 20 26 75 6e 69 6f  e, pPrior, &unio
15230 6e 64 65 73 74 29 3b 0a 20 20 20 20 20 20 69 66  ndest);.      if
15240 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
15250 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
15260 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a  t_end;.      }..
15270 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68        /* Code th
15280 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54  e current SELECT
15290 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 20   statement.     
152a0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 2d   */.      if( p-
152b0 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 29  >op==TK_EXCEPT )
152c0 7b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20 53  {.        op = S
152d0 52 54 5f 45 78 63 65 70 74 3b 0a 20 20 20 20 20  RT_Except;.     
152e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
152f0 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54  assert( p->op==T
15300 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20  K_UNION );.     
15310 20 20 20 6f 70 20 3d 20 53 52 54 5f 55 6e 69 6f     op = SRT_Unio
15320 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  n;.      }.     
15330 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
15340 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70        pLimit = p
15350 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->pLimit;.      
15360 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  p->pLimit = 0;. 
15370 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20 70       pOffset = p
15380 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ->pOffset;.     
15390 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b   p->pOffset = 0;
153a0 0a 20 20 20 20 20 20 75 6e 69 6f 6e 64 65 73 74  .      uniondest
153b0 2e 65 44 65 73 74 20 3d 20 6f 70 3b 0a 20 20 20  .eDest = op;.   
153c0 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74     explainSetInt
153d0 65 67 65 72 28 69 53 75 62 32 2c 20 70 50 61 72  eger(iSub2, pPar
153e0 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
153f0 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  d);.      rc = s
15400 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
15410 72 73 65 2c 20 70 2c 20 26 75 6e 69 6f 6e 64 65  rse, p, &unionde
15420 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  st);.      testc
15430 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
15440 4f 4b 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 51  OK );.      /* Q
15450 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20  uery flattening 
15460 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  in sqlite3Select
15470 28 29 20 6d 69 67 68 74 20 72 65 66 69 6c 6c 20  () might refill 
15480 70 2d 3e 70 4f 72 64 65 72 42 79 2e 0a 20 20 20  p->pOrderBy..   
15490 20 20 20 2a 2a 20 42 65 20 73 75 72 65 20 74 6f     ** Be sure to
154a0 20 64 65 6c 65 74 65 20 70 2d 3e 70 4f 72 64 65   delete p->pOrde
154b0 72 42 79 2c 20 74 68 65 72 65 66 6f 72 65 2c 20  rBy, therefore, 
154c0 74 6f 20 61 76 6f 69 64 20 61 20 6d 65 6d 6f 72  to avoid a memor
154d0 79 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20 20 20 20  y leak. */.     
154e0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
154f0 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f  Delete(db, p->pO
15500 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 70  rderBy);.      p
15510 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69  Delete = p->pPri
15520 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72  or;.      p->pPr
15530 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
15540 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
15550 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70  = 0;.      if( p
15560 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29  ->op==TK_UNION )
15570 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 65  {.        p->nSe
15580 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65  lectRow = sqlite
15590 33 4c 6f 67 45 73 74 41 64 64 28 70 2d 3e 6e 53  3LogEstAdd(p->nS
155a0 65 6c 65 63 74 52 6f 77 2c 20 70 50 72 69 6f 72  electRow, pPrior
155b0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20  ->nSelectRow);. 
155c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
155d0 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
155e0 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  b, p->pLimit);. 
155f0 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d       p->pLimit =
15600 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70   pLimit;.      p
15610 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66  ->pOffset = pOff
15620 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c  set;.      p->iL
15630 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  imit = 0;.      
15640 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->iOffset = 0;.
15650 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72  .      /* Conver
15660 74 20 74 68 65 20 64 61 74 61 20 69 6e 20 74 68  t the data in th
15670 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
15680 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72 20  e into whatever 
15690 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 69 74  form.      ** it
156a0 20 69 73 20 74 68 61 74 20 77 65 20 63 75 72 72   is that we curr
156b0 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20 20  ently need..    
156c0 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
156d0 74 28 20 75 6e 69 6f 6e 54 61 62 3d 3d 64 65 73  t( unionTab==des
156e0 74 2e 69 53 44 50 61 72 6d 20 7c 7c 20 64 65 73  t.iSDParm || des
156f0 74 2e 65 44 65 73 74 21 3d 70 72 69 6f 72 4f 70  t.eDest!=priorOp
15700 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 65   );.      if( de
15710 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f 72 4f  st.eDest!=priorO
15720 70 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  p ){.        int
15730 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20   iCont, iBreak, 
15740 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20  iStart;.        
15750 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
15760 74 20 29 3b 0a 20 20 20 20 20 20 20 20 69 42 72  t );.        iBr
15770 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  eak = sqlite3Vdb
15780 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
15790 20 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73         iCont = s
157a0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
157b0 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20  bel(v);.        
157c0 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
157d0 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c  sters(pParse, p,
157e0 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
157f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15800 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op2(v, OP_Rewind
15810 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72 65  , unionTab, iBre
15820 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ak); VdbeCoverag
15830 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69 53  e(v);.        iS
15840 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  tart = sqlite3Vd
15850 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
15860 3b 0a 20 20 20 20 20 20 20 20 73 65 6c 65 63 74  ;.        select
15870 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
15880 2c 20 70 2c 20 75 6e 69 6f 6e 54 61 62 2c 0a 20  , p, unionTab,. 
15890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158a0 20 20 20 20 20 20 20 30 2c 20 30 2c 20 26 64 65         0, 0, &de
158b0 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61  st, iCont, iBrea
158c0 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  k);.        sqli
158d0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
158e0 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20  bel(v, iCont);. 
158f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
15900 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
15910 65 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69  ext, unionTab, i
15920 53 74 61 72 74 29 3b 20 56 64 62 65 43 6f 76 65  Start); VdbeCove
15930 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
15940 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
15950 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65  lveLabel(v, iBre
15960 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ak);.        sql
15970 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15980 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f  , OP_Close, unio
15990 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  nTab, 0);.      
159a0 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
159b0 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
159c0 3a 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d  : assert( p->op=
159d0 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 3b  =TK_INTERSECT );
159e0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 61 62   {.      int tab
159f0 31 2c 20 74 61 62 32 3b 0a 20 20 20 20 20 20 69  1, tab2;.      i
15a00 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b  nt iCont, iBreak
15a10 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20  , iStart;.      
15a20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70  Expr *pLimit, *p
15a30 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69 6e  Offset;.      in
15a40 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 53 65  t addr;.      Se
15a50 6c 65 63 74 44 65 73 74 20 69 6e 74 65 72 73 65  lectDest interse
15a60 63 74 64 65 73 74 3b 0a 20 20 20 20 20 20 69 6e  ctdest;.      in
15a70 74 20 72 31 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  t r1;..      /* 
15a80 49 4e 54 45 52 53 45 43 54 20 69 73 20 64 69 66  INTERSECT is dif
15a90 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  ferent from the 
15aa0 6f 74 68 65 72 73 20 73 69 6e 63 65 20 69 74 20  others since it 
15ab0 72 65 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a  requires.      *
15ac0 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 20  * two temporary 
15ad0 74 61 62 6c 65 73 2e 20 20 48 65 6e 63 65 20 69  tables.  Hence i
15ae0 74 20 68 61 73 20 69 74 73 20 6f 77 6e 20 63 61  t has its own ca
15af0 73 65 2e 20 20 42 65 67 69 6e 0a 20 20 20 20 20  se.  Begin.     
15b00 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69 6e   ** by allocatin
15b10 67 20 74 68 65 20 74 61 62 6c 65 73 20 77 65 20  g the tables we 
15b20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20 20  will need..     
15b30 20 2a 2f 0a 20 20 20 20 20 20 74 61 62 31 20 3d   */.      tab1 =
15b40 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
15b50 0a 20 20 20 20 20 20 74 61 62 32 20 3d 20 70 50  .      tab2 = pP
15b60 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
15b70 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
15b80 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 0a 20  OrderBy==0 );.. 
15b90 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
15ba0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
15bb0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
15bc0 6c 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20  l, tab1, 0);.   
15bd0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64     assert( p->ad
15be0 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d  drOpenEphm[0] ==
15bf0 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e   -1 );.      p->
15c00 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20  addrOpenEphm[0] 
15c10 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 66 69  = addr;.      fi
15c20 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e  ndRightmost(p)->
15c30 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55  selFlags |= SF_U
15c40 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20  sesEphemeral;.  
15c50 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
15c60 45 4c 69 73 74 20 29 3b 0a 0a 20 20 20 20 20 20  EList );..      
15c70 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45  /* Code the SELE
15c80 43 54 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 20  CTs to our left 
15c90 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74  into temporary t
15ca0 61 62 6c 65 20 22 74 61 62 31 22 2e 0a 20 20 20  able "tab1"..   
15cb0 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
15cc0 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
15cd0 74 28 26 69 6e 74 65 72 73 65 63 74 64 65 73 74  t(&intersectdest
15ce0 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62  , SRT_Union, tab
15cf0 31 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69  1);.      explai
15d00 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62  nSetInteger(iSub
15d10 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74  1, pParse->iNext
15d20 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20  SelectId);.     
15d30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
15d40 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69  ect(pParse, pPri
15d50 6f 72 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65  or, &intersectde
15d60 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  st);.      if( r
15d70 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  c ){.        got
15d80 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
15d90 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  nd;.      }..   
15da0 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63     /* Code the c
15db0 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69 6e  urrent SELECT in
15dc0 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  to temporary tab
15dd0 6c 65 20 22 74 61 62 32 22 0a 20 20 20 20 20 20  le "tab2".      
15de0 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  */.      addr = 
15df0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15e00 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
15e10 6d 65 72 61 6c 2c 20 74 61 62 32 2c 20 30 29 3b  meral, tab2, 0);
15e20 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
15e30 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31  ->addrOpenEphm[1
15e40 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20  ] == -1 );.     
15e50 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
15e60 5b 31 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20  [1] = addr;.    
15e70 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
15e80 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20  .      pLimit = 
15e90 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20  p->pLimit;.     
15ea0 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
15eb0 20 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20        pOffset = 
15ec0 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20  p->pOffset;.    
15ed0 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30    p->pOffset = 0
15ee0 3b 0a 20 20 20 20 20 20 69 6e 74 65 72 73 65 63  ;.      intersec
15ef0 74 64 65 73 74 2e 69 53 44 50 61 72 6d 20 3d 20  tdest.iSDParm = 
15f00 74 61 62 32 3b 0a 20 20 20 20 20 20 65 78 70 6c  tab2;.      expl
15f10 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53  ainSetInteger(iS
15f20 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65  ub2, pParse->iNe
15f30 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  xtSelectId);.   
15f40 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
15f50 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
15f60 20 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 29   &intersectdest)
15f70 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
15f80 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
15f90 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65  );.      pDelete
15fa0 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
15fb0 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
15fc0 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 69 66  pPrior;.      if
15fd0 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e  ( p->nSelectRow>
15fe0 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52  pPrior->nSelectR
15ff0 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52  ow ) p->nSelectR
16000 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65  ow = pPrior->nSe
16010 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 73  lectRow;.      s
16020 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
16030 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b  (db, p->pLimit);
16040 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  .      p->pLimit
16050 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20   = pLimit;.     
16060 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f   p->pOffset = pO
16070 66 66 73 65 74 3b 0a 0a 20 20 20 20 20 20 2f 2a  ffset;..      /*
16080 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
16090 6f 20 74 61 6b 65 20 74 68 65 20 69 6e 74 65 72  o take the inter
160a0 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 74  section of the t
160b0 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20  wo temporary.   
160c0 20 20 20 2a 2a 20 74 61 62 6c 65 73 2e 0a 20 20     ** tables..  
160d0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
160e0 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
160f0 3b 0a 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d  ;.      iBreak =
16100 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
16110 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
16120 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56  iCont = sqlite3V
16130 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
16140 0a 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69  .      computeLi
16150 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
16160 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b  rse, p, iBreak);
16170 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
16180 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
16190 65 77 69 6e 64 2c 20 74 61 62 31 2c 20 69 42 72  ewind, tab1, iBr
161a0 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61  eak); VdbeCovera
161b0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 72 31 20  ge(v);.      r1 
161c0 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
161d0 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
161e0 20 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69     iStart = sqli
161f0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
16200 20 4f 50 5f 52 6f 77 44 61 74 61 2c 20 74 61 62   OP_RowData, tab
16210 31 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  1, r1);.      sq
16220 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
16230 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e  nt(v, OP_NotFoun
16240 64 2c 20 74 61 62 32 2c 20 69 43 6f 6e 74 2c 20  d, tab2, iCont, 
16250 72 31 2c 20 30 29 3b 20 56 64 62 65 43 6f 76 65  r1, 0); VdbeCove
16260 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73  rage(v);.      s
16270 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
16280 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
16290 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e  ;.      selectIn
162a0 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
162b0 70 2c 20 74 61 62 31 2c 0a 20 20 20 20 20 20 20  p, tab1,.       
162c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
162d0 2c 20 30 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e  , 0, &dest, iCon
162e0 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  t, iBreak);.    
162f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
16300 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f  olveLabel(v, iCo
16310 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nt);.      sqlit
16320 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
16330 4f 50 5f 4e 65 78 74 2c 20 74 61 62 31 2c 20 69  OP_Next, tab1, i
16340 53 74 61 72 74 29 3b 20 56 64 62 65 43 6f 76 65  Start); VdbeCove
16350 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73  rage(v);.      s
16360 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
16370 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b  eLabel(v, iBreak
16380 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
16390 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
163a0 5f 43 6c 6f 73 65 2c 20 74 61 62 32 2c 20 30 29  _Close, tab2, 0)
163b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
163c0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
163d0 43 6c 6f 73 65 2c 20 74 61 62 31 2c 20 30 29 3b  Close, tab1, 0);
163e0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
163f0 20 20 7d 0a 20 20 7d 0a 0a 20 20 65 78 70 6c 61    }.  }..  expla
16400 69 6e 43 6f 6d 70 6f 73 69 74 65 28 70 50 61 72  inComposite(pPar
16410 73 65 2c 20 70 2d 3e 6f 70 2c 20 69 53 75 62 31  se, p->op, iSub1
16420 2c 20 69 53 75 62 32 2c 20 70 2d 3e 6f 70 21 3d  , iSub2, p->op!=
16430 54 4b 5f 41 4c 4c 29 3b 0a 0a 20 20 2f 2a 20 43  TK_ALL);..  /* C
16440 6f 6d 70 75 74 65 20 63 6f 6c 6c 61 74 69 6e 67  ompute collating
16450 20 73 65 71 75 65 6e 63 65 73 20 75 73 65 64 20   sequences used 
16460 62 79 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61  by .  ** tempora
16470 72 79 20 74 61 62 6c 65 73 20 6e 65 65 64 65 64  ry tables needed
16480 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
16490 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  e compound selec
164a0 74 2e 0a 20 20 2a 2a 20 41 74 74 61 63 68 20 74  t..  ** Attach t
164b0 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  he KeyInfo struc
164c0 74 75 72 65 20 74 6f 20 61 6c 6c 20 74 65 6d 70  ture to all temp
164d0 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 0a 20 20  orary tables..  
164e0 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 73 65 63  **.  ** This sec
164f0 74 69 6f 6e 20 69 73 20 72 75 6e 20 62 79 20 74  tion is run by t
16500 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 53 45  he right-most SE
16510 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f  LECT statement o
16520 6e 6c 79 2e 0a 20 20 2a 2a 20 53 45 4c 45 43 54  nly..  ** SELECT
16530 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 74   statements to t
16540 68 65 20 6c 65 66 74 20 61 6c 77 61 79 73 20 73  he left always s
16550 6b 69 70 20 74 68 69 73 20 70 61 72 74 2e 20 20  kip this part.  
16560 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20  The right-most. 
16570 20 2a 2a 20 53 45 4c 45 43 54 20 6d 69 67 68 74   ** SELECT might
16580 20 61 6c 73 6f 20 73 6b 69 70 20 74 68 69 73 20   also skip this 
16590 70 61 72 74 20 69 66 20 69 74 20 68 61 73 20 6e  part if it has n
165a0 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  o ORDER BY claus
165b0 65 20 61 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74 65  e and.  ** no te
165c0 6d 70 20 74 61 62 6c 65 73 20 61 72 65 20 72 65  mp tables are re
165d0 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  quired..  */.  i
165e0 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
165f0 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61   SF_UsesEphemera
16600 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20  l ){.    int i; 
16610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16620 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
16630 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 4b 65  ounter */.    Ke
16640 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
16650 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
16660 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
16670 65 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74  e for the result
16680 20 73 65 74 20 2a 2f 0a 20 20 20 20 53 65 6c 65   set */.    Sele
16690 63 74 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20  ct *pLoop;      
166a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
166b0 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68   looping through
166c0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
166d0 74 73 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65  ts */.    CollSe
166e0 71 20 2a 2a 61 70 43 6f 6c 6c 3b 20 20 20 20 20  q **apColl;     
166f0 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
16700 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20 70  ooping through p
16710 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d  KeyInfo->aColl[]
16720 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c   */.    int nCol
16730 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16740 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
16750 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65  of columns in re
16760 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20 20  sult set */..   
16770 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4e 65 78   assert( p->pNex
16780 74 3d 3d 30 20 29 3b 0a 20 20 20 20 6e 43 6f 6c  t==0 );.    nCol
16790 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45   = p->pEList->nE
167a0 78 70 72 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66  xpr;.    pKeyInf
167b0 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  o = sqlite3KeyIn
167c0 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 43 6f 6c  foAlloc(db, nCol
167d0 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 21 70  , 1);.    if( !p
167e0 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20  KeyInfo ){.     
167f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
16800 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67  EM_BKPT;.      g
16810 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
16820 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _end;.    }.    
16830 66 6f 72 28 69 3d 30 2c 20 61 70 43 6f 6c 6c 3d  for(i=0, apColl=
16840 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b  pKeyInfo->aColl;
16850 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 61 70   i<nCol; i++, ap
16860 43 6f 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 2a  Coll++){.      *
16870 61 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65  apColl = multiSe
16880 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72  lectCollSeq(pPar
16890 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20  se, p, i);.     
168a0 20 69 66 28 20 30 3d 3d 2a 61 70 43 6f 6c 6c 20   if( 0==*apColl 
168b0 29 7b 0a 20 20 20 20 20 20 20 20 2a 61 70 43 6f  ){.        *apCo
168c0 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
168d0 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ll;.      }.    
168e0 7d 0a 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70  }..    for(pLoop
168f0 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70  =p; pLoop; pLoop
16900 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 29 7b  =pLoop->pPrior){
16910 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
16920 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<2; i++){.     
16930 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 70 4c     int addr = pL
16940 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  oop->addrOpenEph
16950 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  m[i];.        if
16960 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20  ( addr<0 ){.    
16970 20 20 20 20 20 20 2f 2a 20 49 66 20 5b 30 5d 20        /* If [0] 
16980 69 73 20 75 6e 75 73 65 64 20 74 68 65 6e 20 5b  is unused then [
16990 31 5d 20 69 73 20 61 6c 73 6f 20 75 6e 75 73 65  1] is also unuse
169a0 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 0a 20 20  d.  So we can.  
169b0 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79          ** alway
169c0 73 20 73 61 66 65 6c 79 20 61 62 6f 72 74 20 61  s safely abort a
169d0 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 66 69  s soon as the fi
169e0 72 73 74 20 75 6e 75 73 65 64 20 73 6c 6f 74 20  rst unused slot 
169f0 69 73 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20  is found */.    
16a00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
16a10 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  oop->addrOpenEph
16a20 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20 20 20 20 20  m[1]<0 );.      
16a30 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
16a40 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
16a50 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32  ite3VdbeChangeP2
16a60 28 76 2c 20 61 64 64 72 2c 20 6e 43 6f 6c 29 3b  (v, addr, nCol);
16a70 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
16a80 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
16a90 61 64 64 72 2c 20 28 63 68 61 72 2a 29 73 71 6c  addr, (char*)sql
16aa0 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70  ite3KeyInfoRef(p
16ab0 4b 65 79 49 6e 66 6f 29 2c 0a 20 20 20 20 20 20  KeyInfo),.      
16ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ad0 20 20 20 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f        P4_KEYINFO
16ae0 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70  );.        pLoop
16af0 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69  ->addrOpenEphm[i
16b00 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a  ] = -1;.      }.
16b10 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
16b20 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b  3KeyInfoUnref(pK
16b30 65 79 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75  eyInfo);.  }..mu
16b40 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3a 0a  lti_select_end:.
16b50 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d    pDest->iSdst =
16b60 20 64 65 73 74 2e 69 53 64 73 74 3b 0a 20 20 70   dest.iSdst;.  p
16b70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 64 65  Dest->nSdst = de
16b80 73 74 2e 6e 53 64 73 74 3b 0a 20 20 73 71 6c 69  st.nSdst;.  sqli
16b90 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
16ba0 64 62 2c 20 70 44 65 6c 65 74 65 29 3b 0a 20 20  db, pDelete);.  
16bb0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
16bc0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
16bd0 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
16be0 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 45 72 72  CT */../*.** Err
16bf0 6f 72 20 6d 65 73 73 61 67 65 20 66 6f 72 20 77  or message for w
16c00 68 65 6e 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  hen two or more 
16c10 74 65 72 6d 73 20 6f 66 20 61 20 63 6f 6d 70 6f  terms of a compo
16c20 75 6e 64 20 73 65 6c 65 63 74 20 68 61 76 65 20  und select have 
16c30 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 73 69 7a  different.** siz
16c40 65 20 72 65 73 75 6c 74 20 73 65 74 73 2e 0a 2a  e result sets..*
16c50 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65  /.void sqlite3Se
16c60 6c 65 63 74 57 72 6f 6e 67 4e 75 6d 54 65 72 6d  lectWrongNumTerm
16c70 73 45 72 72 6f 72 28 50 61 72 73 65 20 2a 70 50  sError(Parse *pP
16c80 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29  arse, Select *p)
16c90 7b 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  {.  if( p->selFl
16ca0 61 67 73 20 26 20 53 46 5f 56 61 6c 75 65 73 20  ags & SF_Values 
16cb0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
16cc0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
16cd0 61 6c 6c 20 56 41 4c 55 45 53 20 6d 75 73 74 20  all VALUES must 
16ce0 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75  have the same nu
16cf0 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 22 29 3b  mber of terms");
16d00 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
16d10 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
16d20 61 72 73 65 2c 20 22 53 45 4c 45 43 54 73 20 74  arse, "SELECTs t
16d30 6f 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72  o the left and r
16d40 69 67 68 74 20 6f 66 20 25 73 22 0a 20 20 20 20  ight of %s".    
16d50 20 20 22 20 64 6f 20 6e 6f 74 20 68 61 76 65 20    " do not have 
16d60 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20  the same number 
16d70 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
16d80 73 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65  s", selectOpName
16d90 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 7d 0a 7d 0a  (p->op));.  }.}.
16da0 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 6f  ./*.** Code an o
16db0 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65  utput subroutine
16dc0 20 66 6f 72 20 61 20 63 6f 72 6f 75 74 69 6e 65   for a coroutine
16dd0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
16de0 6f 66 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73  of a.** SELECT s
16df0 74 61 74 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  tatment..**.** T
16e00 68 65 20 64 61 74 61 20 74 6f 20 62 65 20 6f 75  he data to be ou
16e10 74 70 75 74 20 69 73 20 63 6f 6e 74 61 69 6e 65  tput is containe
16e20 64 20 69 6e 20 70 49 6e 2d 3e 69 53 64 73 74 2e  d in pIn->iSdst.
16e30 20 20 54 68 65 72 65 20 61 72 65 0a 2a 2a 20 70    There are.** p
16e40 49 6e 2d 3e 6e 53 64 73 74 20 63 6f 6c 75 6d 6e  In->nSdst column
16e50 73 20 74 6f 20 62 65 20 6f 75 74 70 75 74 2e 20  s to be output. 
16e60 20 70 44 65 73 74 20 69 73 20 77 68 65 72 65 20   pDest is where 
16e70 74 68 65 20 6f 75 74 70 75 74 20 73 68 6f 75 6c  the output shoul
16e80 64 0a 2a 2a 20 62 65 20 73 65 6e 74 2e 0a 2a 2a  d.** be sent..**
16e90 0a 2a 2a 20 72 65 67 52 65 74 75 72 6e 20 69 73  .** regReturn is
16ea0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74   the number of t
16eb0 68 65 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64  he register hold
16ec0 69 6e 67 20 74 68 65 20 73 75 62 72 6f 75 74 69  ing the subrouti
16ed0 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 20 61 64 64  ne.** return add
16ee0 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72  ress..**.** If r
16ef0 65 67 50 72 65 76 3e 30 20 74 68 65 6e 20 69 74  egPrev>0 then it
16f00 20 69 73 20 74 68 65 20 66 69 72 73 74 20 72 65   is the first re
16f10 67 69 73 74 65 72 20 69 6e 20 61 20 76 65 63 74  gister in a vect
16f20 6f 72 20 74 68 61 74 0a 2a 2a 20 72 65 63 6f 72  or that.** recor
16f30 64 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  ds the previous 
16f40 6f 75 74 70 75 74 2e 20 20 6d 65 6d 5b 72 65 67  output.  mem[reg
16f50 50 72 65 76 5d 20 69 73 20 61 20 66 6c 61 67 20  Prev] is a flag 
16f60 74 68 61 74 20 69 73 20 66 61 6c 73 65 0a 2a 2a  that is false.**
16f70 20 69 66 20 74 68 65 72 65 20 68 61 73 20 62 65   if there has be
16f80 65 6e 20 6e 6f 20 70 72 65 76 69 6f 75 73 20 6f  en no previous o
16f90 75 74 70 75 74 2e 20 20 49 66 20 72 65 67 50 72  utput.  If regPr
16fa0 65 76 3e 30 20 74 68 65 6e 20 63 6f 64 65 20 69  ev>0 then code i
16fb0 73 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64 20 74  s.** generated t
16fc0 6f 20 73 75 70 70 72 65 73 73 20 64 75 70 6c 69  o suppress dupli
16fd0 63 61 74 65 73 2e 20 20 70 4b 65 79 49 6e 66 6f  cates.  pKeyInfo
16fe0 20 69 73 20 75 73 65 64 20 66 6f 72 20 63 6f 6d   is used for com
16ff0 70 61 72 69 6e 67 0a 2a 2a 20 6b 65 79 73 2e 0a  paring.** keys..
17000 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4c 49 4d  **.** If the LIM
17010 49 54 20 66 6f 75 6e 64 20 69 6e 20 70 2d 3e 69  IT found in p->i
17020 4c 69 6d 69 74 20 69 73 20 72 65 61 63 68 65 64  Limit is reached
17030 2c 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65  , jump immediate
17040 6c 79 20 74 6f 0a 2a 2a 20 69 42 72 65 61 6b 2e  ly to.** iBreak.
17050 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
17060 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75 62  enerateOutputSub
17070 72 6f 75 74 69 6e 65 28 0a 20 20 50 61 72 73 65  routine(.  Parse
17080 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
17090 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
170a0 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
170b0 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
170c0 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
170d0 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
170e0 53 65 6c 65 63 74 44 65 73 74 20 2a 70 49 6e 2c  SelectDest *pIn,
170f0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 6f 75          /* Corou
17100 74 69 6e 65 20 73 75 70 70 6c 79 69 6e 67 20 64  tine supplying d
17110 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ata */.  SelectD
17120 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20 20 20  est *pDest,     
17130 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 73 65 6e   /* Where to sen
17140 64 20 74 68 65 20 64 61 74 61 20 2a 2f 0a 20 20  d the data */.  
17150 69 6e 74 20 72 65 67 52 65 74 75 72 6e 2c 20 20  int regReturn,  
17160 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
17170 65 74 75 72 6e 20 61 64 64 72 65 73 73 20 72 65  eturn address re
17180 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  gister */.  int 
17190 72 65 67 50 72 65 76 2c 20 20 20 20 20 20 20 20  regPrev,        
171a0 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20      /* Previous 
171b0 72 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 2e  result register.
171c0 20 20 4e 6f 20 75 6e 69 71 75 65 6e 65 73 73 20    No uniqueness 
171d0 69 66 20 30 20 2a 2f 0a 20 20 4b 65 79 49 6e 66  if 0 */.  KeyInf
171e0 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20  o *pKeyInfo,    
171f0 20 20 2f 2a 20 46 6f 72 20 63 6f 6d 70 61 72 69    /* For compari
17200 6e 67 20 77 69 74 68 20 70 72 65 76 69 6f 75 73  ng with previous
17210 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69 6e 74 20   entry */.  int 
17220 69 42 72 65 61 6b 20 20 20 20 20 20 20 20 20 20  iBreak          
17230 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
17240 20 69 66 20 77 65 20 68 69 74 20 74 68 65 20 4c   if we hit the L
17250 49 4d 49 54 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  IMIT */.){.  Vdb
17260 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
17270 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 43 6f 6e  Vdbe;.  int iCon
17280 74 69 6e 75 65 3b 0a 20 20 69 6e 74 20 61 64 64  tinue;.  int add
17290 72 3b 0a 0a 20 20 61 64 64 72 20 3d 20 73 71 6c  r;..  addr = sql
172a0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
172b0 64 64 72 28 76 29 3b 0a 20 20 69 43 6f 6e 74 69  ddr(v);.  iConti
172c0 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  nue = sqlite3Vdb
172d0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a  eMakeLabel(v);..
172e0 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20 64 75    /* Suppress du
172f0 70 6c 69 63 61 74 65 73 20 66 6f 72 20 55 4e 49  plicates for UNI
17300 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e 64 20  ON, EXCEPT, and 
17310 49 4e 54 45 52 53 45 43 54 20 0a 20 20 2a 2f 0a  INTERSECT .  */.
17320 20 20 69 66 28 20 72 65 67 50 72 65 76 20 29 7b    if( regPrev ){
17330 0a 20 20 20 20 69 6e 74 20 61 64 64 72 31 2c 20  .    int addr1, 
17340 61 64 64 72 32 3b 0a 20 20 20 20 61 64 64 72 31  addr2;.    addr1
17350 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
17360 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  dOp1(v, OP_IfNot
17370 2c 20 72 65 67 50 72 65 76 29 3b 20 56 64 62 65  , regPrev); Vdbe
17380 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
17390 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33   addr2 = sqlite3
173a0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
173b0 5f 43 6f 6d 70 61 72 65 2c 20 70 49 6e 2d 3e 69  _Compare, pIn->i
173c0 53 64 73 74 2c 20 72 65 67 50 72 65 76 2b 31 2c  Sdst, regPrev+1,
173d0 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 0a 20 20 20   pIn->nSdst,.   
173e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173f0 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
17400 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  *)sqlite3KeyInfo
17410 52 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c 20 50  Ref(pKeyInfo), P
17420 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
17430 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17440 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64  3(v, OP_Jump, ad
17450 64 72 32 2b 32 2c 20 69 43 6f 6e 74 69 6e 75 65  dr2+2, iContinue
17460 2c 20 61 64 64 72 32 2b 32 29 3b 20 56 64 62 65  , addr2+2); Vdbe
17470 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
17480 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
17490 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
174a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
174b0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79  ddOp3(v, OP_Copy
174c0 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 72 65  , pIn->iSdst, re
174d0 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53  gPrev+1, pIn->nS
174e0 64 73 74 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69  dst-1);.    sqli
174f0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
17500 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
17510 72 65 67 50 72 65 76 29 3b 0a 20 20 7d 0a 20 20  regPrev);.  }.  
17520 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  if( pParse->db->
17530 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
17540 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 53  eturn 0;..  /* S
17550 75 70 70 72 65 73 73 20 74 68 65 20 66 69 72 73  uppress the firs
17560 74 20 4f 46 46 53 45 54 20 65 6e 74 72 69 65 73  t OFFSET entries
17570 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   if there is an 
17580 4f 46 46 53 45 54 20 63 6c 61 75 73 65 0a 20 20  OFFSET clause.  
17590 2a 2f 0a 20 20 63 6f 64 65 4f 66 66 73 65 74 28  */.  codeOffset(
175a0 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69  v, p->iOffset, i
175b0 43 6f 6e 74 69 6e 75 65 29 3b 0a 0a 20 20 61 73  Continue);..  as
175c0 73 65 72 74 28 20 70 44 65 73 74 2d 3e 65 44 65  sert( pDest->eDe
175d0 73 74 21 3d 53 52 54 5f 45 78 69 73 74 73 20 29  st!=SRT_Exists )
175e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 65 73  ;.  assert( pDes
175f0 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 54 61  t->eDest!=SRT_Ta
17600 62 6c 65 20 29 3b 0a 20 20 73 77 69 74 63 68 28  ble );.  switch(
17610 20 70 44 65 73 74 2d 3e 65 44 65 73 74 20 29 7b   pDest->eDest ){
17620 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68  .    /* Store th
17630 65 20 72 65 73 75 6c 74 20 61 73 20 64 61 74 61  e result as data
17640 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65 20   using a unique 
17650 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  key..    */.    
17660 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61  case SRT_EphemTa
17670 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  b: {.      int r
17680 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
17690 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
176a0 20 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71       int r2 = sq
176b0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
176c0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
176d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
176e0 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
176f0 64 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70  d, pIn->iSdst, p
17700 49 6e 2d 3e 6e 53 64 73 74 2c 20 72 31 29 3b 0a  In->nSdst, r1);.
17710 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17720 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
17730 77 52 6f 77 69 64 2c 20 70 44 65 73 74 2d 3e 69  wRowid, pDest->i
17740 53 44 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20  SDParm, r2);.   
17750 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17760 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72  dOp3(v, OP_Inser
17770 74 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  t, pDest->iSDPar
17780 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20  m, r1, r2);.    
17790 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
177a0 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
177b0 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 73  APPEND);.      s
177c0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
177d0 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29  pReg(pParse, r2)
177e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
177f0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
17800 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
17810 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23   break;.    }..#
17820 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
17830 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
17840 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63 72 65  /* If we are cre
17850 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72 20  ating a set for 
17860 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c  an "expr IN (SEL
17870 45 43 54 20 2e 2e 2e 29 22 2e 0a 20 20 20 20 2a  ECT ...)"..    *
17880 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53  /.    case SRT_S
17890 65 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  et: {.      int 
178a0 72 31 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  r1;.      testca
178b0 73 65 28 20 70 49 6e 2d 3e 6e 53 64 73 74 3e 31  se( pIn->nSdst>1
178c0 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
178d0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
178e0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
178f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17900 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  4(v, OP_MakeReco
17910 72 64 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  rd, pIn->iSdst, 
17920 70 49 6e 2d 3e 6e 53 64 73 74 2c 20 0a 20 20 20  pIn->nSdst, .   
17930 20 20 20 20 20 20 20 72 31 2c 20 70 44 65 73 74         r1, pDest
17940 2d 3e 7a 41 66 66 53 64 73 74 2c 20 70 49 6e 2d  ->zAffSdst, pIn-
17950 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73  >nSdst);.      s
17960 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
17970 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
17980 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74  arse, pIn->iSdst
17990 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20  , pIn->nSdst);. 
179a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
179b0 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
179c0 49 64 78 49 6e 73 65 72 74 2c 20 70 44 65 73 74  IdxInsert, pDest
179d0 2d 3e 69 53 44 50 61 72 6d 2c 20 72 31 2c 0a 20  ->iSDParm, r1,. 
179e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
179f0 20 20 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 69            pIn->i
17a00 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74  Sdst, pIn->nSdst
17a10 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
17a20 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
17a30 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
17a40 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
17a50 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
17a60 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63  s a scalar selec
17a70 74 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f  t that is part o
17a80 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c  f an expression,
17a90 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f   then.    ** sto
17aa0 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  re the results i
17ab0 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  n the appropriat
17ac0 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e  e memory cell an
17ad0 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20 20 20  d break out.    
17ae0 2a 2a 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c  ** of the scan l
17af0 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oop..    */.    
17b00 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a  case SRT_Mem: {.
17b10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
17b20 6e 2d 3e 6e 53 64 73 74 3d 3d 31 20 7c 7c 20 70  n->nSdst==1 || p
17b30 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 3b  Parse->nErr>0 );
17b40 20 20 74 65 73 74 63 61 73 65 28 20 70 49 6e 2d    testcase( pIn-
17b50 3e 6e 53 64 73 74 21 3d 31 20 29 3b 0a 20 20 20  >nSdst!=1 );.   
17b60 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
17b70 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70  deMove(pParse, p
17b80 49 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74  In->iSdst, pDest
17b90 2d 3e 69 53 44 50 61 72 6d 2c 20 31 29 3b 0a 20  ->iSDParm, 1);. 
17ba0 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49       /* The LIMI
17bb0 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75  T clause will ju
17bc0 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f  mp out of the lo
17bd0 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20  op for us */.   
17be0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
17bf0 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65  #endif /* #ifnde
17c00 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
17c10 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f  BQUERY */..    /
17c20 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72  * The results ar
17c30 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73 65  e stored in a se
17c40 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74  quence of regist
17c50 65 72 73 0a 20 20 20 20 2a 2a 20 73 74 61 72 74  ers.    ** start
17c60 69 6e 67 20 61 74 20 70 44 65 73 74 2d 3e 69 53  ing at pDest->iS
17c70 64 73 74 2e 20 20 54 68 65 6e 20 74 68 65 20 63  dst.  Then the c
17c80 6f 2d 72 6f 75 74 69 6e 65 20 79 69 65 6c 64 73  o-routine yields
17c90 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
17ca0 65 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a  e SRT_Coroutine:
17cb0 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 65   {.      if( pDe
17cc0 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29 7b 0a  st->iSdst==0 ){.
17cd0 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 69          pDest->i
17ce0 53 64 73 74 20 3d 20 73 71 6c 69 74 65 33 47 65  Sdst = sqlite3Ge
17cf0 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
17d00 65 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a  e, pIn->nSdst);.
17d10 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 6e          pDest->n
17d20 53 64 73 74 20 3d 20 70 49 6e 2d 3e 6e 53 64 73  Sdst = pIn->nSds
17d30 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
17d40 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
17d50 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e  Move(pParse, pIn
17d60 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e  ->iSdst, pDest->
17d70 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73  iSdst, pIn->nSds
17d80 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
17d90 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
17da0 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e  P_Yield, pDest->
17db0 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  iSDParm);.      
17dc0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
17dd0 20 20 2f 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20    /* If none of 
17de0 74 68 65 20 61 62 6f 76 65 2c 20 74 68 65 6e 20  the above, then 
17df0 74 68 65 20 72 65 73 75 6c 74 20 64 65 73 74 69  the result desti
17e00 6e 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 0a 20  nation must be. 
17e10 20 20 20 2a 2a 20 53 52 54 5f 4f 75 74 70 75 74     ** SRT_Output
17e20 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
17e30 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20  is never called 
17e40 77 69 74 68 20 61 6e 79 20 6f 74 68 65 72 0a 20  with any other. 
17e50 20 20 20 2a 2a 20 64 65 73 74 69 6e 61 74 69 6f     ** destinatio
17e60 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65  n other than the
17e70 20 6f 6e 65 73 20 68 61 6e 64 6c 65 64 20 61 62   ones handled ab
17e80 6f 76 65 20 6f 72 20 53 52 54 5f 4f 75 74 70 75  ove or SRT_Outpu
17e90 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  t..    **.    **
17ea0 20 46 6f 72 20 53 52 54 5f 4f 75 74 70 75 74 2c   For SRT_Output,
17eb0 20 72 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f   results are sto
17ec0 72 65 64 20 69 6e 20 61 20 73 65 71 75 65 6e 63  red in a sequenc
17ed0 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 2e 20  e of registers. 
17ee0 20 0a 20 20 20 20 2a 2a 20 54 68 65 6e 20 74 68   .    ** Then th
17ef0 65 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20 6f  e OP_ResultRow o
17f00 70 63 6f 64 65 20 69 73 20 75 73 65 64 20 74 6f  pcode is used to
17f10 20 63 61 75 73 65 20 73 71 6c 69 74 65 33 5f 73   cause sqlite3_s
17f20 74 65 70 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20  tep() to.    ** 
17f30 72 65 74 75 72 6e 20 74 68 65 20 6e 65 78 74 20  return the next 
17f40 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 2e 0a 20  row of result.. 
17f50 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c     */.    defaul
17f60 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t: {.      asser
17f70 74 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  t( pDest->eDest=
17f80 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20  =SRT_Output );. 
17f90 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
17fa0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
17fb0 75 6c 74 52 6f 77 2c 20 70 49 6e 2d 3e 69 53 64  ultRow, pIn->iSd
17fc0 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b  st, pIn->nSdst);
17fd0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
17fe0 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
17ff0 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49  hange(pParse, pI
18000 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e  n->iSdst, pIn->n
18010 53 64 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65  Sdst);.      bre
18020 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
18030 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20   /* Jump to the 
18040 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  end of the loop 
18050 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20  if the LIMIT is 
18060 72 65 61 63 68 65 64 2e 0a 20 20 2a 2f 0a 20 20  reached..  */.  
18070 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b  if( p->iLimit ){
18080 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
18090 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63  AddOp2(v, OP_Dec
180a0 72 4a 75 6d 70 5a 65 72 6f 2c 20 70 2d 3e 69 4c  rJumpZero, p->iL
180b0 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 20 56  imit, iBreak); V
180c0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
180d0 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
180e0 74 65 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  te the subroutin
180f0 65 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20 20  e return.  */.  
18100 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
18110 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74  veLabel(v, iCont
18120 69 6e 75 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  inue);.  sqlite3
18130 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
18140 5f 52 65 74 75 72 6e 2c 20 72 65 67 52 65 74 75  _Return, regRetu
18150 72 6e 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 61  rn);..  return a
18160 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  ddr;.}../*.** Al
18170 74 65 72 6e 61 74 69 76 65 20 63 6f 6d 70 6f 75  ternative compou
18180 6e 64 20 73 65 6c 65 63 74 20 63 6f 64 65 20 67  nd select code g
18190 65 6e 65 72 61 74 6f 72 20 66 6f 72 20 63 61 73  enerator for cas
181a0 65 73 20 77 68 65 6e 20 74 68 65 72 65 0a 2a 2a  es when there.**
181b0 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
181c0 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 65  clause..**.** We
181d0 20 61 73 73 75 6d 65 20 61 20 71 75 65 72 79 20   assume a query 
181e0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
181f0 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   form:.**.**    
18200 20 20 3c 73 65 6c 65 63 74 41 3e 20 20 3c 6f 70    <selectA>  <op
18210 65 72 61 74 6f 72 3e 20 20 3c 73 65 6c 65 63 74  erator>  <select
18220 42 3e 20 20 4f 52 44 45 52 20 42 59 20 3c 6f 72  B>  ORDER BY <or
18230 64 65 72 62 79 6c 69 73 74 3e 0a 2a 2a 0a 2a 2a  derbylist>.**.**
18240 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73 20 6f   <operator> is o
18250 6e 65 20 6f 66 20 55 4e 49 4f 4e 20 41 4c 4c 2c  ne of UNION ALL,
18260 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20   UNION, EXCEPT, 
18270 6f 72 20 49 4e 54 45 52 53 45 43 54 2e 20 20 54  or INTERSECT.  T
18280 68 65 20 69 64 65 61 0a 2a 2a 20 69 73 20 74 6f  he idea.** is to
18290 20 63 6f 64 65 20 62 6f 74 68 20 3c 73 65 6c 65   code both <sele
182a0 63 74 41 3e 20 61 6e 64 20 3c 73 65 6c 65 63 74  ctA> and <select
182b0 42 3e 20 77 69 74 68 20 74 68 65 20 4f 52 44 45  B> with the ORDE
182c0 52 20 42 59 20 63 6c 61 75 73 65 20 61 73 0a 2a  R BY clause as.*
182d0 2a 20 63 6f 2d 72 6f 75 74 69 6e 65 73 2e 20 20  * co-routines.  
182e0 54 68 65 6e 20 72 75 6e 20 74 68 65 20 63 6f 2d  Then run the co-
182f0 72 6f 75 74 69 6e 65 73 20 69 6e 20 70 61 72 61  routines in para
18300 6c 6c 65 6c 20 61 6e 64 20 6d 65 72 67 65 20 74  llel and merge t
18310 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e  he results.** in
18320 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 20 20  to the output.  
18330 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 74  In addition to t
18340 68 65 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65  he two coroutine
18350 73 20 28 63 61 6c 6c 65 64 20 73 65 6c 65 63 74  s (called select
18360 41 20 61 6e 64 0a 2a 2a 20 73 65 6c 65 63 74 42  A and.** selectB
18370 29 20 74 68 65 72 65 20 61 72 65 20 37 20 73 75  ) there are 7 su
18380 62 72 6f 75 74 69 6e 65 73 3a 0a 2a 2a 0a 2a 2a  broutines:.**.**
18390 20 20 20 20 6f 75 74 41 3a 20 20 20 20 4d 6f 76      outA:    Mov
183a0 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20  e the output of 
183b0 74 68 65 20 73 65 6c 65 63 74 41 20 63 6f 72 6f  the selectA coro
183c0 75 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f  utine into the o
183d0 75 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20  utput.**        
183e0 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70       of the comp
183f0 6f 75 6e 64 20 71 75 65 72 79 2e 0a 2a 2a 0a 2a  ound query..**.*
18400 2a 20 20 20 20 6f 75 74 42 3a 20 20 20 20 4d 6f  *    outB:    Mo
18410 76 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66  ve the output of
18420 20 74 68 65 20 73 65 6c 65 63 74 42 20 63 6f 72   the selectB cor
18430 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20  outine into the 
18440 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20  output.**       
18450 20 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d        of the com
18460 70 6f 75 6e 64 20 71 75 65 72 79 2e 20 20 28 4f  pound query.  (O
18470 6e 6c 79 20 67 65 6e 65 72 61 74 65 64 20 66 6f  nly generated fo
18480 72 20 55 4e 49 4f 4e 20 61 6e 64 0a 2a 2a 20 20  r UNION and.**  
18490 20 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e             UNION
184a0 20 41 4c 4c 2e 20 20 45 58 43 45 50 54 20 61 6e   ALL.  EXCEPT an
184b0 64 20 49 4e 53 45 52 54 53 45 43 54 20 6e 65 76  d INSERTSECT nev
184c0 65 72 20 6f 75 74 70 75 74 20 61 20 72 6f 77 20  er output a row 
184d0 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  that.**         
184e0 20 20 20 20 61 70 70 65 61 72 73 20 6f 6e 6c 79      appears only
184f0 20 69 6e 20 42 2e 29 0a 2a 2a 0a 2a 2a 20 20 20   in B.).**.**   
18500 20 41 6c 74 42 3a 20 20 20 20 43 61 6c 6c 65 64   AltB:    Called
18510 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 64   when there is d
18520 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f  ata from both co
18530 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3c 42  routines and A<B
18540 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 65 71 42 3a  ..**.**    AeqB:
18550 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20      Called when 
18560 74 68 65 72 65 20 69 73 20 64 61 74 61 20 66 72  there is data fr
18570 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e  om both coroutin
18580 65 73 20 61 6e 64 20 41 3d 3d 42 2e 0a 2a 2a 0a  es and A==B..**.
18590 2a 2a 20 20 20 20 41 67 74 42 3a 20 20 20 20 43  **    AgtB:    C
185a0 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65  alled when there
185b0 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f   is data from bo
185c0 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e  th coroutines an
185d0 64 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  d A>B..**.**    
185e0 45 6f 66 41 3a 20 20 20 20 43 61 6c 6c 65 64 20  EofA:    Called 
185f0 77 68 65 6e 20 64 61 74 61 20 69 73 20 65 78 68  when data is exh
18600 61 75 73 74 65 64 20 66 72 6f 6d 20 73 65 6c 65  austed from sele
18610 63 74 41 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f  ctA..**.**    Eo
18620 66 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68  fB:    Called wh
18630 65 6e 20 64 61 74 61 20 69 73 20 65 78 68 61 75  en data is exhau
18640 73 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63 74  sted from select
18650 42 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70  B..**.** The imp
18660 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
18670 68 65 20 6c 61 74 74 65 72 20 66 69 76 65 20 73  he latter five s
18680 75 62 72 6f 75 74 69 6e 65 73 20 64 65 70 65 6e  ubroutines depen
18690 64 20 6f 6e 20 77 68 69 63 68 20 0a 2a 2a 20 3c  d on which .** <
186a0 6f 70 65 72 61 74 6f 72 3e 20 69 73 20 75 73 65  operator> is use
186b0 64 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  d:.**.**.**     
186c0 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c          UNION AL
186d0 4c 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20  L         UNION 
186e0 20 20 20 20 20 20 20 20 20 20 20 45 58 43 45 50             EXCEP
186f0 54 20 20 20 20 20 20 20 20 20 20 49 4e 54 45 52  T          INTER
18700 53 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20  SECT.**         
18710 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20   -------------  
18720 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18730 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -  -------------
18740 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -  -------------
18750 2d 2d 2d 2d 0a 2a 2a 20 20 20 41 6c 74 42 3a 20  ----.**   AltB: 
18760 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
18770 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
18780 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41       outA, nextA
18790 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 0a 2a           nextA.*
187a0 2a 0a 2a 2a 20 20 20 41 65 71 42 3a 20 20 20 6f  *.**   AeqB:   o
187b0 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
187c0 20 20 20 6e 65 78 74 41 20 20 20 20 20 20 20 20     nextA        
187d0 20 20 20 20 20 6e 65 78 74 41 20 20 20 20 20 20       nextA      
187e0 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 0a 2a     outA, nextA.*
187f0 2a 0a 2a 2a 20 20 20 41 67 74 42 3a 20 20 20 6f  *.**   AgtB:   o
18800 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20  utB, nextB      
18810 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20  outB, nextB     
18820 20 20 20 20 20 6e 65 78 74 42 20 20 20 20 20 20       nextB      
18830 20 20 20 20 20 20 6e 65 78 74 42 0a 2a 2a 0a 2a        nextB.**.*
18840 2a 20 20 20 45 6f 66 41 3a 20 20 20 6f 75 74 42  *   EofA:   outB
18850 2c 20 6e 65 78 74 42 20 20 20 20 20 20 6f 75 74  , nextB      out
18860 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 20 20  B, nextB        
18870 20 20 68 61 6c 74 20 20 20 20 20 20 20 20 20 20    halt          
18880 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 20 20     halt.**.**   
18890 45 6f 66 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65  EofB:   outA, ne
188a0 78 74 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e  xtA      outA, n
188b0 65 78 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c  extA       outA,
188c0 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 68   nextA         h
188d0 61 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65  alt.**.** In the
188e0 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 61 6e 64   AltB, AeqB, and
188f0 20 41 67 74 42 20 73 75 62 72 6f 75 74 69 6e 65   AgtB subroutine
18900 73 2c 20 61 6e 20 45 4f 46 20 6f 6e 20 41 20 66  s, an EOF on A f
18910 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 41 0a 2a  ollowing nextA.*
18920 2a 20 63 61 75 73 65 73 20 61 6e 20 69 6d 6d 65  * causes an imme
18930 64 69 61 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f  diate jump to Eo
18940 66 41 20 61 6e 64 20 61 6e 20 45 4f 46 20 6f 6e  fA and an EOF on
18950 20 42 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78   B following nex
18960 74 42 20 63 61 75 73 65 73 0a 2a 2a 20 61 6e 20  tB causes.** an 
18970 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74  immediate jump t
18980 6f 20 45 6f 66 42 2e 20 20 57 69 74 68 69 6e 20  o EofB.  Within 
18990 45 6f 66 41 20 61 6e 64 20 45 6f 66 42 2c 20 61  EofA and EofB, a
189a0 6e 64 20 45 4f 46 20 6f 6e 20 65 6e 74 72 79 20  nd EOF on entry 
189b0 6f 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  or.** following 
189c0 6e 65 78 74 58 20 63 61 75 73 65 73 20 61 20 6a  nextX causes a j
189d0 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ump to the end o
189e0 66 20 74 68 65 20 73 65 6c 65 63 74 20 70 72 6f  f the select pro
189f0 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 44  cessing..**.** D
18a00 75 70 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c  uplicate removal
18a10 20 69 6e 20 74 68 65 20 55 4e 49 4f 4e 2c 20 45   in the UNION, E
18a20 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52  XCEPT, and INTER
18a30 53 45 43 54 20 63 61 73 65 73 20 69 73 20 68 61  SECT cases is ha
18a40 6e 64 6c 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20  ndled.** within 
18a50 74 68 65 20 6f 75 74 70 75 74 20 73 75 62 72 6f  the output subro
18a60 75 74 69 6e 65 2e 20 20 54 68 65 20 72 65 67 50  utine.  The regP
18a70 72 65 76 20 72 65 67 69 73 74 65 72 20 73 65 74  rev register set
18a80 20 68 6f 6c 64 73 20 74 68 65 20 70 72 65 76 69   holds the previ
18a90 6f 75 73 6c 79 0a 2a 2a 20 6f 75 74 70 75 74 20  ously.** output 
18aa0 76 61 6c 75 65 2e 20 20 41 20 63 6f 6d 70 61 72  value.  A compar
18ab0 69 73 6f 6e 20 69 73 20 6d 61 64 65 20 61 67 61  ison is made aga
18ac0 69 6e 73 74 20 74 68 69 73 20 76 61 6c 75 65 20  inst this value 
18ad0 61 6e 64 20 74 68 65 20 6f 75 74 70 75 74 0a 2a  and the output.*
18ae0 2a 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20  * is skipped if 
18af0 74 68 65 20 6e 65 78 74 20 72 65 73 75 6c 74 73  the next results
18b00 20 77 6f 75 6c 64 20 62 65 20 74 68 65 20 73 61   would be the sa
18b10 6d 65 20 61 73 20 74 68 65 20 70 72 65 76 69 6f  me as the previo
18b20 75 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d  us..**.** The im
18b30 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 70 6c 61  plementation pla
18b40 6e 20 69 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  n is to implemen
18b50 74 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75 74  t the two corout
18b60 69 6e 65 73 20 61 6e 64 20 73 65 76 65 6e 0a 2a  ines and seven.*
18b70 2a 20 73 75 62 72 6f 75 74 69 6e 65 73 20 66 69  * subroutines fi
18b80 72 73 74 2c 20 74 68 65 6e 20 70 75 74 20 74 68  rst, then put th
18b90 65 20 63 6f 6e 74 72 6f 6c 20 6c 6f 67 69 63 20  e control logic 
18ba0 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 2e 20 20  at the bottom.  
18bb0 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  Like this:.**.**
18bc0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 49            goto I
18bd0 6e 69 74 0a 2a 2a 20 20 20 20 20 63 6f 41 3a 20  nit.**     coA: 
18be0 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65  coroutine for le
18bf0 66 74 20 71 75 65 72 79 20 28 41 29 0a 2a 2a 20  ft query (A).** 
18c00 20 20 20 20 63 6f 42 3a 20 63 6f 72 6f 75 74 69      coB: corouti
18c10 6e 65 20 66 6f 72 20 72 69 67 68 74 20 71 75 65  ne for right que
18c20 72 79 20 28 42 29 0a 2a 2a 20 20 20 20 6f 75 74  ry (B).**    out
18c30 41 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f  A: output one ro
18c40 77 20 6f 66 20 41 0a 2a 2a 20 20 20 20 6f 75 74  w of A.**    out
18c50 42 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f  B: output one ro
18c60 77 20 6f 66 20 42 20 28 55 4e 49 4f 4e 20 61 6e  w of B (UNION an
18c70 64 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 6e 6c 79  d UNION ALL only
18c80 29 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20 2e 2e  ).**    EofA: ..
18c90 2e 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20 2e 2e  ..**    EofB: ..
18ca0 2e 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20 2e 2e  ..**    AltB: ..
18cb0 2e 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20 2e 2e  ..**    AeqB: ..
18cc0 2e 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20 2e 2e  ..**    AgtB: ..
18cd0 2e 0a 2a 2a 20 20 20 20 49 6e 69 74 3a 20 69 6e  ..**    Init: in
18ce0 69 74 69 61 6c 69 7a 65 20 63 6f 72 6f 75 74 69  itialize corouti
18cf0 6e 65 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20  ne registers.** 
18d00 20 20 20 20 20 20 20 20 20 79 69 65 6c 64 20 63           yield c
18d10 6f 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69  oA.**          i
18d20 66 20 65 6f 66 28 41 29 20 67 6f 74 6f 20 45 6f  f eof(A) goto Eo
18d30 66 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79  fA.**          y
18d40 69 65 6c 64 20 63 6f 42 0a 2a 2a 20 20 20 20 20  ield coB.**     
18d50 20 20 20 20 20 69 66 20 65 6f 66 28 42 29 20 67       if eof(B) g
18d60 6f 74 6f 20 45 6f 66 42 0a 2a 2a 20 20 20 20 43  oto EofB.**    C
18d70 6d 70 72 3a 20 43 6f 6d 70 61 72 65 20 41 2c 20  mpr: Compare A, 
18d80 42 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 4a 75  B.**          Ju
18d90 6d 70 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41  mp AltB, AeqB, A
18da0 67 74 42 0a 2a 2a 20 20 20 20 20 45 6e 64 3a 20  gtB.**     End: 
18db0 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 63 61 6c  ....**.** We cal
18dc0 6c 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67  l AltB, AeqB, Ag
18dd0 74 42 2c 20 45 6f 66 41 2c 20 61 6e 64 20 45 6f  tB, EofA, and Eo
18de0 66 42 20 22 73 75 62 72 6f 75 74 69 6e 65 73 22  fB "subroutines"
18df0 20 62 75 74 20 74 68 65 79 20 61 72 65 20 6e 6f   but they are no
18e00 74 0a 2a 2a 20 61 63 74 75 61 6c 6c 79 20 63 61  t.** actually ca
18e10 6c 6c 65 64 20 75 73 69 6e 67 20 47 6f 73 75 62  lled using Gosub
18e20 20 61 6e 64 20 74 68 65 79 20 64 6f 20 6e 6f 74   and they do not
18e30 20 52 65 74 75 72 6e 2e 20 20 45 6f 66 41 20 61   Return.  EofA a
18e40 6e 64 20 45 6f 66 42 20 6c 6f 6f 70 0a 2a 2a 20  nd EofB loop.** 
18e50 75 6e 74 69 6c 20 61 6c 6c 20 64 61 74 61 20 69  until all data i
18e60 73 20 65 78 68 61 75 73 74 65 64 20 74 68 65 6e  s exhausted then
18e70 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 22 65 6e   jump to the "en
18e80 64 22 20 6c 61 62 65 2e 20 20 41 6c 74 42 2c 20  d" labe.  AltB, 
18e90 41 65 71 42 2c 0a 2a 2a 20 61 6e 64 20 41 67 74  AeqB,.** and Agt
18ea0 42 20 6a 75 6d 70 20 74 6f 20 65 69 74 68 65 72  B jump to either
18eb0 20 4c 32 20 6f 72 20 74 6f 20 6f 6e 65 20 6f 66   L2 or to one of
18ec0 20 45 6f 66 41 20 6f 72 20 45 6f 66 42 2e 0a 2a   EofA or EofB..*
18ed0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
18ee0 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
18ef0 45 4c 45 43 54 0a 73 74 61 74 69 63 20 69 6e 74  ELECT.static int
18f00 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65   multiSelectOrde
18f10 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  rBy(.  Parse *pP
18f20 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
18f30 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
18f40 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
18f50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
18f60 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20  e right-most of 
18f70 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f  SELECTs to be co
18f80 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ded */.  SelectD
18f90 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f  est *pDest     /
18fa0 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
18fb0 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20  h query results 
18fc0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  */.){.  int i, j
18fd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
18fe0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
18ff0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69  /.  Select *pPri
19000 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f  or;       /* Ano
19010 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65  ther SELECT imme
19020 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c  diately to our l
19030 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  eft */.  Vdbe *v
19040 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
19050 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
19060 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a  to this VDBE */.
19070 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
19080 74 41 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69  tA;     /* Desti
19090 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75  nation for corou
190a0 74 69 6e 65 20 41 20 2a 2f 0a 20 20 53 65 6c 65  tine A */.  Sele
190b0 63 74 44 65 73 74 20 64 65 73 74 42 3b 20 20 20  ctDest destB;   
190c0 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e    /* Destination
190d0 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20 42   for coroutine B
190e0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 64 64   */.  int regAdd
190f0 72 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  rA;         /* A
19100 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
19110 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 63 6f 72  for select-A cor
19120 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
19130 72 65 67 41 64 64 72 42 3b 20 20 20 20 20 20 20  regAddrB;       
19140 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67    /* Address reg
19150 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74  ister for select
19160 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a  -B coroutine */.
19170 20 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74    int addrSelect
19180 41 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65  A;      /* Addre
19190 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ss of the select
191a0 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a  -A coroutine */.
191b0 20 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74    int addrSelect
191c0 42 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65  B;      /* Addre
191d0 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ss of the select
191e0 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a  -B coroutine */.
191f0 20 20 69 6e 74 20 72 65 67 4f 75 74 41 3b 20 20    int regOutA;  
19200 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
19210 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ss register for 
19220 74 68 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62  the output-A sub
19230 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
19240 20 72 65 67 4f 75 74 42 3b 20 20 20 20 20 20 20   regOutB;       
19250 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65     /* Address re
19260 67 69 73 74 65 72 20 66 6f 72 20 74 68 65 20 6f  gister for the o
19270 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69  utput-B subrouti
19280 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
19290 4f 75 74 41 3b 20 20 20 20 20 20 20 20 20 2f 2a  OutA;         /*
192a0 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
192b0 6f 75 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74  output-A subrout
192c0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
192d0 72 4f 75 74 42 20 3d 20 30 3b 20 20 20 20 20 2f  rOutB = 0;     /
192e0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
192f0 20 6f 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75   output-B subrou
19300 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
19310 64 72 45 6f 66 41 3b 20 20 20 20 20 20 20 20 20  drEofA;         
19320 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
19330 65 20 73 65 6c 65 63 74 2d 41 2d 65 78 68 61 75  e select-A-exhau
19340 73 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20  sted subroutine 
19350 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66  */.  int addrEof
19360 41 5f 6e 6f 42 3b 20 20 20 20 20 2f 2a 20 41 6c  A_noB;     /* Al
19370 74 65 72 6e 61 74 65 20 61 64 64 72 45 6f 66 41  ternate addrEofA
19380 20 69 66 20 42 20 69 73 20 75 6e 69 6e 69 74 69   if B is uniniti
19390 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 69 6e 74 20  alized */.  int 
193a0 61 64 64 72 45 6f 66 42 3b 20 20 20 20 20 20 20  addrEofB;       
193b0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
193c0 74 68 65 20 73 65 6c 65 63 74 2d 42 2d 65 78 68  the select-B-exh
193d0 61 75 73 74 65 64 20 73 75 62 72 6f 75 74 69 6e  austed subroutin
193e0 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41  e */.  int addrA
193f0 6c 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ltB;         /* 
19400 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41  Address of the A
19410 3c 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  <B subroutine */
19420 0a 20 20 69 6e 74 20 61 64 64 72 41 65 71 42 3b  .  int addrAeqB;
19430 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
19440 65 73 73 20 6f 66 20 74 68 65 20 41 3d 3d 42 20  ess of the A==B 
19450 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
19460 69 6e 74 20 61 64 64 72 41 67 74 42 3b 20 20 20  int addrAgtB;   
19470 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
19480 20 6f 66 20 74 68 65 20 41 3e 42 20 73 75 62 72   of the A>B subr
19490 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
194a0 72 65 67 4c 69 6d 69 74 41 3b 20 20 20 20 20 20  regLimitA;      
194b0 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69 73    /* Limit regis
194c0 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41  ter for select-A
194d0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d   */.  int regLim
194e0 69 74 42 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c  itB;        /* L
194f0 69 6d 69 74 20 72 65 67 69 73 74 65 72 20 66 6f  imit register fo
19500 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20  r select-A */.  
19510 69 6e 74 20 72 65 67 50 72 65 76 3b 20 20 20 20  int regPrev;    
19520 20 20 20 20 20 20 2f 2a 20 41 20 72 61 6e 67 65        /* A range
19530 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 74 6f   of registers to
19540 20 68 6f 6c 64 20 70 72 65 76 69 6f 75 73 20 6f   hold previous o
19550 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 73  utput */.  int s
19560 61 76 65 64 4c 69 6d 69 74 3b 20 20 20 20 20 20  avedLimit;      
19570 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20   /* Saved value 
19580 6f 66 20 70 2d 3e 69 4c 69 6d 69 74 20 2a 2f 0a  of p->iLimit */.
19590 20 20 69 6e 74 20 73 61 76 65 64 4f 66 66 73 65    int savedOffse
195a0 74 3b 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64  t;      /* Saved
195b0 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4f 66   value of p->iOf
195c0 66 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 61  fset */.  int la
195d0 62 65 6c 43 6d 70 72 3b 20 20 20 20 20 20 20 20  belCmpr;        
195e0 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 65  /* Label for the
195f0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6d 65   start of the me
19600 72 67 65 20 61 6c 67 6f 72 69 74 68 6d 20 2a 2f  rge algorithm */
19610 0a 20 20 69 6e 74 20 6c 61 62 65 6c 45 6e 64 3b  .  int labelEnd;
19620 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65           /* Labe
19630 6c 20 66 6f 72 20 74 68 65 20 65 6e 64 20 6f 66  l for the end of
19640 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 53 45 4c   the overall SEL
19650 45 43 54 20 73 74 6d 74 20 2a 2f 0a 20 20 69 6e  ECT stmt */.  in
19660 74 20 61 64 64 72 31 3b 20 20 20 20 20 20 20 20  t addr1;        
19670 20 20 20 20 2f 2a 20 4a 75 6d 70 20 69 6e 73 74      /* Jump inst
19680 72 75 63 74 69 6f 6e 73 20 74 68 61 74 20 67 65  ructions that ge
19690 74 20 72 65 74 61 72 67 65 74 74 65 64 20 2a 2f  t retargetted */
196a0 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20  .  int op;      
196b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
196c0 6f 66 20 54 4b 5f 41 4c 4c 2c 20 54 4b 5f 55 4e  of TK_ALL, TK_UN
196d0 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c 20  ION, TK_EXCEPT, 
196e0 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 2a 2f 0a  TK_INTERSECT */.
196f0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 44    KeyInfo *pKeyD
19700 75 70 20 3d 20 30 3b 20 2f 2a 20 43 6f 6d 70 61  up = 0; /* Compa
19710 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f  rison informatio
19720 6e 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20  n for duplicate 
19730 72 65 6d 6f 76 61 6c 20 2a 2f 0a 20 20 4b 65 79  removal */.  Key
19740 49 6e 66 6f 20 2a 70 4b 65 79 4d 65 72 67 65 3b  Info *pKeyMerge;
19750 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e     /* Comparison
19760 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
19770 20 6d 65 72 67 69 6e 67 20 72 6f 77 73 20 2a 2f   merging rows */
19780 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
19790 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
197a0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
197b0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
197c0 4f 72 64 65 72 42 79 3b 20 20 20 2f 2a 20 54 68  OrderBy;   /* Th
197d0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
197e0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64 65  e */.  int nOrde
197f0 72 42 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  rBy;         /* 
19800 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20  Number of terms 
19810 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  in the ORDER BY 
19820 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
19830 2a 61 50 65 72 6d 75 74 65 3b 20 20 20 20 20 20  *aPermute;      
19840 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f    /* Mapping fro
19850 6d 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73  m ORDER BY terms
19860 20 74 6f 20 72 65 73 75 6c 74 20 73 65 74 20 63   to result set c
19870 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 69 66 6e 64 65  olumns */.#ifnde
19880 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
19890 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69 53 75 62  PLAIN.  int iSub
198a0 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  1;            /*
198b0 20 45 51 50 20 69 64 20 6f 66 20 6c 65 66 74 2d   EQP id of left-
198c0 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 20 20  hand query */.  
198d0 69 6e 74 20 69 53 75 62 32 3b 20 20 20 20 20 20  int iSub2;      
198e0 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20        /* EQP id 
198f0 6f 66 20 72 69 67 68 74 2d 68 61 6e 64 20 71 75  of right-hand qu
19900 65 72 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20  ery */.#endif.. 
19910 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64   assert( p->pOrd
19920 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 61 73 73  erBy!=0 );.  ass
19930 65 72 74 28 20 70 4b 65 79 44 75 70 3d 3d 30 20  ert( pKeyDup==0 
19940 29 3b 20 2f 2a 20 22 4d 61 6e 61 67 65 64 22 20  ); /* "Managed" 
19950 63 6f 64 65 20 6e 65 65 64 73 20 74 68 69 73 2e  code needs this.
19960 20 20 54 69 63 6b 65 74 20 23 33 33 38 32 2e 20    Ticket #3382. 
19970 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  */.  db = pParse
19980 2d 3e 64 62 3b 0a 20 20 76 20 3d 20 70 50 61 72  ->db;.  v = pPar
19990 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73  se->pVdbe;.  ass
199a0 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20 20 20  ert( v!=0 );    
199b0 20 20 20 2f 2a 20 41 6c 72 65 61 64 79 20 74 68     /* Already th
199c0 72 6f 77 6e 20 74 68 65 20 65 72 72 6f 72 20 69  rown the error i
199d0 66 20 56 44 42 45 20 61 6c 6c 6f 63 20 66 61 69  f VDBE alloc fai
199e0 6c 65 64 20 2a 2f 0a 20 20 6c 61 62 65 6c 45 6e  led */.  labelEn
199f0 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  d = sqlite3VdbeM
19a00 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 6c  akeLabel(v);.  l
19a10 61 62 65 6c 43 6d 70 72 20 3d 20 73 71 6c 69 74  abelCmpr = sqlit
19a20 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
19a30 76 29 3b 0a 0a 0a 20 20 2f 2a 20 50 61 74 63 68  v);...  /* Patch
19a40 20 75 70 20 74 68 65 20 4f 52 44 45 52 20 42 59   up the ORDER BY
19a50 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 6f   clause.  */.  o
19a60 70 20 3d 20 70 2d 3e 6f 70 3b 20 20 0a 20 20 70  p = p->op;  .  p
19a70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f  Prior = p->pPrio
19a80 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 72  r;.  assert( pPr
19a90 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ior->pOrderBy==0
19aa0 20 29 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d   );.  pOrderBy =
19ab0 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
19ac0 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79  assert( pOrderBy
19ad0 20 29 3b 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d   );.  nOrderBy =
19ae0 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
19af0 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 6f 70 65 72  ;..  /* For oper
19b00 61 74 6f 72 73 20 6f 74 68 65 72 20 74 68 61 6e  ators other than
19b10 20 55 4e 49 4f 4e 20 41 4c 4c 20 77 65 20 68 61   UNION ALL we ha
19b20 76 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ve to make sure 
19b30 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 20 4f 52  that.  ** the OR
19b40 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f  DER BY clause co
19b50 76 65 72 73 20 65 76 65 72 79 20 74 65 72 6d 20  vers every term 
19b60 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  of the result se
19b70 74 2e 20 20 41 64 64 0a 20 20 2a 2a 20 74 65 72  t.  Add.  ** ter
19b80 6d 73 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20  ms to the ORDER 
19b90 42 59 20 63 6c 61 75 73 65 20 61 73 20 6e 65 63  BY clause as nec
19ba0 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69  essary..  */.  i
19bb0 66 28 20 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b  f( op!=TK_ALL ){
19bc0 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 64 62  .    for(i=1; db
19bd0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d  ->mallocFailed==
19be0 30 20 26 26 20 69 3c 3d 70 2d 3e 70 45 4c 69 73  0 && i<=p->pELis
19bf0 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
19c00 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
19c10 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
19c20 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  m;.      for(j=0
19c30 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79  , pItem=pOrderBy
19c40 2d 3e 61 3b 20 6a 3c 6e 4f 72 64 65 72 42 79 3b  ->a; j<nOrderBy;
19c50 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   j++, pItem++){.
19c60 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
19c70 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65  pItem->u.x.iOrde
19c80 72 42 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20  rByCol>0 );.    
19c90 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 75      if( pItem->u
19ca0 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d  .x.iOrderByCol==
19cb0 69 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  i ) break;.     
19cc0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d   }.      if( j==
19cd0 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  nOrderBy ){.    
19ce0 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d      Expr *pNew =
19cf0 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
19d00 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 29 3b   TK_INTEGER, 0);
19d10 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65  .        if( pNe
19d20 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  w==0 ) return SQ
19d30 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
19d40 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66  .        pNew->f
19d50 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61  lags |= EP_IntVa
19d60 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  lue;.        pNe
19d70 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69 3b  w->u.iValue = i;
19d80 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4f 72 64  .        p->pOrd
19d90 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 20  erBy = pOrderBy 
19da0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
19db0 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
19dc0 70 4f 72 64 65 72 42 79 2c 20 70 4e 65 77 29 3b  pOrderBy, pNew);
19dd0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 72  .        if( pOr
19de0 64 65 72 42 79 20 29 20 70 4f 72 64 65 72 42 79  derBy ) pOrderBy
19df0 2d 3e 61 5b 6e 4f 72 64 65 72 42 79 2b 2b 5d 2e  ->a[nOrderBy++].
19e00 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20  u.x.iOrderByCol 
19e10 3d 20 28 75 31 36 29 69 3b 0a 20 20 20 20 20 20  = (u16)i;.      
19e20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
19e30 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f  * Compute the co
19e40 6d 70 61 72 69 73 6f 6e 20 70 65 72 6d 75 74 61  mparison permuta
19e50 74 69 6f 6e 20 61 6e 64 20 6b 65 79 69 6e 66 6f  tion and keyinfo
19e60 20 74 68 61 74 20 69 73 20 75 73 65 64 20 77 69   that is used wi
19e70 74 68 0a 20 20 2a 2a 20 74 68 65 20 70 65 72 6d  th.  ** the perm
19e80 75 74 61 74 69 6f 6e 20 75 73 65 64 20 74 6f 20  utation used to 
19e90 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65  determine if the
19ea0 20 6e 65 78 74 0a 20 20 2a 2a 20 72 6f 77 20 6f   next.  ** row o
19eb0 66 20 72 65 73 75 6c 74 73 20 63 6f 6d 65 73 20  f results comes 
19ec0 66 72 6f 6d 20 73 65 6c 65 63 74 41 20 6f 72 20  from selectA or 
19ed0 73 65 6c 65 63 74 42 2e 20 20 41 6c 73 6f 20 61  selectB.  Also a
19ee0 64 64 20 65 78 70 6c 69 63 69 74 0a 20 20 2a 2a  dd explicit.  **
19ef0 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 74 6f 20 74   collations to t
19f00 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
19f10 73 65 20 74 65 72 6d 73 20 73 6f 20 74 68 61 74  se terms so that
19f20 20 77 68 65 6e 20 74 68 65 20 73 75 62 71 75 65   when the subque
19f30 72 69 65 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65  ries.  ** to the
19f40 20 72 69 67 68 74 20 61 6e 64 20 74 68 65 20 6c   right and the l
19f50 65 66 74 20 61 72 65 20 65 76 61 6c 75 61 74 65  eft are evaluate
19f60 64 2c 20 74 68 65 79 20 75 73 65 20 74 68 65 20  d, they use the 
19f70 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20 63 6f 6c  correct.  ** col
19f80 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 61  lation..  */.  a
19f90 50 65 72 6d 75 74 65 20 3d 20 73 71 6c 69 74 65  Permute = sqlite
19fa0 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
19fb0 62 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 28  b, sizeof(int)*(
19fc0 6e 4f 72 64 65 72 42 79 20 2b 20 31 29 29 3b 0a  nOrderBy + 1));.
19fd0 20 20 69 66 28 20 61 50 65 72 6d 75 74 65 20 29    if( aPermute )
19fe0 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  {.    struct Exp
19ff0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
1a000 6d 3b 0a 20 20 20 20 61 50 65 72 6d 75 74 65 5b  m;.    aPermute[
1a010 30 5d 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20  0] = nOrderBy;. 
1a020 20 20 20 66 6f 72 28 69 3d 31 2c 20 70 49 74 65     for(i=1, pIte
1a030 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69  m=pOrderBy->a; i
1a040 3c 3d 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 2c  <=nOrderBy; i++,
1a050 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
1a060 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
1a070 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e  u.x.iOrderByCol>
1a080 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
1a090 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f  t( pItem->u.x.iO
1a0a0 72 64 65 72 42 79 43 6f 6c 3c 3d 70 2d 3e 70 45  rderByCol<=p->pE
1a0b0 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20  List->nExpr );. 
1a0c0 20 20 20 20 20 61 50 65 72 6d 75 74 65 5b 69 5d       aPermute[i]
1a0d0 20 3d 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f   = pItem->u.x.iO
1a0e0 72 64 65 72 42 79 43 6f 6c 20 2d 20 31 3b 0a 20  rderByCol - 1;. 
1a0f0 20 20 20 7d 0a 20 20 20 20 70 4b 65 79 4d 65 72     }.    pKeyMer
1a100 67 65 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  ge = multiSelect
1a110 4f 72 64 65 72 42 79 4b 65 79 49 6e 66 6f 28 70  OrderByKeyInfo(p
1a120 50 61 72 73 65 2c 20 70 2c 20 31 29 3b 0a 20 20  Parse, p, 1);.  
1a130 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4b 65 79 4d  }else{.    pKeyM
1a140 65 72 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  erge = 0;.  }.. 
1a150 20 2f 2a 20 52 65 61 74 74 61 63 68 20 74 68 65   /* Reattach the
1a160 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1a170 20 74 6f 20 74 68 65 20 71 75 65 72 79 2e 0a 20   to the query.. 
1a180 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42   */.  p->pOrderB
1a190 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
1a1a0 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
1a1b0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
1a1c0 73 74 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62  stDup(pParse->db
1a1d0 2c 20 70 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a  , pOrderBy, 0);.
1a1e0 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
1a1f0 20 72 61 6e 67 65 20 6f 66 20 74 65 6d 70 6f 72   range of tempor
1a200 61 72 79 20 72 65 67 69 73 74 65 72 73 20 61 6e  ary registers an
1a210 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6e 65  d the KeyInfo ne
1a220 65 64 65 64 0a 20 20 2a 2a 20 66 6f 72 20 74 68  eded.  ** for th
1a230 65 20 6c 6f 67 69 63 20 74 68 61 74 20 72 65 6d  e logic that rem
1a240 6f 76 65 73 20 64 75 70 6c 69 63 61 74 65 20 72  oves duplicate r
1a250 65 73 75 6c 74 20 72 6f 77 73 20 77 68 65 6e 20  esult rows when 
1a260 74 68 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f  the.  ** operato
1a270 72 20 69 73 20 55 4e 49 4f 4e 2c 20 45 58 43 45  r is UNION, EXCE
1a280 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43 54  PT, or INTERSECT
1a290 20 28 62 75 74 20 6e 6f 74 20 55 4e 49 4f 4e 20   (but not UNION 
1a2a0 41 4c 4c 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ALL)..  */.  if(
1a2b0 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20   op==TK_ALL ){. 
1a2c0 20 20 20 72 65 67 50 72 65 76 20 3d 20 30 3b 0a     regPrev = 0;.
1a2d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
1a2e0 20 6e 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69   nExpr = p->pELi
1a2f0 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61  st->nExpr;.    a
1a300 73 73 65 72 74 28 20 6e 4f 72 64 65 72 42 79 3e  ssert( nOrderBy>
1a310 3d 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e 6d 61  =nExpr || db->ma
1a320 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
1a330 20 20 72 65 67 50 72 65 76 20 3d 20 70 50 61 72    regPrev = pPar
1a340 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
1a350 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
1a360 6e 45 78 70 72 2b 31 3b 0a 20 20 20 20 73 71 6c  nExpr+1;.    sql
1a370 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1a380 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
1a390 20 72 65 67 50 72 65 76 29 3b 0a 20 20 20 20 70   regPrev);.    p
1a3a0 4b 65 79 44 75 70 20 3d 20 73 71 6c 69 74 65 33  KeyDup = sqlite3
1a3b0 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c  KeyInfoAlloc(db,
1a3c0 20 6e 45 78 70 72 2c 20 31 29 3b 0a 20 20 20 20   nExpr, 1);.    
1a3d0 69 66 28 20 70 4b 65 79 44 75 70 20 29 7b 0a 20  if( pKeyDup ){. 
1a3e0 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
1a3f0 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69  ite3KeyInfoIsWri
1a400 74 65 61 62 6c 65 28 70 4b 65 79 44 75 70 29 20  teable(pKeyDup) 
1a410 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
1a420 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  ; i<nExpr; i++){
1a430 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44 75 70  .        pKeyDup
1a440 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 6d 75 6c  ->aColl[i] = mul
1a450 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
1a460 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20  pParse, p, i);. 
1a470 20 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e         pKeyDup->
1a480 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20  aSortOrder[i] = 
1a490 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
1a4a0 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 53 65 70 61  .  }. .  /* Sepa
1a4b0 72 61 74 65 20 74 68 65 20 6c 65 66 74 20 61 6e  rate the left an
1a4c0 64 20 74 68 65 20 72 69 67 68 74 20 71 75 65 72  d the right quer
1a4d0 79 20 66 72 6f 6d 20 6f 6e 65 20 61 6e 6f 74 68  y from one anoth
1a4e0 65 72 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 50 72  er.  */.  p->pPr
1a4f0 69 6f 72 20 3d 20 30 3b 0a 20 20 70 50 72 69 6f  ior = 0;.  pPrio
1a500 72 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  r->pNext = 0;.  
1a510 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72  sqlite3ResolveOr
1a520 64 65 72 47 72 6f 75 70 42 79 28 70 50 61 72 73  derGroupBy(pPars
1a530 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42  e, p, p->pOrderB
1a540 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20 20 69  y, "ORDER");.  i
1a550 66 28 20 70 50 72 69 6f 72 2d 3e 70 50 72 69 6f  f( pPrior->pPrio
1a560 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  r==0 ){.    sqli
1a570 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47  te3ResolveOrderG
1a580 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20 70  roupBy(pParse, p
1a590 50 72 69 6f 72 2c 20 70 50 72 69 6f 72 2d 3e 70  Prior, pPrior->p
1a5a0 4f 72 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22  OrderBy, "ORDER"
1a5b0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d  );.  }..  /* Com
1a5c0 70 75 74 65 20 74 68 65 20 6c 69 6d 69 74 20 72  pute the limit r
1a5d0 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 63 6f  egisters */.  co
1a5e0 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
1a5f0 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 6c  ers(pParse, p, l
1a600 61 62 65 6c 45 6e 64 29 3b 0a 20 20 69 66 28 20  abelEnd);.  if( 
1a610 70 2d 3e 69 4c 69 6d 69 74 20 26 26 20 6f 70 3d  p->iLimit && op=
1a620 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72  =TK_ALL ){.    r
1a630 65 67 4c 69 6d 69 74 41 20 3d 20 2b 2b 70 50 61  egLimitA = ++pPa
1a640 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72  rse->nMem;.    r
1a650 65 67 4c 69 6d 69 74 42 20 3d 20 2b 2b 70 50 61  egLimitB = ++pPa
1a660 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73  rse->nMem;.    s
1a670 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1a680 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 2d 3e  (v, OP_Copy, p->
1a690 69 4f 66 66 73 65 74 20 3f 20 70 2d 3e 69 4f 66  iOffset ? p->iOf
1a6a0 66 73 65 74 2b 31 20 3a 20 70 2d 3e 69 4c 69 6d  fset+1 : p->iLim
1a6b0 69 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  it,.            
1a6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a6d0 20 20 20 20 20 20 72 65 67 4c 69 6d 69 74 41 29        regLimitA)
1a6e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1a6f0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f  eAddOp2(v, OP_Co
1a700 70 79 2c 20 72 65 67 4c 69 6d 69 74 41 2c 20 72  py, regLimitA, r
1a710 65 67 4c 69 6d 69 74 42 29 3b 0a 20 20 7d 65 6c  egLimitB);.  }el
1a720 73 65 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74  se{.    regLimit
1a730 41 20 3d 20 72 65 67 4c 69 6d 69 74 42 20 3d 20  A = regLimitB = 
1a740 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
1a750 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
1a760 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 70 2d 3e  ->pLimit);.  p->
1a770 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 73 71  pLimit = 0;.  sq
1a780 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
1a790 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b  db, p->pOffset);
1a7a0 0a 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20  .  p->pOffset = 
1a7b0 30 3b 0a 0a 20 20 72 65 67 41 64 64 72 41 20 3d  0;..  regAddrA =
1a7c0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
1a7d0 0a 20 20 72 65 67 41 64 64 72 42 20 3d 20 2b 2b  .  regAddrB = ++
1a7e0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
1a7f0 72 65 67 4f 75 74 41 20 3d 20 2b 2b 70 50 61 72  regOutA = ++pPar
1a800 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f  se->nMem;.  regO
1a810 75 74 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  utB = ++pParse->
1a820 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 53  nMem;.  sqlite3S
1a830 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
1a840 65 73 74 41 2c 20 53 52 54 5f 43 6f 72 6f 75 74  estA, SRT_Corout
1a850 69 6e 65 2c 20 72 65 67 41 64 64 72 41 29 3b 0a  ine, regAddrA);.
1a860 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
1a870 65 73 74 49 6e 69 74 28 26 64 65 73 74 42 2c 20  estInit(&destB, 
1a880 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72  SRT_Coroutine, r
1a890 65 67 41 64 64 72 42 29 3b 0a 0a 20 20 2f 2a 20  egAddrB);..  /* 
1a8a0 47 65 6e 65 72 61 74 65 20 61 20 63 6f 72 6f 75  Generate a corou
1a8b0 74 69 6e 65 20 74 6f 20 65 76 61 6c 75 61 74 65  tine to evaluate
1a8c0 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
1a8d0 65 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a  ement to the.  *
1a8e0 2a 20 6c 65 66 74 20 6f 66 20 74 68 65 20 63 6f  * left of the co
1a8f0 6d 70 6f 75 6e 64 20 6f 70 65 72 61 74 6f 72 20  mpound operator 
1a900 2d 20 74 68 65 20 22 41 22 20 73 65 6c 65 63 74  - the "A" select
1a910 2e 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c  ..  */.  addrSel
1a920 65 63 74 41 20 3d 20 73 71 6c 69 74 65 33 56 64  ectA = sqlite3Vd
1a930 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
1a940 20 2b 20 31 3b 0a 20 20 61 64 64 72 31 20 3d 20   + 1;.  addr1 = 
1a950 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a960 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f  3(v, OP_InitCoro
1a970 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 41 2c  utine, regAddrA,
1a980 20 30 2c 20 61 64 64 72 53 65 6c 65 63 74 41 29   0, addrSelectA)
1a990 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28  ;.  VdbeComment(
1a9a0 28 76 2c 20 22 6c 65 66 74 20 53 45 4c 45 43 54  (v, "left SELECT
1a9b0 22 29 29 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 69  "));.  pPrior->i
1a9c0 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69 74  Limit = regLimit
1a9d0 41 3b 0a 20 20 65 78 70 6c 61 69 6e 53 65 74 49  A;.  explainSetI
1a9e0 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70 50  nteger(iSub1, pP
1a9f0 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
1aa00 74 49 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  tId);.  sqlite3S
1aa10 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50  elect(pParse, pP
1aa20 72 69 6f 72 2c 20 26 64 65 73 74 41 29 3b 0a 20  rior, &destA);. 
1aa30 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 64 43   sqlite3VdbeEndC
1aa40 6f 72 6f 75 74 69 6e 65 28 76 2c 20 72 65 67 41  oroutine(v, regA
1aa50 64 64 72 41 29 3b 0a 20 20 73 71 6c 69 74 65 33  ddrA);.  sqlite3
1aa60 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
1aa70 61 64 64 72 31 29 3b 0a 0a 20 20 2f 2a 20 47 65  addr1);..  /* Ge
1aa80 6e 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74 69  nerate a corouti
1aa90 6e 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74  ne to evaluate t
1aaa0 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
1aab0 65 6e 74 20 6f 6e 20 0a 20 20 2a 2a 20 74 68 65  ent on .  ** the
1aac0 20 72 69 67 68 74 20 2d 20 74 68 65 20 22 42 22   right - the "B"
1aad0 20 73 65 6c 65 63 74 0a 20 20 2a 2f 0a 20 20 61   select.  */.  a
1aae0 64 64 72 53 65 6c 65 63 74 42 20 3d 20 73 71 6c  ddrSelectB = sql
1aaf0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
1ab00 64 64 72 28 76 29 20 2b 20 31 3b 0a 20 20 61 64  ddr(v) + 1;.  ad
1ab10 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
1ab20 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
1ab30 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67  itCoroutine, reg
1ab40 41 64 64 72 42 2c 20 30 2c 20 61 64 64 72 53 65  AddrB, 0, addrSe
1ab50 6c 65 63 74 42 29 3b 0a 20 20 56 64 62 65 43 6f  lectB);.  VdbeCo
1ab60 6d 6d 65 6e 74 28 28 76 2c 20 22 72 69 67 68 74  mment((v, "right
1ab70 20 53 45 4c 45 43 54 22 29 29 3b 0a 20 20 73 61   SELECT"));.  sa
1ab80 76 65 64 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c  vedLimit = p->iL
1ab90 69 6d 69 74 3b 0a 20 20 73 61 76 65 64 4f 66 66  imit;.  savedOff
1aba0 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74  set = p->iOffset
1abb0 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20  ;.  p->iLimit = 
1abc0 72 65 67 4c 69 6d 69 74 42 3b 0a 20 20 70 2d 3e  regLimitB;.  p->
1abd0 69 4f 66 66 73 65 74 20 3d 20 30 3b 20 20 0a 20  iOffset = 0;  . 
1abe0 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
1abf0 65 72 28 69 53 75 62 32 2c 20 70 50 61 72 73 65  er(iSub2, pParse
1ac00 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29  ->iNextSelectId)
1ac10 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
1ac20 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65  t(pParse, p, &de
1ac30 73 74 42 29 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69  stB);.  p->iLimi
1ac40 74 20 3d 20 73 61 76 65 64 4c 69 6d 69 74 3b 0a  t = savedLimit;.
1ac50 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 73    p->iOffset = s
1ac60 61 76 65 64 4f 66 66 73 65 74 3b 0a 20 20 73 71  avedOffset;.  sq
1ac70 6c 69 74 65 33 56 64 62 65 45 6e 64 43 6f 72 6f  lite3VdbeEndCoro
1ac80 75 74 69 6e 65 28 76 2c 20 72 65 67 41 64 64 72  utine(v, regAddr
1ac90 42 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  B);..  /* Genera
1aca0 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
1acb0 74 68 61 74 20 6f 75 74 70 75 74 73 20 74 68 65  that outputs the
1acc0 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20   current row of 
1acd0 74 68 65 20 41 0a 20 20 2a 2a 20 73 65 6c 65 63  the A.  ** selec
1ace0 74 20 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75  t as the next ou
1acf0 74 70 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20  tput row of the 
1ad00 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e  compound select.
1ad10 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70  .  */.  VdbeNoop
1ad20 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74  Comment((v, "Out
1ad30 70 75 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  put routine for 
1ad40 41 22 29 29 3b 0a 20 20 61 64 64 72 4f 75 74 41  A"));.  addrOutA
1ad50 20 3d 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75   = generateOutpu
1ad60 74 53 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72  tSubroutine(pPar
1ad70 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  se,.            
1ad80 20 20 20 20 20 70 2c 20 26 64 65 73 74 41 2c 20       p, &destA, 
1ad90 70 44 65 73 74 2c 20 72 65 67 4f 75 74 41 2c 0a  pDest, regOutA,.
1ada0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1adb0 20 72 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75   regPrev, pKeyDu
1adc0 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20  p, labelEnd);.  
1add0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
1ade0 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
1adf0 20 6f 75 74 70 75 74 73 20 74 68 65 20 63 75 72   outputs the cur
1ae00 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20  rent row of the 
1ae10 42 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73  B.  ** select as
1ae20 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74   the next output
1ae30 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70   row of the comp
1ae40 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a  ound select..  *
1ae50 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41  /.  if( op==TK_A
1ae60 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49  LL || op==TK_UNI
1ae70 4f 4e 20 29 7b 0a 20 20 20 20 56 64 62 65 4e 6f  ON ){.    VdbeNo
1ae80 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f  opComment((v, "O
1ae90 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20 66 6f  utput routine fo
1aea0 72 20 42 22 29 29 3b 0a 20 20 20 20 61 64 64 72  r B"));.    addr
1aeb0 4f 75 74 42 20 3d 20 67 65 6e 65 72 61 74 65 4f  OutB = generateO
1aec0 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28  utputSubroutine(
1aed0 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
1aee0 20 20 20 20 20 20 20 20 20 70 2c 20 26 64 65 73           p, &des
1aef0 74 42 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75  tB, pDest, regOu
1af00 74 42 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  tB,.            
1af10 20 20 20 20 20 72 65 67 50 72 65 76 2c 20 70 4b       regPrev, pK
1af20 65 79 44 75 70 2c 20 6c 61 62 65 6c 45 6e 64 29  eyDup, labelEnd)
1af30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4b  ;.  }.  sqlite3K
1af40 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79  eyInfoUnref(pKey
1af50 44 75 70 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  Dup);..  /* Gene
1af60 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e  rate a subroutin
1af70 65 20 74 6f 20 72 75 6e 20 77 68 65 6e 20 74 68  e to run when th
1af80 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 73  e results from s
1af90 65 6c 65 63 74 20 41 0a 20 20 2a 2a 20 61 72 65  elect A.  ** are
1afa0 20 65 78 68 61 75 73 74 65 64 20 61 6e 64 20 6f   exhausted and o
1afb0 6e 6c 79 20 64 61 74 61 20 69 6e 20 73 65 6c 65  nly data in sele
1afc0 63 74 20 42 20 72 65 6d 61 69 6e 73 2e 0a 20 20  ct B remains..  
1afd0 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  */.  if( op==TK_
1afe0 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b  EXCEPT || op==TK
1aff0 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20  _INTERSECT ){.  
1b000 20 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 20 3d    addrEofA_noB =
1b010 20 61 64 64 72 45 6f 66 41 20 3d 20 6c 61 62 65   addrEofA = labe
1b020 6c 45 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 20 20  lEnd;.  }else{  
1b030 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  .    VdbeNoopCom
1b040 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 41 20  ment((v, "eof-A 
1b050 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20  subroutine"));. 
1b060 20 20 20 61 64 64 72 45 6f 66 41 20 3d 20 73 71     addrEofA = sq
1b070 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1b080 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
1b090 4f 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b  OutB, addrOutB);
1b0a0 0a 20 20 20 20 61 64 64 72 45 6f 66 41 5f 6e 6f  .    addrEofA_no
1b0b0 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  B = sqlite3VdbeA
1b0c0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp2(v, OP_Yiel
1b0d0 64 2c 20 72 65 67 41 64 64 72 42 2c 20 6c 61 62  d, regAddrB, lab
1b0e0 65 6c 45 6e 64 29 3b 0a 20 20 20 20 20 20 20 20  elEnd);.        
1b0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b100 20 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62               Vdb
1b110 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1b120 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
1b130 6f 28 76 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a  o(v, addrEofA);.
1b140 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f      p->nSelectRo
1b150 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  w = sqlite3LogEs
1b160 74 41 64 64 28 70 2d 3e 6e 53 65 6c 65 63 74 52  tAdd(p->nSelectR
1b170 6f 77 2c 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c  ow, pPrior->nSel
1b180 65 63 74 52 6f 77 29 3b 0a 20 20 7d 0a 0a 20 20  ectRow);.  }..  
1b190 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
1b1a0 62 72 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20  broutine to run 
1b1b0 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73  when the results
1b1c0 20 66 72 6f 6d 20 73 65 6c 65 63 74 20 42 0a 20   from select B. 
1b1d0 20 2a 2a 20 61 72 65 20 65 78 68 61 75 73 74 65   ** are exhauste
1b1e0 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20  d and only data 
1b1f0 69 6e 20 73 65 6c 65 63 74 20 41 20 72 65 6d 61  in select A rema
1b200 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ins..  */.  if( 
1b210 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54  op==TK_INTERSECT
1b220 20 29 7b 0a 20 20 20 20 61 64 64 72 45 6f 66 42   ){.    addrEofB
1b230 20 3d 20 61 64 64 72 45 6f 66 41 3b 0a 20 20 20   = addrEofA;.   
1b240 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52   if( p->nSelectR
1b250 6f 77 20 3e 20 70 50 72 69 6f 72 2d 3e 6e 53 65  ow > pPrior->nSe
1b260 6c 65 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53 65  lectRow ) p->nSe
1b270 6c 65 63 74 52 6f 77 20 3d 20 70 50 72 69 6f 72  lectRow = pPrior
1b280 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20  ->nSelectRow;.  
1b290 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20 56 64 62  }else{  .    Vdb
1b2a0 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
1b2b0 20 22 65 6f 66 2d 42 20 73 75 62 72 6f 75 74 69   "eof-B subrouti
1b2c0 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72 45  ne"));.    addrE
1b2d0 6f 66 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ofB = sqlite3Vdb
1b2e0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
1b2f0 73 75 62 2c 20 72 65 67 4f 75 74 41 2c 20 61 64  sub, regOutA, ad
1b300 64 72 4f 75 74 41 29 3b 0a 20 20 20 20 73 71 6c  drOutA);.    sql
1b310 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1b320 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
1b330 64 64 72 41 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  ddrA, labelEnd);
1b340 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1b350 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1b360 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 45 6f 66  eGoto(v, addrEof
1b370 42 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  B);.  }..  /* Ge
1b380 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68  nerate code to h
1b390 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f  andle the case o
1b3a0 66 20 41 3c 42 0a 20 20 2a 2f 0a 20 20 56 64 62  f A<B.  */.  Vdb
1b3b0 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
1b3c0 20 22 41 2d 6c 74 2d 42 20 73 75 62 72 6f 75 74   "A-lt-B subrout
1b3d0 69 6e 65 22 29 29 3b 0a 20 20 61 64 64 72 41 6c  ine"));.  addrAl
1b3e0 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  tB = sqlite3Vdbe
1b3f0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
1b400 75 62 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64  ub, regOutA, add
1b410 72 4f 75 74 41 29 3b 0a 20 20 73 71 6c 69 74 65  rOutA);.  sqlite
1b420 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1b430 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72  P_Yield, regAddr
1b440 41 2c 20 61 64 64 72 45 6f 66 41 29 3b 20 56 64  A, addrEofA); Vd
1b450 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
1b460 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
1b470 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a  (v, labelCmpr);.
1b480 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
1b490 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68  ode to handle th
1b4a0 65 20 63 61 73 65 20 6f 66 20 41 3d 3d 42 0a 20  e case of A==B. 
1b4b0 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b   */.  if( op==TK
1b4c0 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 61 64 64 72  _ALL ){.    addr
1b4d0 41 65 71 42 20 3d 20 61 64 64 72 41 6c 74 42 3b  AeqB = addrAltB;
1b4e0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d  .  }else if( op=
1b4f0 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b  =TK_INTERSECT ){
1b500 0a 20 20 20 20 61 64 64 72 41 65 71 42 20 3d 20  .    addrAeqB = 
1b510 61 64 64 72 41 6c 74 42 3b 0a 20 20 20 20 61 64  addrAltB;.    ad
1b520 64 72 41 6c 74 42 2b 2b 3b 0a 20 20 7d 65 6c 73  drAltB++;.  }els
1b530 65 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43  e{.    VdbeNoopC
1b540 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 65 71  omment((v, "A-eq
1b550 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29  -B subroutine"))
1b560 3b 0a 20 20 20 20 61 64 64 72 41 65 71 42 20 3d  ;.    addrAeqB =
1b570 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1b580 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65  AddOp2(v, OP_Yie
1b590 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20 61 64  ld, regAddrA, ad
1b5a0 64 72 45 6f 66 41 29 3b 20 56 64 62 65 43 6f 76  drEofA); VdbeCov
1b5b0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71  erage(v);.    sq
1b5c0 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
1b5d0 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20 7d   labelCmpr);.  }
1b5e0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1b5f0 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74  code to handle t
1b600 68 65 20 63 61 73 65 20 6f 66 20 41 3e 42 0a 20  he case of A>B. 
1b610 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f   */.  VdbeNoopCo
1b620 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 67 74 2d  mment((v, "A-gt-
1b630 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b  B subroutine"));
1b640 0a 20 20 61 64 64 72 41 67 74 42 20 3d 20 73 71  .  addrAgtB = sq
1b650 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
1b660 41 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20 6f  Addr(v);.  if( o
1b670 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d  p==TK_ALL || op=
1b680 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20  =TK_UNION ){.   
1b690 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1b6a0 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
1b6b0 72 65 67 4f 75 74 42 2c 20 61 64 64 72 4f 75 74  regOutB, addrOut
1b6c0 42 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  B);.  }.  sqlite
1b6d0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1b6e0 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72  P_Yield, regAddr
1b6f0 42 2c 20 61 64 64 72 45 6f 66 42 29 3b 20 56 64  B, addrEofB); Vd
1b700 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
1b710 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
1b720 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a  (v, labelCmpr);.
1b730 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20  .  /* This code 
1b740 72 75 6e 73 20 6f 6e 63 65 20 74 6f 20 69 6e 69  runs once to ini
1b750 74 69 61 6c 69 7a 65 20 65 76 65 72 79 74 68 69  tialize everythi
1b760 6e 67 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ng..  */.  sqlit
1b770 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
1b780 2c 20 61 64 64 72 31 29 3b 0a 20 20 73 71 6c 69  , addr1);.  sqli
1b790 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1b7a0 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
1b7b0 64 72 41 2c 20 61 64 64 72 45 6f 66 41 5f 6e 6f  drA, addrEofA_no
1b7c0 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  B); VdbeCoverage
1b7d0 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  (v);.  sqlite3Vd
1b7e0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59  beAddOp2(v, OP_Y
1b7f0 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42 2c 20  ield, regAddrB, 
1b800 61 64 64 72 45 6f 66 42 29 3b 20 56 64 62 65 43  addrEofB); VdbeC
1b810 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f  overage(v);..  /
1b820 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  * Implement the 
1b830 6d 61 69 6e 20 6d 65 72 67 65 20 6c 6f 6f 70 0a  main merge loop.
1b840 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
1b850 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
1b860 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20  , labelCmpr);.  
1b870 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1b880 34 28 76 2c 20 4f 50 5f 50 65 72 6d 75 74 61 74  4(v, OP_Permutat
1b890 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63  ion, 0, 0, 0, (c
1b8a0 68 61 72 2a 29 61 50 65 72 6d 75 74 65 2c 20 50  har*)aPermute, P
1b8b0 34 5f 49 4e 54 41 52 52 41 59 29 3b 0a 20 20 73  4_INTARRAY);.  s
1b8c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1b8d0 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20  (v, OP_Compare, 
1b8e0 64 65 73 74 41 2e 69 53 64 73 74 2c 20 64 65 73  destA.iSdst, des
1b8f0 74 42 2e 69 53 64 73 74 2c 20 6e 4f 72 64 65 72  tB.iSdst, nOrder
1b900 42 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  By,.            
1b910 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
1b920 61 72 2a 29 70 4b 65 79 4d 65 72 67 65 2c 20 50  ar*)pKeyMerge, P
1b930 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 73 71  4_KEYINFO);.  sq
1b940 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
1b950 35 28 76 2c 20 4f 50 46 4c 41 47 5f 50 45 52 4d  5(v, OPFLAG_PERM
1b960 55 54 45 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  UTE);.  sqlite3V
1b970 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
1b980 4a 75 6d 70 2c 20 61 64 64 72 41 6c 74 42 2c 20  Jump, addrAltB, 
1b990 61 64 64 72 41 65 71 42 2c 20 61 64 64 72 41 67  addrAeqB, addrAg
1b9a0 74 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  tB); VdbeCoverag
1b9b0 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70  e(v);..  /* Jump
1b9c0 20 74 6f 20 74 68 65 20 74 68 69 73 20 70 6f 69   to the this poi
1b9d0 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 74  nt in order to t
1b9e0 65 72 6d 69 6e 61 74 65 20 74 68 65 20 71 75 65  erminate the que
1b9f0 72 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ry..  */.  sqlit
1ba00 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
1ba10 65 6c 28 76 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  el(v, labelEnd);
1ba20 0a 0a 20 20 2f 2a 20 52 65 61 73 73 65 6d 62 6c  ..  /* Reassembl
1ba30 79 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71  y the compound q
1ba40 75 65 72 79 20 73 6f 20 74 68 61 74 20 69 74 20  uery so that it 
1ba50 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 63 6f  will be freed co
1ba60 72 72 65 63 74 6c 79 0a 20 20 2a 2a 20 62 79 20  rrectly.  ** by 
1ba70 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  the calling func
1ba80 74 69 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 70 2d  tion */.  if( p-
1ba90 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 73  >pPrior ){.    s
1baa0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
1bab0 74 65 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72  te(db, p->pPrior
1bac0 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 50 72 69  );.  }.  p->pPri
1bad0 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 70  or = pPrior;.  p
1bae0 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70  Prior->pNext = p
1baf0 3b 0a 0a 20 20 2f 2a 2a 2a 20 54 42 44 3a 20 20  ;..  /*** TBD:  
1bb00 49 6e 73 65 72 74 20 73 75 62 72 6f 75 74 69 6e  Insert subroutin
1bb10 65 20 63 61 6c 6c 73 20 74 6f 20 63 6c 6f 73 65  e calls to close
1bb20 20 63 75 72 73 6f 72 73 20 6f 6e 20 69 6e 63 6f   cursors on inco
1bb30 6d 70 6c 65 74 65 0a 20 20 2a 2a 2a 2a 20 73 75  mplete.  **** su
1bb40 62 71 75 65 72 69 65 73 20 2a 2a 2a 2a 2f 0a 20  bqueries ****/. 
1bb50 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74   explainComposit
1bb60 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 6f 70 2c  e(pParse, p->op,
1bb70 20 69 53 75 62 31 2c 20 69 53 75 62 32 2c 20 30   iSub1, iSub2, 0
1bb80 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72  );.  return pPar
1bb90 73 65 2d 3e 6e 45 72 72 21 3d 30 3b 0a 7d 0a 23  se->nErr!=0;.}.#
1bba0 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69  endif..#if !defi
1bbb0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
1bbc0 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65  SUBQUERY) || !de
1bbd0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
1bbe0 54 5f 56 49 45 57 29 0a 0a 2f 2a 20 41 6e 20 69  T_VIEW)../* An i
1bbf0 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 53  nstance of the S
1bc00 75 62 73 74 43 6f 6e 74 65 78 74 20 6f 62 6a 65  ubstContext obje
1bc10 63 74 20 64 65 73 63 72 69 62 65 73 20 61 6e 20  ct describes an 
1bc20 73 75 62 73 74 69 74 75 74 69 6f 6e 20 65 64 69  substitution edi
1bc30 74 0a 2a 2a 20 74 6f 20 62 65 20 70 65 72 66 6f  t.** to be perfo
1bc40 72 6d 65 64 20 6f 6e 20 61 20 70 61 72 73 65 20  rmed on a parse 
1bc50 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  tree..**.** All 
1bc60 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f  references to co
1bc70 6c 75 6d 6e 73 20 69 6e 20 74 61 62 6c 65 20 69  lumns in table i
1bc80 54 61 62 6c 65 20 61 72 65 20 74 6f 20 62 65 20  Table are to be 
1bc90 72 65 70 6c 61 63 65 64 20 62 79 20 63 6f 72 72  replaced by corr
1bca0 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 65 78 70  esponding.** exp
1bcb0 72 65 73 73 69 6f 6e 73 20 69 6e 20 70 45 4c 69  ressions in pELi
1bcc0 73 74 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  st..*/.typedef s
1bcd0 74 72 75 63 74 20 53 75 62 73 74 43 6f 6e 74 65  truct SubstConte
1bce0 78 74 20 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  xt {.  Parse *pP
1bcf0 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  arse;           
1bd00 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
1bd10 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
1bd20 20 69 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20   iTable;        
1bd30 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6c 61 63         /* Replac
1bd40 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  e references to 
1bd50 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20  this table */.  
1bd60 69 6e 74 20 69 4e 65 77 54 61 62 6c 65 3b 20 20  int iNewTable;  
1bd70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
1bd80 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f   table number */
1bd90 0a 20 20 69 6e 74 20 69 73 4c 65 66 74 4a 6f 69  .  int isLeftJoi
1bda0 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  n;           /* 
1bdb0 41 64 64 20 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52  Add TK_IF_NULL_R
1bdc0 4f 57 20 6f 70 63 6f 64 65 73 20 6f 6e 20 65 61  OW opcodes on ea
1bdd0 63 68 20 72 65 70 6c 61 63 65 6d 65 6e 74 20 2a  ch replacement *
1bde0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
1bdf0 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 2f 2a  List;         /*
1be00 20 52 65 70 6c 61 63 65 6d 65 6e 74 20 65 78 70   Replacement exp
1be10 72 65 73 73 69 6f 6e 73 20 2a 2f 0a 7d 20 53 75  ressions */.} Su
1be20 62 73 74 43 6f 6e 74 65 78 74 3b 0a 0a 2f 2a 20  bstContext;../* 
1be30 46 6f 72 77 61 72 64 20 44 65 63 6c 61 72 61 74  Forward Declarat
1be40 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20 76  ions */.static v
1be50 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c 69 73  oid substExprLis
1be60 74 28 53 75 62 73 74 43 6f 6e 74 65 78 74 2a 2c  t(SubstContext*,
1be70 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74 61   ExprList*);.sta
1be80 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 53 65  tic void substSe
1be90 6c 65 63 74 28 53 75 62 73 74 43 6f 6e 74 65 78  lect(SubstContex
1bea0 74 2a 2c 20 53 65 6c 65 63 74 2a 2c 20 69 6e 74  t*, Select*, int
1beb0 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74  );../*.** Scan t
1bec0 68 72 6f 75 67 68 20 74 68 65 20 65 78 70 72 65  hrough the expre
1bed0 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52 65  ssion pExpr.  Re
1bee0 70 6c 61 63 65 20 65 76 65 72 79 20 72 65 66 65  place every refe
1bef0 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61 20 63 6f  rence to.** a co
1bf00 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75  lumn in table nu
1bf10 6d 62 65 72 20 69 54 61 62 6c 65 20 77 69 74 68  mber iTable with
1bf20 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69   a copy of the i
1bf30 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e 74  Column-th.** ent
1bf40 72 79 20 69 6e 20 70 45 4c 69 73 74 2e 20 20 28  ry in pEList.  (
1bf50 42 75 74 20 6c 65 61 76 65 20 72 65 66 65 72 65  But leave refere
1bf60 6e 63 65 73 20 74 6f 20 74 68 65 20 52 4f 57 49  nces to the ROWI
1bf70 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63  D column .** unc
1bf80 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 54  hanged.).**.** T
1bf90 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 70  his routine is p
1bfa0 61 72 74 20 6f 66 20 74 68 65 20 66 6c 61 74 74  art of the flatt
1bfb0 65 6e 69 6e 67 20 70 72 6f 63 65 64 75 72 65 2e  ening procedure.
1bfc0 20 20 41 20 73 75 62 71 75 65 72 79 0a 2a 2a 20    A subquery.** 
1bfd0 77 68 6f 73 65 20 72 65 73 75 6c 74 20 73 65 74  whose result set
1bfe0 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 70   is defined by p
1bff0 45 4c 69 73 74 20 61 70 70 65 61 72 73 20 61 73  EList appears as
1c000 20 65 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a 2a   entry in the.**
1c010 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
1c020 61 20 53 45 4c 45 43 54 20 73 75 63 68 20 74 68  a SELECT such th
1c030 61 74 20 74 68 65 20 56 44 42 45 20 63 75 72 73  at the VDBE curs
1c040 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74  or assigned to t
1c050 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61 75  hat.** FORM clau
1c060 73 65 20 65 6e 74 72 79 20 69 73 20 69 54 61 62  se entry is iTab
1c070 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  le.  This routin
1c080 65 20 6d 61 6b 65 73 20 74 68 65 20 6e 65 63 65  e makes the nece
1c090 73 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e 67 65  ssary .** change
1c0a0 73 20 74 6f 20 70 45 78 70 72 20 73 6f 20 74 68  s to pExpr so th
1c0b0 61 74 20 69 74 20 72 65 66 65 72 73 20 64 69 72  at it refers dir
1c0c0 65 63 74 6c 79 20 74 6f 20 74 68 65 20 73 6f 75  ectly to the sou
1c0d0 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f 66 20  rce table.** of 
1c0e0 74 68 65 20 73 75 62 71 75 65 72 79 20 72 61 74  the subquery rat
1c0f0 68 65 72 20 74 68 65 20 72 65 73 75 6c 74 20 73  her the result s
1c100 65 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  et of the subque
1c110 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78  ry..*/.static Ex
1c120 70 72 20 2a 73 75 62 73 74 45 78 70 72 28 0a 20  pr *substExpr(. 
1c130 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20 2a 70   SubstContext *p
1c140 53 75 62 73 74 2c 20 20 2f 2a 20 44 65 73 63 72  Subst,  /* Descr
1c150 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75  iption of the su
1c160 62 73 74 69 74 75 74 69 6f 6e 20 2a 2f 0a 20 20  bstitution */.  
1c170 45 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20  Expr *pExpr     
1c180 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 20 69         /* Expr i
1c190 6e 20 77 68 69 63 68 20 73 75 62 73 74 69 74 75  n which substitu
1c1a0 74 69 6f 6e 20 6f 63 63 75 72 73 20 2a 2f 0a 29  tion occurs */.)
1c1b0 7b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  {.  if( pExpr==0
1c1c0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
1c1d0 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
1c1e0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f  ty(pExpr, EP_Fro
1c1f0 6d 4a 6f 69 6e 29 20 26 26 20 70 45 78 70 72 2d  mJoin) && pExpr-
1c200 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
1c210 3d 3d 70 53 75 62 73 74 2d 3e 69 54 61 62 6c 65  ==pSubst->iTable
1c220 20 29 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69   ){.    pExpr->i
1c230 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d  RightJoinTable =
1c240 20 70 53 75 62 73 74 2d 3e 69 4e 65 77 54 61 62   pSubst->iNewTab
1c250 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45  le;.  }.  if( pE
1c260 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
1c270 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61  MN && pExpr->iTa
1c280 62 6c 65 3d 3d 70 53 75 62 73 74 2d 3e 69 54 61  ble==pSubst->iTa
1c290 62 6c 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ble ){.    if( p
1c2a0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20  Expr->iColumn<0 
1c2b0 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  ){.      pExpr->
1c2c0 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20  op = TK_NULL;.  
1c2d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45    }else{.      E
1c2e0 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20  xpr *pNew;.     
1c2f0 20 45 78 70 72 20 2a 70 43 6f 70 79 20 3d 20 70   Expr *pCopy = p
1c300 53 75 62 73 74 2d 3e 70 45 4c 69 73 74 2d 3e 61  Subst->pEList->a
1c310 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d  [pExpr->iColumn]
1c320 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 45 78  .pExpr;.      Ex
1c330 70 72 20 69 66 4e 75 6c 6c 52 6f 77 3b 0a 20 20  pr ifNullRow;.  
1c340 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62      assert( pSub
1c350 73 74 2d 3e 70 45 4c 69 73 74 21 3d 30 20 26 26  st->pEList!=0 &&
1c360 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c   pExpr->iColumn<
1c370 70 53 75 62 73 74 2d 3e 70 45 4c 69 73 74 2d 3e  pSubst->pEList->
1c380 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61  nExpr );.      a
1c390 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c  ssert( pExpr->pL
1c3a0 65 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d  eft==0 && pExpr-
1c3b0 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20  >pRight==0 );.  
1c3c0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
1c3d0 78 70 72 49 73 56 65 63 74 6f 72 28 70 43 6f 70  xprIsVector(pCop
1c3e0 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  y) ){.        sq
1c3f0 6c 69 74 65 33 56 65 63 74 6f 72 45 72 72 6f 72  lite3VectorError
1c400 4d 73 67 28 70 53 75 62 73 74 2d 3e 70 50 61 72  Msg(pSubst->pPar
1c410 73 65 2c 20 70 43 6f 70 79 29 3b 0a 20 20 20 20  se, pCopy);.    
1c420 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1c430 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
1c440 53 75 62 73 74 2d 3e 70 50 61 72 73 65 2d 3e 64  Subst->pParse->d
1c450 62 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  b;.        if( p
1c460 53 75 62 73 74 2d 3e 69 73 4c 65 66 74 4a 6f 69  Subst->isLeftJoi
1c470 6e 20 26 26 20 70 43 6f 70 79 2d 3e 6f 70 21 3d  n && pCopy->op!=
1c480 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20  TK_COLUMN ){.   
1c490 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 69         memset(&i
1c4a0 66 4e 75 6c 6c 52 6f 77 2c 20 30 2c 20 73 69 7a  fNullRow, 0, siz
1c4b0 65 6f 66 28 69 66 4e 75 6c 6c 52 6f 77 29 29 3b  eof(ifNullRow));
1c4c0 0a 20 20 20 20 20 20 20 20 20 20 69 66 4e 75 6c  .          ifNul
1c4d0 6c 52 6f 77 2e 6f 70 20 3d 20 54 4b 5f 49 46 5f  lRow.op = TK_IF_
1c4e0 4e 55 4c 4c 5f 52 4f 57 3b 0a 20 20 20 20 20 20  NULL_ROW;.      
1c4f0 20 20 20 20 69 66 4e 75 6c 6c 52 6f 77 2e 70 4c      ifNullRow.pL
1c500 65 66 74 20 3d 20 70 43 6f 70 79 3b 0a 20 20 20  eft = pCopy;.   
1c510 20 20 20 20 20 20 20 69 66 4e 75 6c 6c 52 6f 77         ifNullRow
1c520 2e 69 54 61 62 6c 65 20 3d 20 70 53 75 62 73 74  .iTable = pSubst
1c530 2d 3e 69 4e 65 77 54 61 62 6c 65 3b 0a 20 20 20  ->iNewTable;.   
1c540 20 20 20 20 20 20 20 70 43 6f 70 79 20 3d 20 26         pCopy = &
1c550 69 66 4e 75 6c 6c 52 6f 77 3b 0a 20 20 20 20 20  ifNullRow;.     
1c560 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4e 65     }.        pNe
1c570 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  w = sqlite3ExprD
1c580 75 70 28 64 62 2c 20 70 43 6f 70 79 2c 20 30 29  up(db, pCopy, 0)
1c590 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  ;.        if( pN
1c5a0 65 77 20 26 26 20 70 53 75 62 73 74 2d 3e 69 73  ew && pSubst->is
1c5b0 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20  LeftJoin ){.    
1c5c0 20 20 20 20 20 20 45 78 70 72 53 65 74 50 72 6f        ExprSetPro
1c5d0 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 43  perty(pNew, EP_C
1c5e0 61 6e 42 65 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  anBeNull);.     
1c5f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
1c600 20 70 4e 65 77 20 26 26 20 45 78 70 72 48 61 73   pNew && ExprHas
1c610 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 45  Property(pExpr,E
1c620 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20  P_FromJoin) ){. 
1c630 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69           pNew->i
1c640 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d  RightJoinTable =
1c650 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f   pExpr->iRightJo
1c660 69 6e 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20  inTable;.       
1c670 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72     ExprSetProper
1c680 74 79 28 70 4e 65 77 2c 20 45 50 5f 46 72 6f 6d  ty(pNew, EP_From
1c690 4a 6f 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d  Join);.        }
1c6a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1c6b0 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
1c6c0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 70  Expr);.        p
1c6d0 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20  Expr = pNew;.   
1c6e0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
1c6f0 73 65 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70  se{.    if( pExp
1c700 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 46 5f 4e 55 4c  r->op==TK_IF_NUL
1c710 4c 5f 52 4f 57 20 26 26 20 70 45 78 70 72 2d 3e  L_ROW && pExpr->
1c720 69 54 61 62 6c 65 3d 3d 70 53 75 62 73 74 2d 3e  iTable==pSubst->
1c730 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  iTable ){.      
1c740 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
1c750 70 53 75 62 73 74 2d 3e 69 4e 65 77 54 61 62 6c  pSubst->iNewTabl
1c760 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 45 78  e;.    }.    pEx
1c770 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73 75 62 73  pr->pLeft = subs
1c780 74 45 78 70 72 28 70 53 75 62 73 74 2c 20 70 45  tExpr(pSubst, pE
1c790 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
1c7a0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d   pExpr->pRight =
1c7b0 20 73 75 62 73 74 45 78 70 72 28 70 53 75 62 73   substExpr(pSubs
1c7c0 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t, pExpr->pRight
1c7d0 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48  );.    if( ExprH
1c7e0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1c7f0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
1c800 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 53 65  ){.      substSe
1c810 6c 65 63 74 28 70 53 75 62 73 74 2c 20 70 45 78  lect(pSubst, pEx
1c820 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 31  pr->x.pSelect, 1
1c830 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1c840 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73      substExprLis
1c850 74 28 70 53 75 62 73 74 2c 20 70 45 78 70 72 2d  t(pSubst, pExpr-
1c860 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d  >x.pList);.    }
1c870 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 45  .  }.  return pE
1c880 78 70 72 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  xpr;.}.static vo
1c890 69 64 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  id substExprList
1c8a0 28 0a 20 20 53 75 62 73 74 43 6f 6e 74 65 78 74  (.  SubstContext
1c8b0 20 2a 70 53 75 62 73 74 2c 20 2f 2a 20 44 65 73   *pSubst, /* Des
1c8c0 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20  cription of the 
1c8d0 73 75 62 73 74 69 74 75 74 69 6f 6e 20 2a 2f 0a  substitution */.
1c8e0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
1c8f0 74 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  t       /* List 
1c900 74 6f 20 73 63 61 6e 20 61 6e 64 20 69 6e 20 77  to scan and in w
1c910 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62  hich to make sub
1c920 73 74 69 74 75 74 65 73 20 2a 2f 0a 29 7b 0a 20  stitutes */.){. 
1c930 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c   int i;.  if( pL
1c940 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ist==0 ) return;
1c950 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
1c960 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
1c970 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69  {.    pList->a[i
1c980 5d 2e 70 45 78 70 72 20 3d 20 73 75 62 73 74 45  ].pExpr = substE
1c990 78 70 72 28 70 53 75 62 73 74 2c 20 70 4c 69 73  xpr(pSubst, pLis
1c9a0 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
1c9b0 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
1c9c0 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 0a 20  d substSelect(. 
1c9d0 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20 2a 70   SubstContext *p
1c9e0 53 75 62 73 74 2c 20 2f 2a 20 44 65 73 63 72 69  Subst, /* Descri
1c9f0 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 62  ption of the sub
1ca00 73 74 69 74 75 74 69 6f 6e 20 2a 2f 0a 20 20 53  stitution */.  S
1ca10 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
1ca20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73       /* SELECT s
1ca30 74 61 74 65 6d 65 6e 74 20 69 6e 20 77 68 69 63  tatement in whic
1ca40 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69  h to make substi
1ca50 74 75 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  tutions */.  int
1ca60 20 64 6f 50 72 69 6f 72 20 20 20 20 20 20 20 20   doPrior        
1ca70 20 20 20 2f 2a 20 44 6f 20 73 75 62 73 74 69 74     /* Do substit
1ca80 75 74 65 73 20 6f 6e 20 70 2d 3e 70 50 72 69 6f  utes on p->pPrio
1ca90 72 20 74 6f 6f 20 2a 2f 0a 29 7b 0a 20 20 53 72  r too */.){.  Sr
1caa0 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 73  cList *pSrc;.  s
1cab0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1cac0 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74  em *pItem;.  int
1cad0 20 69 3b 0a 20 20 69 66 28 20 21 70 20 29 20 72   i;.  if( !p ) r
1cae0 65 74 75 72 6e 3b 0a 20 20 64 6f 7b 0a 20 20 20  eturn;.  do{.   
1caf0 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70   substExprList(p
1cb00 53 75 62 73 74 2c 20 70 2d 3e 70 45 4c 69 73 74  Subst, p->pEList
1cb10 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72  );.    substExpr
1cb20 4c 69 73 74 28 70 53 75 62 73 74 2c 20 70 2d 3e  List(pSubst, p->
1cb30 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 73  pGroupBy);.    s
1cb40 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 53 75  ubstExprList(pSu
1cb50 62 73 74 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  bst, p->pOrderBy
1cb60 29 3b 0a 20 20 20 20 70 2d 3e 70 48 61 76 69 6e  );.    p->pHavin
1cb70 67 20 3d 20 73 75 62 73 74 45 78 70 72 28 70 53  g = substExpr(pS
1cb80 75 62 73 74 2c 20 70 2d 3e 70 48 61 76 69 6e 67  ubst, p->pHaving
1cb90 29 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65 72 65  );.    p->pWhere
1cba0 20 3d 20 73 75 62 73 74 45 78 70 72 28 70 53 75   = substExpr(pSu
1cbb0 62 73 74 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b  bst, p->pWhere);
1cbc0 0a 20 20 20 20 70 53 72 63 20 3d 20 70 2d 3e 70  .    pSrc = p->p
1cbd0 53 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Src;.    assert(
1cbe0 20 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 20 20   pSrc!=0 );.    
1cbf0 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63  for(i=pSrc->nSrc
1cc00 2c 20 70 49 74 65 6d 3d 70 53 72 63 2d 3e 61 3b  , pItem=pSrc->a;
1cc10 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d   i>0; i--, pItem
1cc20 2b 2b 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74  ++){.      subst
1cc30 53 65 6c 65 63 74 28 70 53 75 62 73 74 2c 20 70  Select(pSubst, p
1cc40 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 31  Item->pSelect, 1
1cc50 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  );.      if( pIt
1cc60 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63  em->fg.isTabFunc
1cc70 20 29 7b 0a 20 20 20 20 20 20 20 20 73 75 62 73   ){.        subs
1cc80 74 45 78 70 72 4c 69 73 74 28 70 53 75 62 73 74  tExprList(pSubst
1cc90 2c 20 70 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e  , pItem->u1.pFun
1cca0 63 41 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  cArg);.      }. 
1ccb0 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 64     }.  }while( d
1ccc0 6f 50 72 69 6f 72 20 26 26 20 28 70 20 3d 20 70  oPrior && (p = p
1ccd0 2d 3e 70 50 72 69 6f 72 29 21 3d 30 20 29 3b 0a  ->pPrior)!=0 );.
1cce0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
1ccf0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1cd00 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
1cd10 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1cd20 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 23 69 66  IT_VIEW) */..#if
1cd30 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1cd40 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
1cd50 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
1cd60 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a  TE_OMIT_VIEW)./*
1cd70 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1cd80 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c 61   attempts to fla
1cd90 74 74 65 6e 20 73 75 62 71 75 65 72 69 65 73 20  tten subqueries 
1cda0 61 73 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65  as a performance
1cdb0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a   optimization..*
1cdc0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
1cdd0 65 74 75 72 6e 73 20 31 20 69 66 20 69 74 20 6d  eturns 1 if it m
1cde0 61 6b 65 73 20 63 68 61 6e 67 65 73 20 61 6e 64  akes changes and
1cdf0 20 30 20 69 66 20 6e 6f 20 66 6c 61 74 74 65 6e   0 if no flatten
1ce00 69 6e 67 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a  ing occurs..**.*
1ce10 2a 20 54 6f 20 75 6e 64 65 72 73 74 61 6e 64 20  * To understand 
1ce20 74 68 65 20 63 6f 6e 63 65 70 74 20 6f 66 20 66  the concept of f
1ce30 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f 6e 73 69  lattening, consi
1ce40 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  der the followin
1ce50 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a  g.** query:.**.*
1ce60 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 20 46  *     SELECT a F
1ce70 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2b 79 20  ROM (SELECT x+y 
1ce80 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45  AS a FROM t1 WHE
1ce90 52 45 20 7a 3c 31 30 30 29 20 57 48 45 52 45 20  RE z<100) WHERE 
1cea0 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65  a>5.**.** The de
1ceb0 66 61 75 6c 74 20 77 61 79 20 6f 66 20 69 6d 70  fault way of imp
1cec0 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69 73 20 71  lementing this q
1ced0 75 65 72 79 20 69 73 20 74 6f 20 65 78 65 63 75  uery is to execu
1cee0 74 65 20 74 68 65 0a 2a 2a 20 73 75 62 71 75 65  te the.** subque
1cef0 72 79 20 66 69 72 73 74 20 61 6e 64 20 73 74 6f  ry first and sto
1cf00 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  re the results i
1cf10 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  n a temporary ta
1cf20 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20 72 75 6e  ble, then.** run
1cf30 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1cf40 20 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f 72 61   on that tempora
1cf50 72 79 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20  ry table.  This 
1cf60 72 65 71 75 69 72 65 73 20 74 77 6f 0a 2a 2a 20  requires two.** 
1cf70 70 61 73 73 65 73 20 6f 76 65 72 20 74 68 65 20  passes over the 
1cf80 64 61 74 61 2e 20 20 46 75 72 74 68 65 72 6d 6f  data.  Furthermo
1cf90 72 65 2c 20 62 65 63 61 75 73 65 20 74 68 65 20  re, because the 
1cfa0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 0a  temporary table.
1cfb0 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64 69 63 65  ** has no indice
1cfc0 73 2c 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  s, the WHERE cla
1cfd0 75 73 65 20 6f 6e 20 74 68 65 20 6f 75 74 65 72  use on the outer
1cfe0 20 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 62 65   query cannot be
1cff0 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a  .** optimized..*
1d000 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1d010 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65  e attempts to re
1d020 77 72 69 74 65 20 71 75 65 72 69 65 73 20 73 75  write queries su
1d030 63 68 20 61 73 20 74 68 65 20 61 62 6f 76 65 20  ch as the above 
1d040 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65  into.** a single
1d050 20 66 6c 61 74 20 73 65 6c 65 63 74 2c 20 6c 69   flat select, li
1d060 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
1d070 20 20 20 53 45 4c 45 43 54 20 78 2b 79 20 41 53     SELECT x+y AS
1d080 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   a FROM t1 WHERE
1d090 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e 35 0a 2a   z<100 AND a>5.*
1d0a0 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 67 65  *.** The code ge
1d0b0 6e 65 72 61 74 65 64 20 66 6f 72 20 74 68 69 73  nerated for this
1d0c0 20 73 69 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20   simplification 
1d0d0 67 69 76 65 73 20 74 68 65 20 73 61 6d 65 20 72  gives the same r
1d0e0 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c  esult.** but onl
1d0f0 79 20 68 61 73 20 74 6f 20 73 63 61 6e 20 74 68  y has to scan th
1d100 65 20 64 61 74 61 20 6f 6e 63 65 2e 20 20 41 6e  e data once.  An
1d110 64 20 62 65 63 61 75 73 65 20 69 6e 64 69 63 65  d because indice
1d120 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65 78 69 73  s might .** exis
1d130 74 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74  t on the table t
1d140 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 73 63  1, a complete sc
1d150 61 6e 20 6f 66 20 74 68 65 20 64 61 74 61 20 6d  an of the data m
1d160 69 67 68 74 20 62 65 0a 2a 2a 20 61 76 6f 69 64  ight be.** avoid
1d170 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65  ed..**.** Flatte
1d180 6e 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 74 74  ning is only att
1d190 65 6d 70 74 65 64 20 69 66 20 61 6c 6c 20 6f 66  empted if all of
1d1a0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
1d1b0 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20  re true:.**.**  
1d1c0 20 28 31 29 20 20 54 68 65 20 73 75 62 71 75 65   (1)  The subque
1d1d0 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72  ry and the outer
1d1e0 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f   query do not bo
1d1f0 74 68 20 75 73 65 20 61 67 67 72 65 67 61 74 65  th use aggregate
1d200 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 20  s..**.**   (2)  
1d210 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
1d220 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65  not an aggregate
1d230 20 6f 72 20 28 32 61 29 20 74 68 65 20 6f 75 74   or (2a) the out
1d240 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20  er query is not 
1d250 61 20 6a 6f 69 6e 0a 2a 2a 20 20 20 20 20 20 20  a join.**       
1d260 20 61 6e 64 20 28 32 62 29 20 74 68 65 20 6f 75   and (2b) the ou
1d270 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e  ter query does n
1d280 6f 74 20 75 73 65 20 73 75 62 71 75 65 72 69 65  ot use subquerie
1d290 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65  s other than the
1d2a0 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 20 20 20 46   one.**        F
1d2b0 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75  ROM-clause subqu
1d2c0 65 72 79 20 74 68 61 74 20 69 73 20 61 20 63 61  ery that is a ca
1d2d0 6e 64 69 64 61 74 65 20 66 6f 72 20 66 6c 61 74  ndidate for flat
1d2e0 74 65 6e 69 6e 67 2e 20 20 28 32 62 20 69 73 0a  tening.  (2b is.
1d2f0 2a 2a 20 20 20 20 20 20 20 20 64 75 65 20 74 6f  **        due to
1d300 20 74 69 63 6b 65 74 20 5b 32 66 37 31 37 30 64   ticket [2f7170d
1d310 37 33 62 66 39 61 62 66 38 30 5d 20 66 72 6f 6d  73bf9abf80] from
1d320 20 32 30 31 35 2d 30 32 2d 30 39 2e 29 0a 2a 2a   2015-02-09.).**
1d330 0a 2a 2a 20 20 20 28 33 29 20 20 54 68 65 20 73  .**   (3)  The s
1d340 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 74  ubquery is not t
1d350 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
1d360 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 0a   of a LEFT JOIN.
1d370 2a 2a 20 20 20 20 20 20 20 20 6f 72 20 28 61 29  **        or (a)
1d380 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
1d390 20 6e 6f 74 20 69 74 73 65 6c 66 20 61 20 6a 6f   not itself a jo
1d3a0 69 6e 20 61 6e 64 20 28 62 29 20 74 68 65 20 46  in and (b) the F
1d3b0 52 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20 20 20  ROM clause.**   
1d3c0 20 20 20 20 20 6f 66 20 74 68 65 20 73 75 62 71       of the subq
1d3d0 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 63 6f  uery does not co
1d3e0 6e 74 61 69 6e 20 61 20 76 69 72 74 75 61 6c 20  ntain a virtual 
1d3f0 74 61 62 6c 65 20 61 6e 64 20 28 63 29 20 74 68  table and (c) th
1d400 65 20 0a 2a 2a 20 20 20 20 20 20 20 20 6f 75 74  e .**        out
1d410 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20  er query is not 
1d420 61 6e 20 61 67 67 72 65 67 61 74 65 2e 0a 2a 2a  an aggregate..**
1d430 0a 2a 2a 20 20 20 28 34 29 20 20 54 68 65 20 73  .**   (4)  The s
1d440 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 44  ubquery is not D
1d450 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20  ISTINCT..**.**  
1d460 28 2a 2a 29 20 20 41 74 20 6f 6e 65 20 70 6f 69  (**)  At one poi
1d470 6e 74 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20  nt restrictions 
1d480 28 34 29 20 61 6e 64 20 28 35 29 20 64 65 66 69  (4) and (5) defi
1d490 6e 65 64 20 61 20 73 75 62 73 65 74 20 6f 66 20  ned a subset of 
1d4a0 44 49 53 54 49 4e 43 54 0a 2a 2a 20 20 20 20 20  DISTINCT.**     
1d4b0 20 20 20 73 75 62 2d 71 75 65 72 69 65 73 20 74     sub-queries t
1d4c0 68 61 74 20 77 65 72 65 20 65 78 63 6c 75 64 65  hat were exclude
1d4d0 64 20 66 72 6f 6d 20 74 68 69 73 20 6f 70 74 69  d from this opti
1d4e0 6d 69 7a 61 74 69 6f 6e 2e 20 52 65 73 74 72 69  mization. Restri
1d4f0 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 20 20 20 20  ction .**       
1d500 20 28 34 29 20 68 61 73 20 73 69 6e 63 65 20 62   (4) has since b
1d510 65 65 6e 20 65 78 70 61 6e 64 65 64 20 74 6f 20  een expanded to 
1d520 65 78 63 6c 75 64 65 20 61 6c 6c 20 44 49 53 54  exclude all DIST
1d530 49 4e 43 54 20 73 75 62 71 75 65 72 69 65 73 2e  INCT subqueries.
1d540 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29 20 20 54 68  .**.**   (6)  Th
1d550 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20  e subquery does 
1d560 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67 61 74  not use aggregat
1d570 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  es or the outer 
1d580 71 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20  query is not.** 
1d590 20 20 20 20 20 20 20 44 49 53 54 49 4e 43 54 2e         DISTINCT.
1d5a0 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29 20 20 54 68  .**.**   (7)  Th
1d5b0 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20 61  e subquery has a
1d5c0 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54   FROM clause.  T
1d5d0 4f 44 4f 3a 20 20 46 6f 72 20 73 75 62 71 75 65  ODO:  For subque
1d5e0 72 69 65 73 20 77 69 74 68 6f 75 74 0a 2a 2a 20  ries without.** 
1d5f0 20 20 20 20 20 20 20 41 20 46 52 4f 4d 20 63 6c         A FROM cl
1d600 61 75 73 65 2c 20 63 6f 6e 73 69 64 65 72 20 61  ause, consider a
1d610 64 64 69 6e 67 20 61 20 46 52 4f 4d 20 63 6c 61  dding a FROM cla
1d620 75 73 65 20 77 69 74 68 20 74 68 65 20 73 70 65  use with the spe
1d630 63 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 74  cial.**        t
1d640 61 62 6c 65 20 73 71 6c 69 74 65 5f 6f 6e 63 65  able sqlite_once
1d650 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20 6f   that consists o
1d660 66 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 63  f a single row c
1d670 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 20  ontaining a.**  
1d680 20 20 20 20 20 20 73 69 6e 67 6c 65 20 4e 55 4c        single NUL
1d690 4c 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29 20 20  L..**.**   (8)  
1d6a0 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
1d6b0 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20  s not use LIMIT 
1d6c0 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
1d6d0 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e  ry is not a join
1d6e0 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20 20 54  ..**.**   (9)  T
1d6f0 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
1d700 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f   not use LIMIT o
1d710 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
1d720 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a  y does not use.*
1d730 2a 20 20 20 20 20 20 20 20 61 67 67 72 65 67 61  *        aggrega
1d740 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29  tes..**.**  (**)
1d750 20 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31    Restriction (1
1d760 30 29 20 77 61 73 20 72 65 6d 6f 76 65 64 20 66  0) was removed f
1d770 72 6f 6d 20 74 68 65 20 63 6f 64 65 20 6f 6e 20  rom the code on 
1d780 32 30 30 35 2d 30 32 2d 30 35 20 62 75 74 20 77  2005-02-05 but w
1d790 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 63 63 69  e.**        acci
1d7a0 64 65 6e 74 6c 79 20 63 61 72 72 69 65 64 20 74  dently carried t
1d7b0 68 65 20 63 6f 6d 6d 65 6e 74 20 66 6f 72 77 61  he comment forwa
1d7c0 72 64 20 75 6e 74 69 6c 20 32 30 31 34 2d 30 39  rd until 2014-09
1d7d0 2d 31 35 2e 20 20 4f 72 69 67 69 6e 61 6c 0a 2a  -15.  Original.*
1d7e0 2a 20 20 20 20 20 20 20 20 74 65 78 74 3a 20 22  *        text: "
1d7f0 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
1d800 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67  s not use aggreg
1d810 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65  ates or the oute
1d820 72 20 71 75 65 72 79 20 0a 2a 2a 20 20 20 20 20  r query .**     
1d830 20 20 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20     does not use 
1d840 4c 49 4d 49 54 2e 22 0a 2a 2a 0a 2a 2a 20 20 28  LIMIT.".**.**  (
1d850 31 31 29 20 20 54 68 65 20 73 75 62 71 75 65 72  11)  The subquer
1d860 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20  y and the outer 
1d870 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74  query do not bot
1d880 68 20 68 61 76 65 20 4f 52 44 45 52 20 42 59 20  h have ORDER BY 
1d890 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  clauses..**.**  
1d8a0 28 2a 2a 29 20 20 4e 6f 74 20 69 6d 70 6c 65 6d  (**)  Not implem
1d8b0 65 6e 74 65 64 2e 20 20 53 75 62 73 75 6d 65 64  ented.  Subsumed
1d8c0 20 69 6e 74 6f 20 72 65 73 74 72 69 63 74 69 6f   into restrictio
1d8d0 6e 20 28 33 29 2e 20 20 57 61 73 20 70 72 65 76  n (3).  Was prev
1d8e0 69 6f 75 73 6c 79 0a 2a 2a 20 20 20 20 20 20 20  iously.**       
1d8f0 20 61 20 73 65 70 61 72 61 74 65 20 72 65 73 74   a separate rest
1d900 72 69 63 74 69 6f 6e 20 64 65 72 69 76 69 6e 67  riction deriving
1d910 20 66 72 6f 6d 20 74 69 63 6b 65 74 20 23 33 35   from ticket #35
1d920 30 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 33 29 20 20  0..**.**  (13)  
1d930 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  The subquery and
1d940 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20   outer query do 
1d950 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 4c 49 4d  not both use LIM
1d960 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 34 29 20  IT..**.**  (14) 
1d970 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
1d980 65 73 20 6e 6f 74 20 75 73 65 20 4f 46 46 53 45  es not use OFFSE
1d990 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 35 29 20 20  T..**.**  (15)  
1d9a0 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  The outer query 
1d9b0 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61  is not part of a
1d9c0 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
1d9d0 20 6f 72 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   or the.**      
1d9e0 20 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20    subquery does 
1d9f0 6e 6f 74 20 68 61 76 65 20 61 20 4c 49 4d 49 54  not have a LIMIT
1da00 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 20 20 20 20   clause..**     
1da10 20 20 20 28 53 65 65 20 74 69 63 6b 65 74 20 23     (See ticket #
1da20 32 33 33 39 20 61 6e 64 20 74 69 63 6b 65 74 20  2339 and ticket 
1da30 5b 30 32 61 38 65 38 31 64 34 34 5d 29 2e 0a 2a  [02a8e81d44])..*
1da40 2a 0a 2a 2a 20 20 28 31 36 29 20 20 54 68 65 20  *.**  (16)  The 
1da50 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
1da60 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  ot an aggregate 
1da70 6f 72 20 74 68 65 20 73 75 62 71 75 65 72 79 20  or the subquery 
1da80 64 6f 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 6e  does.**        n
1da90 6f 74 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52  ot contain ORDER
1daa0 20 42 59 2e 20 20 28 54 69 63 6b 65 74 20 23 32   BY.  (Ticket #2
1dab0 39 34 32 29 20 20 54 68 69 73 20 75 73 65 64 20  942)  This used 
1dac0 74 6f 20 6e 6f 74 20 6d 61 74 74 65 72 0a 2a 2a  to not matter.**
1dad0 20 20 20 20 20 20 20 20 75 6e 74 69 6c 20 77 65          until we
1dae0 20 69 6e 74 72 6f 64 75 63 65 64 20 74 68 65 20   introduced the 
1daf0 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 29 20 66  group_concat() f
1db00 75 6e 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a  unction.  .**.**
1db10 20 20 28 31 37 29 20 20 54 68 65 20 73 75 62 2d    (17)  The sub-
1db20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 63  query is not a c
1db30 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20  ompound select, 
1db40 6f 72 20 69 74 20 69 73 20 61 20 55 4e 49 4f 4e  or it is a UNION
1db50 20 41 4c 4c 20 0a 2a 2a 20 20 20 20 20 20 20 20   ALL .**        
1db60 63 6f 6d 70 6f 75 6e 64 20 63 6c 61 75 73 65 20  compound clause 
1db70 6d 61 64 65 20 75 70 20 65 6e 74 69 72 65 6c 79  made up entirely
1db80 20 6f 66 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74   of non-aggregat
1db90 65 20 71 75 65 72 69 65 73 2c 20 61 6e 64 20 0a  e queries, and .
1dba0 2a 2a 20 20 20 20 20 20 20 20 74 68 65 20 70 61  **        the pa
1dbb0 72 65 6e 74 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a  rent query:.**.*
1dbc0 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69 73 20  *          * is 
1dbd0 6e 6f 74 20 69 74 73 65 6c 66 20 70 61 72 74 20  not itself part 
1dbe0 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65  of a compound se
1dbf0 6c 65 63 74 2c 0a 2a 2a 20 20 20 20 20 20 20 20  lect,.**        
1dc00 20 20 2a 20 69 73 20 6e 6f 74 20 61 6e 20 61 67    * is not an ag
1dc10 67 72 65 67 61 74 65 20 6f 72 20 44 49 53 54 49  gregate or DISTI
1dc20 4e 43 54 20 71 75 65 72 79 2c 20 61 6e 64 0a 2a  NCT query, and.*
1dc30 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69 73 20  *          * is 
1dc40 6e 6f 74 20 61 20 6a 6f 69 6e 0a 2a 2a 0a 2a 2a  not a join.**.**
1dc50 20 20 20 20 20 20 20 20 54 68 65 20 70 61 72 65          The pare
1dc60 6e 74 20 61 6e 64 20 73 75 62 2d 71 75 65 72 79  nt and sub-query
1dc70 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 57 48 45   may contain WHE
1dc80 52 45 20 63 6c 61 75 73 65 73 2e 20 53 75 62 6a  RE clauses. Subj
1dc90 65 63 74 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20  ect to.**       
1dca0 20 72 75 6c 65 73 20 28 31 31 29 2c 20 28 31 33   rules (11), (13
1dcb0 29 20 61 6e 64 20 28 31 34 29 2c 20 74 68 65 79  ) and (14), they
1dcc0 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69   may also contai
1dcd0 6e 20 4f 52 44 45 52 20 42 59 2c 0a 2a 2a 20 20  n ORDER BY,.**  
1dce0 20 20 20 20 20 20 4c 49 4d 49 54 20 61 6e 64 20        LIMIT and 
1dcf0 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20  OFFSET clauses. 
1dd00 20 54 68 65 20 73 75 62 71 75 65 72 79 20 63 61   The subquery ca
1dd10 6e 6e 6f 74 20 75 73 65 20 61 6e 79 20 63 6f 6d  nnot use any com
1dd20 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20  pound.**        
1dd30 6f 70 65 72 61 74 6f 72 20 6f 74 68 65 72 20 74  operator other t
1dd40 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 62 65  han UNION ALL be
1dd50 63 61 75 73 65 20 61 6c 6c 20 74 68 65 20 6f 74  cause all the ot
1dd60 68 65 72 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20  her compound.** 
1dd70 20 20 20 20 20 20 20 6f 70 65 72 61 74 6f 72 73         operators
1dd80 20 68 61 76 65 20 61 6e 20 69 6d 70 6c 69 65 64   have an implied
1dd90 20 44 49 53 54 49 4e 43 54 20 77 68 69 63 68 20   DISTINCT which 
1dda0 69 73 20 64 69 73 61 6c 6c 6f 77 65 64 20 62 79  is disallowed by
1ddb0 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 73 74 72  .**        restr
1ddc0 69 63 74 69 6f 6e 20 28 34 29 2e 0a 2a 2a 0a 2a  iction (4)..**.*
1ddd0 2a 20 20 20 20 20 20 20 20 41 6c 73 6f 2c 20 65  *        Also, e
1dde0 61 63 68 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66  ach component of
1ddf0 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 6d   the sub-query m
1de00 75 73 74 20 72 65 74 75 72 6e 20 74 68 65 20 73  ust return the s
1de10 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20  ame number.**   
1de20 20 20 20 20 20 6f 66 20 72 65 73 75 6c 74 20 63       of result c
1de30 6f 6c 75 6d 6e 73 2e 20 54 68 69 73 20 69 73 20  olumns. This is 
1de40 61 63 74 75 61 6c 6c 79 20 61 20 72 65 71 75 69  actually a requi
1de50 72 65 6d 65 6e 74 20 66 6f 72 20 61 6e 79 20 63  rement for any c
1de60 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20  ompound.**      
1de70 20 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65    SELECT stateme
1de80 6e 74 2c 20 62 75 74 20 61 6c 6c 20 74 68 65 20  nt, but all the 
1de90 63 6f 64 65 20 68 65 72 65 20 64 6f 65 73 20 69  code here does i
1dea0 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  s make sure that
1deb0 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 75   no.**        su
1dec0 63 68 20 28 69 6c 6c 65 67 61 6c 29 20 73 75 62  ch (illegal) sub
1ded0 2d 71 75 65 72 79 20 69 73 20 66 6c 61 74 74 65  -query is flatte
1dee0 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  ned. The caller 
1def0 77 69 6c 6c 20 64 65 74 65 63 74 20 74 68 65 0a  will detect the.
1df00 2a 2a 20 20 20 20 20 20 20 20 73 79 6e 74 61 78  **        syntax
1df10 20 65 72 72 6f 72 20 61 6e 64 20 72 65 74 75 72   error and retur
1df20 6e 20 61 20 64 65 74 61 69 6c 65 64 20 6d 65 73  n a detailed mes
1df30 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 38  sage..**.**  (18
1df40 29 20 20 49 66 20 74 68 65 20 73 75 62 2d 71 75  )  If the sub-qu
1df50 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e  ery is a compoun
1df60 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 61  d select, then a
1df70 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a  ll terms of the.
1df80 2a 2a 20 20 20 20 20 20 20 20 4f 52 44 45 52 20  **        ORDER 
1df90 62 79 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  by clause of the
1dfa0 20 70 61 72 65 6e 74 20 6d 75 73 74 20 62 65 20   parent must be 
1dfb0 73 69 6d 70 6c 65 20 72 65 66 65 72 65 6e 63 65  simple reference
1dfc0 73 20 74 6f 20 0a 2a 2a 20 20 20 20 20 20 20 20  s to .**        
1dfd0 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 73  columns of the s
1dfe0 75 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20  ub-query..**.** 
1dff0 20 28 31 39 29 20 20 54 68 65 20 73 75 62 71 75   (19)  The subqu
1e000 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
1e010 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75   LIMIT or the ou
1e020 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e  ter query does n
1e030 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 68 61 76  ot.**        hav
1e040 65 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  e a WHERE clause
1e050 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 30 29 20 20 49  ..**.**  (20)  I
1e060 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20  f the sub-query 
1e070 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65  is a compound se
1e080 6c 65 63 74 2c 20 74 68 65 6e 20 69 74 20 6d 75  lect, then it mu
1e090 73 74 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20  st not use.**   
1e0a0 20 20 20 20 20 61 6e 20 4f 52 44 45 52 20 42 59       an ORDER BY
1e0b0 20 63 6c 61 75 73 65 2e 20 20 54 69 63 6b 65 74   clause.  Ticket
1e0c0 20 23 33 37 37 33 2e 20 20 57 65 20 63 6f 75 6c   #3773.  We coul
1e0d0 64 20 72 65 6c 61 78 20 74 68 69 73 20 63 6f 6e  d relax this con
1e0e0 73 74 72 61 69 6e 74 0a 2a 2a 20 20 20 20 20 20  straint.**      
1e0f0 20 20 73 6f 6d 65 77 68 61 74 20 62 79 20 73 61    somewhat by sa
1e100 79 69 6e 67 20 74 68 61 74 20 74 68 65 20 74 65  ying that the te
1e110 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52  rms of the ORDER
1e120 20 42 59 20 63 6c 61 75 73 65 20 6d 75 73 74 0a   BY clause must.
1e130 2a 2a 20 20 20 20 20 20 20 20 61 70 70 65 61 72  **        appear
1e140 20 61 73 20 75 6e 6d 6f 64 69 66 69 65 64 20 72   as unmodified r
1e150 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 69 6e  esult columns in
1e160 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1e170 2e 20 20 42 75 74 20 77 65 0a 2a 2a 20 20 20 20  .  But we.**    
1e180 20 20 20 20 68 61 76 65 20 6f 74 68 65 72 20 6f      have other o
1e190 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 69 6e 20  ptimizations in 
1e1a0 6d 69 6e 64 20 74 6f 20 64 65 61 6c 20 77 69 74  mind to deal wit
1e1b0 68 20 74 68 61 74 20 63 61 73 65 2e 0a 2a 2a 0a  h that case..**.
1e1c0 2a 2a 20 20 28 32 31 29 20 20 54 68 65 20 73 75  **  (21)  The su
1e1d0 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
1e1e0 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65  use LIMIT or the
1e1f0 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
1e200 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 44 49  not.**        DI
1e210 53 54 49 4e 43 54 2e 20 20 28 53 65 65 20 74 69  STINCT.  (See ti
1e220 63 6b 65 74 20 5b 37 35 32 65 31 36 34 36 66 63  cket [752e1646fc
1e230 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 32 29 20  ])..**.**  (22) 
1e240 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
1e250 20 6e 6f 74 20 61 20 72 65 63 75 72 73 69 76 65   not a recursive
1e260 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 33   CTE..**.**  (23
1e270 29 20 20 54 68 65 20 70 61 72 65 6e 74 20 69 73  )  The parent is
1e280 20 6e 6f 74 20 61 20 72 65 63 75 72 73 69 76 65   not a recursive
1e290 20 43 54 45 2c 20 6f 72 20 74 68 65 20 73 75 62   CTE, or the sub
1e2a0 2d 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 0a  -query is not a.
1e2b0 2a 2a 20 20 20 20 20 20 20 20 63 6f 6d 70 6f 75  **        compou
1e2c0 6e 64 20 71 75 65 72 79 2e 20 54 68 69 73 20 72  nd query. This r
1e2d0 65 73 74 72 69 63 74 69 6f 6e 20 69 73 20 62 65  estriction is be
1e2e0 63 61 75 73 65 20 74 72 61 6e 73 66 6f 72 6d 69  cause transformi
1e2f0 6e 67 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  ng the.**       
1e300 20 70 61 72 65 6e 74 20 74 6f 20 61 20 63 6f 6d   parent to a com
1e310 70 6f 75 6e 64 20 71 75 65 72 79 20 63 6f 6e 66  pound query conf
1e320 75 73 65 73 20 74 68 65 20 63 6f 64 65 20 74 68  uses the code th
1e330 61 74 20 68 61 6e 64 6c 65 73 0a 2a 2a 20 20 20  at handles.**   
1e340 20 20 20 20 20 72 65 63 75 72 73 69 76 65 20 71       recursive q
1e350 75 65 72 69 65 73 20 69 6e 20 6d 75 6c 74 69 53  ueries in multiS
1e360 65 6c 65 63 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 20  elect()..**.**  
1e370 28 32 34 29 20 20 54 68 65 20 73 75 62 71 75 65  (24)  The subque
1e380 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67  ry is not an agg
1e390 72 65 67 61 74 65 20 74 68 61 74 20 75 73 65 73  regate that uses
1e3a0 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 6d 69   the built-in mi
1e3b0 6e 28 29 20 6f 72 20 0a 2a 2a 20 20 20 20 20 20  n() or .**      
1e3c0 20 20 6f 72 20 6d 61 78 28 29 20 66 75 6e 63 74    or max() funct
1e3d0 69 6f 6e 73 2e 20 20 28 57 69 74 68 6f 75 74 20  ions.  (Without 
1e3e0 74 68 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e  this restriction
1e3f0 2c 20 61 20 71 75 65 72 79 20 6c 69 6b 65 3a 0a  , a query like:.
1e400 2a 2a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43  **        "SELEC
1e410 54 20 78 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  T x FROM (SELECT
1e420 20 6d 61 78 28 79 29 2c 20 78 20 46 52 4f 4d 20   max(y), x FROM 
1e430 74 31 29 22 20 77 6f 75 6c 64 20 6e 6f 74 20 6e  t1)" would not n
1e440 65 63 65 73 73 61 72 69 6c 79 0a 2a 2a 20 20 20  ecessarily.**   
1e450 20 20 20 20 20 72 65 74 75 72 6e 20 74 68 65 20       return the 
1e460 76 61 6c 75 65 20 58 20 66 6f 72 20 77 68 69 63  value X for whic
1e470 68 20 59 20 77 61 73 20 6d 61 78 69 6d 61 6c 2e  h Y was maximal.
1e480 29 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  ).**.**.** In th
1e490 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 20  is routine, the 
1e4a0 22 70 22 20 70 61 72 61 6d 65 74 65 72 20 69 73  "p" parameter is
1e4b0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
1e4c0 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 2a  e outer query..*
1e4d0 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69  * The subquery i
1e4e0 73 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46 72  s p->pSrc->a[iFr
1e4f0 6f 6d 5d 2e 20 20 69 73 41 67 67 20 69 73 20 74  om].  isAgg is t
1e500 72 75 65 20 69 66 20 74 68 65 20 6f 75 74 65 72  rue if the outer
1e510 20 71 75 65 72 79 0a 2a 2a 20 75 73 65 73 20 61   query.** uses a
1e520 67 67 72 65 67 61 74 65 73 20 61 6e 64 20 73 75  ggregates and su
1e530 62 71 75 65 72 79 49 73 41 67 67 20 69 73 20 74  bqueryIsAgg is t
1e540 72 75 65 20 69 66 20 74 68 65 20 73 75 62 71 75  rue if the subqu
1e550 65 72 79 20 75 73 65 73 20 61 67 67 72 65 67 61  ery uses aggrega
1e560 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c  tes..**.** If fl
1e570 61 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20  attening is not 
1e580 61 74 74 65 6d 70 74 65 64 2c 20 74 68 69 73 20  attempted, this 
1e590 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
1e5a0 6f 70 20 61 6e 64 20 72 65 74 75 72 6e 73 20 30  op and returns 0
1e5b0 2e 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69  ..** If flatteni
1e5c0 6e 67 20 69 73 20 61 74 74 65 6d 70 74 65 64 20  ng is attempted 
1e5d0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
1e5e0 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c  urns 1..**.** Al
1e5f0 6c 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  l of the express
1e600 69 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75 73  ion analysis mus
1e610 74 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68 20  t occur on both 
1e620 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1e630 61 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62 71 75  and.** the subqu
1e640 65 72 79 20 62 65 66 6f 72 65 20 74 68 69 73 20  ery before this 
1e650 72 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f  routine runs..*/
1e660 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 61 74  .static int flat
1e670 74 65 6e 53 75 62 71 75 65 72 79 28 0a 20 20 50  tenSubquery(.  P
1e680 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
1e690 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
1e6a0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
1e6b0 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
1e6c0 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6f   /* The parent o
1e6d0 72 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20 73  r outer SELECT s
1e6e0 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e  tatement */.  in
1e6f0 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20 20  t iFrom,        
1e700 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70     /* Index in p
1e710 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74  ->pSrc->a[] of t
1e720 68 65 20 69 6e 6e 65 72 20 73 75 62 71 75 65 72  he inner subquer
1e730 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67  y */.  int isAgg
1e740 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
1e750 72 75 65 20 69 66 20 6f 75 74 65 72 20 53 45 4c  rue if outer SEL
1e760 45 43 54 20 75 73 65 73 20 61 67 67 72 65 67 61  ECT uses aggrega
1e770 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  te functions */.
1e780 20 20 69 6e 74 20 73 75 62 71 75 65 72 79 49 73    int subqueryIs
1e790 41 67 67 20 20 20 20 2f 2a 20 54 72 75 65 20 69  Agg    /* True i
1e7a0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 75  f the subquery u
1e7b0 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66 75  ses aggregate fu
1e7c0 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20  nctions */.){.  
1e7d0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 61 76  const char *zSav
1e7e0 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20  edAuthContext = 
1e7f0 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e  pParse->zAuthCon
1e800 74 65 78 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a  text;.  Select *
1e810 70 50 61 72 65 6e 74 3b 20 20 20 20 2f 2a 20 43  pParent;    /* C
1e820 75 72 72 65 6e 74 20 55 4e 49 4f 4e 20 41 4c 4c  urrent UNION ALL
1e830 20 74 65 72 6d 20 6f 66 20 74 68 65 20 6f 74 68   term of the oth
1e840 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 65  er query */.  Se
1e850 6c 65 63 74 20 2a 70 53 75 62 3b 20 20 20 20 20  lect *pSub;     
1e860 20 20 2f 2a 20 54 68 65 20 69 6e 6e 65 72 20 71    /* The inner q
1e870 75 65 72 79 20 6f 72 20 22 73 75 62 71 75 65 72  uery or "subquer
1e880 79 22 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  y" */.  Select *
1e890 70 53 75 62 31 3b 20 20 20 20 20 20 2f 2a 20 50  pSub1;      /* P
1e8a0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 72 69  ointer to the ri
1e8b0 67 68 74 6d 6f 73 74 20 73 65 6c 65 63 74 20 69  ghtmost select i
1e8c0 6e 20 73 75 62 2d 71 75 65 72 79 20 2a 2f 0a 20  n sub-query */. 
1e8d0 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20   SrcList *pSrc; 
1e8e0 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d       /* The FROM
1e8f0 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f   clause of the o
1e900 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20  uter query */.  
1e910 53 72 63 4c 69 73 74 20 2a 70 53 75 62 53 72 63  SrcList *pSubSrc
1e920 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20  ;   /* The FROM 
1e930 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 75  clause of the su
1e940 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20  bquery */.  int 
1e950 69 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20  iParent;        
1e960 2f 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e  /* VDBE cursor n
1e970 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 53 75  umber of the pSu
1e980 62 20 72 65 73 75 6c 74 20 73 65 74 20 74 65 6d  b result set tem
1e990 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  p table */.  int
1e9a0 20 69 4e 65 77 50 61 72 65 6e 74 20 3d 20 2d 31   iNewParent = -1
1e9b0 3b 2f 2a 20 52 65 70 6c 61 63 65 6d 65 6e 74 20  ;/* Replacement 
1e9c0 74 61 62 6c 65 20 66 6f 72 20 69 50 61 72 65 6e  table for iParen
1e9d0 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4c 65 66  t */.  int isLef
1e9e0 74 4a 6f 69 6e 20 3d 20 30 3b 20 2f 2a 20 54 72  tJoin = 0; /* Tr
1e9f0 75 65 20 69 66 20 70 53 75 62 20 69 73 20 74 68  ue if pSub is th
1ea00 65 20 72 69 67 68 74 20 73 69 64 65 20 6f 66 20  e right side of 
1ea10 61 20 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f 20 20  a LEFT JOIN */  
1ea20 20 20 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20    .  int i;     
1ea30 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
1ea40 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 45 78   counter */.  Ex
1ea50 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20  pr *pWhere;     
1ea60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ea70 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
1ea80 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
1ea90 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 75  rcList_item *pSu
1eaa0 62 69 74 65 6d 3b 20 20 20 2f 2a 20 54 68 65 20  bitem;   /* The 
1eab0 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 73 71  subquery */.  sq
1eac0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
1ead0 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 43 68  se->db;..  /* Ch
1eae0 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 66 6c  eck to see if fl
1eaf0 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d  attening is perm
1eb00 69 74 74 65 64 2e 20 20 52 65 74 75 72 6e 20 30  itted.  Return 0
1eb10 20 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20   if not..  */.  
1eb20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
1eb30 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 72    assert( p->pPr
1eb40 69 6f 72 3d 3d 30 20 29 3b 20 20 2f 2a 20 55 6e  ior==0 );  /* Un
1eb50 61 62 6c 65 20 74 6f 20 66 6c 61 74 74 65 6e 20  able to flatten 
1eb60 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 69 65 73  compound queries
1eb70 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d 69   */.  if( Optimi
1eb80 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64  zationDisabled(d
1eb90 62 2c 20 53 51 4c 49 54 45 5f 51 75 65 72 79 46  b, SQLITE_QueryF
1eba0 6c 61 74 74 65 6e 65 72 29 20 29 20 72 65 74 75  lattener) ) retu
1ebb0 72 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d 20 70  rn 0;.  pSrc = p
1ebc0 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74  ->pSrc;.  assert
1ebd0 28 20 70 53 72 63 20 26 26 20 69 46 72 6f 6d 3e  ( pSrc && iFrom>
1ebe0 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70 53 72 63  =0 && iFrom<pSrc
1ebf0 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53 75 62  ->nSrc );.  pSub
1ec00 69 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b  item = &pSrc->a[
1ec10 69 46 72 6f 6d 5d 3b 0a 20 20 69 50 61 72 65 6e  iFrom];.  iParen
1ec20 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 69 43  t = pSubitem->iC
1ec30 75 72 73 6f 72 3b 0a 20 20 70 53 75 62 20 3d 20  ursor;.  pSub = 
1ec40 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63  pSubitem->pSelec
1ec50 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 75  t;.  assert( pSu
1ec60 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 73 75  b!=0 );.  if( su
1ec70 62 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20  bqueryIsAgg ){. 
1ec80 20 20 20 69 66 28 20 69 73 41 67 67 20 29 20 72     if( isAgg ) r
1ec90 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1eca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ecb0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1ecc0 69 63 74 69 6f 6e 20 28 31 29 20 20 20 2a 2f 0a  iction (1)   */.
1ecd0 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 53      if( pSrc->nS
1ece0 72 63 3e 31 20 29 20 72 65 74 75 72 6e 20 30 3b  rc>1 ) return 0;
1ecf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed00 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
1ed10 72 69 63 74 69 6f 6e 20 28 32 61 29 20 20 2a 2f  riction (2a)  */
1ed20 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 70 57 68  .    if( (p->pWh
1ed30 65 72 65 20 26 26 20 45 78 70 72 48 61 73 50 72  ere && ExprHasPr
1ed40 6f 70 65 72 74 79 28 70 2d 3e 70 57 68 65 72 65  operty(p->pWhere
1ed50 2c 45 50 5f 53 75 62 71 75 65 72 79 29 29 0a 20  ,EP_Subquery)). 
1ed60 20 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 45      || (sqlite3E
1ed70 78 70 72 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e  xprListFlags(p->
1ed80 70 45 4c 69 73 74 29 20 26 20 45 50 5f 53 75 62  pEList) & EP_Sub
1ed90 71 75 65 72 79 29 21 3d 30 0a 20 20 20 20 20 7c  query)!=0.     |
1eda0 7c 20 28 73 71 6c 69 74 65 33 45 78 70 72 4c 69  | (sqlite3ExprLi
1edb0 73 74 46 6c 61 67 73 28 70 2d 3e 70 4f 72 64 65  stFlags(p->pOrde
1edc0 72 42 79 29 20 26 20 45 50 5f 53 75 62 71 75 65  rBy) & EP_Subque
1edd0 72 79 29 21 3d 30 0a 20 20 20 20 29 7b 0a 20 20  ry)!=0.    ){.  
1ede0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
1edf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee10 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
1ee20 63 74 69 6f 6e 20 28 32 62 29 20 20 2a 2f 0a 20  ction (2b)  */. 
1ee30 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 53 75 62     }.  }..  pSub
1ee40 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63  Src = pSub->pSrc
1ee50 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62  ;.  assert( pSub
1ee60 53 72 63 20 29 3b 0a 20 20 2f 2a 20 50 72 69 6f  Src );.  /* Prio
1ee70 72 20 74 6f 20 76 65 72 73 69 6f 6e 20 33 2e 31  r to version 3.1
1ee80 2e 32 2c 20 77 68 65 6e 20 4c 49 4d 49 54 20 61  .2, when LIMIT a
1ee90 6e 64 20 4f 46 46 53 45 54 20 68 61 64 20 74 6f  nd OFFSET had to
1eea0 20 62 65 20 73 69 6d 70 6c 65 20 63 6f 6e 73 74   be simple const
1eeb0 61 6e 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20 61  ants,.  ** not a
1eec0 72 62 69 74 72 61 72 79 20 65 78 70 72 65 73 73  rbitrary express
1eed0 69 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f 77 65 64  ions, we allowed
1eee0 20 73 6f 6d 65 20 63 6f 6d 62 69 6e 69 6e 67 20   some combining 
1eef0 6f 66 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  of LIMIT and OFF
1ef00 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 75 73 65  SET.  ** because
1ef10 20 74 68 65 79 20 63 6f 75 6c 64 20 62 65 20 63   they could be c
1ef20 6f 6d 70 75 74 65 64 20 61 74 20 63 6f 6d 70 69  omputed at compi
1ef30 6c 65 2d 74 69 6d 65 2e 20 20 42 75 74 20 77 68  le-time.  But wh
1ef40 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  en LIMIT and OFF
1ef50 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 6d 65 20  SET.  ** became 
1ef60 61 72 62 69 74 72 61 72 79 20 65 78 70 72 65 73  arbitrary expres
1ef70 73 69 6f 6e 73 2c 20 77 65 20 77 65 72 65 20 66  sions, we were f
1ef80 6f 72 63 65 64 20 74 6f 20 61 64 64 20 72 65 73  orced to add res
1ef90 74 72 69 63 74 69 6f 6e 73 20 28 31 33 29 0a 20  trictions (13). 
1efa0 20 2a 2a 20 61 6e 64 20 28 31 34 29 2e 20 2a 2f   ** and (14). */
1efb0 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69  .  if( pSub->pLi
1efc0 6d 69 74 20 26 26 20 70 2d 3e 70 4c 69 6d 69 74  mit && p->pLimit
1efd0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
1efe0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
1eff0 74 72 69 63 74 69 6f 6e 20 28 31 33 29 20 2a 2f  triction (13) */
1f000 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 66  .  if( pSub->pOf
1f010 66 73 65 74 20 29 20 72 65 74 75 72 6e 20 30 3b  fset ) return 0;
1f020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f030 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
1f040 74 72 69 63 74 69 6f 6e 20 28 31 34 29 20 2a 2f  triction (14) */
1f050 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c  .  if( (p->selFl
1f060 61 67 73 20 26 20 53 46 5f 43 6f 6d 70 6f 75 6e  ags & SF_Compoun
1f070 64 29 21 3d 30 20 26 26 20 70 53 75 62 2d 3e 70  d)!=0 && pSub->p
1f080 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 72 65 74  Limit ){.    ret
1f090 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
1f0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f0c0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1f0d0 20 28 31 35 29 20 2a 2f 0a 20 20 7d 0a 20 20 69   (15) */.  }.  i
1f0e0 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63  f( pSubSrc->nSrc
1f0f0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ==0 ) return 0; 
1f100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f110 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1f120 74 69 6f 6e 20 28 37 29 20 20 2a 2f 0a 20 20 69  tion (7)  */.  i
1f130 66 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67  f( pSub->selFlag
1f140 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20  s & SF_Distinct 
1f150 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
1f160 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1f170 74 69 6f 6e 20 28 35 29 20 20 2a 2f 0a 20 20 69  tion (5)  */.  i
1f180 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20  f( pSub->pLimit 
1f190 26 26 20 28 70 53 72 63 2d 3e 6e 53 72 63 3e 31  && (pSrc->nSrc>1
1f1a0 20 7c 7c 20 69 73 41 67 67 29 20 29 7b 0a 20 20   || isAgg) ){.  
1f1b0 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
1f1c0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1f1d0 69 6f 6e 73 20 28 38 29 28 39 29 20 2a 2f 0a 20  ions (8)(9) */. 
1f1e0 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c   }.  if( (p->sel
1f1f0 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
1f200 6e 63 74 29 21 3d 30 20 26 26 20 73 75 62 71 75  nct)!=0 && subqu
1f210 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20  eryIsAgg ){.    
1f220 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1f230 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1f240 6e 20 28 36 29 20 20 2a 2f 0a 20 20 7d 0a 20 20  n (6)  */.  }.  
1f250 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
1f260 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42  && pSub->pOrderB
1f270 79 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e  y ){.     return
1f280 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1f290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f2b0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 31   Restriction (11
1f2c0 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 69  ) */.  }.  if( i
1f2d0 73 41 67 67 20 26 26 20 70 53 75 62 2d 3e 70 4f  sAgg && pSub->pO
1f2e0 72 64 65 72 42 79 20 29 20 72 65 74 75 72 6e 20  rderBy ) return 
1f2f0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1f300 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1f310 20 28 31 36 29 20 2a 2f 0a 20 20 69 66 28 20 70   (16) */.  if( p
1f320 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70  Sub->pLimit && p
1f330 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74 75 72  ->pWhere ) retur
1f340 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
1f350 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1f360 20 28 31 39 29 20 2a 2f 0a 20 20 69 66 28 20 70   (19) */.  if( p
1f370 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28  Sub->pLimit && (
1f380 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
1f390 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20 29 7b  _Distinct)!=0 ){
1f3a0 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  .     return 0; 
1f3b0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1f3c0 69 63 74 69 6f 6e 20 28 32 31 29 20 2a 2f 0a 20  iction (21) */. 
1f3d0 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28 20 70   }.  testcase( p
1f3e0 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  Sub->selFlags & 
1f3f0 53 46 5f 52 65 63 75 72 73 69 76 65 20 29 3b 0a  SF_Recursive );.
1f400 20 20 74 65 73 74 63 61 73 65 28 20 70 53 75 62    testcase( pSub
1f410 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
1f420 4d 69 6e 4d 61 78 41 67 67 20 29 3b 0a 20 20 69  MinMaxAgg );.  i
1f430 66 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67  f( pSub->selFlag
1f440 73 20 26 20 28 53 46 5f 52 65 63 75 72 73 69 76  s & (SF_Recursiv
1f450 65 7c 53 46 5f 4d 69 6e 4d 61 78 41 67 67 29 20  e|SF_MinMaxAgg) 
1f460 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
1f470 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 73   /* Restrictions
1f480 20 28 32 32 29 20 61 6e 64 20 28 32 34 29 20 2a   (22) and (24) *
1f490 2f 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e  /.  }.  if( (p->
1f4a0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65  selFlags & SF_Re
1f4b0 63 75 72 73 69 76 65 29 20 26 26 20 70 53 75 62  cursive) && pSub
1f4c0 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
1f4d0 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 52 65 73  return 0; /* Res
1f4e0 74 72 69 63 74 69 6f 6e 20 28 32 33 29 20 2a 2f  triction (23) */
1f4f0 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
1f500 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
1f510 69 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65  is the right ope
1f520 72 61 6e 64 20 6f 66 20 61 20 4c 45 46 54 20 4a  rand of a LEFT J
1f530 4f 49 4e 2c 20 74 68 65 6e 20 74 68 65 0a 20 20  OIN, then the.  
1f540 2a 2a 20 73 75 62 71 75 65 72 79 20 6d 61 79 20  ** subquery may 
1f550 6e 6f 74 20 62 65 20 61 20 6a 6f 69 6e 20 69 74  not be a join it
1f560 73 65 6c 66 2e 20 20 45 78 61 6d 70 6c 65 20 6f  self.  Example o
1f570 66 20 77 68 79 20 74 68 69 73 20 69 73 20 6e 6f  f why this is no
1f580 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a  t allowed:.  **.
1f590 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20    **         t1 
1f5a0 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
1f5b0 28 74 32 20 4a 4f 49 4e 20 74 33 29 0a 20 20 2a  (t2 JOIN t3).  *
1f5c0 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61  *.  ** If we fla
1f5d0 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20  tten the above, 
1f5e0 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a  we would get.  *
1f5f0 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28  *.  **         (
1f600 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f  t1 LEFT OUTER JO
1f610 49 4e 20 74 32 29 20 4a 4f 49 4e 20 74 33 0a 20  IN t2) JOIN t3. 
1f620 20 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68 20 69   **.  ** which i
1f630 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 74 68 65  s not at all the
1f640 20 73 61 6d 65 20 74 68 69 6e 67 2e 0a 20 20 2a   same thing..  *
1f650 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 73 75  *.  ** If the su
1f660 62 71 75 65 72 79 20 69 73 20 74 68 65 20 72 69  bquery is the ri
1f670 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61  ght operand of a
1f680 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e   LEFT JOIN, then
1f690 20 74 68 65 20 6f 75 74 65 72 0a 20 20 2a 2a 20   the outer.  ** 
1f6a0 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 62 65 20  query cannot be 
1f6b0 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20 20 54  an aggregate.  T
1f6c0 68 69 73 20 69 73 20 61 6e 20 61 72 74 69 66 61  his is an artifa
1f6d0 63 74 20 6f 66 20 74 68 65 20 77 61 79 20 61 67  ct of the way ag
1f6e0 67 72 65 67 61 74 65 73 0a 20 20 2a 2a 20 61 72  gregates.  ** ar
1f6f0 65 20 70 72 6f 63 65 73 73 65 64 20 2d 20 74 68  e processed - th
1f700 65 72 65 20 69 73 20 6e 6f 20 6d 65 63 68 61 6e  ere is no mechan
1f710 69 73 6d 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ism to determine
1f720 20 69 66 20 74 68 65 20 4c 45 46 54 20 4a 4f 49   if the LEFT JOI
1f730 4e 0a 20 20 2a 2a 20 74 61 62 6c 65 20 73 68 6f  N.  ** table sho
1f740 75 6c 64 20 62 65 20 61 6c 6c 2d 4e 55 4c 4c 2e  uld be all-NULL.
1f750 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 65 65 20 61  .  **.  ** See a
1f760 6c 73 6f 20 74 69 63 6b 65 74 73 20 23 33 30 36  lso tickets #306
1f770 2c 20 23 33 35 30 2c 20 61 6e 64 20 23 33 33 30  , #350, and #330
1f780 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  0..  */.  if( (p
1f790 53 75 62 69 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e  Subitem->fg.join
1f7a0 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29  type & JT_OUTER)
1f7b0 21 3d 30 20 29 7b 0a 20 20 20 20 69 73 4c 65 66  !=0 ){.    isLef
1f7c0 74 4a 6f 69 6e 20 3d 20 31 3b 0a 20 20 20 20 69  tJoin = 1;.    i
1f7d0 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63  f( pSubSrc->nSrc
1f7e0 3e 31 20 7c 7c 20 69 73 41 67 67 20 7c 7c 20 49  >1 || isAgg || I
1f7f0 73 56 69 72 74 75 61 6c 28 70 53 75 62 53 72 63  sVirtual(pSubSrc
1f800 2d 3e 61 5b 30 5d 2e 70 54 61 62 29 20 29 7b 0a  ->a[0].pTab) ){.
1f810 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20        return 0; 
1f820 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1f830 33 29 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a  3) */.    }.  }.
1f840 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 58  #ifdef SQLITE_EX
1f850 54 52 41 5f 49 46 4e 55 4c 4c 52 4f 57 0a 20 20  TRA_IFNULLROW.  
1f860 65 6c 73 65 20 69 66 28 20 69 46 72 6f 6d 3e 30  else if( iFrom>0
1f870 20 26 26 20 21 69 73 41 67 67 20 29 7b 0a 20 20   && !isAgg ){.  
1f880 20 20 2f 2a 20 53 65 74 74 69 6e 67 20 69 73 4c    /* Setting isL
1f890 65 66 74 4a 6f 69 6e 20 74 6f 20 2d 31 20 63 61  eftJoin to -1 ca
1f8a0 75 73 65 73 20 4f 50 5f 49 66 4e 75 6c 6c 52 6f  uses OP_IfNullRo
1f8b0 77 20 6f 70 63 6f 64 65 73 20 74 6f 20 62 65 20  w opcodes to be 
1f8c0 67 65 6e 65 72 61 74 65 64 20 66 6f 72 0a 20 20  generated for.  
1f8d0 20 20 2a 2a 20 65 76 65 72 79 20 72 65 66 65 72    ** every refer
1f8e0 65 6e 63 65 20 74 6f 20 61 6e 79 20 72 65 73 75  ence to any resu
1f8f0 6c 74 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20 73  lt column from s
1f900 75 62 71 75 65 72 79 20 69 6e 20 61 20 6a 6f 69  ubquery in a joi
1f910 6e 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 0a 20  n, even though. 
1f920 20 20 20 2a 2a 20 74 68 65 79 20 61 72 65 20 6e     ** they are n
1f930 6f 74 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54  ot necessary.  T
1f940 68 69 73 20 77 69 6c 6c 20 73 74 72 65 73 73 2d  his will stress-
1f950 74 65 73 74 20 74 68 65 20 4f 50 5f 49 66 4e 75  test the OP_IfNu
1f960 6c 6c 52 6f 77 20 6f 70 63 6f 64 65 2e 20 2a 2f  llRow opcode. */
1f970 0a 20 20 20 20 69 73 4c 65 66 74 4a 6f 69 6e 20  .    isLeftJoin 
1f980 3d 20 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  = -1;.  }.#endif
1f990 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69  ..  /* Restricti
1f9a0 6f 6e 20 31 37 3a 20 49 66 20 74 68 65 20 73 75  on 17: If the su
1f9b0 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d  b-query is a com
1f9c0 70 6f 75 6e 64 20 53 45 4c 45 43 54 2c 20 74 68  pound SELECT, th
1f9d0 65 6e 20 69 74 20 6d 75 73 74 0a 20 20 2a 2a 20  en it must.  ** 
1f9e0 75 73 65 20 6f 6e 6c 79 20 74 68 65 20 55 4e 49  use only the UNI
1f9f0 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 2e  ON ALL operator.
1fa00 20 41 6e 64 20 6e 6f 6e 65 20 6f 66 20 74 68 65   And none of the
1fa10 20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74 20 71   simple select q
1fa20 75 65 72 69 65 73 0a 20 20 2a 2a 20 74 68 61 74  ueries.  ** that
1fa30 20 6d 61 6b 65 20 75 70 20 74 68 65 20 63 6f 6d   make up the com
1fa40 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 61 72 65  pound SELECT are
1fa50 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20 61   allowed to be a
1fa60 67 67 72 65 67 61 74 65 20 6f 72 20 64 69 73 74  ggregate or dist
1fa70 69 6e 63 74 0a 20 20 2a 2a 20 71 75 65 72 69 65  inct.  ** querie
1fa80 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  s..  */.  if( pS
1fa90 75 62 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20  ub->pPrior ){.  
1faa0 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64    if( pSub->pOrd
1fab0 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 72 65  erBy ){.      re
1fac0 74 75 72 6e 20 30 3b 20 20 2f 2a 20 52 65 73 74  turn 0;  /* Rest
1fad0 72 69 63 74 69 6f 6e 20 32 30 20 2a 2f 0a 20 20  riction 20 */.  
1fae0 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 41 67    }.    if( isAg
1faf0 67 20 7c 7c 20 28 70 2d 3e 73 65 6c 46 6c 61 67  g || (p->selFlag
1fb00 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29  s & SF_Distinct)
1fb10 21 3d 30 20 7c 7c 20 70 53 72 63 2d 3e 6e 53 72  !=0 || pSrc->nSr
1fb20 63 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 65  c!=1 ){.      re
1fb30 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
1fb40 20 20 66 6f 72 28 70 53 75 62 31 3d 70 53 75 62    for(pSub1=pSub
1fb50 3b 20 70 53 75 62 31 3b 20 70 53 75 62 31 3d 70  ; pSub1; pSub1=p
1fb60 53 75 62 31 2d 3e 70 50 72 69 6f 72 29 7b 0a 20  Sub1->pPrior){. 
1fb70 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28       testcase( (
1fb80 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20  pSub1->selFlags 
1fb90 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53  & (SF_Distinct|S
1fba0 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53  F_Aggregate))==S
1fbb0 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20  F_Distinct );.  
1fbc0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70      testcase( (p
1fbd0 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26  Sub1->selFlags &
1fbe0 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46   (SF_Distinct|SF
1fbf0 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46  _Aggregate))==SF
1fc00 5f 41 67 67 72 65 67 61 74 65 20 29 3b 0a 20 20  _Aggregate );.  
1fc10 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62      assert( pSub
1fc20 2d 3e 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 20  ->pSrc!=0 );.   
1fc30 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62 2d     assert( pSub-
1fc40 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d  >pEList->nExpr==
1fc50 70 53 75 62 31 2d 3e 70 45 4c 69 73 74 2d 3e 6e  pSub1->pEList->n
1fc60 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 69 66  Expr );.      if
1fc70 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61  ( (pSub1->selFla
1fc80 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63  gs & (SF_Distinc
1fc90 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29  t|SF_Aggregate))
1fca0 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 28 70  !=0.       || (p
1fcb0 53 75 62 31 2d 3e 70 50 72 69 6f 72 20 26 26 20  Sub1->pPrior && 
1fcc0 70 53 75 62 31 2d 3e 6f 70 21 3d 54 4b 5f 41 4c  pSub1->op!=TK_AL
1fcd0 4c 29 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 53  L) .       || pS
1fce0 75 62 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3c  ub1->pSrc->nSrc<
1fcf0 31 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  1.      ){.     
1fd00 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
1fd10 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63     }.      testc
1fd20 61 73 65 28 20 70 53 75 62 31 2d 3e 70 53 72 63  ase( pSub1->pSrc
1fd30 2d 3e 6e 53 72 63 3e 31 20 29 3b 0a 20 20 20 20  ->nSrc>1 );.    
1fd40 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 74 72 69  }..    /* Restri
1fd50 63 74 69 6f 6e 20 31 38 2e 20 2a 2f 0a 20 20 20  ction 18. */.   
1fd60 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
1fd70 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69   ){.      int ii
1fd80 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30  ;.      for(ii=0
1fd90 3b 20 69 69 3c 70 2d 3e 70 4f 72 64 65 72 42 79  ; ii<p->pOrderBy
1fda0 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a  ->nExpr; ii++){.
1fdb0 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70          if( p->p
1fdc0 4f 72 64 65 72 42 79 2d 3e 61 5b 69 69 5d 2e 75  OrderBy->a[ii].u
1fdd0 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d  .x.iOrderByCol==
1fde0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
1fdf0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1fe00 0a 20 20 2f 2a 2a 2a 2a 2a 20 49 66 20 77 65 20  .  /***** If we 
1fe10 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
1fe20 2c 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  , flattening is 
1fe30 70 65 72 6d 69 74 74 65 64 2e 20 2a 2a 2a 2a 2a  permitted. *****
1fe40 2f 0a 20 20 53 45 4c 45 43 54 54 52 41 43 45 28  /.  SELECTTRACE(
1fe50 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 66 6c 61  1,pParse,p,("fla
1fe60 74 74 65 6e 20 25 73 2e 25 70 20 66 72 6f 6d 20  tten %s.%p from 
1fe70 74 65 72 6d 20 25 64 5c 6e 22 2c 0a 20 20 20 20  term %d\n",.    
1fe80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1fe90 53 75 62 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 20 70  Sub->zSelName, p
1fea0 53 75 62 2c 20 69 46 72 6f 6d 29 29 3b 0a 0a 20  Sub, iFrom));.. 
1feb0 20 2f 2a 20 41 75 74 68 6f 72 69 7a 65 20 74 68   /* Authorize th
1fec0 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  e subquery */.  
1fed0 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e  pParse->zAuthCon
1fee0 74 65 78 74 20 3d 20 70 53 75 62 69 74 65 6d 2d  text = pSubitem-
1fef0 3e 7a 4e 61 6d 65 3b 0a 20 20 54 45 53 54 4f 4e  >zName;.  TESTON
1ff00 4c 59 28 69 20 3d 29 20 73 71 6c 69 74 65 33 41  LY(i =) sqlite3A
1ff10 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
1ff20 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20   SQLITE_SELECT, 
1ff30 30 2c 20 30 2c 20 30 29 3b 0a 20 20 74 65 73 74  0, 0, 0);.  test
1ff40 63 61 73 65 28 20 69 3d 3d 53 51 4c 49 54 45 5f  case( i==SQLITE_
1ff50 44 45 4e 59 20 29 3b 0a 20 20 70 50 61 72 73 65  DENY );.  pParse
1ff60 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d  ->zAuthContext =
1ff70 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65   zSavedAuthConte
1ff80 78 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  xt;..  /* If the
1ff90 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20   sub-query is a 
1ffa0 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20  compound SELECT 
1ffb0 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20  statement, then 
1ffc0 28 62 79 20 72 65 73 74 72 69 63 74 69 6f 6e 73  (by restrictions
1ffd0 0a 20 20 2a 2a 20 31 37 20 61 6e 64 20 31 38 20  .  ** 17 and 18 
1ffe0 61 62 6f 76 65 29 20 69 74 20 6d 75 73 74 20 62  above) it must b
1fff0 65 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 61 6e  e a UNION ALL an
20000 64 20 74 68 65 20 70 61 72 65 6e 74 20 71 75 65  d the parent que
20010 72 79 20 6d 75 73 74 20 0a 20 20 2a 2a 20 62 65  ry must .  ** be
20020 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20   of the form:.  
20030 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  **.  **     SELE
20040 43 54 20 3c 65 78 70 72 2d 6c 69 73 74 3e 20 46  CT <expr-list> F
20050 52 4f 4d 20 28 3c 73 75 62 2d 71 75 65 72 79 3e  ROM (<sub-query>
20060 29 20 3c 77 68 65 72 65 2d 63 6c 61 75 73 65 3e  ) <where-clause>
20070 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 66 6f 6c 6c   .  **.  ** foll
20080 6f 77 65 64 20 62 79 20 61 6e 79 20 4f 52 44 45  owed by any ORDE
20090 52 20 42 59 2c 20 4c 49 4d 49 54 20 61 6e 64 2f  R BY, LIMIT and/
200a0 6f 72 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65  or OFFSET clause
200b0 73 2e 20 54 68 69 73 20 62 6c 6f 63 6b 0a 20 20  s. This block.  
200c0 2a 2a 20 63 72 65 61 74 65 73 20 4e 2d 31 20 63  ** creates N-1 c
200d0 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70 61 72  opies of the par
200e0 65 6e 74 20 71 75 65 72 79 20 77 69 74 68 6f 75  ent query withou
200f0 74 20 61 6e 79 20 4f 52 44 45 52 20 42 59 2c 20  t any ORDER BY, 
20100 4c 49 4d 49 54 20 6f 72 20 0a 20 20 2a 2a 20 4f  LIMIT or .  ** O
20110 46 46 53 45 54 20 63 6c 61 75 73 65 73 20 61 6e  FFSET clauses an
20120 64 20 6a 6f 69 6e 73 20 74 68 65 6d 20 74 6f 20  d joins them to 
20130 74 68 65 20 6c 65 66 74 2d 68 61 6e 64 2d 73 69  the left-hand-si
20140 64 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e  de of the origin
20150 61 6c 0a 20 20 2a 2a 20 75 73 69 6e 67 20 55 4e  al.  ** using UN
20160 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72  ION ALL operator
20170 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  s. In this case 
20180 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  N is the number 
20190 6f 66 20 73 69 6d 70 6c 65 0a 20 20 2a 2a 20 73  of simple.  ** s
201a0 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73  elect statements
201b0 20 69 6e 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   in the compound
201c0 20 73 75 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2a   sub-query..  **
201d0 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20  .  ** Example:. 
201e0 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c   **.  **     SEL
201f0 45 43 54 20 61 2b 31 20 46 52 4f 4d 20 28 0a 20  ECT a+1 FROM (. 
20200 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43   **        SELEC
20210 54 20 78 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a  T x FROM tab.  *
20220 2a 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41  *        UNION A
20230 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53  LL.  **        S
20240 45 4c 45 43 54 20 79 20 46 52 4f 4d 20 74 61 62  ELECT y FROM tab
20250 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 55 4e 49  .  **        UNI
20260 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20  ON ALL.  **     
20270 20 20 20 53 45 4c 45 43 54 20 61 62 73 28 7a 2a     SELECT abs(z*
20280 32 29 20 46 52 4f 4d 20 74 61 62 32 0a 20 20 2a  2) FROM tab2.  *
20290 2a 20 20 20 20 20 29 20 57 48 45 52 45 20 61 21  *     ) WHERE a!
202a0 3d 35 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20  =5 ORDER BY 1.  
202b0 2a 2a 0a 20 20 2a 2a 20 54 72 61 6e 73 66 6f 72  **.  ** Transfor
202c0 6d 65 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20  med into:.  **. 
202d0 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78   **     SELECT x
202e0 2b 31 20 46 52 4f 4d 20 74 61 62 20 57 48 45 52  +1 FROM tab WHER
202f0 45 20 78 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20  E x+1!=5.  **   
20300 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a    UNION ALL.  **
20310 20 20 20 20 20 53 45 4c 45 43 54 20 79 2b 31 20       SELECT y+1 
20320 46 52 4f 4d 20 74 61 62 20 57 48 45 52 45 20 79  FROM tab WHERE y
20330 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55  +1!=5.  **     U
20340 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20  NION ALL.  **   
20350 20 20 53 45 4c 45 43 54 20 61 62 73 28 7a 2a 32    SELECT abs(z*2
20360 29 2b 31 20 46 52 4f 4d 20 74 61 62 32 20 57 48  )+1 FROM tab2 WH
20370 45 52 45 20 61 62 73 28 7a 2a 32 29 2b 31 21 3d  ERE abs(z*2)+1!=
20380 35 0a 20 20 2a 2a 20 20 20 20 20 4f 52 44 45 52  5.  **     ORDER
20390 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20   BY 1.  **.  ** 
203a0 57 65 20 63 61 6c 6c 20 74 68 69 73 20 74 68 65  We call this the
203b0 20 22 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75   "compound-subqu
203c0 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 22 2e  ery flattening".
203d0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 53 75 62  .  */.  for(pSub
203e0 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 3b 20 70  =pSub->pPrior; p
203f0 53 75 62 3b 20 70 53 75 62 3d 70 53 75 62 2d 3e  Sub; pSub=pSub->
20400 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 53 65 6c  pPrior){.    Sel
20410 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 45  ect *pNew;.    E
20420 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
20430 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
20440 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69  .    Expr *pLimi
20450 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20  t = p->pLimit;. 
20460 20 20 20 45 78 70 72 20 2a 70 4f 66 66 73 65 74     Expr *pOffset
20470 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20   = p->pOffset;. 
20480 20 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f     Select *pPrio
20490 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  r = p->pPrior;. 
204a0 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
204b0 20 30 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63 20   0;.    p->pSrc 
204c0 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69  = 0;.    p->pPri
204d0 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70  or = 0;.    p->p
204e0 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 70  Limit = 0;.    p
204f0 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->pOffset = 0;. 
20500 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
20510 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
20520 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
20530 33 53 65 6c 65 63 74 53 65 74 4e 61 6d 65 28 70  3SelectSetName(p
20540 4e 65 77 2c 20 70 53 75 62 2d 3e 7a 53 65 6c 4e  New, pSub->zSelN
20550 61 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 66  ame);.    p->pOf
20560 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a  fset = pOffset;.
20570 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
20580 70 4c 69 6d 69 74 3b 0a 20 20 20 20 70 2d 3e 70  pLimit;.    p->p
20590 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
205a0 42 79 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63 20  By;.    p->pSrc 
205b0 3d 20 70 53 72 63 3b 0a 20 20 20 20 70 2d 3e 6f  = pSrc;.    p->o
205c0 70 20 3d 20 54 4b 5f 41 4c 4c 3b 0a 20 20 20 20  p = TK_ALL;.    
205d0 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
205e0 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
205f0 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 7d 65 6c   pPrior;.    }el
20600 73 65 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  se{.      pNew->
20610 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
20620 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 69 6f  .      if( pPrio
20630 72 20 29 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78  r ) pPrior->pNex
20640 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  t = pNew;.      
20650 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70 3b  pNew->pNext = p;
20660 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
20670 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 53   = pNew;.      S
20680 45 4c 45 43 54 54 52 41 43 45 28 32 2c 70 50 61  ELECTTRACE(2,pPa
20690 72 73 65 2c 70 2c 0a 20 20 20 20 20 20 20 20 20  rse,p,.         
206a0 28 22 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75  ("compound-subqu
206b0 65 72 79 20 66 6c 61 74 74 65 6e 65 72 20 63 72  ery flattener cr
206c0 65 61 74 65 73 20 25 73 2e 25 70 20 61 73 20 70  eates %s.%p as p
206d0 65 65 72 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  eer\n",.        
206e0 20 70 4e 65 77 2d 3e 7a 53 65 6c 4e 61 6d 65 2c   pNew->zSelName,
206f0 20 70 4e 65 77 29 29 3b 0a 20 20 20 20 7d 0a 20   pNew));.    }. 
20700 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
20710 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
20720 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65   1;.  }..  /* Be
20730 67 69 6e 20 66 6c 61 74 74 65 6e 69 6e 67 20 74  gin flattening t
20740 68 65 20 69 46 72 6f 6d 2d 74 68 20 65 6e 74 72  he iFrom-th entr
20750 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  y of the FROM cl
20760 61 75 73 65 20 0a 20 20 2a 2a 20 69 6e 20 74 68  ause .  ** in th
20770 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20  e outer query.. 
20780 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20 70 53 75   */.  pSub = pSu
20790 62 31 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70  b1 = pSubitem->p
207a0 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20 44 65  Select;..  /* De
207b0 6c 65 74 65 20 74 68 65 20 74 72 61 6e 73 69 65  lete the transie
207c0 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74 75  nt table structu
207d0 72 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  re associated wi
207e0 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71  th the.  ** subq
207f0 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  uery.  */.  sqli
20800 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53  te3DbFree(db, pS
20810 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73  ubitem->zDatabas
20820 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  e);.  sqlite3DbF
20830 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d  ree(db, pSubitem
20840 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  ->zName);.  sqli
20850 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53  te3DbFree(db, pS
20860 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b  ubitem->zAlias);
20870 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61  .  pSubitem->zDa
20880 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 70 53  tabase = 0;.  pS
20890 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20  ubitem->zName = 
208a0 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a  0;.  pSubitem->z
208b0 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 70 53 75  Alias = 0;.  pSu
208c0 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d  bitem->pSelect =
208d0 20 30 3b 0a 0a 20 20 2f 2a 20 44 65 66 65 72 20   0;..  /* Defer 
208e0 64 65 6c 65 74 69 6e 67 20 74 68 65 20 54 61 62  deleting the Tab
208f0 6c 65 20 6f 62 6a 65 63 74 20 61 73 73 6f 63 69  le object associ
20900 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 20 20  ated with the.  
20910 2a 2a 20 73 75 62 71 75 65 72 79 20 75 6e 74 69  ** subquery unti
20920 6c 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f  l code generatio
20930 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 6c 65  n is.  ** comple
20940 74 65 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20  te, since there 
20950 6d 61 79 20 73 74 69 6c 6c 20 65 78 69 73 74 20  may still exist 
20960 45 78 70 72 2e 70 54 61 62 20 65 6e 74 72 69 65  Expr.pTab entrie
20970 73 20 74 68 61 74 0a 20 20 2a 2a 20 72 65 66 65  s that.  ** refe
20980 72 20 74 6f 20 74 68 65 20 73 75 62 71 75 65 72  r to the subquer
20990 79 20 65 76 65 6e 20 61 66 74 65 72 20 66 6c 61  y even after fla
209a0 74 74 65 6e 69 6e 67 2e 20 20 54 69 63 6b 65 74  ttening.  Ticket
209b0 20 23 33 33 34 36 2e 0a 20 20 2a 2a 0a 20 20 2a   #3346..  **.  *
209c0 2a 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62  * pSubitem->pTab
209d0 20 69 73 20 61 6c 77 61 79 73 20 6e 6f 6e 2d 4e   is always non-N
209e0 55 4c 4c 20 62 79 20 74 65 73 74 20 72 65 73 74  ULL by test rest
209f0 72 69 63 74 69 6f 6e 73 20 61 6e 64 20 74 65 73  rictions and tes
20a00 74 73 20 61 62 6f 76 65 2e 0a 20 20 2a 2f 0a 20  ts above..  */. 
20a10 20 69 66 28 20 41 4c 57 41 59 53 28 70 53 75 62   if( ALWAYS(pSub
20a20 69 74 65 6d 2d 3e 70 54 61 62 21 3d 30 29 20 29  item->pTab!=0) )
20a30 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
20a40 62 54 6f 44 65 6c 20 3d 20 70 53 75 62 69 74 65  bToDel = pSubite
20a50 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28  m->pTab;.    if(
20a60 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 54 61 62   pTabToDel->nTab
20a70 52 65 66 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  Ref==1 ){.      
20a80 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c  Parse *pToplevel
20a90 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54   = sqlite3ParseT
20aa0 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b  oplevel(pParse);
20ab0 0a 20 20 20 20 20 20 70 54 61 62 54 6f 44 65 6c  .      pTabToDel
20ac0 2d 3e 70 4e 65 78 74 5a 6f 6d 62 69 65 20 3d 20  ->pNextZombie = 
20ad0 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62  pToplevel->pZomb
20ae0 69 65 54 61 62 3b 0a 20 20 20 20 20 20 70 54 6f  ieTab;.      pTo
20af0 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54  plevel->pZombieT
20b00 61 62 20 3d 20 70 54 61 62 54 6f 44 65 6c 3b 0a  ab = pTabToDel;.
20b10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20b20 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 54 61 62   pTabToDel->nTab
20b30 52 65 66 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20  Ref--;.    }.   
20b40 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 20   pSubitem->pTab 
20b50 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  = 0;.  }..  /* T
20b60 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f  he following loo
20b70 70 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20  p runs once for 
20b80 65 61 63 68 20 74 65 72 6d 20 69 6e 20 61 20 63  each term in a c
20b90 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79  ompound-subquery
20ba0 0a 20 20 2a 2a 20 66 6c 61 74 74 65 6e 69 6e 67  .  ** flattening
20bb0 20 28 61 73 20 64 65 73 63 72 69 62 65 64 20 61   (as described a
20bc0 62 6f 76 65 29 2e 20 20 49 66 20 77 65 20 61 72  bove).  If we ar
20bd0 65 20 64 6f 69 6e 67 20 61 20 64 69 66 66 65 72  e doing a differ
20be0 65 6e 74 20 6b 69 6e 64 0a 20 20 2a 2a 20 6f 66  ent kind.  ** of
20bf0 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d 20 61 20   flattening - a 
20c00 66 6c 61 74 74 65 6e 69 6e 67 20 6f 74 68 65 72  flattening other
20c10 20 74 68 61 6e 20 61 20 63 6f 6d 70 6f 75 6e 64   than a compound
20c20 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74 74 65  -subquery flatte
20c30 6e 69 6e 67 20 2d 0a 20 20 2a 2a 20 74 68 65 6e  ning -.  ** then
20c40 20 74 68 69 73 20 6c 6f 6f 70 20 6f 6e 6c 79 20   this loop only 
20c50 72 75 6e 73 20 6f 6e 63 65 2e 0a 20 20 2a 2a 0a  runs once..  **.
20c60 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 6d    ** This loop m
20c70 6f 76 65 73 20 61 6c 6c 20 6f 66 20 74 68 65 20  oves all of the 
20c80 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 73 20 6f 66  FROM elements of
20c90 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 6e   the subquery in
20ca0 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20  to the.  ** the 
20cb0 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
20cc0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20  he outer query. 
20cd0 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 74 68   Before doing th
20ce0 69 73 2c 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a  is, remember.  *
20cf0 2a 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d  * the cursor num
20d00 62 65 72 20 66 6f 72 20 74 68 65 20 6f 72 69 67  ber for the orig
20d10 69 6e 61 6c 20 6f 75 74 65 72 20 71 75 65 72 79  inal outer query
20d20 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 20 69 6e   FROM element in
20d30 0a 20 20 2a 2a 20 69 50 61 72 65 6e 74 2e 20 20  .  ** iParent.  
20d40 54 68 65 20 69 50 61 72 65 6e 74 20 63 75 72 73  The iParent curs
20d50 6f 72 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  or will never be
20d60 20 75 73 65 64 2e 20 20 53 75 62 73 65 71 75 65   used.  Subseque
20d70 6e 74 20 63 6f 64 65 0a 20 20 2a 2a 20 77 69 6c  nt code.  ** wil
20d80 6c 20 73 63 61 6e 20 65 78 70 72 65 73 73 69 6f  l scan expressio
20d90 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 69  ns looking for i
20da0 50 61 72 65 6e 74 20 72 65 66 65 72 65 6e 63 65  Parent reference
20db0 73 20 61 6e 64 20 72 65 70 6c 61 63 65 0a 20 20  s and replace.  
20dc0 2a 2a 20 74 68 6f 73 65 20 72 65 66 65 72 65 6e  ** those referen
20dd0 63 65 73 20 77 69 74 68 20 65 78 70 72 65 73 73  ces with express
20de0 69 6f 6e 73 20 74 68 61 74 20 72 65 73 6f 6c 76  ions that resolv
20df0 65 20 74 6f 20 74 68 65 20 73 75 62 71 75 65 72  e to the subquer
20e00 79 20 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d  y FROM.  ** elem
20e10 65 6e 74 73 20 77 65 20 61 72 65 20 6e 6f 77 20  ents we are now 
20e20 63 6f 70 79 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f  copying in..  */
20e30 0a 20 20 66 6f 72 28 70 50 61 72 65 6e 74 3d 70  .  for(pParent=p
20e40 3b 20 70 50 61 72 65 6e 74 3b 20 70 50 61 72 65  ; pParent; pPare
20e50 6e 74 3d 70 50 61 72 65 6e 74 2d 3e 70 50 72 69  nt=pParent->pPri
20e60 6f 72 2c 20 70 53 75 62 3d 70 53 75 62 2d 3e 70  or, pSub=pSub->p
20e70 50 72 69 6f 72 29 7b 0a 20 20 20 20 69 6e 74 20  Prior){.    int 
20e80 6e 53 75 62 53 72 63 3b 0a 20 20 20 20 75 38 20  nSubSrc;.    u8 
20e90 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20  jointype = 0;.  
20ea0 20 20 70 53 75 62 53 72 63 20 3d 20 70 53 75 62    pSubSrc = pSub
20eb0 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a 20 46  ->pSrc;     /* F
20ec0 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 73 75  ROM clause of su
20ed0 62 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 6e 53  bquery */.    nS
20ee0 75 62 53 72 63 20 3d 20 70 53 75 62 53 72 63 2d  ubSrc = pSubSrc-
20ef0 3e 6e 53 72 63 3b 20 20 2f 2a 20 4e 75 6d 62 65  >nSrc;  /* Numbe
20f00 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 73 75  r of terms in su
20f10 62 71 75 65 72 79 20 46 52 4f 4d 20 63 6c 61 75  bquery FROM clau
20f20 73 65 20 2a 2f 0a 20 20 20 20 70 53 72 63 20 3d  se */.    pSrc =
20f30 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 3b 20   pParent->pSrc; 
20f40 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75      /* FROM clau
20f50 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  se of the outer 
20f60 71 75 65 72 79 20 2a 2f 0a 0a 20 20 20 20 69 66  query */..    if
20f70 28 20 70 53 72 63 20 29 7b 0a 20 20 20 20 20 20  ( pSrc ){.      
20f80 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 3d  assert( pParent=
20f90 3d 70 20 29 3b 20 20 2f 2a 20 46 69 72 73 74 20  =p );  /* First 
20fa0 74 69 6d 65 20 74 68 72 6f 75 67 68 20 74 68 65  time through the
20fb0 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 6a   loop */.      j
20fc0 6f 69 6e 74 79 70 65 20 3d 20 70 53 75 62 69 74  ointype = pSubit
20fd0 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 3b  em->fg.jointype;
20fe0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
20ff0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
21000 74 21 3d 70 20 29 3b 20 20 2f 2a 20 32 6e 64 20  t!=p );  /* 2nd 
21010 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20 74  and subsequent t
21020 69 6d 65 73 20 74 68 72 6f 75 67 68 20 74 68 65  imes through the
21030 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 70   loop */.      p
21040 53 72 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70  Src = pParent->p
21050 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63  Src = sqlite3Src
21060 4c 69 73 74 41 70 70 65 6e 64 28 64 62 2c 20 30  ListAppend(db, 0
21070 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  , 0, 0);.      i
21080 66 28 20 70 53 72 63 3d 3d 30 20 29 7b 0a 20 20  f( pSrc==0 ){.  
21090 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62        assert( db
210a0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
210b0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
210c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
210d0 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75      /* The subqu
210e0 65 72 79 20 75 73 65 73 20 61 20 73 69 6e 67 6c  ery uses a singl
210f0 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 20 46 52  e slot of the FR
21100 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
21110 20 6f 75 74 65 72 0a 20 20 20 20 2a 2a 20 71 75   outer.    ** qu
21120 65 72 79 2e 20 20 49 66 20 74 68 65 20 73 75 62  ery.  If the sub
21130 71 75 65 72 79 20 68 61 73 20 6d 6f 72 65 20 74  query has more t
21140 68 61 6e 20 6f 6e 65 20 65 6c 65 6d 65 6e 74 20  han one element 
21150 69 6e 20 69 74 73 20 46 52 4f 4d 20 63 6c 61 75  in its FROM clau
21160 73 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  se,.    ** then 
21170 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74 65 72  expand the outer
21180 20 71 75 65 72 79 20 74 6f 20 6d 61 6b 65 20 73   query to make s
21190 70 61 63 65 20 66 6f 72 20 69 74 20 74 6f 20 68  pace for it to h
211a0 6f 6c 64 20 61 6c 6c 20 65 6c 65 6d 65 6e 74 73  old all elements
211b0 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73  .    ** of the s
211c0 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a 0a  ubquery..    **.
211d0 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a      ** Example:.
211e0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
211f0 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
21200 61 62 41 2c 20 28 53 45 4c 45 43 54 20 2a 20 46  abA, (SELECT * F
21210 52 4f 4d 20 73 75 62 31 2c 20 73 75 62 32 29 2c  ROM sub1, sub2),
21220 20 74 61 62 42 3b 0a 20 20 20 20 2a 2a 0a 20 20   tabB;.    **.  
21230 20 20 2a 2a 20 54 68 65 20 6f 75 74 65 72 20 71    ** The outer q
21240 75 65 72 79 20 68 61 73 20 33 20 73 6c 6f 74 73  uery has 3 slots
21250 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 63 6c 61   in its FROM cla
21260 75 73 65 2e 20 20 4f 6e 65 20 73 6c 6f 74 20 6f  use.  One slot o
21270 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74  f the.    ** out
21280 65 72 20 71 75 65 72 79 20 28 74 68 65 20 6d 69  er query (the mi
21290 64 64 6c 65 20 73 6c 6f 74 29 20 69 73 20 75 73  ddle slot) is us
212a0 65 64 20 62 79 20 74 68 65 20 73 75 62 71 75 65  ed by the subque
212b0 72 79 2e 20 20 54 68 65 20 6e 65 78 74 0a 20 20  ry.  The next.  
212c0 20 20 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20 63 6f    ** block of co
212d0 64 65 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 74  de will expand t
212e0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 46  he outer query F
212f0 52 4f 4d 20 63 6c 61 75 73 65 20 74 6f 20 34 20  ROM clause to 4 
21300 73 6c 6f 74 73 2e 0a 20 20 20 20 2a 2a 20 54 68  slots..    ** Th
21310 65 20 6d 69 64 64 6c 65 20 73 6c 6f 74 20 69 73  e middle slot is
21320 20 65 78 70 61 6e 64 65 64 20 74 6f 20 74 77 6f   expanded to two
21330 20 73 6c 6f 74 73 20 69 6e 20 6f 72 64 65 72 20   slots in order 
21340 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 0a 20 20  to make space.  
21350 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 74 77 6f    ** for the two
21360 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65   elements in the
21370 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
21380 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20  the subquery..  
21390 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 53 75    */.    if( nSu
213a0 62 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20  bSrc>1 ){.      
213b0 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20  pParent->pSrc = 
213c0 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72  pSrc = sqlite3Sr
213d0 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64 62 2c  cListEnlarge(db,
213e0 20 70 53 72 63 2c 20 6e 53 75 62 53 72 63 2d 31   pSrc, nSubSrc-1
213f0 2c 69 46 72 6f 6d 2b 31 29 3b 0a 20 20 20 20 20  ,iFrom+1);.     
21400 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
21410 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20  ailed ){.       
21420 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
21430 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 72      }..    /* Tr
21440 61 6e 73 66 65 72 20 74 68 65 20 46 52 4f 4d 20  ansfer the FROM 
21450 63 6c 61 75 73 65 20 74 65 72 6d 73 20 66 72 6f  clause terms fro
21460 6d 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  m the subquery i
21470 6e 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f  nto the.    ** o
21480 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 20 20  uter query..    
21490 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
214a0 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b  i<nSubSrc; i++){
214b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 49 64  .      sqlite3Id
214c0 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
214d0 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 2e  Src->a[i+iFrom].
214e0 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 20 20 61  pUsing);.      a
214f0 73 73 65 72 74 28 20 70 53 72 63 2d 3e 61 5b 69  ssert( pSrc->a[i
21500 2b 69 46 72 6f 6d 5d 2e 66 67 2e 69 73 54 61 62  +iFrom].fg.isTab
21510 46 75 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Func==0 );.     
21520 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d   pSrc->a[i+iFrom
21530 5d 20 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b 69  ] = pSubSrc->a[i
21540 5d 3b 0a 20 20 20 20 20 20 69 4e 65 77 50 61 72  ];.      iNewPar
21550 65 6e 74 20 3d 20 70 53 75 62 53 72 63 2d 3e 61  ent = pSubSrc->a
21560 5b 69 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 20  [i].iCursor;.   
21570 20 20 20 6d 65 6d 73 65 74 28 26 70 53 75 62 53     memset(&pSubS
21580 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69 7a  rc->a[i], 0, siz
21590 65 6f 66 28 70 53 75 62 53 72 63 2d 3e 61 5b 69  eof(pSubSrc->a[i
215a0 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ]));.    }.    p
215b0 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 66 67  Src->a[iFrom].fg
215c0 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69 6e  .jointype = join
215d0 74 79 70 65 3b 0a 20 20 0a 20 20 20 20 2f 2a 20  type;.  .    /* 
215e0 4e 6f 77 20 62 65 67 69 6e 20 73 75 62 73 74 69  Now begin substi
215f0 74 75 74 69 6e 67 20 73 75 62 71 75 65 72 79 20  tuting subquery 
21600 72 65 73 75 6c 74 20 73 65 74 20 65 78 70 72 65  result set expre
21610 73 73 69 6f 6e 73 20 66 6f 72 20 0a 20 20 20 20  ssions for .    
21620 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ** references to
21630 20 74 68 65 20 69 50 61 72 65 6e 74 20 69 6e 20   the iParent in 
21640 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e  the outer query.
21650 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20  .    ** .    ** 
21660 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a  Example:.    **.
21670 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20      **   SELECT 
21680 61 2b 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28  a+5, b*10 FROM (
21690 53 45 4c 45 43 54 20 78 2a 33 20 41 53 20 61 2c  SELECT x*3 AS a,
216a0 20 79 2b 31 30 20 41 53 20 62 20 46 52 4f 4d 20   y+10 AS b FROM 
216b0 74 31 29 20 57 48 45 52 45 20 61 3e 62 3b 0a 20  t1) WHERE a>b;. 
216c0 20 20 20 2a 2a 20 20 20 5c 20 20 20 20 20 20 20     **   \       
216d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f                \_
216e0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62  ____________ sub
216f0 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  query __________
21700 2f 20 20 20 20 20 20 20 20 20 20 2f 0a 20 20 20  /          /.   
21710 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f   **    \________
21720 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75  _____________ ou
21730 74 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f  ter query ______
21740 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
21750 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20 20 2a 2a  ________/.    **
21760 0a 20 20 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20  .    ** We look 
21770 61 74 20 65 76 65 72 79 20 65 78 70 72 65 73 73  at every express
21780 69 6f 6e 20 69 6e 20 74 68 65 20 6f 75 74 65 72  ion in the outer
21790 20 71 75 65 72 79 20 61 6e 64 20 65 76 65 72 79   query and every
217a0 20 70 6c 61 63 65 20 77 65 20 73 65 65 0a 20 20   place we see.  
217b0 20 20 2a 2a 20 22 61 22 20 77 65 20 73 75 62 73    ** "a" we subs
217c0 74 69 74 75 74 65 20 22 78 2a 33 22 20 61 6e 64  titute "x*3" and
217d0 20 65 76 65 72 79 20 70 6c 61 63 65 20 77 65 20   every place we 
217e0 73 65 65 20 22 62 22 20 77 65 20 73 75 62 73 74  see "b" we subst
217f0 69 74 75 74 65 20 22 79 2b 31 30 22 2e 0a 20 20  itute "y+10"..  
21800 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75    */.    if( pSu
21810 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  b->pOrderBy ){. 
21820 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20       /* At this 
21830 70 6f 69 6e 74 2c 20 61 6e 79 20 6e 6f 6e 2d 7a  point, any non-z
21840 65 72 6f 20 69 4f 72 64 65 72 42 79 43 6f 6c 20  ero iOrderByCol 
21850 76 61 6c 75 65 73 20 69 6e 64 69 63 61 74 65 20  values indicate 
21860 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a  that the.      *
21870 2a 20 4f 52 44 45 52 20 42 59 20 63 6f 6c 75 6d  * ORDER BY colum
21880 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  n expression is 
21890 69 64 65 6e 74 69 63 61 6c 20 74 6f 20 74 68 65  identical to the
218a0 20 69 4f 72 64 65 72 42 79 43 6f 6c 27 74 68 0a   iOrderByCol'th.
218b0 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73        ** express
218c0 69 6f 6e 20 72 65 74 75 72 6e 65 64 20 62 79 20  ion returned by 
218d0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
218e0 20 70 53 75 62 2e 20 53 69 6e 63 65 20 74 68 65   pSub. Since the
218f0 73 65 20 76 61 6c 75 65 73 0a 20 20 20 20 20 20  se values.      
21900 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65 63 65 73 73  ** do not necess
21910 61 72 69 6c 79 20 63 6f 72 72 65 73 70 6f 6e 64  arily correspond
21920 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 53   to columns in S
21930 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
21940 70 50 61 72 65 6e 74 2c 0a 20 20 20 20 20 20 2a  pParent,.      *
21950 2a 20 7a 65 72 6f 20 74 68 65 6d 20 62 65 66 6f  * zero them befo
21960 72 65 20 74 72 61 6e 73 66 65 72 69 6e 67 20 74  re transfering t
21970 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
21980 73 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  se..      **.   
21990 20 20 20 2a 2a 20 4e 6f 74 20 64 6f 69 6e 67 20     ** Not doing 
219a0 74 68 69 73 20 6d 61 79 20 63 61 75 73 65 20 61  this may cause a
219b0 6e 20 65 72 72 6f 72 20 69 66 20 61 20 73 75 62  n error if a sub
219c0 73 65 71 75 65 6e 74 20 63 61 6c 6c 20 74 6f 20  sequent call to 
219d0 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 66 75  this.      ** fu
219e0 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20  nction attempts 
219f0 74 6f 20 66 6c 61 74 74 65 6e 20 61 20 63 6f 6d  to flatten a com
21a00 70 6f 75 6e 64 20 73 75 62 2d 71 75 65 72 79 20  pound sub-query 
21a10 69 6e 74 6f 20 70 50 61 72 65 6e 74 0a 20 20 20  into pParent.   
21a20 20 20 20 2a 2a 20 28 74 68 65 20 6f 6e 6c 79 20     ** (the only 
21a30 77 61 79 20 74 68 69 73 20 63 61 6e 20 68 61 70  way this can hap
21a40 70 65 6e 20 69 73 20 69 66 20 74 68 65 20 63 6f  pen is if the co
21a50 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65 72 79  mpound sub-query
21a60 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 63 75 72   is.      ** cur
21a70 72 65 6e 74 6c 79 20 70 61 72 74 20 6f 66 20 70  rently part of p
21a80 53 75 62 2d 3e 70 53 72 63 29 2e 20 53 65 65 20  Sub->pSrc). See 
21a90 74 69 63 6b 65 74 20 5b 64 31 31 61 36 65 39 30  ticket [d11a6e90
21aa0 38 66 5d 2e 20 20 2a 2f 0a 20 20 20 20 20 20 45  8f].  */.      E
21ab0 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
21ac0 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72 64 65 72  y = pSub->pOrder
21ad0 42 79 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  By;.      for(i=
21ae0 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e  0; i<pOrderBy->n
21af0 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
21b00 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b      pOrderBy->a[
21b10 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  i].u.x.iOrderByC
21b20 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ol = 0;.      }.
21b30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
21b40 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 3d  arent->pOrderBy=
21b50 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
21b60 72 74 28 20 70 53 75 62 2d 3e 70 50 72 69 6f 72  rt( pSub->pPrior
21b70 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61  ==0 );.      pPa
21b80 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20 3d  rent->pOrderBy =
21b90 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20   pOrderBy;.     
21ba0 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
21bb0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  = 0;.    }.    p
21bc0 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45  Where = sqlite3E
21bd0 78 70 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d  xprDup(db, pSub-
21be0 3e 70 57 68 65 72 65 2c 20 30 29 3b 0a 20 20 20  >pWhere, 0);.   
21bf0 20 69 66 28 20 69 73 4c 65 66 74 4a 6f 69 6e 3e   if( isLeftJoin>
21c00 30 20 29 7b 0a 20 20 20 20 20 20 73 65 74 4a 6f  0 ){.      setJo
21c10 69 6e 45 78 70 72 28 70 57 68 65 72 65 2c 20 69  inExpr(pWhere, i
21c20 4e 65 77 50 61 72 65 6e 74 29 3b 0a 20 20 20 20  NewParent);.    
21c30 7d 0a 20 20 20 20 69 66 28 20 73 75 62 71 75 65  }.    if( subque
21c40 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20 20  ryIsAgg ){.     
21c50 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
21c60 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29 3b 0a  ->pHaving==0 );.
21c70 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
21c80 48 61 76 69 6e 67 20 3d 20 70 50 61 72 65 6e 74  Having = pParent
21c90 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 20 20  ->pWhere;.      
21ca0 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 20  pParent->pWhere 
21cb0 3d 20 70 57 68 65 72 65 3b 0a 20 20 20 20 20 20  = pWhere;.      
21cc0 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67  pParent->pHaving
21cd0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
21ce0 64 28 64 62 2c 20 0a 20 20 20 20 20 20 20 20 20  d(db, .         
21cf0 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
21d00 64 62 2c 20 70 53 75 62 2d 3e 70 48 61 76 69 6e  db, pSub->pHavin
21d10 67 2c 20 30 29 2c 20 70 50 61 72 65 6e 74 2d 3e  g, 0), pParent->
21d20 70 48 61 76 69 6e 67 0a 20 20 20 20 20 20 29 3b  pHaving.      );
21d30 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
21d40 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70 42 79  Parent->pGroupBy
21d50 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61  ==0 );.      pPa
21d60 72 65 6e 74 2d 3e 70 47 72 6f 75 70 42 79 20 3d  rent->pGroupBy =
21d70 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
21d80 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 47  Dup(db, pSub->pG
21d90 72 6f 75 70 42 79 2c 20 30 29 3b 0a 20 20 20 20  roupBy, 0);.    
21da0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61  }else{.      pPa
21db0 72 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20 73  rent->pWhere = s
21dc0 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62  qlite3ExprAnd(db
21dd0 2c 20 70 57 68 65 72 65 2c 20 70 50 61 72 65 6e  , pWhere, pParen
21de0 74 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20  t->pWhere);.    
21df0 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  }.    if( db->ma
21e00 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b  llocFailed==0 ){
21e10 0a 20 20 20 20 20 20 53 75 62 73 74 43 6f 6e 74  .      SubstCont
21e20 65 78 74 20 78 3b 0a 20 20 20 20 20 20 78 2e 70  ext x;.      x.p
21e30 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
21e40 20 20 20 20 20 20 78 2e 69 54 61 62 6c 65 20 3d        x.iTable =
21e50 20 69 50 61 72 65 6e 74 3b 0a 20 20 20 20 20 20   iParent;.      
21e60 78 2e 69 4e 65 77 54 61 62 6c 65 20 3d 20 69 4e  x.iNewTable = iN
21e70 65 77 50 61 72 65 6e 74 3b 0a 20 20 20 20 20 20  ewParent;.      
21e80 78 2e 69 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 69  x.isLeftJoin = i
21e90 73 4c 65 66 74 4a 6f 69 6e 3b 0a 20 20 20 20 20  sLeftJoin;.     
21ea0 20 78 2e 70 45 4c 69 73 74 20 3d 20 70 53 75 62   x.pEList = pSub
21eb0 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20  ->pEList;.      
21ec0 73 75 62 73 74 53 65 6c 65 63 74 28 26 78 2c 20  substSelect(&x, 
21ed0 70 50 61 72 65 6e 74 2c 20 30 29 3b 0a 20 20 20  pParent, 0);.   
21ee0 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 65   }.  .    /* The
21ef0 20 66 6c 61 74 74 65 6e 65 64 20 71 75 65 72 79   flattened query
21f00 20 69 73 20 64 69 73 74 69 6e 63 74 20 69 66 20   is distinct if 
21f10 65 69 74 68 65 72 20 74 68 65 20 69 6e 6e 65 72  either the inner
21f20 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f   or the.    ** o
21f30 75 74 65 72 20 71 75 65 72 79 20 69 73 20 64 69  uter query is di
21f40 73 74 69 6e 63 74 2e 20 0a 20 20 20 20 2a 2f 0a  stinct. .    */.
21f50 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 73 65 6c      pParent->sel
21f60 46 6c 61 67 73 20 7c 3d 20 70 53 75 62 2d 3e 73  Flags |= pSub->s
21f70 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
21f80 74 69 6e 63 74 3b 0a 20 20 0a 20 20 20 20 2f 2a  tinct;.  .    /*
21f90 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 2e  .    ** SELECT .
21fa0 2e 2e 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20  .. FROM (SELECT 
21fb0 2e 2e 2e 20 4c 49 4d 49 54 20 61 20 4f 46 46 53  ... LIMIT a OFFS
21fc0 45 54 20 62 29 20 4c 49 4d 49 54 20 78 20 4f 46  ET b) LIMIT x OF
21fd0 46 53 45 54 20 79 3b 0a 20 20 20 20 2a 2a 0a 20  FSET y;.    **. 
21fe0 20 20 20 2a 2a 20 4f 6e 65 20 69 73 20 74 65 6d     ** One is tem
21ff0 70 74 65 64 20 74 6f 20 74 72 79 20 74 6f 20 61  pted to try to a
22000 64 64 20 61 20 61 6e 64 20 62 20 74 6f 20 63 6f  dd a and b to co
22010 6d 62 69 6e 65 20 74 68 65 20 6c 69 6d 69 74 73  mbine the limits
22020 2e 20 20 42 75 74 20 74 68 69 73 0a 20 20 20 20  .  But this.    
22030 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  ** does not work
22040 20 69 66 20 65 69 74 68 65 72 20 6c 69 6d 69 74   if either limit
22050 20 69 73 20 6e 65 67 61 74 69 76 65 2e 0a 20 20   is negative..  
22060 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75    */.    if( pSu
22070 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  b->pLimit ){.   
22080 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4c 69 6d     pParent->pLim
22090 69 74 20 3d 20 70 53 75 62 2d 3e 70 4c 69 6d 69  it = pSub->pLimi
220a0 74 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70  t;.      pSub->p
220b0 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 7d  Limit = 0;.    }
220c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69 61  .  }..  /* Finia
220d0 6c 6c 79 2c 20 64 65 6c 65 74 65 20 77 68 61 74  lly, delete what
220e0 20 69 73 20 6c 65 66 74 20 6f 66 20 74 68 65 20   is left of the 
220f0 73 75 62 71 75 65 72 79 20 61 6e 64 20 72 65 74  subquery and ret
22100 75 72 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73  urn.  ** success
22110 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
22120 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
22130 20 70 53 75 62 31 29 3b 0a 0a 23 69 66 20 53 45   pSub1);..#if SE
22140 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45  LECTTRACE_ENABLE
22150 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  D.  if( sqlite3S
22160 65 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 31  electTrace & 0x1
22170 30 30 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54  00 ){.    SELECT
22180 54 52 41 43 45 28 30 78 31 30 30 2c 70 50 61 72  TRACE(0x100,pPar
22190 73 65 2c 70 2c 28 22 41 66 74 65 72 20 66 6c 61  se,p,("After fla
221a0 74 74 65 6e 69 6e 67 3a 5c 6e 22 29 29 3b 0a 20  ttening:\n"));. 
221b0 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
221c0 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30  ewSelect(0, p, 0
221d0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
221e0 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e   return 1;.}.#en
221f0 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
22200 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
22210 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
22220 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
22230 45 57 29 20 2a 2f 0a 0a 0a 0a 23 69 66 20 21 64  EW) */....#if !d
22240 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
22250 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
22260 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
22270 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a  OMIT_VIEW)./*.**
22280 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20   Make copies of 
22290 72 65 6c 65 76 61 6e 74 20 57 48 45 52 45 20 63  relevant WHERE c
222a0 6c 61 75 73 65 20 74 65 72 6d 73 20 6f 66 20 74  lause terms of t
222b0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
222c0 6e 74 6f 0a 2a 2a 20 74 68 65 20 57 48 45 52 45  nto.** the WHERE
222d0 20 63 6c 61 75 73 65 20 6f 66 20 73 75 62 71 75   clause of subqu
222e0 65 72 79 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a  ery.  Example:.*
222f0 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a  *.**    SELECT *
22300 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 61 20   FROM (SELECT a 
22310 41 53 20 78 2c 20 63 2d 64 20 41 53 20 79 20 46  AS x, c-d AS y F
22320 52 4f 4d 20 74 31 29 20 57 48 45 52 45 20 78 3d  ROM t1) WHERE x=
22330 35 20 41 4e 44 20 79 3d 31 30 3b 0a 2a 2a 0a 2a  5 AND y=10;.**.*
22340 2a 20 54 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e  * Transformed in
22350 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c  to:.**.**    SEL
22360 45 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45  ECT * FROM (SELE
22370 43 54 20 61 20 41 53 20 78 2c 20 63 2d 64 20 41  CT a AS x, c-d A
22380 53 20 79 20 46 52 4f 4d 20 74 31 20 57 48 45 52  S y FROM t1 WHER
22390 45 20 61 3d 35 20 41 4e 44 20 63 2d 64 3d 31 30  E a=5 AND c-d=10
223a0 29 0a 2a 2a 20 20 20 20 20 57 48 45 52 45 20 78  ).**     WHERE x
223b0 3d 35 20 41 4e 44 20 79 3d 31 30 3b 0a 2a 2a 0a  =5 AND y=10;.**.
223c0 2a 2a 20 54 68 65 20 68 6f 70 65 20 69 73 20 74  ** The hope is t
223d0 68 61 74 20 74 68 65 20 74 65 72 6d 73 20 61 64  hat the terms ad
223e0 64 65 64 20 74 6f 20 74 68 65 20 69 6e 6e 65 72  ded to the inner
223f0 20 71 75 65 72 79 20 77 69 6c 6c 20 6d 61 6b 65   query will make
22400 20 69 74 20 6d 6f 72 65 0a 2a 2a 20 65 66 66 69   it more.** effi
22410 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20  cient..**.** Do 
22420 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 68 69 73  not attempt this
22430 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66   optimization if
22440 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 54 68  :.**.**   (1) Th
22450 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 69 73  e inner query is
22460 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20 20   an aggregate.  
22470 28 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 77  (In that case, w
22480 65 27 64 20 72 65 61 6c 6c 79 20 77 61 6e 74 0a  e'd really want.
22490 2a 2a 20 20 20 20 20 20 20 74 6f 20 63 6f 70 79  **       to copy
224a0 20 74 68 65 20 6f 75 74 65 72 20 57 48 45 52 45   the outer WHERE
224b0 2d 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6f 6e  -clause terms on
224c0 74 6f 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c  to the HAVING cl
224d0 61 75 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20  ause of the.**  
224e0 20 20 20 20 20 69 6e 6e 65 72 20 71 75 65 72 79       inner query
224f0 2e 20 20 42 75 74 20 74 68 65 79 20 70 72 6f 62  .  But they prob
22500 61 62 6c 79 20 77 6f 6e 27 74 20 68 65 6c 70 20  ably won't help 
22510 74 68 65 72 65 20 73 6f 20 64 6f 20 6e 6f 74 20  there so do not 
22520 62 6f 74 68 65 72 2e 29 0a 2a 2a 0a 2a 2a 20 20  bother.).**.**  
22530 20 28 32 29 20 54 68 65 20 69 6e 6e 65 72 20 71   (2) The inner q
22540 75 65 72 79 20 69 73 20 74 68 65 20 72 65 63 75  uery is the recu
22550 72 73 69 76 65 20 70 61 72 74 20 6f 66 20 61 20  rsive part of a 
22560 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65 20 65 78 70  common table exp
22570 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20  ression..**.**  
22580 20 28 33 29 20 54 68 65 20 69 6e 6e 65 72 20 71   (3) The inner q
22590 75 65 72 79 20 68 61 73 20 61 20 4c 49 4d 49 54  uery has a LIMIT
225a0 20 63 6c 61 75 73 65 20 28 73 69 6e 63 65 20 74   clause (since t
225b0 68 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  he changes to th
225c0 65 20 57 48 45 52 45 0a 2a 2a 20 20 20 20 20 20  e WHERE.**      
225d0 20 63 6c 6f 73 65 20 77 6f 75 6c 64 20 63 68 61   close would cha
225e0 6e 67 65 20 74 68 65 20 6d 65 61 6e 69 6e 67 20  nge the meaning 
225f0 6f 66 20 74 68 65 20 4c 49 4d 49 54 29 2e 0a 2a  of the LIMIT)..*
22600 2a 0a 2a 2a 20 20 20 28 34 29 20 54 68 65 20 69  *.**   (4) The i
22610 6e 6e 65 72 20 71 75 65 72 79 20 69 73 20 74 68  nner query is th
22620 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  e right operand 
22630 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 20  of a LEFT JOIN. 
22640 20 28 54 68 65 20 63 61 6c 6c 65 72 0a 2a 2a 20   (The caller.** 
22650 20 20 20 20 20 20 65 6e 66 6f 72 63 65 73 20 74        enforces t
22660 68 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e 20  his restriction 
22670 73 69 6e 63 65 20 74 68 69 73 20 72 6f 75 74 69  since this routi
22680 6e 65 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  ne does not have
22690 20 65 6e 6f 75 67 68 0a 2a 2a 20 20 20 20 20 20   enough.**      
226a0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20   information to 
226b0 6b 6e 6f 77 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 28  know.).**.**   (
226c0 35 29 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  5) The WHERE cla
226d0 75 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f  use expression o
226e0 72 69 67 69 6e 61 74 65 73 20 69 6e 20 74 68 65  riginates in the
226f0 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
22700 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20  use.**       of 
22710 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 0a 2a 2a 0a  a LEFT JOIN..**.
22720 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e  ** Return 0 if n
22730 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61  o changes are ma
22740 64 65 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 20  de and non-zero 
22750 69 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57  if one or more W
22760 48 45 52 45 20 63 6c 61 75 73 65 0a 2a 2a 20 74  HERE clause.** t
22770 65 72 6d 73 20 61 72 65 20 64 75 70 6c 69 63 61  erms are duplica
22780 74 65 64 20 69 6e 74 6f 20 74 68 65 20 73 75 62  ted into the sub
22790 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  query..*/.static
227a0 20 69 6e 74 20 70 75 73 68 44 6f 77 6e 57 68 65   int pushDownWhe
227b0 72 65 54 65 72 6d 73 28 0a 20 20 50 61 72 73 65  reTerms(.  Parse
227c0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
227d0 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78   /* Parse contex
227e0 74 20 28 66 6f 72 20 6d 61 6c 6c 6f 63 28 29 20  t (for malloc() 
227f0 61 6e 64 20 65 72 72 6f 72 20 72 65 70 6f 72 74  and error report
22800 69 6e 67 29 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ing) */.  Select
22810 20 2a 70 53 75 62 71 2c 20 20 20 20 20 20 20 20   *pSubq,        
22820 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20  /* The subquery 
22830 77 68 6f 73 65 20 57 48 45 52 45 20 63 6c 61 75  whose WHERE clau
22840 73 65 20 69 73 20 74 6f 20 62 65 20 61 75 67 6d  se is to be augm
22850 65 6e 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 20  ented */.  Expr 
22860 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20 20 20  *pWhere,        
22870 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
22880 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65  ause of the oute
22890 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  r query */.  int
228a0 20 69 43 75 72 73 6f 72 20 20 20 20 20 20 20 20   iCursor        
228b0 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d     /* Cursor num
228c0 62 65 72 20 6f 66 20 74 68 65 20 73 75 62 71 75  ber of the subqu
228d0 65 72 79 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72  ery */.){.  Expr
228e0 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 43   *pNew;.  int nC
228f0 68 6e 67 20 3d 20 30 3b 0a 20 20 53 65 6c 65 63  hng = 0;.  Selec
22900 74 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20  t *pX;          
22910 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
22920 6f 76 65 72 20 63 6f 6d 70 6f 75 6e 64 20 53 45  over compound SE
22930 4c 45 43 54 73 20 69 6e 20 70 53 75 62 71 20 2a  LECTs in pSubq *
22940 2f 0a 20 20 69 66 28 20 70 57 68 65 72 65 3d 3d  /.  if( pWhere==
22950 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
22960 66 6f 72 28 70 58 3d 70 53 75 62 71 3b 20 70 58  for(pX=pSubq; pX
22970 3b 20 70 58 3d 70 58 2d 3e 70 50 72 69 6f 72 29  ; pX=pX->pPrior)
22980 7b 0a 20 20 20 20 69 66 28 20 28 70 58 2d 3e 73  {.    if( (pX->s
22990 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 41 67  elFlags & (SF_Ag
229a0 67 72 65 67 61 74 65 7c 53 46 5f 52 65 63 75 72  gregate|SF_Recur
229b0 73 69 76 65 29 29 21 3d 30 20 29 7b 0a 20 20 20  sive))!=0 ){.   
229c0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58 2d     testcase( pX-
229d0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41  >selFlags & SF_A
229e0 67 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20  ggregate );.    
229f0 20 20 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e    testcase( pX->
22a00 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65  selFlags & SF_Re
22a10 63 75 72 73 69 76 65 20 29 3b 0a 20 20 20 20 20  cursive );.     
22a20 20 74 65 73 74 63 61 73 65 28 20 70 58 21 3d 70   testcase( pX!=p
22a30 53 75 62 71 20 29 3b 0a 20 20 20 20 20 20 72 65  Subq );.      re
22a40 74 75 72 6e 20 30 3b 20 2f 2a 20 72 65 73 74 72  turn 0; /* restr
22a50 69 63 74 69 6f 6e 73 20 28 31 29 20 61 6e 64 20  ictions (1) and 
22a60 28 32 29 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d  (2) */.    }.  }
22a70 0a 20 20 69 66 28 20 70 53 75 62 71 2d 3e 70 4c  .  if( pSubq->pL
22a80 69 6d 69 74 21 3d 30 20 29 7b 0a 20 20 20 20 72  imit!=0 ){.    r
22a90 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72 65 73 74  eturn 0; /* rest
22aa0 72 69 63 74 69 6f 6e 20 28 33 29 20 2a 2f 0a 20  riction (3) */. 
22ab0 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 57 68 65   }.  while( pWhe
22ac0 72 65 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29  re->op==TK_AND )
22ad0 7b 0a 20 20 20 20 6e 43 68 6e 67 20 2b 3d 20 70  {.    nChng += p
22ae0 75 73 68 44 6f 77 6e 57 68 65 72 65 54 65 72 6d  ushDownWhereTerm
22af0 73 28 70 50 61 72 73 65 2c 20 70 53 75 62 71 2c  s(pParse, pSubq,
22b00 20 70 57 68 65 72 65 2d 3e 70 52 69 67 68 74 2c   pWhere->pRight,
22b10 20 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 70   iCursor);.    p
22b20 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 2d 3e  Where = pWhere->
22b30 70 4c 65 66 74 3b 0a 20 20 7d 0a 20 20 69 66 28  pLeft;.  }.  if(
22b40 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
22b50 28 70 57 68 65 72 65 2c 45 50 5f 46 72 6f 6d 4a  (pWhere,EP_FromJ
22b60 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b  oin) ) return 0;
22b70 20 2f 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 20   /* restriction 
22b80 35 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74  5 */.  if( sqlit
22b90 65 33 45 78 70 72 49 73 54 61 62 6c 65 43 6f 6e  e3ExprIsTableCon
22ba0 73 74 61 6e 74 28 70 57 68 65 72 65 2c 20 69 43  stant(pWhere, iC
22bb0 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 6e 43  ursor) ){.    nC
22bc0 68 6e 67 2b 2b 3b 0a 20 20 20 20 77 68 69 6c 65  hng++;.    while
22bd0 28 20 70 53 75 62 71 20 29 7b 0a 20 20 20 20 20  ( pSubq ){.     
22be0 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20 78 3b   SubstContext x;
22bf0 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71  .      pNew = sq
22c00 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50 61  lite3ExprDup(pPa
22c10 72 73 65 2d 3e 64 62 2c 20 70 57 68 65 72 65 2c  rse->db, pWhere,
22c20 20 30 29 3b 0a 20 20 20 20 20 20 78 2e 70 50 61   0);.      x.pPa
22c30 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
22c40 20 20 20 20 78 2e 69 54 61 62 6c 65 20 3d 20 69      x.iTable = i
22c50 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 78 2e  Cursor;.      x.
22c60 69 4e 65 77 54 61 62 6c 65 20 3d 20 69 43 75 72  iNewTable = iCur
22c70 73 6f 72 3b 0a 20 20 20 20 20 20 78 2e 69 73 4c  sor;.      x.isL
22c80 65 66 74 4a 6f 69 6e 20 3d 20 30 3b 0a 20 20 20  eftJoin = 0;.   
22c90 20 20 20 78 2e 70 45 4c 69 73 74 20 3d 20 70 53     x.pEList = pS
22ca0 75 62 71 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20  ubq->pEList;.   
22cb0 20 20 20 70 4e 65 77 20 3d 20 73 75 62 73 74 45     pNew = substE
22cc0 78 70 72 28 26 78 2c 20 70 4e 65 77 29 3b 0a 20  xpr(&x, pNew);. 
22cd0 20 20 20 20 20 70 53 75 62 71 2d 3e 70 57 68 65       pSubq->pWhe
22ce0 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  re = sqlite3Expr
22cf0 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  And(pParse->db, 
22d00 70 53 75 62 71 2d 3e 70 57 68 65 72 65 2c 20 70  pSubq->pWhere, p
22d10 4e 65 77 29 3b 0a 20 20 20 20 20 20 70 53 75 62  New);.      pSub
22d20 71 20 3d 20 70 53 75 62 71 2d 3e 70 50 72 69 6f  q = pSubq->pPrio
22d30 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  r;.    }.  }.  r
22d40 65 74 75 72 6e 20 6e 43 68 6e 67 3b 0a 7d 0a 23  eturn nChng;.}.#
22d50 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
22d60 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
22d70 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69  BQUERY) || !defi
22d80 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
22d90 56 49 45 57 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  VIEW) */../*.** 
22da0 42 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e  Based on the con
22db0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 41 67 67  tents of the Agg
22dc0 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  Info structure i
22dd0 6e 64 69 63 61 74 65 64 20 62 79 20 74 68 65 20  ndicated by the 
22de0 66 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e  first.** argumen
22df0 74 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  t, this function
22e00 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 20 66   checks if the f
22e10 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75  ollowing are tru
22e20 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68  e:.**.**    * th
22e30 65 20 71 75 65 72 79 20 63 6f 6e 74 61 69 6e 73  e query contains
22e40 20 6a 75 73 74 20 61 20 73 69 6e 67 6c 65 20 61   just a single a
22e50 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
22e60 6e 2c 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 61  n,.**    * the a
22e70 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
22e80 6e 20 69 73 20 65 69 74 68 65 72 20 6d 69 6e 28  n is either min(
22e90 29 20 6f 72 20 6d 61 78 28 29 2c 20 61 6e 64 0a  ) or max(), and.
22ea0 2a 2a 20 20 20 20 2a 20 74 68 65 20 61 72 67 75  **    * the argu
22eb0 6d 65 6e 74 20 74 6f 20 74 68 65 20 61 67 67 72  ment to the aggr
22ec0 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 69  egate function i
22ed0 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  s a column value
22ee0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 6f  ..**.** If all o
22ef0 66 20 74 68 65 20 61 62 6f 76 65 20 61 72 65 20  f the above are 
22f00 74 72 75 65 2c 20 74 68 65 6e 20 57 48 45 52 45  true, then WHERE
22f10 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20 6f 72 20  _ORDERBY_MIN or 
22f20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41  WHERE_ORDERBY_MA
22f30 58 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  X.** is returned
22f40 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e   as appropriate.
22f50 20 41 6c 73 6f 2c 20 2a 70 70 4d 69 6e 4d 61 78   Also, *ppMinMax
22f60 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
22f70 20 74 6f 20 74 68 65 20 0a 2a 2a 20 6c 69 73 74   to the .** list
22f80 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 70 61   of arguments pa
22f90 73 73 65 64 20 74 6f 20 74 68 65 20 61 67 67 72  ssed to the aggr
22fa0 65 67 61 74 65 20 62 65 66 6f 72 65 20 72 65 74  egate before ret
22fb0 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 4f 72  urning..**.** Or
22fc0 2c 20 69 66 20 74 68 65 20 63 6f 6e 64 69 74 69  , if the conditi
22fd0 6f 6e 73 20 61 62 6f 76 65 20 61 72 65 20 6e 6f  ons above are no
22fe0 74 20 6d 65 74 2c 20 2a 70 70 4d 69 6e 4d 61 78  t met, *ppMinMax
22ff0 20 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64   is set to 0 and
23000 0a 2a 2a 20 57 48 45 52 45 5f 4f 52 44 45 52 42  .** WHERE_ORDERB
23010 59 5f 4e 4f 52 4d 41 4c 20 69 73 20 72 65 74 75  Y_NORMAL is retu
23020 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
23030 75 38 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 41  u8 minMaxQuery(A
23040 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
23050 2c 20 45 78 70 72 4c 69 73 74 20 2a 2a 70 70 4d  , ExprList **ppM
23060 69 6e 4d 61 78 29 7b 0a 20 20 69 6e 74 20 65 52  inMax){.  int eR
23070 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52  et = WHERE_ORDER
23080 42 59 5f 4e 4f 52 4d 41 4c 3b 20 20 20 20 20 20  BY_NORMAL;      
23090 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61      /* Return va
230a0 6c 75 65 20 2a 2f 0a 0a 20 20 2a 70 70 4d 69 6e  lue */..  *ppMin
230b0 4d 61 78 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  Max = 0;.  if( p
230c0 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d  AggInfo->nFunc==
230d0 31 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  1 ){.    Expr *p
230e0 45 78 70 72 20 3d 20 70 41 67 67 49 6e 66 6f 2d  Expr = pAggInfo-
230f0 3e 61 46 75 6e 63 5b 30 5d 2e 70 45 78 70 72 3b  >aFunc[0].pExpr;
23100 20 2f 2a 20 41 67 67 72 65 67 61 74 65 20 66 75   /* Aggregate fu
23110 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 45 78  nction */.    Ex
23120 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d  prList *pEList =
23130 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
23140 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e        /* Argumen
23150 74 73 20 74 6f 20 61 67 67 20 66 75 6e 63 74 69  ts to agg functi
23160 6f 6e 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72  on */..    asser
23170 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  t( pExpr->op==TK
23180 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b  _AGG_FUNCTION );
23190 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 20  .    if( pEList 
231a0 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  && pEList->nExpr
231b0 3d 3d 31 20 26 26 20 70 45 4c 69 73 74 2d 3e 61  ==1 && pEList->a
231c0 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  [0].pExpr->op==T
231d0 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  K_AGG_COLUMN ){.
231e0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
231f0 20 2a 7a 46 75 6e 63 20 3d 20 70 45 78 70 72 2d   *zFunc = pExpr-
23200 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20  >u.zToken;.     
23210 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
23220 43 6d 70 28 7a 46 75 6e 63 2c 20 22 6d 69 6e 22  Cmp(zFunc, "min"
23230 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
23240 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44  eRet = WHERE_ORD
23250 45 52 42 59 5f 4d 49 4e 3b 0a 20 20 20 20 20 20  ERBY_MIN;.      
23260 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 70 45    *ppMinMax = pE
23270 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  List;.      }els
23280 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72  e if( sqlite3Str
23290 49 43 6d 70 28 7a 46 75 6e 63 2c 20 22 6d 61 78  ICmp(zFunc, "max
232a0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
232b0 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52   eRet = WHERE_OR
232c0 44 45 52 42 59 5f 4d 41 58 3b 0a 20 20 20 20 20  DERBY_MAX;.     
232d0 20 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 70     *ppMinMax = p
232e0 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20  EList;.      }. 
232f0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65     }.  }..  asse
23300 72 74 28 20 2a 70 70 4d 69 6e 4d 61 78 3d 3d 30  rt( *ppMinMax==0
23310 20 7c 7c 20 28 2a 70 70 4d 69 6e 4d 61 78 29 2d   || (*ppMinMax)-
23320 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20 72  >nExpr==1 );.  r
23330 65 74 75 72 6e 20 65 52 65 74 3b 0a 7d 0a 0a 2f  eturn eRet;.}../
23340 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63 74 20  *.** The select 
23350 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64  statement passed
23360 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
23370 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 61 67 67  gument is an agg
23380 72 65 67 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a  regate query..**
23390 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   The second argu
233a0 6d 65 6e 74 20 69 73 20 74 68 65 20 61 73 73 6f  ment is the asso
233b0 63 69 61 74 65 64 20 61 67 67 72 65 67 61 74 65  ciated aggregate
233c0 2d 69 6e 66 6f 20 6f 62 6a 65 63 74 2e 20 54 68  -info object. Th
233d0 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  is .** function 
233e0 74 65 73 74 73 20 69 66 20 74 68 65 20 53 45 4c  tests if the SEL
233f0 45 43 54 20 69 73 20 6f 66 20 74 68 65 20 66 6f  ECT is of the fo
23400 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45  rm:.**.**   SELE
23410 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
23420 20 3c 74 62 6c 3e 0a 2a 2a 0a 2a 2a 20 77 68 65   <tbl>.**.** whe
23430 72 65 20 74 61 62 6c 65 20 69 73 20 61 20 64 61  re table is a da
23440 74 61 62 61 73 65 20 74 61 62 6c 65 2c 20 6e 6f  tabase table, no
23450 74 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20 6f  t a sub-select o
23460 72 20 76 69 65 77 2e 20 49 66 20 74 68 65 20 71  r view. If the q
23470 75 65 72 79 0a 2a 2a 20 64 6f 65 73 20 6d 61 74  uery.** does mat
23480 63 68 20 74 68 69 73 20 70 61 74 74 65 72 6e 2c  ch this pattern,
23490 20 74 68 65 6e 20 61 20 70 6f 69 6e 74 65 72 20   then a pointer 
234a0 74 6f 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a  to the Table obj
234b0 65 63 74 20 72 65 70 72 65 73 65 6e 74 69 6e 67  ect representing
234c0 0a 2a 2a 20 3c 74 62 6c 3e 20 69 73 20 72 65 74  .** <tbl> is ret
234d0 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
234e0 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e  , 0 is returned.
234f0 0a 2a 2f 0a 73 74 61 74 69 63 20 54 61 62 6c 65  .*/.static Table
23500 20 2a 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28   *isSimpleCount(
23510 53 65 6c 65 63 74 20 2a 70 2c 20 41 67 67 49 6e  Select *p, AggIn
23520 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20  fo *pAggInfo){. 
23530 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
23540 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 0a 20 20  Expr *pExpr;..  
23550 61 73 73 65 72 74 28 20 21 70 2d 3e 70 47 72 6f  assert( !p->pGro
23560 75 70 42 79 20 29 3b 0a 0a 20 20 69 66 28 20 70  upBy );..  if( p
23570 2d 3e 70 57 68 65 72 65 20 7c 7c 20 70 2d 3e 70  ->pWhere || p->p
23580 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20  EList->nExpr!=1 
23590 0a 20 20 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e  .   || p->pSrc->
235a0 6e 53 72 63 21 3d 31 20 7c 7c 20 70 2d 3e 70 53  nSrc!=1 || p->pS
235b0 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74  rc->a[0].pSelect
235c0 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
235d0 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d   0;.  }.  pTab =
235e0 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70   p->pSrc->a[0].p
235f0 54 61 62 3b 0a 20 20 70 45 78 70 72 20 3d 20 70  Tab;.  pExpr = p
23600 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
23610 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20  Expr;.  assert( 
23620 70 54 61 62 20 26 26 20 21 70 54 61 62 2d 3e 70  pTab && !pTab->p
23630 53 65 6c 65 63 74 20 26 26 20 70 45 78 70 72 20  Select && pExpr 
23640 29 3b 0a 0a 20 20 69 66 28 20 49 73 56 69 72 74  );..  if( IsVirt
23650 75 61 6c 28 70 54 61 62 29 20 29 20 72 65 74 75  ual(pTab) ) retu
23660 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70  rn 0;.  if( pExp
23670 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55  r->op!=TK_AGG_FU
23680 4e 43 54 49 4f 4e 20 29 20 72 65 74 75 72 6e 20  NCTION ) return 
23690 30 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  0;.  if( NEVER(p
236a0 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d  AggInfo->nFunc==
236b0 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  0) ) return 0;. 
236c0 20 69 66 28 20 28 70 41 67 67 49 6e 66 6f 2d 3e   if( (pAggInfo->
236d0 61 46 75 6e 63 5b 30 5d 2e 70 46 75 6e 63 2d 3e  aFunc[0].pFunc->
236e0 66 75 6e 63 46 6c 61 67 73 26 53 51 4c 49 54 45  funcFlags&SQLITE
236f0 5f 46 55 4e 43 5f 43 4f 55 4e 54 29 3d 3d 30 20  _FUNC_COUNT)==0 
23700 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
23710 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 26 45  ( pExpr->flags&E
23720 50 5f 44 69 73 74 69 6e 63 74 20 29 20 72 65 74  P_Distinct ) ret
23730 75 72 6e 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e  urn 0;..  return
23740 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pTab;.}../*.** 
23750 49 66 20 74 68 65 20 73 6f 75 72 63 65 2d 6c 69  If the source-li
23760 73 74 20 69 74 65 6d 20 70 61 73 73 65 64 20 61  st item passed a
23770 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 77 61  s an argument wa
23780 73 20 61 75 67 6d 65 6e 74 65 64 20 77 69 74 68  s augmented with
23790 20 61 6e 0a 2a 2a 20 49 4e 44 45 58 45 44 20 42   an.** INDEXED B
237a0 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74  Y clause, then t
237b0 72 79 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65  ry to locate the
237c0 20 73 70 65 63 69 66 69 65 64 20 69 6e 64 65 78   specified index
237d0 2e 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 77 61  . If there.** wa
237e0 73 20 73 75 63 68 20 61 20 63 6c 61 75 73 65 20  s such a clause 
237f0 61 6e 64 20 74 68 65 20 6e 61 6d 65 64 20 69 6e  and the named in
23800 64 65 78 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f  dex cannot be fo
23810 75 6e 64 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20  und, return .** 
23820 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 61 6e 64  SQLITE_ERROR and
23830 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
23840 69 6e 20 70 50 61 72 73 65 2e 20 4f 74 68 65 72  in pParse. Other
23850 77 69 73 65 2c 20 70 6f 70 75 6c 61 74 65 20 0a  wise, populate .
23860 2a 2a 20 70 46 72 6f 6d 2d 3e 70 49 6e 64 65 78  ** pFrom->pIndex
23870 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
23880 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71  TE_OK..*/.int sq
23890 6c 69 74 65 33 49 6e 64 65 78 65 64 42 79 4c 6f  lite3IndexedByLo
238a0 6f 6b 75 70 28 50 61 72 73 65 20 2a 70 50 61 72  okup(Parse *pPar
238b0 73 65 2c 20 73 74 72 75 63 74 20 53 72 63 4c 69  se, struct SrcLi
238c0 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b  st_item *pFrom){
238d0 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54  .  if( pFrom->pT
238e0 61 62 20 26 26 20 70 46 72 6f 6d 2d 3e 66 67 2e  ab && pFrom->fg.
238f0 69 73 49 6e 64 65 78 65 64 42 79 20 29 7b 0a 20  isIndexedBy ){. 
23900 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
23910 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20   pFrom->pTab;.  
23920 20 20 63 68 61 72 20 2a 7a 49 6e 64 65 78 65 64    char *zIndexed
23930 42 79 20 3d 20 70 46 72 6f 6d 2d 3e 75 31 2e 7a  By = pFrom->u1.z
23940 49 6e 64 65 78 65 64 42 79 3b 0a 20 20 20 20 49  IndexedBy;.    I
23950 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20  ndex *pIdx;.    
23960 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
23970 49 6e 64 65 78 3b 20 0a 20 20 20 20 20 20 20 20  Index; .        
23980 70 49 64 78 20 26 26 20 73 71 6c 69 74 65 33 53  pIdx && sqlite3S
23990 74 72 49 43 6d 70 28 70 49 64 78 2d 3e 7a 4e 61  trICmp(pIdx->zNa
239a0 6d 65 2c 20 7a 49 6e 64 65 78 65 64 42 79 29 3b  me, zIndexedBy);
239b0 20 0a 20 20 20 20 20 20 20 20 70 49 64 78 3d 70   .        pIdx=p
239c0 49 64 78 2d 3e 70 4e 65 78 74 0a 20 20 20 20 29  Idx->pNext.    )
239d0 3b 0a 20 20 20 20 69 66 28 20 21 70 49 64 78 20  ;.    if( !pIdx 
239e0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
239f0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
23a00 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a   "no such index:
23a10 20 25 73 22 2c 20 7a 49 6e 64 65 78 65 64 42 79   %s", zIndexedBy
23a20 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72  , 0);.      pPar
23a30 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20  se->checkSchema 
23a40 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 1;.      retur
23a50 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
23a60 20 20 20 20 7d 0a 20 20 20 20 70 46 72 6f 6d 2d      }.    pFrom-
23a70 3e 70 49 42 49 6e 64 65 78 20 3d 20 70 49 64 78  >pIBIndex = pIdx
23a80 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
23a90 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a  QLITE_OK;.}./*.*
23aa0 2a 20 44 65 74 65 63 74 20 63 6f 6d 70 6f 75 6e  * Detect compoun
23ab0 64 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  d SELECT stateme
23ac0 6e 74 73 20 74 68 61 74 20 75 73 65 20 61 6e 20  nts that use an 
23ad0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
23ae0 77 69 74 68 20 0a 2a 2a 20 61 6e 20 61 6c 74 65  with .** an alte
23af0 72 6e 61 74 69 76 65 20 63 6f 6c 6c 61 74 69 6e  rnative collatin
23b00 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a  g sequence..**.*
23b10 2a 20 20 20 20 53 45 4c 45 43 54 20 2e 2e 2e 20  *    SELECT ... 
23b20 46 52 4f 4d 20 74 31 20 45 58 43 45 50 54 20 53  FROM t1 EXCEPT S
23b30 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74  ELECT ... FROM t
23b40 32 20 4f 52 44 45 52 20 42 59 20 2e 2e 20 43 4f  2 ORDER BY .. CO
23b50 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20  LLATE ....**.** 
23b60 54 68 65 73 65 20 61 72 65 20 72 65 77 72 69 74  These are rewrit
23b70 74 65 6e 20 61 73 20 61 20 73 75 62 71 75 65 72  ten as a subquer
23b80 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45  y:.**.**    SELE
23b90 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43  CT * FROM (SELEC
23ba0 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 45 58  T ... FROM t1 EX
23bb0 43 45 50 54 20 53 45 4c 45 43 54 20 2e 2e 2e 20  CEPT SELECT ... 
23bc0 46 52 4f 4d 20 74 32 29 0a 2a 2a 20 20 20 20 20  FROM t2).**     
23bd0 4f 52 44 45 52 20 42 59 20 2e 2e 2e 20 43 4f 4c  ORDER BY ... COL
23be0 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54  LATE ....**.** T
23bf0 68 69 73 20 74 72 61 6e 73 66 6f 72 6d 61 74 69  his transformati
23c00 6f 6e 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  on is necessary 
23c10 62 65 63 61 75 73 65 20 74 68 65 20 6d 75 6c 74  because the mult
23c20 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 29  iSelectOrderBy()
23c30 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 62 6f 76   routine.** abov
23c40 65 20 74 68 61 74 20 67 65 6e 65 72 61 74 65 73  e that generates
23c50 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20 61 20   the code for a 
23c60 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20  compound SELECT 
23c70 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59  with an ORDER BY
23c80 20 63 6c 61 75 73 65 0a 2a 2a 20 75 73 65 73 20   clause.** uses 
23c90 61 20 6d 65 72 67 65 20 61 6c 67 6f 72 69 74 68  a merge algorith
23ca0 6d 20 74 68 61 74 20 72 65 71 75 69 72 65 73 20  m that requires 
23cb0 74 68 65 20 73 61 6d 65 20 63 6f 6c 6c 61 74 69  the same collati
23cc0 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 6e 20 74  ng sequence on t
23cd0 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20 63 6f 6c  he.** result col
23ce0 75 6d 6e 73 20 61 73 20 6f 6e 20 74 68 65 20 4f  umns as on the O
23cf0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20  RDER BY clause. 
23d00 20 53 65 65 20 74 69 63 6b 65 74 0a 2a 2a 20 68   See ticket.** h
23d10 74 74 70 3a 2f 2f 77 77 77 2e 73 71 6c 69 74 65  ttp://www.sqlite
23d20 2e 6f 72 67 2f 73 72 63 2f 69 6e 66 6f 2f 36 37  .org/src/info/67
23d30 30 39 35 37 34 64 32 61 0a 2a 2a 0a 2a 2a 20 54  09574d2a.**.** T
23d40 68 69 73 20 74 72 61 6e 73 66 6f 72 6d 61 74 69  his transformati
23d50 6f 6e 20 69 73 20 6f 6e 6c 79 20 6e 65 65 64 65  on is only neede
23d60 64 20 66 6f 72 20 45 58 43 45 50 54 2c 20 49 4e  d for EXCEPT, IN
23d70 54 45 52 53 45 43 54 2c 20 61 6e 64 20 55 4e 49  TERSECT, and UNI
23d80 4f 4e 2e 0a 2a 2a 20 54 68 65 20 55 4e 49 4f 4e  ON..** The UNION
23d90 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 77 6f   ALL operator wo
23da0 72 6b 73 20 66 69 6e 65 20 77 69 74 68 20 6d 75  rks fine with mu
23db0 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79  ltiSelectOrderBy
23dc0 28 29 20 65 76 65 6e 20 77 68 65 6e 0a 2a 2a 20  () even when.** 
23dd0 74 68 65 72 65 20 61 72 65 20 43 4f 4c 4c 41 54  there are COLLAT
23de0 45 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f  E terms in the O
23df0 52 44 45 52 20 42 59 2e 0a 2a 2f 0a 73 74 61 74  RDER BY..*/.stat
23e00 69 63 20 69 6e 74 20 63 6f 6e 76 65 72 74 43 6f  ic int convertCo
23e10 6d 70 6f 75 6e 64 53 65 6c 65 63 74 54 6f 53 75  mpoundSelectToSu
23e20 62 71 75 65 72 79 28 57 61 6c 6b 65 72 20 2a 70  bquery(Walker *p
23e30 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a  Walker, Select *
23e40 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53  p){.  int i;.  S
23e50 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 53  elect *pNew;.  S
23e60 65 6c 65 63 74 20 2a 70 58 3b 0a 20 20 73 71 6c  elect *pX;.  sql
23e70 69 74 65 33 20 2a 64 62 3b 0a 20 20 73 74 72 75  ite3 *db;.  stru
23e80 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
23e90 20 2a 61 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a   *a;.  SrcList *
23ea0 70 4e 65 77 53 72 63 3b 0a 20 20 50 61 72 73 65  pNewSrc;.  Parse
23eb0 20 2a 70 50 61 72 73 65 3b 0a 20 20 54 6f 6b 65   *pParse;.  Toke
23ec0 6e 20 64 75 6d 6d 79 3b 0a 0a 20 20 69 66 28 20  n dummy;..  if( 
23ed0 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20 72  p->pPrior==0 ) r
23ee0 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
23ef0 75 65 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72  ue;.  if( p->pOr
23f00 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74 75 72  derBy==0 ) retur
23f10 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
23f20 20 20 66 6f 72 28 70 58 3d 70 3b 20 70 58 20 26    for(pX=p; pX &
23f30 26 20 28 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c  & (pX->op==TK_AL
23f40 4c 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f  L || pX->op==TK_
23f50 53 45 4c 45 43 54 29 3b 20 70 58 3d 70 58 2d 3e  SELECT); pX=pX->
23f60 70 50 72 69 6f 72 29 7b 7d 0a 20 20 69 66 28 20  pPrior){}.  if( 
23f70 70 58 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57  pX==0 ) return W
23f80 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 61  RC_Continue;.  a
23f90 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e   = p->pOrderBy->
23fa0 61 3b 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 70 4f  a;.  for(i=p->pO
23fb0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2d 31 3b  rderBy->nExpr-1;
23fc0 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
23fd0 20 69 66 28 20 61 5b 69 5d 2e 70 45 78 70 72 2d   if( a[i].pExpr-
23fe0 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c  >flags & EP_Coll
23ff0 61 74 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  ate ) break;.  }
24000 0a 20 20 69 66 28 20 69 3c 30 20 29 20 72 65 74  .  if( i<0 ) ret
24010 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
24020 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65  ;..  /* If we re
24030 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20  ach this point, 
24040 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20 74  that means the t
24050 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73  ransformation is
24060 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 0a 20   required. */.. 
24070 20 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65   pParse = pWalke
24080 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64 62 20  r->pParse;.  db 
24090 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
240a0 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
240b0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
240c0 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a  izeof(*pNew) );.
240d0 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
240e0 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
240f0 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 75 6d 6d  ;.  memset(&dumm
24100 79 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 75 6d  y, 0, sizeof(dum
24110 6d 79 29 29 3b 0a 20 20 70 4e 65 77 53 72 63 20  my));.  pNewSrc 
24120 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
24130 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28 70  AppendFromTerm(p
24140 50 61 72 73 65 2c 30 2c 30 2c 30 2c 26 64 75 6d  Parse,0,0,0,&dum
24150 6d 79 2c 70 4e 65 77 2c 30 2c 30 29 3b 0a 20 20  my,pNew,0,0);.  
24160 69 66 28 20 70 4e 65 77 53 72 63 3d 3d 30 20 29  if( pNewSrc==0 )
24170 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
24180 74 3b 0a 20 20 2a 70 4e 65 77 20 3d 20 2a 70 3b  t;.  *pNew = *p;
24190 0a 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 4e 65  .  p->pSrc = pNe
241a0 77 53 72 63 3b 0a 20 20 70 2d 3e 70 45 4c 69 73  wSrc;.  p->pELis
241b0 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
241c0 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
241d0 2c 20 30 2c 20 73 71 6c 69 74 65 33 45 78 70 72  , 0, sqlite3Expr
241e0 28 64 62 2c 20 54 4b 5f 41 53 54 45 52 49 53 4b  (db, TK_ASTERISK
241f0 2c 20 30 29 29 3b 0a 20 20 70 2d 3e 6f 70 20 3d  , 0));.  p->op =
24200 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 70 2d   TK_SELECT;.  p-
24210 3e 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 70  >pWhere = 0;.  p
24220 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20  New->pGroupBy = 
24230 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69  0;.  pNew->pHavi
24240 6e 67 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  ng = 0;.  pNew->
24250 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
24260 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
24270 20 70 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20   p->pNext = 0;. 
24280 20 70 2d 3e 70 57 69 74 68 20 3d 20 30 3b 0a 20   p->pWith = 0;. 
24290 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20   p->selFlags &= 
242a0 7e 53 46 5f 43 6f 6d 70 6f 75 6e 64 3b 0a 20 20  ~SF_Compound;.  
242b0 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46  assert( (p->selF
242c0 6c 61 67 73 20 26 20 53 46 5f 43 6f 6e 76 65 72  lags & SF_Conver
242d0 74 65 64 29 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e  ted)==0 );.  p->
242e0 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 43  selFlags |= SF_C
242f0 6f 6e 76 65 72 74 65 64 3b 0a 20 20 61 73 73 65  onverted;.  asse
24300 72 74 28 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72  rt( pNew->pPrior
24310 21 3d 30 20 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  !=0 );.  pNew->p
24320 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70  Prior->pNext = p
24330 4e 65 77 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69  New;.  pNew->pLi
24340 6d 69 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  mit = 0;.  pNew-
24350 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >pOffset = 0;.  
24360 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
24370 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  nue;.}../*.** Ch
24380 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
24390 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  e FROM clause te
243a0 72 6d 20 70 46 72 6f 6d 20 68 61 73 20 74 61 62  rm pFrom has tab
243b0 6c 65 2d 76 61 6c 75 65 64 20 66 75 6e 63 74 69  le-valued functi
243c0 6f 6e 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 2e  on.** arguments.
243d0 20 20 49 66 20 69 74 20 64 6f 65 73 2c 20 6c 65    If it does, le
243e0 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
243f0 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 20 61  sage in pParse a
24400 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e  nd return.** non
24410 2d 7a 65 72 6f 2c 20 73 69 6e 63 65 20 70 46 72  -zero, since pFr
24420 6f 6d 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65  om is not allowe
24430 64 20 74 6f 20 62 65 20 61 20 74 61 62 6c 65 2d  d to be a table-
24440 76 61 6c 75 65 64 20 66 75 6e 63 74 69 6f 6e 2e  valued function.
24450 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
24460 61 6e 6e 6f 74 42 65 46 75 6e 63 74 69 6f 6e 28  annotBeFunction(
24470 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 73  Parse *pParse, s
24480 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
24490 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66  em *pFrom){.  if
244a0 28 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73 54 61  ( pFrom->fg.isTa
244b0 62 46 75 6e 63 20 29 7b 0a 20 20 20 20 73 71 6c  bFunc ){.    sql
244c0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
244d0 72 73 65 2c 20 22 27 25 73 27 20 69 73 20 6e 6f  rse, "'%s' is no
244e0 74 20 61 20 66 75 6e 63 74 69 6f 6e 22 2c 20 70  t a function", p
244f0 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  From->zName);.  
24500 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
24510 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23    return 0;.}..#
24520 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
24530 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 41 72 67  IT_CTE./*.** Arg
24540 75 6d 65 6e 74 20 70 57 69 74 68 20 28 77 68 69  ument pWith (whi
24550 63 68 20 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20  ch may be NULL) 
24560 70 6f 69 6e 74 73 20 74 6f 20 61 20 6c 69 6e 6b  points to a link
24570 65 64 20 6c 69 73 74 20 6f 66 20 6e 65 73 74 65  ed list of neste
24580 64 20 0a 2a 2a 20 57 49 54 48 20 63 6f 6e 74 65  d .** WITH conte
24590 78 74 73 2c 20 66 72 6f 6d 20 69 6e 6e 65 72 20  xts, from inner 
245a0 74 6f 20 6f 75 74 65 72 6d 6f 73 74 2e 20 49 66  to outermost. If
245b0 20 74 68 65 20 74 61 62 6c 65 20 69 64 65 6e 74   the table ident
245c0 69 66 69 65 64 20 62 79 20 0a 2a 2a 20 46 52 4f  ified by .** FRO
245d0 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74  M clause element
245e0 20 70 49 74 65 6d 20 69 73 20 72 65 61 6c 6c 79   pItem is really
245f0 20 61 20 63 6f 6d 6d 6f 6e 2d 74 61 62 6c 65 2d   a common-table-
24600 65 78 70 72 65 73 73 69 6f 6e 20 28 43 54 45 29  expression (CTE)
24610 20 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e   .** then return
24620 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
24630 65 20 43 54 45 20 64 65 66 69 6e 69 74 69 6f 6e  e CTE definition
24640 20 66 6f 72 20 74 68 61 74 20 74 61 62 6c 65 2e   for that table.
24650 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 72 65   Otherwise.** re
24660 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  turn NULL..**.**
24670 20 49 66 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76   If a non-NULL v
24680 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e 65 64  alue is returned
24690 2c 20 73 65 74 20 2a 70 70 43 6f 6e 74 65 78 74  , set *ppContext
246a0 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
246b0 20 57 69 74 68 0a 2a 2a 20 6f 62 6a 65 63 74 20   With.** object 
246c0 74 68 61 74 20 74 68 65 20 72 65 74 75 72 6e 65  that the returne
246d0 64 20 43 54 45 20 62 65 6c 6f 6e 67 73 20 74 6f  d CTE belongs to
246e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  ..*/.static stru
246f0 63 74 20 43 74 65 20 2a 73 65 61 72 63 68 57 69  ct Cte *searchWi
24700 74 68 28 0a 20 20 57 69 74 68 20 2a 70 57 69 74  th(.  With *pWit
24710 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
24720 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
24730 20 69 6e 6e 65 72 6d 6f 73 74 20 57 49 54 48 20   innermost WITH 
24740 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
24750 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
24760 2a 70 49 74 65 6d 2c 20 20 20 20 20 2f 2a 20 46  *pItem,     /* F
24770 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65  ROM clause eleme
24780 6e 74 20 74 6f 20 72 65 73 6f 6c 76 65 20 2a 2f  nt to resolve */
24790 0a 20 20 57 69 74 68 20 2a 2a 70 70 43 6f 6e 74  .  With **ppCont
247a0 65 78 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ext             
247b0 20 20 20 2f 2a 20 4f 55 54 3a 20 57 49 54 48 20     /* OUT: WITH 
247c0 63 6c 61 75 73 65 20 72 65 74 75 72 6e 20 76 61  clause return va
247d0 6c 75 65 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a  lue belongs to *
247e0 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  /.){.  const cha
247f0 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20  r *zName;.  if( 
24800 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  pItem->zDatabase
24810 3d 3d 30 20 26 26 20 28 7a 4e 61 6d 65 20 3d 20  ==0 && (zName = 
24820 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 21 3d 30  pItem->zName)!=0
24830 20 29 7b 0a 20 20 20 20 57 69 74 68 20 2a 70 3b   ){.    With *p;
24840 0a 20 20 20 20 66 6f 72 28 70 3d 70 57 69 74 68  .    for(p=pWith
24850 3b 20 70 3b 20 70 3d 70 2d 3e 70 4f 75 74 65 72  ; p; p=p->pOuter
24860 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
24870 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
24880 3c 70 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a  <p->nCte; i++){.
24890 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
248a0 74 65 33 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65  te3StrICmp(zName
248b0 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  , p->a[i].zName)
248c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
248d0 20 2a 70 70 43 6f 6e 74 65 78 74 20 3d 20 70 3b   *ppContext = p;
248e0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
248f0 6e 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  n &p->a[i];.    
24900 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
24910 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
24920 20 30 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f   0;.}../* The co
24930 64 65 20 67 65 6e 65 72 61 74 6f 72 20 6d 61 69  de generator mai
24940 6e 74 61 69 6e 73 20 61 20 73 74 61 63 6b 20 6f  ntains a stack o
24950 66 20 61 63 74 69 76 65 20 57 49 54 48 20 63 6c  f active WITH cl
24960 61 75 73 65 73 0a 2a 2a 20 77 69 74 68 20 74 68  auses.** with th
24970 65 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 57 49 54  e inner-most WIT
24980 48 20 63 6c 61 75 73 65 20 62 65 69 6e 67 20 61  H clause being a
24990 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65  t the top of the
249a0 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68   stack..**.** Th
249b0 69 73 20 72 6f 75 74 69 6e 65 20 70 75 73 68 65  is routine pushe
249c0 73 20 74 68 65 20 57 49 54 48 20 63 6c 61 75 73  s the WITH claus
249d0 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
249e0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a  second argument.
249f0 2a 2a 20 6f 6e 74 6f 20 74 68 65 20 74 6f 70 20  ** onto the top 
24a00 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 20 49 66  of the stack. If
24a10 20 61 72 67 75 6d 65 6e 74 20 62 46 72 65 65 20   argument bFree 
24a20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68  is true, then th
24a30 69 73 0a 2a 2a 20 57 49 54 48 20 63 6c 61 75 73  is.** WITH claus
24a40 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20  e will never be 
24a50 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20  popped from the 
24a60 73 74 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63  stack. In this c
24a70 61 73 65 20 69 74 0a 2a 2a 20 73 68 6f 75 6c 64  ase it.** should
24a80 20 62 65 20 66 72 65 65 64 20 61 6c 6f 6e 67 20   be freed along 
24a90 77 69 74 68 20 74 68 65 20 50 61 72 73 65 20 6f  with the Parse o
24aa0 62 6a 65 63 74 2e 20 49 6e 20 6f 74 68 65 72 20  bject. In other 
24ab0 63 61 73 65 73 2c 20 77 68 65 6e 0a 2a 2a 20 62  cases, when.** b
24ac0 46 72 65 65 3d 3d 30 2c 20 74 68 65 20 57 69 74  Free==0, the Wit
24ad0 68 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 62 65  h object will be
24ae0 20 66 72 65 65 64 20 61 6c 6f 6e 67 20 77 69 74   freed along wit
24af0 68 20 74 68 65 20 53 45 4c 45 43 54 20 0a 2a 2a  h the SELECT .**
24b00 20 73 74 61 74 65 6d 65 6e 74 20 77 69 74 68 20   statement with 
24b10 77 68 69 63 68 20 69 74 20 69 73 20 61 73 73 6f  which it is asso
24b20 63 69 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  ciated..*/.void 
24b30 73 71 6c 69 74 65 33 57 69 74 68 50 75 73 68 28  sqlite3WithPush(
24b40 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 57  Parse *pParse, W
24b50 69 74 68 20 2a 70 57 69 74 68 2c 20 75 38 20 62  ith *pWith, u8 b
24b60 46 72 65 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Free){.  assert(
24b70 20 62 46 72 65 65 3d 3d 30 20 7c 7c 20 28 70 50   bFree==0 || (pP
24b80 61 72 73 65 2d 3e 70 57 69 74 68 3d 3d 30 20 26  arse->pWith==0 &
24b90 26 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 54  & pParse->pWithT
24ba0 6f 46 72 65 65 3d 3d 30 29 20 29 3b 0a 20 20 69  oFree==0) );.  i
24bb0 66 28 20 70 57 69 74 68 20 29 7b 0a 20 20 20 20  f( pWith ){.    
24bc0 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
24bd0 70 57 69 74 68 21 3d 70 57 69 74 68 20 29 3b 0a  pWith!=pWith );.
24be0 20 20 20 20 70 57 69 74 68 2d 3e 70 4f 75 74 65      pWith->pOute
24bf0 72 20 3d 20 70 50 61 72 73 65 2d 3e 70 57 69 74  r = pParse->pWit
24c00 68 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70  h;.    pParse->p
24c10 57 69 74 68 20 3d 20 70 57 69 74 68 3b 0a 20 20  With = pWith;.  
24c20 20 20 69 66 28 20 62 46 72 65 65 20 29 20 70 50    if( bFree ) pP
24c30 61 72 73 65 2d 3e 70 57 69 74 68 54 6f 46 72 65  arse->pWithToFre
24c40 65 20 3d 20 70 57 69 74 68 3b 0a 20 20 7d 0a 7d  e = pWith;.  }.}
24c50 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
24c60 63 74 69 6f 6e 20 63 68 65 63 6b 73 20 69 66 20  ction checks if 
24c70 61 72 67 75 6d 65 6e 74 20 70 46 72 6f 6d 20 72  argument pFrom r
24c80 65 66 65 72 73 20 74 6f 20 61 20 43 54 45 20 64  efers to a CTE d
24c90 65 63 6c 61 72 65 64 20 62 79 20 0a 2a 2a 20 61  eclared by .** a
24ca0 20 57 49 54 48 20 63 6c 61 75 73 65 20 6f 6e 20   WITH clause on 
24cb0 74 68 65 20 73 74 61 63 6b 20 63 75 72 72 65 6e  the stack curren
24cc0 74 6c 79 20 6d 61 69 6e 74 61 69 6e 65 64 20 62  tly maintained b
24cd0 79 20 74 68 65 20 70 61 72 73 65 72 2e 20 41 6e  y the parser. An
24ce0 64 2c 0a 2a 2a 20 69 66 20 63 75 72 72 65 6e 74  d,.** if current
24cf0 6c 79 20 70 72 6f 63 65 73 73 69 6e 67 20 61 20  ly processing a 
24d00 43 54 45 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  CTE expression, 
24d10 69 66 20 69 74 20 69 73 20 61 20 72 65 63 75 72  if it is a recur
24d20 73 69 76 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63  sive.** referenc
24d30 65 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  e to the current
24d40 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70   CTE..**.** If p
24d50 46 72 6f 6d 20 66 61 6c 6c 73 20 69 6e 74 6f 20  From falls into 
24d60 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 74 77  either of the tw
24d70 6f 20 63 61 74 65 67 6f 72 69 65 73 20 61 62 6f  o categories abo
24d80 76 65 2c 20 70 46 72 6f 6d 2d 3e 70 54 61 62 0a  ve, pFrom->pTab.
24d90 2a 2a 20 61 6e 64 20 6f 74 68 65 72 20 66 69 65  ** and other fie
24da0 6c 64 73 20 61 72 65 20 70 6f 70 75 6c 61 74 65  lds are populate
24db0 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 54  d accordingly. T
24dc0 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64  he caller should
24dd0 20 63 68 65 63 6b 0a 2a 2a 20 28 70 46 72 6f 6d   check.** (pFrom
24de0 2d 3e 70 54 61 62 21 3d 30 29 20 74 6f 20 64 65  ->pTab!=0) to de
24df0 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20  termine whether 
24e00 6f 72 20 6e 6f 74 20 61 20 73 75 63 63 65 73 73  or not a success
24e10 66 75 6c 20 6d 61 74 63 68 0a 2a 2a 20 77 61 73  ful match.** was
24e20 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57 68   found..**.** Wh
24e30 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 6d  ether or not a m
24e40 61 74 63 68 20 69 73 20 66 6f 75 6e 64 2c 20 53  atch is found, S
24e50 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
24e60 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f 72  rned if no error
24e70 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 49 66 20 61  .** occurs. If a
24e80 6e 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63  n error does occ
24e90 75 72 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ur, an error mes
24ea0 73 61 67 65 20 69 73 20 73 74 6f 72 65 64 20 69  sage is stored i
24eb0 6e 20 74 68 65 0a 2a 2a 20 70 61 72 73 65 72 20  n the.** parser 
24ec0 61 6e 64 20 73 6f 6d 65 20 65 72 72 6f 72 20 63  and some error c
24ed0 6f 64 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53  ode other than S
24ee0 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
24ef0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
24f00 20 77 69 74 68 45 78 70 61 6e 64 28 0a 20 20 57   withExpand(.  W
24f10 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
24f20 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
24f30 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 0a 29 7b  t_item *pFrom.){
24f40 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
24f50 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72   = pWalker->pPar
24f60 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  se;.  sqlite3 *d
24f70 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
24f80 20 20 73 74 72 75 63 74 20 43 74 65 20 2a 70 43    struct Cte *pC
24f90 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
24fa0 20 20 2f 2a 20 4d 61 74 63 68 65 64 20 43 54 45    /* Matched CTE
24fb0 20 28 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 20   (or NULL if no 
24fc0 6d 61 74 63 68 29 20 2a 2f 0a 20 20 57 69 74 68  match) */.  With
24fd0 20 2a 70 57 69 74 68 3b 20 20 20 20 20 20 20 20   *pWith;        
24fe0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
24ff0 49 54 48 20 63 6c 61 75 73 65 20 74 68 61 74 20  ITH clause that 
25000 70 43 74 65 20 62 65 6c 6f 6e 67 73 20 74 6f 20  pCte belongs to 
25010 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  */..  assert( pF
25020 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a  rom->pTab==0 );.
25030 0a 20 20 70 43 74 65 20 3d 20 73 65 61 72 63 68  .  pCte = search
25040 57 69 74 68 28 70 50 61 72 73 65 2d 3e 70 57 69  With(pParse->pWi
25050 74 68 2c 20 70 46 72 6f 6d 2c 20 26 70 57 69 74  th, pFrom, &pWit
25060 68 29 3b 0a 20 20 69 66 28 20 70 43 74 65 20 29  h);.  if( pCte )
25070 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
25080 62 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  b;.    ExprList 
25090 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20 53 65 6c  *pEList;.    Sel
250a0 65 63 74 20 2a 70 53 65 6c 3b 0a 20 20 20 20 53  ect *pSel;.    S
250b0 65 6c 65 63 74 20 2a 70 4c 65 66 74 3b 20 20 20  elect *pLeft;   
250c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
250d0 4c 65 66 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54  Left-most SELECT
250e0 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
250f0 20 20 69 6e 74 20 62 4d 61 79 52 65 63 75 72 73    int bMayRecurs
25100 69 76 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ive;            
25110 2f 2a 20 54 72 75 65 20 69 66 20 63 6f 6d 70 6f  /* True if compo
25120 75 6e 64 20 6a 6f 69 6e 65 64 20 62 79 20 55 4e  und joined by UN
25130 49 4f 4e 20 5b 41 4c 4c 5d 20 2a 2f 0a 20 20 20  ION [ALL] */.   
25140 20 57 69 74 68 20 2a 70 53 61 76 65 64 57 69 74   With *pSavedWit
25150 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  h;             /
25160 2a 20 49 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  * Initial value 
25170 6f 66 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68  of pParse->pWith
25180 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70   */..    /* If p
25190 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 69 73 20  Cte->zCteErr is 
251a0 6e 6f 6e 2d 4e 55 4c 4c 20 61 74 20 74 68 69 73  non-NULL at this
251b0 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 74 68 69   point, then thi
251c0 73 20 69 73 20 61 6e 20 69 6c 6c 65 67 61 6c 0a  s is an illegal.
251d0 20 20 20 20 2a 2a 20 72 65 63 75 72 73 69 76 65      ** recursive
251e0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 43 54   reference to CT
251f0 45 20 70 43 74 65 2e 20 4c 65 61 76 65 20 61 6e  E pCte. Leave an
25200 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65   error in pParse
25210 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 20 20   and return.    
25220 2a 2a 20 65 61 72 6c 79 2e 20 49 66 20 70 43 74  ** early. If pCt
25230 65 2d 3e 7a 43 74 65 45 72 72 20 69 73 20 4e 55  e->zCteErr is NU
25240 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73  LL, then this is
25250 20 6e 6f 74 20 61 20 72 65 63 75 72 73 69 76 65   not a recursive
25260 20 72 65 66 65 72 65 6e 63 65 2e 0a 20 20 20 20   reference..    
25270 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  ** In this case,
25280 20 70 72 6f 63 65 65 64 2e 20 20 2a 2f 0a 20 20   proceed.  */.  
25290 20 20 69 66 28 20 70 43 74 65 2d 3e 7a 43 74 65    if( pCte->zCte
252a0 45 72 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Err ){.      sql
252b0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
252c0 72 73 65 2c 20 70 43 74 65 2d 3e 7a 43 74 65 45  rse, pCte->zCteE
252d0 72 72 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29  rr, pCte->zName)
252e0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
252f0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
25300 20 7d 0a 20 20 20 20 69 66 28 20 63 61 6e 6e 6f   }.    if( canno
25310 74 42 65 46 75 6e 63 74 69 6f 6e 28 70 50 61 72  tBeFunction(pPar
25320 73 65 2c 20 70 46 72 6f 6d 29 20 29 20 72 65 74  se, pFrom) ) ret
25330 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
25340 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ;..    assert( p
25350 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b  From->pTab==0 );
25360 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62  .    pFrom->pTab
25370 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65   = pTab = sqlite
25380 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
25390 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29  , sizeof(Table))
253a0 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d  ;.    if( pTab==
253b0 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41  0 ) return WRC_A
253c0 62 6f 72 74 3b 0a 20 20 20 20 70 54 61 62 2d 3e  bort;.    pTab->
253d0 6e 54 61 62 52 65 66 20 3d 20 31 3b 0a 20 20 20  nTabRef = 1;.   
253e0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73   pTab->zName = s
253f0 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
25400 62 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b  b, pCte->zName);
25410 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79  .    pTab->iPKey
25420 20 3d 20 2d 31 3b 0a 20 20 20 20 70 54 61 62 2d   = -1;.    pTab-
25430 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30  >nRowLogEst = 20
25440 30 3b 20 61 73 73 65 72 74 28 20 32 30 30 3d 3d  0; assert( 200==
25450 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30  sqlite3LogEst(10
25460 34 38 35 37 36 29 20 29 3b 0a 20 20 20 20 70 54  48576) );.    pT
25470 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20  ab->tabFlags |= 
25480 54 46 5f 45 70 68 65 6d 65 72 61 6c 20 7c 20 54  TF_Ephemeral | T
25490 46 5f 4e 6f 56 69 73 69 62 6c 65 52 6f 77 69 64  F_NoVisibleRowid
254a0 3b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65  ;.    pFrom->pSe
254b0 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65  lect = sqlite3Se
254c0 6c 65 63 74 44 75 70 28 64 62 2c 20 70 43 74 65  lectDup(db, pCte
254d0 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20  ->pSelect, 0);. 
254e0 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
254f0 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
25500 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
25510 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  PT;.    assert( 
25520 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 29  pFrom->pSelect )
25530 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
25540 69 66 20 74 68 69 73 20 69 73 20 61 20 72 65 63  if this is a rec
25550 75 72 73 69 76 65 20 43 54 45 2e 20 2a 2f 0a 20  ursive CTE. */. 
25560 20 20 20 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d     pSel = pFrom-
25570 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 62 4d  >pSelect;.    bM
25580 61 79 52 65 63 75 72 73 69 76 65 20 3d 20 28 20  ayRecursive = ( 
25590 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c  pSel->op==TK_ALL
255a0 20 7c 7c 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b   || pSel->op==TK
255b0 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 69 66  _UNION );.    if
255c0 28 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 20  ( bMayRecursive 
255d0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
255e0 20 20 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70        SrcList *p
255f0 53 72 63 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65  Src = pFrom->pSe
25600 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 20 20  lect->pSrc;.    
25610 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72    for(i=0; i<pSr
25620 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  c->nSrc; i++){. 
25630 20 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72         struct Sr
25640 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
25650 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69 5d 3b  m = &pSrc->a[i];
25660 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74  .        if( pIt
25670 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30  em->zDatabase==0
25680 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 49   .         && pI
25690 74 65 6d 2d 3e 7a 4e 61 6d 65 21 3d 30 20 0a 20  tem->zName!=0 . 
256a0 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73 71          && 0==sq
256b0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 49 74  lite3StrICmp(pIt
256c0 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 43 74 65 2d  em->zName, pCte-
256d0 3e 7a 4e 61 6d 65 29 0a 20 20 20 20 20 20 20 20  >zName).        
256e0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70    ){.          p
256f0 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61  Item->pTab = pTa
25700 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  b;.          pIt
25710 65 6d 2d 3e 66 67 2e 69 73 52 65 63 75 72 73 69  em->fg.isRecursi
25720 76 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ve = 1;.        
25730 20 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 2b    pTab->nTabRef+
25740 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 65  +;.          pSe
25750 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  l->selFlags |= S
25760 46 5f 52 65 63 75 72 73 69 76 65 3b 0a 20 20 20  F_Recursive;.   
25770 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
25780 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c     }..    /* Onl
25790 79 20 6f 6e 65 20 72 65 63 75 72 73 69 76 65 20  y one recursive 
257a0 72 65 66 65 72 65 6e 63 65 20 69 73 20 70 65 72  reference is per
257b0 6d 69 74 74 65 64 2e 20 2a 2f 20 0a 20 20 20 20  mitted. */ .    
257c0 69 66 28 20 70 54 61 62 2d 3e 6e 54 61 62 52 65  if( pTab->nTabRe
257d0 66 3e 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  f>2 ){.      sql
257e0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 0a 20 20  ite3ErrorMsg(.  
257f0 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20          pParse, 
25800 22 6d 75 6c 74 69 70 6c 65 20 72 65 66 65 72 65  "multiple refere
25810 6e 63 65 73 20 74 6f 20 72 65 63 75 72 73 69 76  nces to recursiv
25820 65 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 70 43  e table: %s", pC
25830 74 65 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20  te->zName.      
25840 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
25850 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
25860 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
25870 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 3d 3d 31  pTab->nTabRef==1
25880 20 7c 7c 20 28 28 70 53 65 6c 2d 3e 73 65 6c 46   || ((pSel->selF
25890 6c 61 67 73 26 53 46 5f 52 65 63 75 72 73 69 76  lags&SF_Recursiv
258a0 65 29 20 26 26 20 70 54 61 62 2d 3e 6e 54 61 62  e) && pTab->nTab
258b0 52 65 66 3d 3d 32 20 29 29 3b 0a 0a 20 20 20 20  Ref==2 ));..    
258c0 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20  pCte->zCteErr = 
258d0 22 63 69 72 63 75 6c 61 72 20 72 65 66 65 72 65  "circular refere
258e0 6e 63 65 3a 20 25 73 22 3b 0a 20 20 20 20 70 53  nce: %s";.    pS
258f0 61 76 65 64 57 69 74 68 20 3d 20 70 50 61 72 73  avedWith = pPars
25900 65 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20 70 50  e->pWith;.    pP
25910 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57  arse->pWith = pW
25920 69 74 68 3b 0a 20 20 20 20 69 66 28 20 62 4d 61  ith;.    if( bMa
25930 79 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20  yRecursive ){.  
25940 20 20 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69      Select *pPri
25950 6f 72 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f  or = pSel->pPrio
25960 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
25970 20 70 50 72 69 6f 72 2d 3e 70 57 69 74 68 3d 3d   pPrior->pWith==
25980 30 20 29 3b 0a 20 20 20 20 20 20 70 50 72 69 6f  0 );.      pPrio
25990 72 2d 3e 70 57 69 74 68 20 3d 20 70 53 65 6c 2d  r->pWith = pSel-
259a0 3e 70 57 69 74 68 3b 0a 20 20 20 20 20 20 73 71  >pWith;.      sq
259b0 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28  lite3WalkSelect(
259c0 70 57 61 6c 6b 65 72 2c 20 70 50 72 69 6f 72 29  pWalker, pPrior)
259d0 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e  ;.      pPrior->
259e0 70 57 69 74 68 20 3d 20 30 3b 0a 20 20 20 20 7d  pWith = 0;.    }
259f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
25a00 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57  te3WalkSelect(pW
25a10 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b 0a 20 20  alker, pSel);.  
25a20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e    }.    pParse->
25a30 70 57 69 74 68 20 3d 20 70 57 69 74 68 3b 0a 0a  pWith = pWith;..
25a40 20 20 20 20 66 6f 72 28 70 4c 65 66 74 3d 70 53      for(pLeft=pS
25a50 65 6c 3b 20 70 4c 65 66 74 2d 3e 70 50 72 69 6f  el; pLeft->pPrio
25a60 72 3b 20 70 4c 65 66 74 3d 70 4c 65 66 74 2d 3e  r; pLeft=pLeft->
25a70 70 50 72 69 6f 72 29 3b 0a 20 20 20 20 70 45 4c  pPrior);.    pEL
25a80 69 73 74 20 3d 20 70 4c 65 66 74 2d 3e 70 45 4c  ist = pLeft->pEL
25a90 69 73 74 3b 0a 20 20 20 20 69 66 28 20 70 43 74  ist;.    if( pCt
25aa0 65 2d 3e 70 43 6f 6c 73 20 29 7b 0a 20 20 20 20  e->pCols ){.    
25ab0 20 20 69 66 28 20 70 45 4c 69 73 74 20 26 26 20    if( pEList && 
25ac0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70  pEList->nExpr!=p
25ad0 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78 70  Cte->pCols->nExp
25ae0 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  r ){.        sql
25af0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
25b00 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 68  rse, "table %s h
25b10 61 73 20 25 64 20 76 61 6c 75 65 73 20 66 6f 72  as %d values for
25b20 20 25 64 20 63 6f 6c 75 6d 6e 73 22 2c 0a 20 20   %d columns",.  
25b30 20 20 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e            pCte->
25b40 7a 4e 61 6d 65 2c 20 70 45 4c 69 73 74 2d 3e 6e  zName, pEList->n
25b50 45 78 70 72 2c 20 70 43 74 65 2d 3e 70 43 6f 6c  Expr, pCte->pCol
25b60 73 2d 3e 6e 45 78 70 72 0a 20 20 20 20 20 20 20  s->nExpr.       
25b70 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72   );.        pPar
25b80 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 53 61 76  se->pWith = pSav
25b90 65 64 57 69 74 68 3b 0a 20 20 20 20 20 20 20 20  edWith;.        
25ba0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
25bb0 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
25bc0 20 20 20 70 45 4c 69 73 74 20 3d 20 70 43 74 65     pEList = pCte
25bd0 2d 3e 70 43 6f 6c 73 3b 0a 20 20 20 20 7d 0a 0a  ->pCols;.    }..
25be0 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d      sqlite3Colum
25bf0 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  nsFromExprList(p
25c00 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2c 20 26  Parse, pEList, &
25c10 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61  pTab->nCol, &pTa
25c20 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 69 66  b->aCol);.    if
25c30 28 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 20  ( bMayRecursive 
25c40 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 53 65  ){.      if( pSe
25c50 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  l->selFlags & SF
25c60 5f 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20  _Recursive ){.  
25c70 20 20 20 20 20 20 70 43 74 65 2d 3e 7a 43 74 65        pCte->zCte
25c80 45 72 72 20 3d 20 22 6d 75 6c 74 69 70 6c 65 20  Err = "multiple 
25c90 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65  recursive refere
25ca0 6e 63 65 73 3a 20 25 73 22 3b 0a 20 20 20 20 20  nces: %s";.     
25cb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
25cc0 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20  pCte->zCteErr = 
25cd0 22 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72  "recursive refer
25ce0 65 6e 63 65 20 69 6e 20 61 20 73 75 62 71 75 65  ence in a subque
25cf0 72 79 3a 20 25 73 22 3b 0a 20 20 20 20 20 20 7d  ry: %s";.      }
25d00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61  .      sqlite3Wa
25d10 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72  lkSelect(pWalker
25d20 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 7d 0a 20  , pSel);.    }. 
25d30 20 20 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72     pCte->zCteErr
25d40 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 72 73 65   = 0;.    pParse
25d50 2d 3e 70 57 69 74 68 20 3d 20 70 53 61 76 65 64  ->pWith = pSaved
25d60 57 69 74 68 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  With;.  }..  ret
25d70 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
25d80 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
25d90 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45   SQLITE_OMIT_CTE
25da0 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53 45  ./*.** If the SE
25db0 4c 45 43 54 20 70 61 73 73 65 64 20 61 73 20 74  LECT passed as t
25dc0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
25dd0 6e 74 20 68 61 73 20 61 6e 20 61 73 73 6f 63 69  nt has an associ
25de0 61 74 65 64 20 57 49 54 48 20 0a 2a 2a 20 63 6c  ated WITH .** cl
25df0 61 75 73 65 2c 20 70 6f 70 20 69 74 20 66 72 6f  ause, pop it fro
25e00 6d 20 74 68 65 20 73 74 61 63 6b 20 73 74 6f 72  m the stack stor
25e10 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  ed as part of th
25e20 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 2e 0a  e Parse object..
25e30 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
25e40 69 6f 6e 20 69 73 20 75 73 65 64 20 61 73 20 74  ion is used as t
25e50 68 65 20 78 53 65 6c 65 63 74 43 61 6c 6c 62 61  he xSelectCallba
25e60 63 6b 32 28 29 20 63 61 6c 6c 62 61 63 6b 20 62  ck2() callback b
25e70 79 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65  y.** sqlite3Sele
25e80 63 74 45 78 70 61 6e 64 28 29 20 77 68 65 6e 20  ctExpand() when 
25e90 77 61 6c 6b 69 6e 67 20 61 20 53 45 4c 45 43 54  walking a SELECT
25ea0 20 74 72 65 65 20 74 6f 20 72 65 73 6f 6c 76 65   tree to resolve
25eb0 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20   table.** names 
25ec0 61 6e 64 20 6f 74 68 65 72 20 46 52 4f 4d 20 63  and other FROM c
25ed0 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 73 2e 20  lause elements. 
25ee0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
25ef0 73 65 6c 65 63 74 50 6f 70 57 69 74 68 28 57 61  selectPopWith(Wa
25f00 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53  lker *pWalker, S
25f10 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72  elect *p){.  Par
25f20 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61  se *pParse = pWa
25f30 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20  lker->pParse;.  
25f40 69 66 28 20 70 50 61 72 73 65 2d 3e 70 57 69 74  if( pParse->pWit
25f50 68 20 26 26 20 70 2d 3e 70 50 72 69 6f 72 3d 3d  h && p->pPrior==
25f60 30 20 29 7b 0a 20 20 20 20 57 69 74 68 20 2a 70  0 ){.    With *p
25f70 57 69 74 68 20 3d 20 66 69 6e 64 52 69 67 68 74  With = findRight
25f80 6d 6f 73 74 28 70 29 2d 3e 70 57 69 74 68 3b 0a  most(p)->pWith;.
25f90 20 20 20 20 69 66 28 20 70 57 69 74 68 21 3d 30      if( pWith!=0
25fa0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
25fb0 28 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3d  ( pParse->pWith=
25fc0 3d 70 57 69 74 68 20 29 3b 0a 20 20 20 20 20 20  =pWith );.      
25fd0 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20  pParse->pWith = 
25fe0 70 57 69 74 68 2d 3e 70 4f 75 74 65 72 3b 0a 20  pWith->pOuter;. 
25ff0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65     }.  }.}.#else
26000 0a 23 64 65 66 69 6e 65 20 73 65 6c 65 63 74 50  .#define selectP
26010 6f 70 57 69 74 68 20 30 0a 23 65 6e 64 69 66 0a  opWith 0.#endif.
26020 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
26030 69 6e 65 20 69 73 20 61 20 57 61 6c 6b 65 72 20  ine is a Walker 
26040 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 22 65 78  callback for "ex
26050 70 61 6e 64 69 6e 67 22 20 61 20 53 45 4c 45 43  panding" a SELEC
26060 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  T statement..** 
26070 22 45 78 70 61 6e 64 69 6e 67 22 20 6d 65 61 6e  "Expanding" mean
26080 73 20 74 6f 20 64 6f 20 74 68 65 20 66 6f 6c 6c  s to do the foll
26090 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
260a0 28 31 29 20 20 4d 61 6b 65 20 73 75 72 65 20 56  (1)  Make sure V
260b0 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  DBE cursor numbe
260c0 72 73 20 68 61 76 65 20 62 65 65 6e 20 61 73 73  rs have been ass
260d0 69 67 6e 65 64 20 74 6f 20 65 76 65 72 79 0a 2a  igned to every.*
260e0 2a 20 20 20 20 20 20 20 20 20 65 6c 65 6d 65 6e  *         elemen
260f0 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  t of the FROM cl
26100 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  ause..**.**    (
26110 32 29 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20  2)  Fill in the 
26120 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54  pTabList->a[].pT
26130 61 62 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65  ab fields in the
26140 20 53 72 63 4c 69 73 74 20 74 68 61 74 20 0a 2a   SrcList that .*
26150 2a 20 20 20 20 20 20 20 20 20 64 65 66 69 6e 65  *         define
26160 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  s FROM clause.  
26170 57 68 65 6e 20 76 69 65 77 73 20 61 70 70 65 61  When views appea
26180 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  r in the FROM cl
26190 61 75 73 65 2c 0a 2a 2a 20 20 20 20 20 20 20 20  ause,.**        
261a0 20 66 69 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e   fill pTabList->
261b0 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77 69 74 68  a[].pSelect with
261c0 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53   a copy of the S
261d0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a  ELECT statement.
261e0 2a 2a 20 20 20 20 20 20 20 20 20 74 68 61 74 20  **         that 
261f0 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76  implements the v
26200 69 65 77 2e 20 20 41 20 63 6f 70 79 20 69 73 20  iew.  A copy is 
26210 6d 61 64 65 20 6f 66 20 74 68 65 20 76 69 65 77  made of the view
26220 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20  's SELECT.**    
26230 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74 20 73       statement s
26240 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 66 72  o that we can fr
26250 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f 72 20 64  eely modify or d
26260 65 6c 65 74 65 20 74 68 61 74 20 73 74 61 74 65  elete that state
26270 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  ment.**         
26280 77 69 74 68 6f 75 74 20 77 6f 72 72 79 69 6e 67  without worrying
26290 20 61 62 6f 75 74 20 6d 65 73 73 69 6e 67 20 75   about messing u
262a0 70 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  p the persistent
262b0 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a   representation.
262c0 2a 2a 20 20 20 20 20 20 20 20 20 6f 66 20 74 68  **         of th
262d0 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20  e view..**.**   
262e0 20 28 33 29 20 20 41 64 64 20 74 65 72 6d 73 20   (3)  Add terms 
262f0 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  to the WHERE cla
26300 75 73 65 20 74 6f 20 61 63 63 6f 6d 6d 6f 64 61  use to accommoda
26310 74 65 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b  te the NATURAL k
26320 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20  eyword.**       
26330 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20 74    on joins and t
26340 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  he ON and USING 
26350 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73 2e  clause of joins.
26360 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20 20 53  .**.**    (4)  S
26370 63 61 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20  can the list of 
26380 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72  columns in the r
26390 65 73 75 6c 74 20 73 65 74 20 28 70 45 4c 69 73  esult set (pELis
263a0 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20  t) looking.**   
263b0 20 20 20 20 20 20 66 6f 72 20 69 6e 73 74 61 6e        for instan
263c0 63 65 73 20 6f 66 20 74 68 65 20 22 2a 22 20 6f  ces of the "*" o
263d0 70 65 72 61 74 6f 72 20 6f 72 20 74 68 65 20 54  perator or the T
263e0 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72 2e  ABLE.* operator.
263f0 0a 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20 66  .**         If f
26400 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20 65 61 63  ound, expand eac
26410 68 20 22 2a 22 20 74 6f 20 62 65 20 65 76 65 72  h "*" to be ever
26420 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65 72  y column in ever
26430 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20  y table.**      
26440 20 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20 74     and TABLE.* t
26450 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d  o be every colum
26460 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a  n in TABLE..**.*
26470 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c  /.static int sel
26480 65 63 74 45 78 70 61 6e 64 65 72 28 57 61 6c 6b  ectExpander(Walk
26490 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c  er *pWalker, Sel
264a0 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65  ect *p){.  Parse
264b0 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b   *pParse = pWalk
264c0 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e  er->pParse;.  in
264d0 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20 53 72 63  t i, j, k;.  Src
264e0 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a  List *pTabList;.
264f0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
26500 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  st;.  struct Src
26510 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d  List_item *pFrom
26520 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
26530 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
26540 45 78 70 72 20 2a 70 45 2c 20 2a 70 52 69 67 68  Expr *pE, *pRigh
26550 74 2c 20 2a 70 45 78 70 72 3b 0a 20 20 75 31 36  t, *pExpr;.  u16
26560 20 73 65 6c 46 6c 61 67 73 20 3d 20 70 2d 3e 73   selFlags = p->s
26570 65 6c 46 6c 61 67 73 3b 0a 0a 20 20 70 2d 3e 73  elFlags;..  p->s
26580 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 45 78  elFlags |= SF_Ex
26590 70 61 6e 64 65 64 3b 0a 20 20 69 66 28 20 64 62  panded;.  if( db
265a0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 20  ->mallocFailed  
265b0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52  ){.    return WR
265c0 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 69  C_Abort;.  }.  i
265d0 66 28 20 4e 45 56 45 52 28 70 2d 3e 70 53 72 63  f( NEVER(p->pSrc
265e0 3d 3d 30 29 20 7c 7c 20 28 73 65 6c 46 6c 61 67  ==0) || (selFlag
265f0 73 20 26 20 53 46 5f 45 78 70 61 6e 64 65 64 29  s & SF_Expanded)
26600 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
26610 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d  n WRC_Prune;.  }
26620 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d  .  pTabList = p-
26630 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20  >pSrc;.  pEList 
26640 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69  = p->pEList;.  i
26650 66 28 20 70 2d 3e 70 57 69 74 68 20 29 7b 0a 20  f( p->pWith ){. 
26660 20 20 20 73 71 6c 69 74 65 33 57 69 74 68 50 75     sqlite3WithPu
26670 73 68 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 57  sh(pParse, p->pW
26680 69 74 68 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  ith, 0);.  }..  
26690 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 63 75 72  /* Make sure cur
266a0 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65  sor numbers have
266b0 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74   been assigned t
266c0 6f 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e  o all entries in
266d0 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63  .  ** the FROM c
266e0 6c 61 75 73 65 20 6f 66 20 74 68 65 20 53 45 4c  lause of the SEL
266f0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20  ECT statement.. 
26700 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 72 63   */.  sqlite3Src
26710 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72  ListAssignCursor
26720 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  s(pParse, pTabLi
26730 73 74 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20  st);..  /* Look 
26740 75 70 20 65 76 65 72 79 20 74 61 62 6c 65 20 6e  up every table n
26750 61 6d 65 64 20 69 6e 20 74 68 65 20 46 52 4f 4d  amed in the FROM
26760 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73   clause of the s
26770 65 6c 65 63 74 2e 20 20 49 66 0a 20 20 2a 2a 20  elect.  If.  ** 
26780 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20  an entry of the 
26790 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 61  FROM clause is a
267a0 20 73 75 62 71 75 65 72 79 20 69 6e 73 74 65 61   subquery instea
267b0 64 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20  d of a table or 
267c0 76 69 65 77 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  view,.  ** then 
267d0 63 72 65 61 74 65 20 61 20 74 72 61 6e 73 69 65  create a transie
267e0 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74 75  nt table structu
267f0 72 65 20 74 6f 20 64 65 73 63 72 69 62 65 20 74  re to describe t
26800 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20 2a  he subquery..  *
26810 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72  /.  for(i=0, pFr
26820 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20  om=pTabList->a; 
26830 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
26840 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b  ; i++, pFrom++){
26850 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
26860 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  ;.    assert( pF
26870 72 6f 6d 2d 3e 66 67 2e 69 73 52 65 63 75 72 73  rom->fg.isRecurs
26880 69 76 65 3d 3d 30 20 7c 7c 20 70 46 72 6f 6d 2d  ive==0 || pFrom-
26890 3e 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20  >pTab!=0 );.    
268a0 69 66 28 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73  if( pFrom->fg.is
268b0 52 65 63 75 72 73 69 76 65 20 29 20 63 6f 6e 74  Recursive ) cont
268c0 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74  inue;.    assert
268d0 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30  ( pFrom->pTab==0
268e0 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   );.#ifndef SQLI
268f0 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20  TE_OMIT_CTE.    
26900 69 66 28 20 77 69 74 68 45 78 70 61 6e 64 28 70  if( withExpand(p
26910 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 29 20 29  Walker, pFrom) )
26920 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
26930 74 3b 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d  t;.    if( pFrom
26940 2d 3e 70 54 61 62 20 29 20 7b 7d 20 65 6c 73 65  ->pTab ) {} else
26950 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
26960 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20  pFrom->zName==0 
26970 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
26980 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
26990 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53        Select *pS
269a0 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  el = pFrom->pSel
269b0 65 63 74 3b 0a 20 20 20 20 20 20 2f 2a 20 41 20  ect;.      /* A 
269c0 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65  sub-query in the
269d0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
269e0 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20  a SELECT */.    
269f0 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 21 3d    assert( pSel!=
26a00 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
26a10 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d  t( pFrom->pTab==
26a20 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  0 );.      if( s
26a30 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
26a40 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 20  (pWalker, pSel) 
26a50 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
26a60 72 74 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d  rt;.      pFrom-
26a70 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 73  >pTab = pTab = s
26a80 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
26a90 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61  ro(db, sizeof(Ta
26aa0 62 6c 65 29 29 3b 0a 20 20 20 20 20 20 69 66 28  ble));.      if(
26ab0 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72   pTab==0 ) retur
26ac0 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
26ad0 20 20 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66     pTab->nTabRef
26ae0 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 54 61 62   = 1;.      pTab
26af0 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
26b00 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 73 71  3MPrintf(db, "sq
26b10 6c 69 74 65 5f 73 71 5f 25 70 22 2c 20 28 76 6f  lite_sq_%p", (vo
26b20 69 64 2a 29 70 54 61 62 29 3b 0a 20 20 20 20 20  id*)pTab);.     
26b30 20 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50   while( pSel->pP
26b40 72 69 6f 72 20 29 7b 20 70 53 65 6c 20 3d 20 70  rior ){ pSel = p
26b50 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 20 7d 0a 20  Sel->pPrior; }. 
26b60 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75       sqlite3Colu
26b70 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  mnsFromExprList(
26b80 70 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70 45  pParse, pSel->pE
26b90 4c 69 73 74 2c 26 70 54 61 62 2d 3e 6e 43 6f 6c  List,&pTab->nCol
26ba0 2c 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20  ,&pTab->aCol);. 
26bb0 20 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79       pTab->iPKey
26bc0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 54 61   = -1;.      pTa
26bd0 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20  b->nRowLogEst = 
26be0 32 30 30 3b 20 61 73 73 65 72 74 28 20 32 30 30  200; assert( 200
26bf0 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
26c00 31 30 34 38 35 37 36 29 20 29 3b 0a 20 20 20 20  1048576) );.    
26c10 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73    pTab->tabFlags
26c20 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65 72 61 6c   |= TF_Ephemeral
26c30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c  ;.#endif.    }el
26c40 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20  se{.      /* An 
26c50 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65 20 6f  ordinary table o
26c60 72 20 76 69 65 77 20 6e 61 6d 65 20 69 6e 20 74  r view name in t
26c70 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
26c80 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
26c90 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29  pFrom->pTab==0 )
26ca0 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70  ;.      pFrom->p
26cb0 54 61 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c  Tab = pTab = sql
26cc0 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 49  ite3LocateTableI
26cd0 74 65 6d 28 70 50 61 72 73 65 2c 20 30 2c 20 70  tem(pParse, 0, p
26ce0 46 72 6f 6d 29 3b 0a 20 20 20 20 20 20 69 66 28  From);.      if(
26cf0 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72   pTab==0 ) retur
26d00 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
26d10 20 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 54 61     if( pTab->nTa
26d20 62 52 65 66 3e 3d 30 78 66 66 66 66 20 29 7b 0a  bRef>=0xffff ){.
26d30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
26d40 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
26d50 22 74 6f 6f 20 6d 61 6e 79 20 72 65 66 65 72 65  "too many refere
26d60 6e 63 65 73 20 74 6f 20 5c 22 25 73 5c 22 3a 20  nces to \"%s\": 
26d70 6d 61 78 20 36 35 35 33 35 22 2c 0a 20 20 20 20  max 65535",.    
26d80 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61         pTab->zNa
26d90 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70 46 72  me);.        pFr
26da0 6f 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20  om->pTab = 0;.  
26db0 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
26dc0 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a  _Abort;.      }.
26dd0 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 54 61 62        pTab->nTab
26de0 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  Ref++;.      if(
26df0 20 21 49 73 56 69 72 74 75 61 6c 28 70 54 61 62   !IsVirtual(pTab
26e00 29 20 26 26 20 63 61 6e 6e 6f 74 42 65 46 75 6e  ) && cannotBeFun
26e10 63 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 46  ction(pParse, pF
26e20 72 6f 6d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  rom) ){.        
26e30 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
26e40 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 21 64  ;.      }.#if !d
26e50 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
26e60 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66  IT_VIEW) || !def
26e70 69 6e 65 64 20 28 53 51 4c 49 54 45 5f 4f 4d 49  ined (SQLITE_OMI
26e80 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a  T_VIRTUALTABLE).
26e90 20 20 20 20 20 20 69 66 28 20 49 73 56 69 72 74        if( IsVirt
26ea0 75 61 6c 28 70 54 61 62 29 20 7c 7c 20 70 54 61  ual(pTab) || pTa
26eb0 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
26ec0 20 20 20 20 20 20 69 31 36 20 6e 43 6f 6c 3b 0a        i16 nCol;.
26ed0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
26ee0 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e  te3ViewGetColumn
26ef0 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54  Names(pParse, pT
26f00 61 62 29 20 29 20 72 65 74 75 72 6e 20 57 52 43  ab) ) return WRC
26f10 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 20 20  _Abort;.        
26f20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
26f30 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a 20 20 20  Select==0 );.   
26f40 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c       pFrom->pSel
26f50 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
26f60 65 63 74 44 75 70 28 64 62 2c 20 70 54 61 62 2d  ectDup(db, pTab-
26f70 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20  >pSelect, 0);.  
26f80 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
26f90 65 63 74 53 65 74 4e 61 6d 65 28 70 46 72 6f 6d  ectSetName(pFrom
26fa0 2d 3e 70 53 65 6c 65 63 74 2c 20 70 54 61 62 2d  ->pSelect, pTab-
26fb0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  >zName);.       
26fc0 20 6e 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e 43   nCol = pTab->nC
26fd0 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62  ol;.        pTab
26fe0 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20  ->nCol = -1;.   
26ff0 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b       sqlite3Walk
27000 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20  Select(pWalker, 
27010 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29 3b  pFrom->pSelect);
27020 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e  .        pTab->n
27030 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20  Col = nCol;.    
27040 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
27050 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 61 74 65 20  ..    /* Locate 
27060 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 64 20  the index named 
27070 62 79 20 74 68 65 20 49 4e 44 45 58 45 44 20 42  by the INDEXED B
27080 59 20 63 6c 61 75 73 65 2c 20 69 66 20 61 6e 79  Y clause, if any
27090 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c  . */.    if( sql
270a0 69 74 65 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f  ite3IndexedByLoo
270b0 6b 75 70 28 70 50 61 72 73 65 2c 20 70 46 72 6f  kup(pParse, pFro
270c0 6d 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  m) ){.      retu
270d0 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
270e0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72    }.  }..  /* Pr
270f0 6f 63 65 73 73 20 4e 41 54 55 52 41 4c 20 6b 65  ocess NATURAL ke
27100 79 77 6f 72 64 73 2c 20 61 6e 64 20 4f 4e 20 61  ywords, and ON a
27110 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
27120 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a   of joins..  */.
27130 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
27140 46 61 69 6c 65 64 20 7c 7c 20 73 71 6c 69 74 65  Failed || sqlite
27150 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70 50 61 72  ProcessJoin(pPar
27160 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 72 65  se, p) ){.    re
27170 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
27180 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 76    }..  /* For ev
27190 65 72 79 20 22 2a 22 20 74 68 61 74 20 6f 63 63  ery "*" that occ
271a0 75 72 73 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d  urs in the colum
271b0 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72 74 20 74  n list, insert t
271c0 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20 20 2a 2a  he names of.  **
271d0 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   all columns in 
271e0 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20 41 6e 64  all tables.  And
271f0 20 66 6f 72 20 65 76 65 72 79 20 54 41 42 4c 45   for every TABLE
27200 2e 2a 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61  .* insert the na
27210 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c 20  mes.  ** of all 
27220 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41 42 4c 45  columns in TABLE
27230 2e 20 20 54 68 65 20 70 61 72 73 65 72 20 69 6e  .  The parser in
27240 73 65 72 74 65 64 20 61 20 73 70 65 63 69 61 6c  serted a special
27250 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a   expression.  **
27260 20 77 69 74 68 20 74 68 65 20 54 4b 5f 41 53 54   with the TK_AST
27270 45 52 49 53 4b 20 6f 70 65 72 61 74 6f 72 20 66  ERISK operator f
27280 6f 72 20 65 61 63 68 20 22 2a 22 20 74 68 61 74  or each "*" that
27290 20 69 74 20 66 6f 75 6e 64 20 69 6e 20 74 68 65   it found in the
272a0 20 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20 6c 69 73   column.  ** lis
272b0 74 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  t.  The followin
272c0 67 20 63 6f 64 65 20 6a 75 73 74 20 68 61 73 20  g code just has 
272d0 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 54 4b  to locate the TK
272e0 5f 41 53 54 45 52 49 53 4b 0a 20 20 2a 2a 20 65  _ASTERISK.  ** e
272f0 78 70 72 65 73 73 69 6f 6e 73 20 61 6e 64 20 65  xpressions and e
27300 78 70 61 6e 64 20 65 61 63 68 20 6f 6e 65 20 74  xpand each one t
27310 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c  o the list of al
27320 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 0a 20 20 2a  l columns in.  *
27330 2a 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a 20 20  * all tables..  
27340 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73  **.  ** The firs
27350 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63 68 65 63  t loop just chec
27360 6b 73 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ks to see if the
27370 72 65 20 61 72 65 20 61 6e 79 20 22 2a 22 20 6f  re are any "*" o
27380 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a 20 74 68  perators.  ** th
27390 61 74 20 6e 65 65 64 20 65 78 70 61 6e 64 69 6e  at need expandin
273a0 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d  g..  */.  for(k=
273b0 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; k<pEList->nEx
273c0 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 70 45  pr; k++){.    pE
273d0 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e   = pEList->a[k].
273e0 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70  pExpr;.    if( p
273f0 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 53 54 45 52 49  E->op==TK_ASTERI
27400 53 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  SK ) break;.    
27410 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d  assert( pE->op!=
27420 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52  TK_DOT || pE->pR
27430 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20 20 61  ight!=0 );.    a
27440 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54  ssert( pE->op!=T
27450 4b 5f 44 4f 54 20 7c 7c 20 28 70 45 2d 3e 70 4c  K_DOT || (pE->pL
27460 65 66 74 21 3d 30 20 26 26 20 70 45 2d 3e 70 4c  eft!=0 && pE->pL
27470 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 29 20  eft->op==TK_ID) 
27480 29 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f  );.    if( pE->o
27490 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d  p==TK_DOT && pE-
274a0 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f  >pRight->op==TK_
274b0 41 53 54 45 52 49 53 4b 20 29 20 62 72 65 61 6b  ASTERISK ) break
274c0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6b 3c 70 45  ;.  }.  if( k<pE
274d0 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
274e0 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20     /*.    ** If 
274f0 77 65 20 67 65 74 20 68 65 72 65 20 69 74 20 6d  we get here it m
27500 65 61 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20  eans the result 
27510 73 65 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  set contains one
27520 20 6f 72 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20   or more "*".   
27530 20 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20 74 68   ** operators th
27540 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78  at need to be ex
27550 70 61 6e 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68  panded.  Loop th
27560 72 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65  rough each expre
27570 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20  ssion.    ** in 
27580 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61  the result set a
27590 6e 64 20 65 78 70 61 6e 64 20 74 68 65 6d 20 6f  nd expand them o
275a0 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a  ne by one..    *
275b0 2f 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  /.    struct Exp
275c0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20  rList_item *a = 
275d0 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45  pEList->a;.    E
275e0 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20  xprList *pNew = 
275f0 30 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73  0;.    int flags
27600 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66   = pParse->db->f
27610 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74 20 6c 6f  lags;.    int lo
27620 6e 67 4e 61 6d 65 73 20 3d 20 28 66 6c 61 67 73  ngNames = (flags
27630 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f   & SQLITE_FullCo
27640 6c 4e 61 6d 65 73 29 21 3d 30 0a 20 20 20 20 20  lNames)!=0.     
27650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27660 20 26 26 20 28 66 6c 61 67 73 20 26 20 53 51 4c   && (flags & SQL
27670 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65  ITE_ShortColName
27680 73 29 3d 3d 30 3b 0a 0a 20 20 20 20 66 6f 72 28  s)==0;..    for(
27690 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e  k=0; k<pEList->n
276a0 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  Expr; k++){.    
276b0 20 20 70 45 20 3d 20 61 5b 6b 5d 2e 70 45 78 70    pE = a[k].pExp
276c0 72 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74 20  r;.      pRight 
276d0 3d 20 70 45 2d 3e 70 52 69 67 68 74 3b 0a 20 20  = pE->pRight;.  
276e0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e      assert( pE->
276f0 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 52  op!=TK_DOT || pR
27700 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20 20 20  ight!=0 );.     
27710 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f   if( pE->op!=TK_
27720 41 53 54 45 52 49 53 4b 0a 20 20 20 20 20 20 20  ASTERISK.       
27730 26 26 20 28 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44  && (pE->op!=TK_D
27740 4f 54 20 7c 7c 20 70 52 69 67 68 74 2d 3e 6f 70  OT || pRight->op
27750 21 3d 54 4b 5f 41 53 54 45 52 49 53 4b 29 0a 20  !=TK_ASTERISK). 
27760 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
27770 2f 2a 20 54 68 69 73 20 70 61 72 74 69 63 75 6c  /* This particul
27780 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20 64 6f  ar expression do
27790 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
277a0 65 20 65 78 70 61 6e 64 65 64 2e 0a 20 20 20 20  e expanded..    
277b0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70      */.        p
277c0 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
277d0 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
277e0 73 65 2c 20 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70  se, pNew, a[k].p
277f0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69  Expr);.        i
27800 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20  f( pNew ){.     
27810 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65       pNew->a[pNe
27820 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d  w->nExpr-1].zNam
27830 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a  e = a[k].zName;.
27840 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
27850 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d  a[pNew->nExpr-1]
27860 2e 7a 53 70 61 6e 20 3d 20 61 5b 6b 5d 2e 7a 53  .zSpan = a[k].zS
27870 70 61 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 61  pan;.          a
27880 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20  [k].zName = 0;. 
27890 20 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 53           a[k].zS
278a0 70 61 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  pan = 0;.       
278b0 20 7d 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e   }.        a[k].
278c0 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20 20  pExpr = 0;.     
278d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
278e0 2f 2a 20 54 68 69 73 20 65 78 70 72 65 73 73 69  /* This expressi
278f0 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f 72 20 61  on is a "*" or a
27900 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20 6e   "TABLE.*" and n
27910 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 20  eeds to be.     
27920 20 20 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e 20     ** expanded. 
27930 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74  */.        int t
27940 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20 20  ableSeen = 0;   
27950 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 77     /* Set to 1 w
27960 68 65 6e 20 54 41 42 4c 45 20 6d 61 74 63 68 65  hen TABLE matche
27970 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61  s */.        cha
27980 72 20 2a 7a 54 4e 61 6d 65 20 3d 20 30 3b 20 20  r *zTName = 0;  
27990 20 20 20 20 20 2f 2a 20 74 65 78 74 20 6f 66 20       /* text of 
279a0 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a 2f  name of TABLE */
279b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45 2d  .        if( pE-
279c0 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20  >op==TK_DOT ){. 
279d0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
279e0 20 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20 29 3b   pE->pLeft!=0 );
279f0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
27a00 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
27a10 72 74 79 28 70 45 2d 3e 70 4c 65 66 74 2c 20 45  rty(pE->pLeft, E
27a20 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
27a30 20 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 20           zTName 
27a40 3d 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 75 2e 7a  = pE->pLeft->u.z
27a50 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 7d  Token;.        }
27a60 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
27a70 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74  , pFrom=pTabList
27a80 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  ->a; i<pTabList-
27a90 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f  >nSrc; i++, pFro
27aa0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
27ab0 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46  Table *pTab = pF
27ac0 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  rom->pTab;.     
27ad0 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75       Select *pSu
27ae0 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  b = pFrom->pSele
27af0 63 74 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68  ct;.          ch
27b00 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70  ar *zTabName = p
27b10 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20  From->zAlias;.  
27b20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
27b30 61 72 20 2a 7a 53 63 68 65 6d 61 4e 61 6d 65 20  ar *zSchemaName 
27b40 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69  = 0;.          i
27b50 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20  nt iDb;.        
27b60 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d    if( zTabName==
27b70 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
27b80 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54 61 62   zTabName = pTab
27b90 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ->zName;.       
27ba0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
27bb0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
27bc0 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  led ) break;.   
27bd0 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62 3d         if( pSub=
27be0 3d 30 20 7c 7c 20 28 70 53 75 62 2d 3e 73 65 6c  =0 || (pSub->sel
27bf0 46 6c 61 67 73 20 26 20 53 46 5f 4e 65 73 74 65  Flags & SF_Neste
27c00 64 46 72 6f 6d 29 3d 3d 30 20 29 7b 0a 20 20 20  dFrom)==0 ){.   
27c10 20 20 20 20 20 20 20 20 20 70 53 75 62 20 3d 20           pSub = 
27c20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  0;.            i
27c30 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 73 71 6c  f( zTName && sql
27c40 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 4e 61  ite3StrICmp(zTNa
27c50 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 29 21 3d 30  me, zTabName)!=0
27c60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
27c70 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
27c80 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27c90 20 20 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69        iDb = sqli
27ca0 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
27cb0 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  (db, pTab->pSche
27cc0 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ma);.           
27cd0 20 7a 53 63 68 65 6d 61 4e 61 6d 65 20 3d 20 69   zSchemaName = i
27ce0 44 62 3e 3d 30 20 3f 20 64 62 2d 3e 61 44 62 5b  Db>=0 ? db->aDb[
27cf0 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 20 3a 20  iDb].zDbSName : 
27d00 22 2a 22 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  "*";.          }
27d10 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a  .          for(j
27d20 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c  =0; j<pTab->nCol
27d30 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
27d40 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
27d50 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  = pTab->aCol[j].
27d60 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  zName;.         
27d70 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6e 61 6d     char *zColnam
27d80 65 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 75  e;  /* The compu
27d90 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  ted column name 
27da0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  */.            c
27db0 68 61 72 20 2a 7a 54 6f 46 72 65 65 3b 20 20 20  har *zToFree;   
27dc0 2f 2a 20 4d 61 6c 6c 6f 63 65 64 20 73 74 72 69  /* Malloced stri
27dd0 6e 67 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f  ng that needs to
27de0 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20   be freed */.   
27df0 20 20 20 20 20 20 20 20 20 54 6f 6b 65 6e 20 73           Token s
27e00 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 43 6f 6d  Colname;  /* Com
27e10 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d  puted column nam
27e20 65 20 61 73 20 61 20 74 6f 6b 65 6e 20 2a 2f 0a  e as a token */.
27e30 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
27e40 65 72 74 28 20 7a 4e 61 6d 65 20 29 3b 0a 20 20  ert( zName );.  
27e50 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54            if( zT
27e60 4e 61 6d 65 20 26 26 20 70 53 75 62 0a 20 20 20  Name && pSub.   
27e70 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c            && sql
27e80 69 74 65 33 4d 61 74 63 68 53 70 61 6e 4e 61 6d  ite3MatchSpanNam
27e90 65 28 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e  e(pSub->pEList->
27ea0 61 5b 6a 5d 2e 7a 53 70 61 6e 2c 20 30 2c 20 7a  a[j].zSpan, 0, z
27eb0 54 4e 61 6d 65 2c 20 30 29 3d 3d 30 0a 20 20 20  TName, 0)==0.   
27ec0 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
27ed0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
27ee0 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
27ef0 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  }..            /
27f00 2a 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20 69 73  * If a column is
27f10 20 6d 61 72 6b 65 64 20 61 73 20 27 68 69 64 64   marked as 'hidd
27f20 65 6e 27 2c 20 6f 6d 69 74 20 69 74 20 66 72 6f  en', omit it fro
27f30 6d 20 74 68 65 20 65 78 70 61 6e 64 65 64 0a 20  m the expanded. 
27f40 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 65             ** re
27f50 73 75 6c 74 2d 73 65 74 20 6c 69 73 74 20 75 6e  sult-set list un
27f60 6c 65 73 73 20 74 68 65 20 53 45 4c 45 43 54 20  less the SELECT 
27f70 68 61 73 20 74 68 65 20 53 46 5f 49 6e 63 6c 75  has the SF_Inclu
27f80 64 65 48 69 64 64 65 6e 0a 20 20 20 20 20 20 20  deHidden.       
27f90 20 20 20 20 20 2a 2a 20 62 69 74 20 73 65 74 2e       ** bit set.
27fa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  .            */.
27fb0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
27fc0 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
27fd0 46 5f 49 6e 63 6c 75 64 65 48 69 64 64 65 6e 29  F_IncludeHidden)
27fe0 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  ==0.            
27ff0 20 26 26 20 49 73 48 69 64 64 65 6e 43 6f 6c 75   && IsHiddenColu
28000 6d 6e 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  mn(&pTab->aCol[j
28010 5d 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]) .            
28020 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
28030 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
28040 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
28050 20 20 20 20 20 74 61 62 6c 65 53 65 65 6e 20 3d       tableSeen =
28060 20 31 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20   1;..           
28070 20 69 66 28 20 69 3e 30 20 26 26 20 7a 54 4e 61   if( i>0 && zTNa
28080 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  me==0 ){.       
28090 20 20 20 20 20 20 20 69 66 28 20 28 70 46 72 6f         if( (pFro
280a0 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26  m->fg.jointype &
280b0 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21 3d 30 0a   JT_NATURAL)!=0.
280c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
280d0 26 26 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d  && tableAndColum
280e0 6e 49 6e 64 65 78 28 70 54 61 62 4c 69 73 74 2c  nIndex(pTabList,
280f0 20 69 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 30 29   i, zName, 0, 0)
28100 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29  .              )
28110 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
28120 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55 52 41    /* In a NATURA
28130 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74 68 65  L join, omit the
28140 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20 66 72   join columns fr
28150 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20 20 20  om the .        
28160 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65          ** table
28170 20 74 6f 20 74 68 65 20 72 69 67 68 74 20 6f 66   to the right of
28180 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 20   the join */.   
28190 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
281a0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
281b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
281c0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
281d0 49 64 4c 69 73 74 49 6e 64 65 78 28 70 46 72 6f  IdListIndex(pFro
281e0 6d 2d 3e 70 55 73 69 6e 67 2c 20 7a 4e 61 6d 65  m->pUsing, zName
281f0 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )>=0 ){.        
28200 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20          /* In a 
28210 6a 6f 69 6e 20 77 69 74 68 20 61 20 55 53 49 4e  join with a USIN
28220 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69 74 20 63  G clause, omit c
28230 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a 20 20  olumns in the.  
28240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
28250 20 75 73 69 6e 67 20 63 6c 61 75 73 65 20 66 72   using clause fr
28260 6f 6d 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20  om the table on 
28270 74 68 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20  the right. */.  
28280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
28290 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
282a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
282b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
282c0 20 20 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74    pRight = sqlit
282d0 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44  e3Expr(db, TK_ID
282e0 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
282f0 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d        zColname =
28300 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20   zName;.        
28310 20 20 20 20 7a 54 6f 46 72 65 65 20 3d 20 30 3b      zToFree = 0;
28320 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
28330 20 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c 20 70 54   longNames || pT
28340 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 20 29  abList->nSrc>1 )
28350 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
28360 45 78 70 72 20 2a 70 4c 65 66 74 3b 0a 20 20 20  Expr *pLeft;.   
28370 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 66 74             pLeft
28380 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64   = sqlite3Expr(d
28390 62 2c 20 54 4b 5f 49 44 2c 20 7a 54 61 62 4e 61  b, TK_ID, zTabNa
283a0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
283b0 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74     pExpr = sqlit
283c0 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
283d0 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70  TK_DOT, pLeft, p
283e0 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20  Right);.        
283f0 20 20 20 20 20 20 69 66 28 20 7a 53 63 68 65 6d        if( zSchem
28400 61 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  aName ){.       
28410 20 20 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d           pLeft =
28420 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
28430 20 54 4b 5f 49 44 2c 20 7a 53 63 68 65 6d 61 4e   TK_ID, zSchemaN
28440 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
28450 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71        pExpr = sq
28460 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
28470 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74  e, TK_DOT, pLeft
28480 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
28490 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
284a0 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67          if( long
284b0 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20  Names ){.       
284c0 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d           zColnam
284d0 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
284e0 74 66 28 64 62 2c 20 22 25 73 2e 25 73 22 2c 20  tf(db, "%s.%s", 
284f0 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29  zTabName, zName)
28500 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
28510 20 20 7a 54 6f 46 72 65 65 20 3d 20 7a 43 6f 6c    zToFree = zCol
28520 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  name;.          
28530 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
28540 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
28550 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70         pExpr = p
28560 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20  Right;.         
28570 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
28580 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45   pNew = sqlite3E
28590 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
285a0 61 72 73 65 2c 20 70 4e 65 77 2c 20 70 45 78 70  arse, pNew, pExp
285b0 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r);.            
285c0 73 71 6c 69 74 65 33 54 6f 6b 65 6e 49 6e 69 74  sqlite3TokenInit
285d0 28 26 73 43 6f 6c 6e 61 6d 65 2c 20 7a 43 6f 6c  (&sColname, zCol
285e0 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  name);.         
285f0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
28600 73 74 53 65 74 4e 61 6d 65 28 70 50 61 72 73 65  stSetName(pParse
28610 2c 20 70 4e 65 77 2c 20 26 73 43 6f 6c 6e 61 6d  , pNew, &sColnam
28620 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  e, 0);.         
28630 20 20 20 69 66 28 20 70 4e 65 77 20 26 26 20 28     if( pNew && (
28640 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
28650 5f 4e 65 73 74 65 64 46 72 6f 6d 29 21 3d 30 20  _NestedFrom)!=0 
28660 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
28670 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
28680 5f 69 74 65 6d 20 2a 70 58 20 3d 20 26 70 4e 65  _item *pX = &pNe
28690 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72  w->a[pNew->nExpr
286a0 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  -1];.           
286b0 20 20 20 69 66 28 20 70 53 75 62 20 29 7b 0a 20     if( pSub ){. 
286c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
286d0 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74  X->zSpan = sqlit
286e0 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
286f0 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a  Sub->pEList->a[j
28700 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20 20  ].zSpan);.      
28710 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
28720 73 65 28 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30  se( pX->zSpan==0
28730 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
28740 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
28750 20 20 20 20 20 20 20 20 20 70 58 2d 3e 7a 53 70           pX->zSp
28760 61 6e 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  an = sqlite3MPri
28770 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73 2e 25  ntf(db, "%s.%s.%
28780 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
28790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
287a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
287b0 53 63 68 65 6d 61 4e 61 6d 65 2c 20 7a 54 61 62  SchemaName, zTab
287c0 4e 61 6d 65 2c 20 7a 43 6f 6c 6e 61 6d 65 29 3b  Name, zColname);
287d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
287e0 20 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e 7a   testcase( pX->z
287f0 53 70 61 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Span==0 );.     
28800 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
28810 20 20 20 20 20 20 20 20 20 70 58 2d 3e 62 53 70           pX->bSp
28820 61 6e 49 73 54 61 62 20 3d 20 31 3b 0a 20 20 20  anIsTab = 1;.   
28830 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
28840 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
28850 46 72 65 65 28 64 62 2c 20 7a 54 6f 46 72 65 65  Free(db, zToFree
28860 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
28870 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
28880 20 69 66 28 20 21 74 61 62 6c 65 53 65 65 6e 20   if( !tableSeen 
28890 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
288a0 20 7a 54 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20   zTName ){.     
288b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
288c0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
288d0 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25  no such table: %
288e0 73 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20 20 20  s", zTName);.   
288f0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
28900 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
28910 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
28920 2c 20 22 6e 6f 20 74 61 62 6c 65 73 20 73 70 65  , "no tables spe
28930 63 69 66 69 65 64 22 29 3b 0a 20 20 20 20 20 20  cified");.      
28940 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
28950 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
28960 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
28970 74 44 65 6c 65 74 65 28 64 62 2c 20 70 45 4c 69  tDelete(db, pELi
28980 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 45 4c 69  st);.    p->pELi
28990 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 23  st = pNew;.  }.#
289a0 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  if SQLITE_MAX_CO
289b0 4c 55 4d 4e 0a 20 20 69 66 28 20 70 2d 3e 70 45  LUMN.  if( p->pE
289c0 4c 69 73 74 20 26 26 20 70 2d 3e 70 45 4c 69 73  List && p->pELis
289d0 74 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e 61 4c 69  t->nExpr>db->aLi
289e0 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
289f0 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20  _COLUMN] ){.    
28a00 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
28a10 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e  pParse, "too man
28a20 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73  y columns in res
28a30 75 6c 74 20 73 65 74 22 29 3b 0a 20 20 20 20 72  ult set");.    r
28a40 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
28a50 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
28a60 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
28a70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f  e;.}../*.** No-o
28a80 70 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 74 68  p routine for th
28a90 65 20 70 61 72 73 65 2d 74 72 65 65 20 77 61 6c  e parse-tree wal
28aa0 6b 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ker..**.** When 
28ab0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
28ac0 74 68 65 20 57 61 6c 6b 65 72 2e 78 45 78 70 72  the Walker.xExpr
28ad0 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20 65 78  Callback then ex
28ae0 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73 0a 2a  pression trees.*
28af0 2a 20 61 72 65 20 77 61 6c 6b 65 64 20 77 69 74  * are walked wit
28b00 68 6f 75 74 20 61 6e 79 20 61 63 74 69 6f 6e 73  hout any actions
28b10 20 62 65 69 6e 67 20 74 61 6b 65 6e 20 61 74 20   being taken at 
28b20 65 61 63 68 20 6e 6f 64 65 2e 20 20 50 72 65 73  each node.  Pres
28b30 75 6d 61 62 6c 79 2c 0a 2a 2a 20 77 68 65 6e 20  umably,.** when 
28b40 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
28b50 75 73 65 64 20 66 6f 72 20 57 61 6c 6b 65 72 2e  used for Walker.
28b60 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 74 68  xExprCallback th
28b70 65 6e 20 0a 2a 2a 20 57 61 6c 6b 65 72 2e 78 53  en .** Walker.xS
28b80 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 69 73  electCallback is
28b90 20 73 65 74 20 74 6f 20 64 6f 20 73 6f 6d 65 74   set to do somet
28ba0 68 69 6e 67 20 75 73 65 66 75 6c 20 66 6f 72 20  hing useful for 
28bb0 65 76 65 72 79 20 0a 2a 2a 20 73 75 62 71 75 65  every .** subque
28bc0 72 79 20 69 6e 20 74 68 65 20 70 61 72 73 65 72  ry in the parser
28bd0 20 74 72 65 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   tree..*/.int sq
28be0 6c 69 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f  lite3ExprWalkNoo
28bf0 70 28 57 61 6c 6b 65 72 20 2a 4e 6f 74 55 73 65  p(Walker *NotUse
28c00 64 2c 20 45 78 70 72 20 2a 4e 6f 74 55 73 65 64  d, Expr *NotUsed
28c10 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  2){.  UNUSED_PAR
28c20 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c  AMETER2(NotUsed,
28c30 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65   NotUsed2);.  re
28c40 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
28c50 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f  e;.}../*.** No-o
28c60 70 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 74 68  p routine for th
28c70 65 20 70 61 72 73 65 2d 74 72 65 65 20 77 61 6c  e parse-tree wal
28c80 6b 65 72 20 66 6f 72 20 53 45 4c 45 43 54 20 73  ker for SELECT s
28c90 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 20 73 75  tatements..** su
28ca0 62 71 75 65 72 79 20 69 6e 20 74 68 65 20 70 61  bquery in the pa
28cb0 72 73 65 72 20 74 72 65 65 2e 0a 2a 2f 0a 69 6e  rser tree..*/.in
28cc0 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57  t sqlite3SelectW
28cd0 61 6c 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72 20 2a  alkNoop(Walker *
28ce0 4e 6f 74 55 73 65 64 2c 20 53 65 6c 65 63 74 20  NotUsed, Select 
28cf0 2a 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e  *NotUsed2){.  UN
28d00 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28  USED_PARAMETER2(
28d10 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64  NotUsed, NotUsed
28d20 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43  2);.  return WRC
28d30 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 23 69  _Continue;.}..#i
28d40 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
28d50 2a 0a 2a 2a 20 41 6c 77 61 79 73 20 61 73 73 65  *.** Always asse
28d60 72 74 2e 20 20 54 68 69 73 20 78 53 65 6c 65 63  rt.  This xSelec
28d70 74 43 61 6c 6c 62 61 63 6b 32 20 69 6d 70 6c 65  tCallback2 imple
28d80 6d 65 6e 74 61 74 69 6f 6e 20 70 72 6f 76 65 73  mentation proves
28d90 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 78 53 65   that the.** xSe
28da0 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 69 73  lectCallback2 is
28db0 20 6e 65 76 65 72 20 69 6e 76 6f 6b 65 64 2e 0a   never invoked..
28dc0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
28dd0 65 6c 65 63 74 57 61 6c 6b 41 73 73 65 72 74 32  electWalkAssert2
28de0 28 57 61 6c 6b 65 72 20 2a 4e 6f 74 55 73 65 64  (Walker *NotUsed
28df0 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74 55 73 65  , Select *NotUse
28e00 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  d2){.  UNUSED_PA
28e10 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64  RAMETER2(NotUsed
28e20 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 61  , NotUsed2);.  a
28e30 73 73 65 72 74 28 20 30 20 29 3b 0a 7d 0a 23 65  ssert( 0 );.}.#e
28e40 6e 64 69 66 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ndif./*.** This 
28e50 72 6f 75 74 69 6e 65 20 22 65 78 70 61 6e 64 73  routine "expands
28e60 22 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  " a SELECT state
28e70 6d 65 6e 74 20 61 6e 64 20 61 6c 6c 20 6f 66 20  ment and all of 
28e80 69 74 73 20 73 75 62 71 75 65 72 69 65 73 2e 0a  its subqueries..
28e90 2a 2a 20 46 6f 72 20 61 64 64 69 74 69 6f 6e 61  ** For additiona
28ea0 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e  l information on
28eb0 20 77 68 61 74 20 69 74 20 6d 65 61 6e 73 20 74   what it means t
28ec0 6f 20 22 65 78 70 61 6e 64 22 20 61 20 53 45 4c  o "expand" a SEL
28ed0 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  ECT.** statement
28ee0 2c 20 73 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e  , see the commen
28ef0 74 20 6f 6e 20 74 68 65 20 73 65 6c 65 63 74 45  t on the selectE
28f00 78 70 61 6e 64 20 77 6f 72 6b 65 72 20 63 61 6c  xpand worker cal
28f10 6c 62 61 63 6b 20 61 62 6f 76 65 2e 0a 2a 2a 0a  lback above..**.
28f20 2a 2a 20 45 78 70 61 6e 64 69 6e 67 20 61 20 53  ** Expanding a S
28f30 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
28f40 69 73 20 74 68 65 20 66 69 72 73 74 20 73 74 65  is the first ste
28f50 70 20 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  p in processing 
28f60 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74  a.** SELECT stat
28f70 65 6d 65 6e 74 2e 20 20 54 68 65 20 53 45 4c 45  ement.  The SELE
28f80 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6d 75 73  CT statement mus
28f90 74 20 62 65 20 65 78 70 61 6e 64 65 64 20 62 65  t be expanded be
28fa0 66 6f 72 65 0a 2a 2a 20 6e 61 6d 65 20 72 65 73  fore.** name res
28fb0 6f 6c 75 74 69 6f 6e 20 69 73 20 70 65 72 66 6f  olution is perfo
28fc0 72 6d 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  rmed..**.** If a
28fd0 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  nything goes wro
28fe0 6e 67 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ng, an error mes
28ff0 73 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20  sage is written 
29000 69 6e 74 6f 20 70 50 61 72 73 65 2e 0a 2a 2a 20  into pParse..** 
29010 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  The calling func
29020 74 69 6f 6e 20 63 61 6e 20 64 65 74 65 63 74 20  tion can detect 
29030 74 68 65 20 70 72 6f 62 6c 65 6d 20 62 79 20 6c  the problem by l
29040 6f 6f 6b 69 6e 67 20 61 74 20 70 50 61 72 73 65  ooking at pParse
29050 2d 3e 6e 45 72 72 0a 2a 2a 20 61 6e 64 2f 6f 72  ->nErr.** and/or
29060 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
29070 6c 6f 63 46 61 69 6c 65 64 2e 0a 2a 2f 0a 73 74  locFailed..*/.st
29080 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
29090 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28 50 61  3SelectExpand(Pa
290a0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
290b0 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20  ect *pSelect){. 
290c0 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78   Walker w;.  w.x
290d0 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 73  ExprCallback = s
290e0 71 6c 69 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f  qlite3ExprWalkNo
290f0 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d  op;.  w.pParse =
29100 20 70 50 61 72 73 65 3b 0a 20 20 69 66 28 20 70   pParse;.  if( p
29110 50 61 72 73 65 2d 3e 68 61 73 43 6f 6d 70 6f 75  Parse->hasCompou
29120 6e 64 20 29 7b 0a 20 20 20 20 77 2e 78 53 65 6c  nd ){.    w.xSel
29130 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 63 6f  ectCallback = co
29140 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65 6c  nvertCompoundSel
29150 65 63 74 54 6f 53 75 62 71 75 65 72 79 3b 0a 20  ectToSubquery;. 
29160 20 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c     w.xSelectCall
29170 62 61 63 6b 32 20 3d 20 30 3b 0a 20 20 20 20 73  back2 = 0;.    s
29180 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
29190 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20  (&w, pSelect);. 
291a0 20 7d 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61   }.  w.xSelectCa
291b0 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 45  llback = selectE
291c0 78 70 61 6e 64 65 72 3b 0a 20 20 77 2e 78 53 65  xpander;.  w.xSe
291d0 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20  lectCallback2 = 
291e0 73 65 6c 65 63 74 50 6f 70 57 69 74 68 3b 0a 20  selectPopWith;. 
291f0 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
29200 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b  ct(&w, pSelect);
29210 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  .}...#ifndef SQL
29220 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
29230 59 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  Y./*.** This is 
29240 61 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74  a Walker.xSelect
29250 43 61 6c 6c 62 61 63 6b 20 63 61 6c 6c 62 61 63  Callback callbac
29260 6b 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65  k for the sqlite
29270 33 53 65 6c 65 63 74 54 79 70 65 49 6e 66 6f 28  3SelectTypeInfo(
29280 29 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e 0a  ).** interface..
29290 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20 46  **.** For each F
292a0 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75  ROM-clause subqu
292b0 65 72 79 2c 20 61 64 64 20 43 6f 6c 75 6d 6e 2e  ery, add Column.
292c0 7a 54 79 70 65 20 61 6e 64 20 43 6f 6c 75 6d 6e  zType and Column
292d0 2e 7a 43 6f 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d  .zColl.** inform
292e0 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 54 61 62  ation to the Tab
292f0 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61  le structure tha
29300 74 20 72 65 70 72 65 73 65 6e 74 73 20 74 68 65  t represents the
29310 20 72 65 73 75 6c 74 20 73 65 74 0a 2a 2a 20 6f   result set.** o
29320 66 20 74 68 61 74 20 73 75 62 71 75 65 72 79 2e  f that subquery.
29330 0a 2a 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65  .**.** The Table
29340 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
29350 72 65 70 72 65 73 65 6e 74 73 20 74 68 65 20 72  represents the r
29360 65 73 75 6c 74 20 73 65 74 20 77 61 73 20 63 6f  esult set was co
29370 6e 73 74 72 75 63 74 65 64 0a 2a 2a 20 62 79 20  nstructed.** by 
29380 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72 28 29  selectExpander()
29390 20 62 75 74 20 74 68 65 20 74 79 70 65 20 61 6e   but the type an
293a0 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f  d collation info
293b0 72 6d 61 74 69 6f 6e 20 77 61 73 20 6f 6d 69 74  rmation was omit
293c0 74 65 64 0a 2a 2a 20 61 74 20 74 68 61 74 20 70  ted.** at that p
293d0 6f 69 6e 74 20 62 65 63 61 75 73 65 20 69 64 65  oint because ide
293e0 6e 74 69 66 69 65 72 73 20 68 61 64 20 6e 6f 74  ntifiers had not
293f0 20 79 65 74 20 62 65 65 6e 20 72 65 73 6f 6c 76   yet been resolv
29400 65 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75  ed.  This.** rou
29410 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61  tine is called a
29420 66 74 65 72 20 69 64 65 6e 74 69 66 69 65 72 20  fter identifier 
29430 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73  resolution..*/.s
29440 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63  tatic void selec
29450 74 41 64 64 53 75 62 71 75 65 72 79 54 79 70 65  tAddSubqueryType
29460 49 6e 66 6f 28 57 61 6c 6b 65 72 20 2a 70 57 61  Info(Walker *pWa
29470 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29  lker, Select *p)
29480 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
29490 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 72  e;.  int i;.  Sr
294a0 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b  cList *pTabList;
294b0 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
294c0 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a  t_item *pFrom;..
294d0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 65 6c    assert( p->sel
294e0 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c  Flags & SF_Resol
294f0 76 65 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ved );.  assert(
29500 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
29510 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 29 3d  SF_HasTypeInfo)=
29520 3d 30 20 29 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c  =0 );.  p->selFl
29530 61 67 73 20 7c 3d 20 53 46 5f 48 61 73 54 79 70  ags |= SF_HasTyp
29540 65 49 6e 66 6f 3b 0a 20 20 70 50 61 72 73 65 20  eInfo;.  pParse 
29550 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73  = pWalker->pPars
29560 65 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20  e;.  pTabList = 
29570 70 2d 3e 70 53 72 63 3b 0a 20 20 66 6f 72 28 69  p->pSrc;.  for(i
29580 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69  =0, pFrom=pTabLi
29590 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73  st->a; i<pTabLis
295a0 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46  t->nSrc; i++, pF
295b0 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c  rom++){.    Tabl
295c0 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d  e *pTab = pFrom-
295d0 3e 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72  >pTab;.    asser
295e0 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20  t( pTab!=0 );.  
295f0 20 20 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62    if( (pTab->tab
29600 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d  Flags & TF_Ephem
29610 65 72 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20  eral)!=0 ){.    
29620 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79    /* A sub-query
29630 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
29640 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20  use of a SELECT 
29650 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20  */.      Select 
29660 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pSel = pFrom->p
29670 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 69 66  Select;.      if
29680 28 20 70 53 65 6c 20 29 7b 0a 20 20 20 20 20 20  ( pSel ){.      
29690 20 20 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70    while( pSel->p
296a0 50 72 69 6f 72 20 29 20 70 53 65 6c 20 3d 20 70  Prior ) pSel = p
296b0 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  Sel->pPrior;.   
296c0 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
296d0 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41  ctAddColumnTypeA
296e0 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72  ndCollation(pPar
296f0 73 65 2c 20 70 54 61 62 2c 20 70 53 65 6c 29 3b  se, pTab, pSel);
29700 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
29710 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a   }.}.#endif.../*
29720 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
29730 20 61 64 64 73 20 64 61 74 61 74 79 70 65 20 61   adds datatype a
29740 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  nd collating seq
29750 75 65 6e 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f  uence informatio
29760 6e 20 74 6f 0a 2a 2a 20 74 68 65 20 54 61 62 6c  n to.** the Tabl
29770 65 20 73 74 72 75 63 74 75 72 65 73 20 6f 66 20  e structures of 
29780 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20  all FROM-clause 
29790 73 75 62 71 75 65 72 69 65 73 20 69 6e 20 61 0a  subqueries in a.
297a0 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
297b0 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74  ent..**.** Use t
297c0 68 69 73 20 72 6f 75 74 69 6e 65 20 61 66 74 65  his routine afte
297d0 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f  r name resolutio
297e0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
297f0 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41  d sqlite3SelectA
29800 64 64 54 79 70 65 49 6e 66 6f 28 50 61 72 73 65  ddTypeInfo(Parse
29810 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
29820 20 2a 70 53 65 6c 65 63 74 29 7b 0a 23 69 66 6e   *pSelect){.#ifn
29830 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
29840 53 55 42 51 55 45 52 59 0a 20 20 57 61 6c 6b 65  SUBQUERY.  Walke
29850 72 20 77 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  r w;.  w.xSelect
29860 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74  Callback = sqlit
29870 65 33 53 65 6c 65 63 74 57 61 6c 6b 4e 6f 6f 70  e3SelectWalkNoop
29880 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  ;.  w.xSelectCal
29890 6c 62 61 63 6b 32 20 3d 20 73 65 6c 65 63 74 41  lback2 = selectA
298a0 64 64 53 75 62 71 75 65 72 79 54 79 70 65 49 6e  ddSubqueryTypeIn
298b0 66 6f 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c  fo;.  w.xExprCal
298c0 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 45  lback = sqlite3E
298d0 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77  xprWalkNoop;.  w
298e0 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
298f0 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53  ;.  sqlite3WalkS
29900 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63  elect(&w, pSelec
29910 74 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f  t);.#endif.}.../
29920 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
29930 65 20 73 65 74 73 20 75 70 20 61 20 53 45 4c 45  e sets up a SELE
29940 43 54 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72  CT statement for
29950 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 54 68   processing.  Th
29960 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69  e.** following i
29970 73 20 61 63 63 6f 6d 70 6c 69 73 68 65 64 3a 0a  s accomplished:.
29980 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 20 56 44 42  **.**     *  VDB
29990 45 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  E Cursor numbers
299a0 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74 6f   are assigned to
299b0 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65   all FROM-clause
299c0 20 74 65 72 6d 73 2e 0a 2a 2a 20 20 20 20 20 2a   terms..**     *
299d0 20 20 45 70 68 65 6d 65 72 61 6c 20 54 61 62 6c    Ephemeral Tabl
299e0 65 20 6f 62 6a 65 63 74 73 20 61 72 65 20 63 72  e objects are cr
299f0 65 61 74 65 64 20 66 6f 72 20 61 6c 6c 20 46 52  eated for all FR
29a00 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65  OM-clause subque
29a10 72 69 65 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20  ries..**     *  
29a20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61  ON and USING cla
29a30 75 73 65 73 20 61 72 65 20 73 68 69 66 74 65 64  uses are shifted
29a40 20 69 6e 74 6f 20 57 48 45 52 45 20 73 74 61 74   into WHERE stat
29a50 65 6d 65 6e 74 73 0a 2a 2a 20 20 20 20 20 2a 20  ements.**     * 
29a60 20 57 69 6c 64 63 61 72 64 73 20 22 2a 22 20 61   Wildcards "*" a
29a70 6e 64 20 22 54 41 42 4c 45 2e 2a 22 20 69 6e 20  nd "TABLE.*" in 
29a80 72 65 73 75 6c 74 20 73 65 74 73 20 61 72 65 20  result sets are 
29a90 65 78 70 61 6e 64 65 64 2e 0a 2a 2a 20 20 20 20  expanded..**    
29aa0 20 2a 20 20 49 64 65 6e 74 69 66 69 65 72 73 20   *  Identifiers 
29ab0 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 72  in expression ar
29ac0 65 20 6d 61 74 63 68 65 64 20 74 6f 20 74 61 62  e matched to tab
29ad0 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  les..**.** This 
29ae0 72 6f 75 74 69 6e 65 20 61 63 74 73 20 72 65 63  routine acts rec
29af0 75 72 73 69 76 65 6c 79 20 6f 6e 20 61 6c 6c 20  ursively on all 
29b00 73 75 62 71 75 65 72 69 65 73 20 77 69 74 68 69  subqueries withi
29b10 6e 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f  n the SELECT..*/
29b20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c  .void sqlite3Sel
29b30 65 63 74 50 72 65 70 28 0a 20 20 50 61 72 73 65  ectPrep(.  Parse
29b40 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
29b50 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
29b60 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
29b70 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
29b80 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43      /* The SELEC
29b90 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  T statement bein
29ba0 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e 61  g coded. */.  Na
29bb0 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65  meContext *pOute
29bc0 72 4e 43 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e  rNC  /* Name con
29bd0 74 65 78 74 20 66 6f 72 20 63 6f 6e 74 61 69 6e  text for contain
29be0 65 72 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  er */.){.  sqlit
29bf0 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 4e 45  e3 *db;.  if( NE
29c00 56 45 52 28 70 3d 3d 30 29 20 29 20 72 65 74 75  VER(p==0) ) retu
29c10 72 6e 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73  rn;.  db = pPars
29c20 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64 62 2d  e->db;.  if( db-
29c30 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
29c40 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d  return;.  if( p-
29c50 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 48  >selFlags & SF_H
29c60 61 73 54 79 70 65 49 6e 66 6f 20 29 20 72 65 74  asTypeInfo ) ret
29c70 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  urn;.  sqlite3Se
29c80 6c 65 63 74 45 78 70 61 6e 64 28 70 50 61 72 73  lectExpand(pPars
29c90 65 2c 20 70 29 3b 0a 20 20 69 66 28 20 70 50 61  e, p);.  if( pPa
29ca0 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d  rse->nErr || db-
29cb0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
29cc0 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65  return;.  sqlite
29cd0 33 52 65 73 6f 6c 76 65 53 65 6c 65 63 74 4e 61  3ResolveSelectNa
29ce0 6d 65 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70  mes(pParse, p, p
29cf0 4f 75 74 65 72 4e 43 29 3b 0a 20 20 69 66 28 20  OuterNC);.  if( 
29d00 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
29d10 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
29d20 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c   ) return;.  sql
29d30 69 74 65 33 53 65 6c 65 63 74 41 64 64 54 79 70  ite3SelectAddTyp
29d40 65 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 29  eInfo(pParse, p)
29d50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74  ;.}../*.** Reset
29d60 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 61   the aggregate a
29d70 63 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a  ccumulator..**.*
29d80 2a 20 54 68 65 20 61 67 67 72 65 67 61 74 65 20  * The aggregate 
29d90 61 63 63 75 6d 75 6c 61 74 6f 72 20 69 73 20 61  accumulator is a
29da0 20 73 65 74 20 6f 66 20 6d 65 6d 6f 72 79 20 63   set of memory c
29db0 65 6c 6c 73 20 74 68 61 74 20 68 6f 6c 64 0a 2a  ells that hold.*
29dc0 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72  * intermediate r
29dd0 65 73 75 6c 74 73 20 77 68 69 6c 65 20 63 61 6c  esults while cal
29de0 63 75 6c 61 74 69 6e 67 20 61 6e 20 61 67 67 72  culating an aggr
29df0 65 67 61 74 65 2e 20 20 54 68 69 73 0a 2a 2a 20  egate.  This.** 
29e00 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65  routine generate
29e10 73 20 63 6f 64 65 20 74 68 61 74 20 73 74 6f 72  s code that stor
29e20 65 73 20 4e 55 4c 4c 73 20 69 6e 20 61 6c 6c 20  es NULLs in all 
29e30 6f 66 20 74 68 6f 73 65 20 6d 65 6d 6f 72 79 0a  of those memory.
29e40 2a 2a 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61  ** cells..*/.sta
29e50 74 69 63 20 76 6f 69 64 20 72 65 73 65 74 41 63  tic void resetAc
29e60 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20  cumulator(Parse 
29e70 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f  *pParse, AggInfo
29e80 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56   *pAggInfo){.  V
29e90 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
29ea0 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
29eb0 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66  .  struct AggInf
29ec0 6f 5f 66 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20  o_func *pFunc;. 
29ed0 20 69 6e 74 20 6e 52 65 67 20 3d 20 70 41 67 67   int nReg = pAgg
29ee0 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 2b 20 70 41  Info->nFunc + pA
29ef0 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b  ggInfo->nColumn;
29f00 0a 20 20 69 66 28 20 6e 52 65 67 3d 3d 30 20 29  .  if( nReg==0 )
29f10 20 72 65 74 75 72 6e 3b 0a 23 69 66 64 65 66 20   return;.#ifdef 
29f20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
29f30 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 61 6c  * Verify that al
29f40 6c 20 41 67 67 49 6e 66 6f 20 72 65 67 69 73 74  l AggInfo regist
29f50 65 72 73 20 61 72 65 20 77 69 74 68 69 6e 20 74  ers are within t
29f60 68 65 20 72 61 6e 67 65 20 73 70 65 63 69 66 69  he range specifi
29f70 65 64 20 62 79 0a 20 20 2a 2a 20 41 67 67 49 6e  ed by.  ** AggIn
29f80 66 6f 2e 6d 6e 52 65 67 2e 2e 41 67 67 49 6e 66  fo.mnReg..AggInf
29f90 6f 2e 6d 78 52 65 67 20 2a 2f 0a 20 20 61 73 73  o.mxReg */.  ass
29fa0 65 72 74 28 20 6e 52 65 67 3d 3d 70 41 67 67 49  ert( nReg==pAggI
29fb0 6e 66 6f 2d 3e 6d 78 52 65 67 2d 70 41 67 67 49  nfo->mxReg-pAggI
29fc0 6e 66 6f 2d 3e 6d 6e 52 65 67 2b 31 20 29 3b 0a  nfo->mnReg+1 );.
29fd0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67    for(i=0; i<pAg
29fe0 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  gInfo->nColumn; 
29ff0 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  i++){.    assert
2a000 28 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  ( pAggInfo->aCol
2a010 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41 67 67 49 6e  [i].iMem>=pAggIn
2a020 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20 20 20 20 20  fo->mnReg.      
2a030 20 20 20 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e     && pAggInfo->
2a040 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3c 3d 70 41  aCol[i].iMem<=pA
2a050 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 20 29 3b  ggInfo->mxReg );
2a060 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
2a070 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  i<pAggInfo->nFun
2a080 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73  c; i++){.    ass
2a090 65 72 74 28 20 70 41 67 67 49 6e 66 6f 2d 3e 61  ert( pAggInfo->a
2a0a0 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41  Func[i].iMem>=pA
2a0b0 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20  ggInfo->mnReg.  
2a0c0 20 20 20 20 20 20 20 26 26 20 70 41 67 67 49 6e         && pAggIn
2a0d0 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d 65  fo->aFunc[i].iMe
2a0e0 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52  m<=pAggInfo->mxR
2a0f0 65 67 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  eg );.  }.#endif
2a100 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
2a110 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp3(v, OP_Null,
2a120 20 30 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e   0, pAggInfo->mn
2a130 52 65 67 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 6d  Reg, pAggInfo->m
2a140 78 52 65 67 29 3b 0a 20 20 66 6f 72 28 70 46 75  xReg);.  for(pFu
2a150 6e 63 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  nc=pAggInfo->aFu
2a160 6e 63 2c 20 69 3d 30 3b 20 69 3c 70 41 67 67 49  nc, i=0; i<pAggI
2a170 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c  nfo->nFunc; i++,
2a180 20 70 46 75 6e 63 2b 2b 29 7b 0a 20 20 20 20 69   pFunc++){.    i
2a190 66 28 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69  f( pFunc->iDisti
2a1a0 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  nct>=0 ){.      
2a1b0 45 78 70 72 20 2a 70 45 20 3d 20 70 46 75 6e 63  Expr *pE = pFunc
2a1c0 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61  ->pExpr;.      a
2a1d0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
2a1e0 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f 78  roperty(pE, EP_x
2a1f0 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
2a200 20 20 20 69 66 28 20 70 45 2d 3e 78 2e 70 4c 69     if( pE->x.pLi
2a210 73 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 78 2e 70  st==0 || pE->x.p
2a220 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29  List->nExpr!=1 )
2a230 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2a240 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
2a250 2c 20 22 44 49 53 54 49 4e 43 54 20 61 67 67 72  , "DISTINCT aggr
2a260 65 67 61 74 65 73 20 6d 75 73 74 20 68 61 76 65  egates must have
2a270 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 22 0a 20   exactly one ". 
2a280 20 20 20 20 20 20 20 20 20 20 22 61 72 67 75 6d            "argum
2a290 65 6e 74 22 29 3b 0a 20 20 20 20 20 20 20 20 70  ent");.        p
2a2a0 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 20  Func->iDistinct 
2a2b0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = -1;.      }els
2a2c0 65 7b 0a 20 20 20 20 20 20 20 20 4b 65 79 49 6e  e{.        KeyIn
2a2d0 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6b  fo *pKeyInfo = k
2a2e0 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
2a2f0 73 74 28 70 50 61 72 73 65 2c 20 70 45 2d 3e 78  st(pParse, pE->x
2a300 2e 70 4c 69 73 74 2c 20 30 2c 20 30 29 3b 0a 20  .pList, 0, 0);. 
2a310 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2a320 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f  beAddOp4(v, OP_O
2a330 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 46  penEphemeral, pF
2a340 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20  unc->iDistinct, 
2a350 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  0, 0,.          
2a360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a370 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c  (char*)pKeyInfo,
2a380 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
2a390 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2a3a0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  }../*.** Invoke 
2a3b0 74 68 65 20 4f 50 5f 41 67 67 46 69 6e 61 6c 69  the OP_AggFinali
2a3c0 7a 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 65 76  ze opcode for ev
2a3d0 65 72 79 20 61 67 67 72 65 67 61 74 65 20 66 75  ery aggregate fu
2a3e0 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65  nction.** in the
2a3f0 20 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75   AggInfo structu
2a400 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  re..*/.static vo
2a410 69 64 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75  id finalizeAggFu
2a420 6e 63 74 69 6f 6e 73 28 50 61 72 73 65 20 2a 70  nctions(Parse *p
2a430 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a  Parse, AggInfo *
2a440 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62  pAggInfo){.  Vdb
2a450 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
2a460 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vdbe;.  int i;. 
2a470 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
2a480 66 75 6e 63 20 2a 70 46 3b 0a 20 20 66 6f 72 28  func *pF;.  for(
2a490 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f  i=0, pF=pAggInfo
2a4a0 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49  ->aFunc; i<pAggI
2a4b0 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c  nfo->nFunc; i++,
2a4c0 20 70 46 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72   pF++){.    Expr
2a4d0 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46  List *pList = pF
2a4e0 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  ->pExpr->x.pList
2a4f0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  ;.    assert( !E
2a500 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
2a510 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78 49 73  F->pExpr, EP_xIs
2a520 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 73  Select) );.    s
2a530 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2a540 28 76 2c 20 4f 50 5f 41 67 67 46 69 6e 61 6c 2c  (v, OP_AggFinal,
2a550 20 70 46 2d 3e 69 4d 65 6d 2c 20 70 4c 69 73 74   pF->iMem, pList
2a560 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20   ? pList->nExpr 
2a570 3a 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  : 0);.    sqlite
2a580 33 56 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c  3VdbeAppendP4(v,
2a590 20 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46   pF->pFunc, P4_F
2a5a0 55 4e 43 44 45 46 29 3b 0a 20 20 7d 0a 7d 0a 0a  UNCDEF);.  }.}..
2a5b0 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65  /*.** Update the
2a5c0 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 6d 65 6d   accumulator mem
2a5d0 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 6e  ory cells for an
2a5e0 20 61 67 67 72 65 67 61 74 65 20 62 61 73 65 64   aggregate based
2a5f0 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 75 72 72 65   on.** the curre
2a600 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69  nt cursor positi
2a610 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
2a620 69 64 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c  id updateAccumul
2a630 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72  ator(Parse *pPar
2a640 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67  se, AggInfo *pAg
2a650 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a  gInfo){.  Vdbe *
2a660 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
2a670 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  e;.  int i;.  in
2a680 74 20 72 65 67 48 69 74 20 3d 20 30 3b 0a 20 20  t regHit = 0;.  
2a690 69 6e 74 20 61 64 64 72 48 69 74 54 65 73 74 20  int addrHitTest 
2a6a0 3d 20 30 3b 0a 20 20 73 74 72 75 63 74 20 41 67  = 0;.  struct Ag
2a6b0 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a  gInfo_func *pF;.
2a6c0 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
2a6d0 5f 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20 70 41 67  _col *pC;..  pAg
2a6e0 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64  gInfo->directMod
2a6f0 65 20 3d 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30  e = 1;.  for(i=0
2a700 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61  , pF=pAggInfo->a
2a710 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f  Func; i<pAggInfo
2a720 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46  ->nFunc; i++, pF
2a730 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72  ++){.    int nAr
2a740 67 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4e  g;.    int addrN
2a750 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  ext = 0;.    int
2a760 20 72 65 67 41 67 67 3b 0a 20 20 20 20 45 78 70   regAgg;.    Exp
2a770 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
2a780 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  F->pExpr->x.pLis
2a790 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  t;.    assert( !
2a7a0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
2a7b0 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78 49  pF->pExpr, EP_xI
2a7c0 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
2a7d0 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
2a7e0 20 20 20 6e 41 72 67 20 3d 20 70 4c 69 73 74 2d     nArg = pList-
2a7f0 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 72 65  >nExpr;.      re
2a800 67 41 67 67 20 3d 20 73 71 6c 69 74 65 33 47 65  gAgg = sqlite3Ge
2a810 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
2a820 65 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 20 20  e, nArg);.      
2a830 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
2a840 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
2a850 70 4c 69 73 74 2c 20 72 65 67 41 67 67 2c 20 30  pList, regAgg, 0
2a860 2c 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55  , SQLITE_ECEL_DU
2a870 50 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  P);.    }else{. 
2a880 20 20 20 20 20 6e 41 72 67 20 3d 20 30 3b 0a 20       nArg = 0;. 
2a890 20 20 20 20 20 72 65 67 41 67 67 20 3d 20 30 3b       regAgg = 0;
2a8a0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
2a8b0 46 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20  F->iDistinct>=0 
2a8c0 29 7b 0a 20 20 20 20 20 20 61 64 64 72 4e 65 78  ){.      addrNex
2a8d0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
2a8e0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
2a8f0 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 41 72     testcase( nAr
2a900 67 3d 3d 30 20 29 3b 20 20 2f 2a 20 45 72 72 6f  g==0 );  /* Erro
2a910 72 20 63 6f 6e 64 69 74 69 6f 6e 20 2a 2f 0a 20  r condition */. 
2a920 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e       testcase( n
2a930 41 72 67 3e 31 20 29 3b 20 20 20 2f 2a 20 41 6c  Arg>1 );   /* Al
2a940 73 6f 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20  so an error */. 
2a950 20 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63       codeDistinc
2a960 74 28 70 50 61 72 73 65 2c 20 70 46 2d 3e 69 44  t(pParse, pF->iD
2a970 69 73 74 69 6e 63 74 2c 20 61 64 64 72 4e 65 78  istinct, addrNex
2a980 74 2c 20 31 2c 20 72 65 67 41 67 67 29 3b 0a 20  t, 1, regAgg);. 
2a990 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 2d     }.    if( pF-
2a9a0 3e 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67  >pFunc->funcFlag
2a9b0 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
2a9c0 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20  NEEDCOLL ){.    
2a9d0 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
2a9e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 72 75   = 0;.      stru
2a9f0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
2aa00 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 69   *pItem;.      i
2aa10 6e 74 20 6a 3b 0a 20 20 20 20 20 20 61 73 73 65  nt j;.      asse
2aa20 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 20  rt( pList!=0 ); 
2aa30 20 2f 2a 20 70 4c 69 73 74 21 3d 30 20 69 66 20   /* pList!=0 if 
2aa40 70 46 2d 3e 70 46 75 6e 63 20 68 61 73 20 4e 45  pF->pFunc has NE
2aa50 45 44 43 4f 4c 4c 20 2a 2f 0a 20 20 20 20 20 20  EDCOLL */.      
2aa60 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70  for(j=0, pItem=p
2aa70 4c 69 73 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20  List->a; !pColl 
2aa80 26 26 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c 20  && j<nArg; j++, 
2aa90 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
2aaa0 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
2aab0 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
2aac0 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70  rse, pItem->pExp
2aad0 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
2aae0 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a    if( !pColl ){.
2aaf0 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
2ab00 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c  pParse->db->pDfl
2ab10 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  tColl;.      }. 
2ab20 20 20 20 20 20 69 66 28 20 72 65 67 48 69 74 3d       if( regHit=
2ab30 3d 30 20 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e  =0 && pAggInfo->
2ab40 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 29 20 72  nAccumulator ) r
2ab50 65 67 48 69 74 20 3d 20 2b 2b 70 50 61 72 73 65  egHit = ++pParse
2ab60 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71  ->nMem;.      sq
2ab70 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
2ab80 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 72  v, OP_CollSeq, r
2ab90 65 67 48 69 74 2c 20 30 2c 20 30 2c 20 28 63 68  egHit, 0, 0, (ch
2aba0 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43  ar *)pColl, P4_C
2abb0 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 7d 0a 20  OLLSEQ);.    }. 
2abc0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2abd0 64 4f 70 33 28 76 2c 20 4f 50 5f 41 67 67 53 74  dOp3(v, OP_AggSt
2abe0 65 70 30 2c 20 30 2c 20 72 65 67 41 67 67 2c 20  ep0, 0, regAgg, 
2abf0 70 46 2d 3e 69 4d 65 6d 29 3b 0a 20 20 20 20 73  pF->iMem);.    s
2ac00 71 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64  qlite3VdbeAppend
2ac10 50 34 28 76 2c 20 70 46 2d 3e 70 46 75 6e 63 2c  P4(v, pF->pFunc,
2ac20 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20   P4_FUNCDEF);.  
2ac30 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
2ac40 6e 67 65 50 35 28 76 2c 20 28 75 38 29 6e 41 72  ngeP5(v, (u8)nAr
2ac50 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  g);.    sqlite3E
2ac60 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
2ac70 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  Change(pParse, r
2ac80 65 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20  egAgg, nArg);.  
2ac90 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
2aca0 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
2acb0 2c 20 72 65 67 41 67 67 2c 20 6e 41 72 67 29 3b  , regAgg, nArg);
2acc0 0a 20 20 20 20 69 66 28 20 61 64 64 72 4e 65 78  .    if( addrNex
2acd0 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
2ace0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
2acf0 65 6c 28 76 2c 20 61 64 64 72 4e 65 78 74 29 3b  el(v, addrNext);
2ad00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
2ad10 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
2ad20 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rse);.    }.  }.
2ad30 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 70 6f 70  .  /* Before pop
2ad40 75 6c 61 74 69 6e 67 20 74 68 65 20 61 63 63 75  ulating the accu
2ad50 6d 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72  mulator register
2ad60 73 2c 20 63 6c 65 61 72 20 74 68 65 20 63 6f 6c  s, clear the col
2ad70 75 6d 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2a 20  umn cache..  ** 
2ad80 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 6e  Otherwise, if an
2ad90 79 20 6f 66 20 74 68 65 20 72 65 71 75 69 72 65  y of the require
2ada0 64 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20  d column values 
2adb0 61 72 65 20 61 6c 72 65 61 64 79 20 70 72 65 73  are already pres
2adc0 65 6e 74 20 0a 20 20 2a 2a 20 69 6e 20 72 65 67  ent .  ** in reg
2add0 69 73 74 65 72 73 2c 20 73 71 6c 69 74 65 33 45  isters, sqlite3E
2ade0 78 70 72 43 6f 64 65 28 29 20 6d 61 79 20 75 73  xprCode() may us
2adf0 65 20 4f 50 5f 53 43 6f 70 79 20 74 6f 20 63 6f  e OP_SCopy to co
2ae00 70 79 20 74 68 65 20 76 61 6c 75 65 0a 20 20 2a  py the value.  *
2ae10 2a 20 74 6f 20 70 43 2d 3e 69 4d 65 6d 2e 20 42  * to pC->iMem. B
2ae20 75 74 20 62 79 20 74 68 65 20 74 69 6d 65 20 74  ut by the time t
2ae30 68 65 20 76 61 6c 75 65 20 69 73 20 75 73 65 64  he value is used
2ae40 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 72  , the original r
2ae50 65 67 69 73 74 65 72 0a 20 20 2a 2a 20 6d 61 79  egister.  ** may
2ae60 20 68 61 76 65 20 62 65 65 6e 20 75 73 65 64 2c   have been used,
2ae70 20 69 6e 76 61 6c 69 64 61 74 69 6e 67 20 74 68   invalidating th
2ae80 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 75 66  e underlying buf
2ae90 66 65 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a  fer holding the.
2aea0 20 20 2a 2a 20 74 65 78 74 20 6f 72 20 62 6c 6f    ** text or blo
2aeb0 62 20 76 61 6c 75 65 2e 20 53 65 65 20 74 69 63  b value. See tic
2aec0 6b 65 74 20 5b 38 38 33 30 33 34 64 63 62 35 5d  ket [883034dcb5]
2aed0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 6f 74  ..  **.  ** Anot
2aee0 68 65 72 20 73 6f 6c 75 74 69 6f 6e 20 77 6f 75  her solution wou
2aef0 6c 64 20 62 65 20 74 6f 20 63 68 61 6e 67 65 20  ld be to change 
2af00 74 68 65 20 4f 50 5f 53 43 6f 70 79 20 75 73 65  the OP_SCopy use
2af10 64 20 74 6f 20 63 6f 70 79 20 63 61 63 68 65 64  d to copy cached
2af20 0a 20 20 2a 2a 20 76 61 6c 75 65 73 20 74 6f 20  .  ** values to 
2af30 61 6e 20 4f 50 5f 43 6f 70 79 2e 0a 20 20 2a 2f  an OP_Copy..  */
2af40 0a 20 20 69 66 28 20 72 65 67 48 69 74 20 29 7b  .  if( regHit ){
2af50 0a 20 20 20 20 61 64 64 72 48 69 74 54 65 73 74  .    addrHitTest
2af60 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
2af70 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20 72  dOp1(v, OP_If, r
2af80 65 67 48 69 74 29 3b 20 56 64 62 65 43 6f 76 65  egHit); VdbeCove
2af90 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 73  rage(v);.  }.  s
2afa0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
2afb0 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
2afc0 66 6f 72 28 69 3d 30 2c 20 70 43 3d 70 41 67 67  for(i=0, pC=pAgg
2afd0 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41  Info->aCol; i<pA
2afe0 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c  ggInfo->nAccumul
2aff0 61 74 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29  ator; i++, pC++)
2b000 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
2b010 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 43  rCode(pParse, pC
2b020 2d 3e 70 45 78 70 72 2c 20 70 43 2d 3e 69 4d 65  ->pExpr, pC->iMe
2b030 6d 29 3b 0a 20 20 7d 0a 20 20 70 41 67 67 49 6e  m);.  }.  pAggIn
2b040 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d  fo->directMode =
2b050 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70   0;.  sqlite3Exp
2b060 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
2b070 73 65 29 3b 0a 20 20 69 66 28 20 61 64 64 72 48  se);.  if( addrH
2b080 69 74 54 65 73 74 20 29 7b 0a 20 20 20 20 73 71  itTest ){.    sq
2b090 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
2b0a0 65 28 76 2c 20 61 64 64 72 48 69 74 54 65 73 74  e(v, addrHitTest
2b0b0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
2b0c0 41 64 64 20 61 20 73 69 6e 67 6c 65 20 4f 50 5f  Add a single OP_
2b0d0 45 78 70 6c 61 69 6e 20 69 6e 73 74 72 75 63 74  Explain instruct
2b0e0 69 6f 6e 20 74 6f 20 74 68 65 20 56 44 42 45 20  ion to the VDBE 
2b0f0 74 6f 20 65 78 70 6c 61 69 6e 20 61 20 73 69 6d  to explain a sim
2b100 70 6c 65 0a 2a 2a 20 63 6f 75 6e 74 28 2a 29 20  ple.** count(*) 
2b110 71 75 65 72 79 20 28 22 53 45 4c 45 43 54 20 63  query ("SELECT c
2b120 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 70 54 61  ount(*) FROM pTa
2b130 62 22 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  b")..*/.#ifndef 
2b140 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
2b150 41 49 4e 0a 73 74 61 74 69 63 20 76 6f 69 64 20  AIN.static void 
2b160 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75  explainSimpleCou
2b170 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  nt(.  Parse *pPa
2b180 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
2b190 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63        /* Parse c
2b1a0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c  ontext */.  Tabl
2b1b0 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20  e *pTab,        
2b1c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2b1d0 61 62 6c 65 20 62 65 69 6e 67 20 71 75 65 72 69  able being queri
2b1e0 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  ed */.  Index *p
2b1f0 49 64 78 20 20 20 20 20 20 20 20 20 20 20 20 20  Idx             
2b200 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
2b210 20 75 73 65 64 20 74 6f 20 6f 70 74 69 6d 69 7a   used to optimiz
2b220 65 20 73 63 61 6e 2c 20 6f 72 20 4e 55 4c 4c 20  e scan, or NULL 
2b230 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 50 61 72  */.){.  if( pPar
2b240 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29  se->explain==2 )
2b250 7b 0a 20 20 20 20 69 6e 74 20 62 43 6f 76 65 72  {.    int bCover
2b260 20 3d 20 28 70 49 64 78 21 3d 30 20 26 26 20 28   = (pIdx!=0 && (
2b270 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 7c  HasRowid(pTab) |
2b280 7c 20 21 49 73 50 72 69 6d 61 72 79 4b 65 79 49  | !IsPrimaryKeyI
2b290 6e 64 65 78 28 70 49 64 78 29 29 29 3b 0a 20 20  ndex(pIdx)));.  
2b2a0 20 20 63 68 61 72 20 2a 7a 45 71 70 20 3d 20 73    char *zEqp = s
2b2b0 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50  qlite3MPrintf(pP
2b2c0 61 72 73 65 2d 3e 64 62 2c 20 22 53 43 41 4e 20  arse->db, "SCAN 
2b2d0 54 41 42 4c 45 20 25 73 25 73 25 73 22 2c 0a 20  TABLE %s%s%s",. 
2b2e0 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61         pTab->zNa
2b2f0 6d 65 2c 0a 20 20 20 20 20 20 20 20 62 43 6f 76  me,.        bCov
2b300 65 72 20 3f 20 22 20 55 53 49 4e 47 20 43 4f 56  er ? " USING COV
2b310 45 52 49 4e 47 20 49 4e 44 45 58 20 22 20 3a 20  ERING INDEX " : 
2b320 22 22 2c 0a 20 20 20 20 20 20 20 20 62 43 6f 76  "",.        bCov
2b330 65 72 20 3f 20 70 49 64 78 2d 3e 7a 4e 61 6d 65  er ? pIdx->zName
2b340 20 3a 20 22 22 0a 20 20 20 20 29 3b 0a 20 20 20   : "".    );.   
2b350 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2b360 70 34 28 0a 20 20 20 20 20 20 20 20 70 50 61 72  p4(.        pPar
2b370 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 45 78  se->pVdbe, OP_Ex
2b380 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69  plain, pParse->i
2b390 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20  SelectId, 0, 0, 
2b3a0 7a 45 71 70 2c 20 50 34 5f 44 59 4e 41 4d 49 43  zEqp, P4_DYNAMIC
2b3b0 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65  .    );.  }.}.#e
2b3c0 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 65 78 70  lse.# define exp
2b3d0 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28  lainSimpleCount(
2b3e0 61 2c 62 2c 63 29 0a 23 65 6e 64 69 66 0a 0a 2f  a,b,c).#endif../
2b3f0 2a 0a 2a 2a 20 43 6f 6e 74 65 78 74 20 6f 62 6a  *.** Context obj
2b400 65 63 74 20 66 6f 72 20 68 61 76 69 6e 67 54 6f  ect for havingTo
2b410 57 68 65 72 65 45 78 70 72 43 62 28 29 2e 0a 2a  WhereExprCb()..*
2b420 2f 0a 73 74 72 75 63 74 20 48 61 76 69 6e 67 54  /.struct HavingT
2b430 6f 57 68 65 72 65 43 74 78 20 7b 0a 20 20 45 78  oWhereCtx {.  Ex
2b440 70 72 20 2a 2a 70 70 57 68 65 72 65 3b 0a 20 20  pr **ppWhere;.  
2b450 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70  ExprList *pGroup
2b460 42 79 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 73 71  By;.};../*.** sq
2b470 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 29 20  lite3WalkExpr() 
2b480 63 61 6c 6c 62 61 63 6b 20 75 73 65 64 20 62 79  callback used by
2b490 20 68 61 76 69 6e 67 54 6f 57 68 65 72 65 28 29   havingToWhere()
2b4a0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e  ..**.** If the n
2b4b0 6f 64 65 20 70 61 73 73 65 64 20 74 6f 20 74 68  ode passed to th
2b4c0 65 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 61 20  e callback is a 
2b4d0 54 4b 5f 41 4e 44 20 6e 6f 64 65 2c 20 72 65 74  TK_AND node, ret
2b4e0 75 72 6e 20 0a 2a 2a 20 57 52 43 5f 43 6f 6e 74  urn .** WRC_Cont
2b4f0 69 6e 75 65 20 74 6f 20 74 65 6c 6c 20 73 71 6c  inue to tell sql
2b500 69 74 65 33 57 61 6c 6b 45 78 70 72 28 29 20 74  ite3WalkExpr() t
2b510 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
2b520 68 20 63 68 69 6c 64 20 6e 6f 64 65 73 2e 0a 2a  h child nodes..*
2b530 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
2b540 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
2b550 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
2b560 61 6c 73 6f 20 63 68 65 63 6b 20 69 66 20 74 68  also check if th
2b570 65 20 0a 2a 2a 20 73 75 62 2d 65 78 70 72 65 73  e .** sub-expres
2b580 73 69 6f 6e 20 6d 61 74 63 68 65 73 20 74 68 65  sion matches the
2b590 20 63 72 69 74 65 72 69 61 20 66 6f 72 20 62 65   criteria for be
2b5a0 69 6e 67 20 6d 6f 76 65 64 20 74 6f 20 74 68 65  ing moved to the
2b5b0 20 57 48 45 52 45 0a 2a 2a 20 63 6c 61 75 73 65   WHERE.** clause
2b5c0 2e 20 49 66 20 73 6f 2c 20 61 64 64 20 69 74 20  . If so, add it 
2b5d0 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  to the WHERE cla
2b5e0 75 73 65 20 61 6e 64 20 72 65 70 6c 61 63 65 20  use and replace 
2b5f0 74 68 65 20 73 75 62 2d 65 78 70 72 65 73 73 69  the sub-expressi
2b600 6f 6e 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65  on.** within the
2b610 20 48 41 56 49 4e 47 20 65 78 70 72 65 73 73 69   HAVING expressi
2b620 6f 6e 20 77 69 74 68 20 61 20 63 6f 6e 73 74 61  on with a consta
2b630 6e 74 20 22 31 22 2e 0a 2a 2f 0a 73 74 61 74 69  nt "1"..*/.stati
2b640 63 20 69 6e 74 20 68 61 76 69 6e 67 54 6f 57 68  c int havingToWh
2b650 65 72 65 45 78 70 72 43 62 28 57 61 6c 6b 65 72  ereExprCb(Walker
2b660 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20   *pWalker, Expr 
2b670 2a 70 45 78 70 72 29 7b 0a 20 20 69 66 28 20 70  *pExpr){.  if( p
2b680 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 4e 44  Expr->op!=TK_AND
2b690 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 48   ){.    struct H
2b6a0 61 76 69 6e 67 54 6f 57 68 65 72 65 43 74 78 20  avingToWhereCtx 
2b6b0 2a 70 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e  *p = pWalker->u.
2b6c0 70 48 61 76 69 6e 67 43 74 78 3b 0a 20 20 20 20  pHavingCtx;.    
2b6d0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
2b6e0 73 43 6f 6e 73 74 61 6e 74 4f 72 47 72 6f 75 70  sConstantOrGroup
2b6f0 42 79 28 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72  By(pWalker->pPar
2b700 73 65 2c 20 70 45 78 70 72 2c 20 70 2d 3e 70 47  se, pExpr, p->pG
2b710 72 6f 75 70 42 79 29 20 29 7b 0a 20 20 20 20 20  roupBy) ){.     
2b720 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
2b730 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 2d 3e  Walker->pParse->
2b740 64 62 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  db;.      Expr *
2b750 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
2b760 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49  prAlloc(db, TK_I
2b770 4e 54 45 47 45 52 2c 20 26 73 71 6c 69 74 65 33  NTEGER, &sqlite3
2b780 49 6e 74 54 6f 6b 65 6e 73 5b 31 5d 2c 20 30 29  IntTokens[1], 0)
2b790 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77  ;.      if( pNew
2b7a0 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72   ){.        Expr
2b7b0 20 2a 70 57 68 65 72 65 20 3d 20 2a 28 70 2d 3e   *pWhere = *(p->
2b7c0 70 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20  ppWhere);.      
2b7d0 20 20 53 57 41 50 28 45 78 70 72 2c 20 2a 70 4e    SWAP(Expr, *pN
2b7e0 65 77 2c 20 2a 70 45 78 70 72 29 3b 0a 20 20 20  ew, *pExpr);.   
2b7f0 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69       pNew = sqli
2b800 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70  te3ExprAnd(db, p
2b810 57 68 65 72 65 2c 20 70 4e 65 77 29 3b 0a 20 20  Where, pNew);.  
2b820 20 20 20 20 20 20 2a 28 70 2d 3e 70 70 57 68 65        *(p->ppWhe
2b830 72 65 29 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  re) = pNew;.    
2b840 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65    }.    }.    re
2b850 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a  turn WRC_Prune;.
2b860 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43    }.  return WRC
2b870 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a  _Continue;.}../*
2b880 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 65 6c 69  .** Transfer eli
2b890 67 69 62 6c 65 20 74 65 72 6d 73 20 66 72 6f 6d  gible terms from
2b8a0 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75   the HAVING clau
2b8b0 73 65 20 6f 66 20 61 20 71 75 65 72 79 2c 20 77  se of a query, w
2b8c0 68 69 63 68 20 69 73 0a 2a 2a 20 70 72 6f 63 65  hich is.** proce
2b8d0 73 73 65 64 20 61 66 74 65 72 20 67 72 6f 75 70  ssed after group
2b8e0 69 6e 67 2c 20 74 6f 20 74 68 65 20 57 48 45 52  ing, to the WHER
2b8f0 45 20 63 6c 61 75 73 65 2c 20 77 68 69 63 68 20  E clause, which 
2b900 69 73 20 70 72 6f 63 65 73 73 65 64 20 62 65 66  is processed bef
2b910 6f 72 65 0a 2a 2a 20 67 72 6f 75 70 69 6e 67 2e  ore.** grouping.
2b920 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68   For example, th
2b930 65 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20  e query:.**.**  
2b940 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 3c   SELECT * FROM <
2b950 74 61 62 6c 65 73 3e 20 57 48 45 52 45 20 61 3d  tables> WHERE a=
2b960 3f 20 47 52 4f 55 50 20 42 59 20 62 20 48 41 56  ? GROUP BY b HAV
2b970 49 4e 47 20 62 3d 3f 20 41 4e 44 20 63 3d 3f 0a  ING b=? AND c=?.
2b980 2a 2a 0a 2a 2a 20 63 61 6e 20 62 65 20 72 65 77  **.** can be rew
2b990 72 69 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a  ritten as:.**.**
2b9a0 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
2b9b0 20 3c 74 61 62 6c 65 73 3e 20 57 48 45 52 45 20   <tables> WHERE 
2b9c0 61 3d 3f 20 41 4e 44 20 62 3d 3f 20 47 52 4f 55  a=? AND b=? GROU
2b9d0 50 20 42 59 20 62 20 48 41 56 49 4e 47 20 63 3d  P BY b HAVING c=
2b9e0 3f 0a 2a 2a 0a 2a 2a 20 41 20 74 65 72 6d 20 6f  ?.**.** A term o
2b9f0 66 20 74 68 65 20 48 41 56 49 4e 47 20 65 78 70  f the HAVING exp
2ba00 72 65 73 73 69 6f 6e 20 69 73 20 65 6c 69 67 69  ression is eligi
2ba10 62 6c 65 20 66 6f 72 20 74 72 61 6e 73 66 65 72  ble for transfer
2ba20 20 69 66 20 69 74 20 63 6f 6e 73 69 73 74 73 0a   if it consists.
2ba30 2a 2a 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 63  ** entirely of c
2ba40 6f 6e 73 74 61 6e 74 73 20 61 6e 64 20 65 78 70  onstants and exp
2ba50 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72  ressions that ar
2ba60 65 20 61 6c 73 6f 20 47 52 4f 55 50 20 42 59 20  e also GROUP BY 
2ba70 74 65 72 6d 73 20 74 68 61 74 0a 2a 2a 20 75 73  terms that.** us
2ba80 65 20 74 68 65 20 22 42 49 4e 41 52 59 22 20 63  e the "BINARY" c
2ba90 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
2baa0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
2bab0 64 20 68 61 76 69 6e 67 54 6f 57 68 65 72 65 28  d havingToWhere(
2bac0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
2bad0 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47  ,.  ExprList *pG
2bae0 72 6f 75 70 42 79 2c 0a 20 20 45 78 70 72 20 2a  roupBy,.  Expr *
2baf0 70 48 61 76 69 6e 67 2c 20 0a 20 20 45 78 70 72  pHaving, .  Expr
2bb00 20 2a 2a 70 70 57 68 65 72 65 0a 29 7b 0a 20 20   **ppWhere.){.  
2bb10 73 74 72 75 63 74 20 48 61 76 69 6e 67 54 6f 57  struct HavingToW
2bb20 68 65 72 65 43 74 78 20 73 43 74 78 3b 0a 20 20  hereCtx sCtx;.  
2bb30 57 61 6c 6b 65 72 20 73 57 61 6c 6b 65 72 3b 0a  Walker sWalker;.
2bb40 0a 20 20 73 43 74 78 2e 70 70 57 68 65 72 65 20  .  sCtx.ppWhere 
2bb50 3d 20 70 70 57 68 65 72 65 3b 0a 20 20 73 43 74  = ppWhere;.  sCt
2bb60 78 2e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72  x.pGroupBy = pGr
2bb70 6f 75 70 42 79 3b 0a 0a 20 20 6d 65 6d 73 65 74  oupBy;..  memset
2bb80 28 26 73 57 61 6c 6b 65 72 2c 20 30 2c 20 73 69  (&sWalker, 0, si
2bb90 7a 65 6f 66 28 73 57 61 6c 6b 65 72 29 29 3b 0a  zeof(sWalker));.
2bba0 20 20 73 57 61 6c 6b 65 72 2e 70 50 61 72 73 65    sWalker.pParse
2bbb0 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 57 61   = pParse;.  sWa
2bbc0 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61  lker.xExprCallba
2bbd0 63 6b 20 3d 20 68 61 76 69 6e 67 54 6f 57 68 65  ck = havingToWhe
2bbe0 72 65 45 78 70 72 43 62 3b 0a 20 20 73 57 61 6c  reExprCb;.  sWal
2bbf0 6b 65 72 2e 75 2e 70 48 61 76 69 6e 67 43 74 78  ker.u.pHavingCtx
2bc00 20 3d 20 26 73 43 74 78 3b 0a 20 20 73 71 6c 69   = &sCtx;.  sqli
2bc10 74 65 33 57 61 6c 6b 45 78 70 72 28 26 73 57 61  te3WalkExpr(&sWa
2bc20 6c 6b 65 72 2c 20 70 48 61 76 69 6e 67 29 3b 0a  lker, pHaving);.
2bc30 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  }../*.** Check t
2bc40 6f 20 73 65 65 20 69 66 20 74 68 65 20 70 54 68  o see if the pTh
2bc50 69 73 20 65 6e 74 72 79 20 6f 66 20 70 54 61 62  is entry of pTab
2bc60 4c 69 73 74 20 69 73 20 61 20 73 65 6c 66 2d 6a  List is a self-j
2bc70 6f 69 6e 20 6f 66 20 61 20 70 72 69 6f 72 20 76  oin of a prior v
2bc80 69 65 77 2e 0a 2a 2a 20 49 66 20 69 74 20 69 73  iew..** If it is
2bc90 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68  , then return th
2bca0 65 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 66  e SrcList_item f
2bcb0 6f 72 20 74 68 65 20 70 72 69 6f 72 20 76 69 65  or the prior vie
2bcc0 77 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74  w.  If it is not
2bcd0 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e  ,.** then return
2bce0 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74   0..*/.static st
2bcf0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2bd00 6d 20 2a 69 73 53 65 6c 66 4a 6f 69 6e 56 69 65  m *isSelfJoinVie
2bd10 77 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  w(.  SrcList *pT
2bd20 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20  abList,         
2bd30 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20    /* Search for 
2bd40 73 65 6c 66 2d 6a 6f 69 6e 73 20 69 6e 20 74 68  self-joins in th
2bd50 69 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  is FROM clause *
2bd60 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
2bd70 73 74 5f 69 74 65 6d 20 2a 70 54 68 69 73 20 20  st_item *pThis  
2bd80 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 70   /* Search for p
2bd90 72 69 6f 72 20 72 65 66 65 72 65 6e 63 65 20 74  rior reference t
2bda0 6f 20 74 68 69 73 20 73 75 62 71 75 65 72 79 20  o this subquery 
2bdb0 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53  */.){.  struct S
2bdc0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
2bdd0 65 6d 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 20  em;.  for(pItem 
2bde0 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 70  = pTabList->a; p
2bdf0 49 74 65 6d 3c 70 54 68 69 73 3b 20 70 49 74 65  Item<pThis; pIte
2be00 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 49  m++){.    if( pI
2be10 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  tem->pSelect==0 
2be20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2be30 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 76 69  if( pItem->fg.vi
2be40 61 43 6f 72 6f 75 74 69 6e 65 20 29 20 63 6f 6e  aCoroutine ) con
2be50 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
2be60 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29  Item->zName==0 )
2be70 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
2be80 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  f( sqlite3_stric
2be90 6d 70 28 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62  mp(pItem->zDatab
2bea0 61 73 65 2c 20 70 54 68 69 73 2d 3e 7a 44 61 74  ase, pThis->zDat
2beb0 61 62 61 73 65 29 21 3d 30 20 29 20 63 6f 6e 74  abase)!=0 ) cont
2bec0 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73 71  inue;.    if( sq
2bed0 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 70 49  lite3_stricmp(pI
2bee0 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 54 68 69  tem->zName, pThi
2bef0 73 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 20 63  s->zName)!=0 ) c
2bf00 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
2bf10 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
2bf20 61 72 65 28 30 2c 20 0a 20 20 20 20 20 20 20 20  are(0, .        
2bf30 20 20 70 54 68 69 73 2d 3e 70 53 65 6c 65 63 74    pThis->pSelect
2bf40 2d 3e 70 57 68 65 72 65 2c 20 70 49 74 65 6d 2d  ->pWhere, pItem-
2bf50 3e 70 53 65 6c 65 63 74 2d 3e 70 57 68 65 72 65  >pSelect->pWhere
2bf60 2c 20 2d 31 29 20 0a 20 20 20 20 29 7b 0a 20 20  , -1) .    ){.  
2bf70 20 20 20 20 2f 2a 20 54 68 65 20 76 69 65 77 20      /* The view 
2bf80 77 61 73 20 6d 6f 64 69 66 69 65 64 20 62 79 20  was modified by 
2bf90 73 6f 6d 65 20 6f 74 68 65 72 20 6f 70 74 69 6d  some other optim
2bfa0 69 7a 61 74 69 6f 6e 20 73 75 63 68 20 61 73 0a  ization such as.
2bfb0 20 20 20 20 20 20 2a 2a 20 70 75 73 68 44 6f 77        ** pushDow
2bfc0 6e 57 68 65 72 65 54 65 72 6d 73 28 29 20 2a 2f  nWhereTerms() */
2bfd0 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
2bfe0 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
2bff0 6e 20 70 49 74 65 6d 3b 0a 20 20 7d 0a 20 20 72  n pItem;.  }.  r
2c000 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 64  eturn 0;.}..#ifd
2c010 65 66 20 53 51 4c 49 54 45 5f 43 4f 55 4e 54 4f  ef SQLITE_COUNTO
2c020 46 56 49 45 57 5f 4f 50 54 49 4d 49 5a 41 54 49  FVIEW_OPTIMIZATI
2c030 4f 4e 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  ON./*.** Attempt
2c040 20 74 6f 20 74 72 61 6e 73 66 6f 72 6d 20 61 20   to transform a 
2c050 71 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f 72  query of the for
2c060 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43  m.**.**    SELEC
2c070 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
2c080 28 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74  (SELECT x FROM t
2c090 31 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45  1 UNION ALL SELE
2c0a0 43 54 20 79 20 46 52 4f 4d 20 74 32 29 0a 2a 2a  CT y FROM t2).**
2c0b0 0a 2a 2a 20 49 6e 74 6f 20 74 68 69 73 3a 0a 2a  .** Into this:.*
2c0c0 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 28  *.**    SELECT (
2c0d0 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
2c0e0 46 52 4f 4d 20 74 31 29 2b 28 53 45 4c 45 43 54  FROM t1)+(SELECT
2c0f0 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74   count(*) FROM t
2c100 32 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 72 61  2).**.** The tra
2c110 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 6c 79  nsformation only
2c120 20 77 6f 72 6b 73 20 69 66 20 61 6c 6c 20 6f 66   works if all of
2c130 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
2c140 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20  re true:.**.**  
2c150 20 2a 20 20 54 68 65 20 73 75 62 71 75 65 72 79   *  The subquery
2c160 20 69 73 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20   is a UNION ALL 
2c170 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 74  of two or more t
2c180 65 72 6d 73 0a 2a 2a 20 20 20 2a 20 20 54 68 65  erms.**   *  The
2c190 72 65 20 69 73 20 6e 6f 20 57 48 45 52 45 20 6f  re is no WHERE o
2c1a0 72 20 47 52 4f 55 50 20 42 59 20 6f 72 20 48 41  r GROUP BY or HA
2c1b0 56 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 6e 20  VING clauses on 
2c1c0 74 68 65 20 73 75 62 71 75 65 72 69 65 73 0a 2a  the subqueries.*
2c1d0 2a 20 20 20 2a 20 20 54 68 65 20 6f 75 74 65 72  *   *  The outer
2c1e0 20 71 75 65 72 79 20 69 73 20 61 20 73 69 6d 70   query is a simp
2c1f0 6c 65 20 63 6f 75 6e 74 28 2a 29 0a 2a 2a 0a 2a  le count(*).**.*
2c200 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
2c210 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   the optimizatio
2c220 6e 20 69 73 20 75 6e 64 65 72 74 61 6b 65 6e 2e  n is undertaken.
2c230 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
2c240 6f 75 6e 74 4f 66 56 69 65 77 4f 70 74 69 6d 69  ountOfViewOptimi
2c250 7a 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  zation(Parse *pP
2c260 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29  arse, Select *p)
2c270 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62  {.  Select *pSub
2c280 2c 20 2a 70 50 72 69 6f 72 3b 0a 20 20 45 78 70  , *pPrior;.  Exp
2c290 72 20 2a 70 45 78 70 72 3b 0a 20 20 45 78 70 72  r *pExpr;.  Expr
2c2a0 20 2a 70 43 6f 75 6e 74 3b 0a 20 20 73 71 6c 69   *pCount;.  sqli
2c2b0 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 28  te3 *db;.  if( (
2c2c0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
2c2d0 5f 41 67 67 72 65 67 61 74 65 29 3d 3d 30 20 29  _Aggregate)==0 )
2c2e0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20   return 0;   /* 
2c2f0 54 68 69 73 20 69 73 20 61 6e 20 61 67 67 72 65  This is an aggre
2c300 67 61 74 65 20 71 75 65 72 79 20 2a 2f 0a 20 20  gate query */.  
2c310 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  if( p->pEList->n
2c320 45 78 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e  Expr!=1 ) return
2c330 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2c340 20 20 2f 2a 20 53 69 6e 67 6c 65 20 72 65 73 75    /* Single resu
2c350 6c 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 70  lt column */.  p
2c360 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74  Expr = p->pEList
2c370 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
2c380 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
2c390 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29  K_AGG_FUNCTION )
2c3a0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
2c3b0 20 20 2f 2a 20 52 65 73 75 6c 74 20 69 73 20 61    /* Result is a
2c3c0 6e 20 61 67 67 72 65 67 61 74 65 20 2a 2f 0a 20  n aggregate */. 
2c3d0 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
2c3e0 69 63 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54  icmp(pExpr->u.zT
2c3f0 6f 6b 65 6e 2c 22 63 6f 75 6e 74 22 29 20 29 20  oken,"count") ) 
2c400 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 4d 75  return 0;  /* Mu
2c410 73 74 20 62 65 20 63 6f 75 6e 74 28 29 20 2a 2f  st be count() */
2c420 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 78 2e  .  if( pExpr->x.
2c430 70 4c 69 73 74 21 3d 30 20 29 20 72 65 74 75 72  pList!=0 ) retur
2c440 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
2c450 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20       /* Must be 
2c460 63 6f 75 6e 74 28 2a 29 20 2a 2f 0a 20 20 69 66  count(*) */.  if
2c470 28 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 21  ( p->pSrc->nSrc!
2c480 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =1 ) return 0;  
2c490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c4a0 2f 2a 20 4f 6e 65 20 74 61 62 6c 65 20 69 6e 20  /* One table in 
2c4b0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
2c4c0 2a 2f 0a 20 20 70 53 75 62 20 3d 20 70 2d 3e 70  */.  pSub = p->p
2c4d0 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63  Src->a[0].pSelec
2c4e0 74 3b 0a 20 20 69 66 28 20 70 53 75 62 3d 3d 30  t;.  if( pSub==0
2c4f0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
2c500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c510 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52         /* The FR
2c520 4f 4d 20 69 73 20 61 20 73 75 62 71 75 65 72 79  OM is a subquery
2c530 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
2c540 70 50 72 69 6f 72 3d 3d 30 20 29 20 72 65 74 75  pPrior==0 ) retu
2c550 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
2c560 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20          /* Must 
2c570 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 75  be a compound su
2c580 62 71 75 65 72 79 20 2a 2f 0a 20 20 64 6f 7b 0a  bquery */.  do{.
2c590 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 6f 70      if( pSub->op
2c5a0 21 3d 54 4b 5f 41 4c 4c 20 26 26 20 70 53 75 62  !=TK_ALL && pSub
2c5b0 2d 3e 70 50 72 69 6f 72 20 29 20 72 65 74 75 72  ->pPrior ) retur
2c5c0 6e 20 30 3b 20 20 2f 2a 20 4d 75 73 74 20 62 65  n 0;  /* Must be
2c5d0 20 55 4e 49 4f 4e 20 41 4c 4c 20 2a 2f 0a 20 20   UNION ALL */.  
2c5e0 20 20 69 66 28 20 70 53 75 62 2d 3e 70 57 68 65    if( pSub->pWhe
2c5f0 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  re ) return 0;  
2c600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c610 20 20 20 20 2f 2a 20 4e 6f 20 57 48 45 52 45 20      /* No WHERE 
2c620 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 69 66  clause */.    if
2c630 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73  ( pSub->selFlags
2c640 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 20   & SF_Aggregate 
2c650 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
2c660 2f 2a 20 4e 6f 74 20 61 6e 20 61 67 67 72 65 67  /* Not an aggreg
2c670 61 74 65 20 2a 2f 0a 20 20 20 20 70 53 75 62 20  ate */.    pSub 
2c680 3d 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 3b 20  = pSub->pPrior; 
2c690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c6b0 52 65 70 65 61 74 20 6f 76 65 72 20 63 6f 6d 70  Repeat over comp
2c6c0 6f 75 6e 64 20 74 65 72 6d 73 20 2a 2f 0a 20 20  ound terms */.  
2c6d0 7d 77 68 69 6c 65 28 20 70 53 75 62 20 29 3b 0a  }while( pSub );.
2c6e0 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63  .  /* If we reac
2c6f0 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  h this point, th
2c700 61 74 20 6d 65 61 6e 73 20 69 74 20 69 73 20 4f  at means it is O
2c710 4b 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 65  K to perform the
2c720 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20   transformation 
2c730 2a 2f 0a 0a 20 20 64 62 20 3d 20 70 50 61 72 73  */..  db = pPars
2c740 65 2d 3e 64 62 3b 0a 20 20 70 43 6f 75 6e 74 20  e->db;.  pCount 
2c750 3d 20 70 45 78 70 72 3b 0a 20 20 70 45 78 70 72  = pExpr;.  pExpr
2c760 20 3d 20 30 3b 0a 20 20 70 53 75 62 20 3d 20 70   = 0;.  pSub = p
2c770 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65  ->pSrc->a[0].pSe
2c780 6c 65 63 74 3b 0a 20 20 70 2d 3e 70 53 72 63 2d  lect;.  p->pSrc-
2c790 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 20 3d 20  >a[0].pSelect = 
2c7a0 30 3b 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c  0;.  sqlite3SrcL
2c7b0 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
2c7c0 3e 70 53 72 63 29 3b 0a 20 20 70 2d 3e 70 53 72  >pSrc);.  p->pSr
2c7d0 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  c = sqlite3DbMal
2c7e0 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e  locZero(pParse->
2c7f0 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 2d 3e 70  db, sizeof(*p->p
2c800 53 72 63 29 29 3b 0a 20 20 77 68 69 6c 65 28 20  Src));.  while( 
2c810 70 53 75 62 20 29 7b 0a 20 20 20 20 45 78 70 72  pSub ){.    Expr
2c820 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20 70 50 72   *pTerm;.    pPr
2c830 69 6f 72 20 3d 20 70 53 75 62 2d 3e 70 50 72 69  ior = pSub->pPri
2c840 6f 72 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70 50  or;.    pSub->pP
2c850 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 53  rior = 0;.    pS
2c860 75 62 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20  ub->pNext = 0;. 
2c870 20 20 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67     pSub->selFlag
2c880 73 20 7c 3d 20 53 46 5f 41 67 67 72 65 67 61 74  s |= SF_Aggregat
2c890 65 3b 0a 20 20 20 20 70 53 75 62 2d 3e 73 65 6c  e;.    pSub->sel
2c8a0 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 43 6f 6d  Flags &= ~SF_Com
2c8b0 70 6f 75 6e 64 3b 0a 20 20 20 20 70 53 75 62 2d  pound;.    pSub-
2c8c0 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 30 3b  >nSelectRow = 0;
2c8d0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
2c8e0 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
2c8f0 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sub->pEList);.  
2c900 20 20 70 54 65 72 6d 20 3d 20 70 50 72 69 6f 72    pTerm = pPrior
2c910 20 3f 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   ? sqlite3ExprDu
2c920 70 28 64 62 2c 20 70 43 6f 75 6e 74 2c 20 30 29  p(db, pCount, 0)
2c930 20 3a 20 70 43 6f 75 6e 74 3b 0a 20 20 20 20 70   : pCount;.    p
2c940 53 75 62 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71  Sub->pEList = sq
2c950 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
2c960 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 70  end(pParse, 0, p
2c970 54 65 72 6d 29 3b 0a 20 20 20 20 70 54 65 72 6d  Term);.    pTerm
2c980 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
2c990 70 50 61 72 73 65 2c 20 54 4b 5f 53 45 4c 45 43  pParse, TK_SELEC
2c9a0 54 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  T, 0, 0);.    sq
2c9b0 6c 69 74 65 33 50 45 78 70 72 41 64 64 53 65 6c  lite3PExprAddSel
2c9c0 65 63 74 28 70 50 61 72 73 65 2c 20 70 54 65 72  ect(pParse, pTer
2c9d0 6d 2c 20 70 53 75 62 29 3b 0a 20 20 20 20 69 66  m, pSub);.    if
2c9e0 28 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20  ( pExpr==0 ){.  
2c9f0 20 20 20 20 70 45 78 70 72 20 3d 20 70 54 65 72      pExpr = pTer
2ca00 6d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  m;.    }else{.  
2ca10 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69      pExpr = sqli
2ca20 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
2ca30 20 54 4b 5f 50 4c 55 53 2c 20 70 54 65 72 6d 2c   TK_PLUS, pTerm,
2ca40 20 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20   pExpr);.    }. 
2ca50 20 20 20 70 53 75 62 20 3d 20 70 50 72 69 6f 72     pSub = pPrior
2ca60 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 45 4c 69 73  ;.  }.  p->pELis
2ca70 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 20 3d 20  t->a[0].pExpr = 
2ca80 70 45 78 70 72 3b 0a 20 20 70 2d 3e 73 65 6c 46  pExpr;.  p->selF
2ca90 6c 61 67 73 20 26 3d 20 7e 53 46 5f 41 67 67 72  lags &= ~SF_Aggr
2caa0 65 67 61 74 65 3b 0a 0a 23 69 66 20 53 45 4c 45  egate;..#if SELE
2cab0 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
2cac0 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
2cad0 65 63 74 54 72 61 63 65 20 26 20 30 78 34 30 30  ectTrace & 0x400
2cae0 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52   ){.    SELECTTR
2caf0 41 43 45 28 30 78 34 30 30 2c 70 50 61 72 73 65  ACE(0x400,pParse
2cb00 2c 70 2c 28 22 41 66 74 65 72 20 63 6f 75 6e 74  ,p,("After count
2cb10 2d 6f 66 2d 76 69 65 77 20 6f 70 74 69 6d 69 7a  -of-view optimiz
2cb20 61 74 69 6f 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20  ation:\n"));.   
2cb30 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
2cb40 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b  Select(0, p, 0);
2cb50 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
2cb60 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  turn 1;.}.#endif
2cb70 20 2f 2a 20 53 51 4c 49 54 45 5f 43 4f 55 4e 54   /* SQLITE_COUNT
2cb80 4f 46 56 49 45 57 5f 4f 50 54 49 4d 49 5a 41 54  OFVIEW_OPTIMIZAT
2cb90 49 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65  ION */../*.** Ge
2cba0 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
2cbb0 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
2cbc0 6d 65 6e 74 20 67 69 76 65 6e 20 69 6e 20 74 68  ment given in th
2cbd0 65 20 70 20 61 72 67 75 6d 65 6e 74 2e 20 20 0a  e p argument.  .
2cbe0 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74  **.** The result
2cbf0 73 20 61 72 65 20 72 65 74 75 72 6e 65 64 20 61  s are returned a
2cc00 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20  ccording to the 
2cc10 53 65 6c 65 63 74 44 65 73 74 20 73 74 72 75 63  SelectDest struc
2cc20 74 75 72 65 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d  ture..** See com
2cc30 6d 65 6e 74 73 20 69 6e 20 73 71 6c 69 74 65 49  ments in sqliteI
2cc40 6e 74 2e 68 20 66 6f 72 20 66 75 72 74 68 65 72  nt.h for further
2cc50 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a   information..**
2cc60 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2cc70 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d   returns the num
2cc80 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20  ber of errors.  
2cc90 49 66 20 61 6e 79 20 65 72 72 6f 72 73 20 61 72  If any errors ar
2cca0 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64  e.** encountered
2ccb0 2c 20 74 68 65 6e 20 61 6e 20 61 70 70 72 6f 70  , then an approp
2ccc0 72 69 61 74 65 20 65 72 72 6f 72 20 6d 65 73 73  riate error mess
2ccd0 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a  age is left in.*
2cce0 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  * pParse->zErrMs
2ccf0 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  g..**.** This ro
2cd00 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66  utine does NOT f
2cd10 72 65 65 20 74 68 65 20 53 65 6c 65 63 74 20 73  ree the Select s
2cd20 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20  tructure passed 
2cd30 69 6e 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c  in.  The.** call
2cd40 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65  ing function nee
2cd50 64 73 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a  ds to do that..*
2cd60 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c  /.int sqlite3Sel
2cd70 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ect(.  Parse *pP
2cd80 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  arse,         /*
2cd90 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
2cda0 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
2cdb0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
2cdc0 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  /* The SELECT st
2cdd0 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f  atement being co
2cde0 64 65 64 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ded. */.  Select
2cdf0 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20  Dest *pDest     
2ce00 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
2ce10 69 74 68 20 74 68 65 20 71 75 65 72 79 20 72 65  ith the query re
2ce20 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  sults */.){.  in
2ce30 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
2ce40 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
2ce50 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72 65  nters */.  Where
2ce60 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20  Info *pWInfo;   
2ce70 20 20 2f 2a 20 52 65 74 75 72 6e 20 66 72 6f 6d    /* Return from
2ce80 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
2ce90 69 6e 28 29 20 2a 2f 0a 20 20 56 64 62 65 20 2a  in() */.  Vdbe *
2cea0 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
2ceb0 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20   /* The virtual 
2cec0 6d 61 63 68 69 6e 65 20 75 6e 64 65 72 20 63 6f  machine under co
2ced0 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
2cee0 69 6e 74 20 69 73 41 67 67 3b 20 20 20 20 20 20  int isAgg;      
2cef0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
2cf00 6f 72 20 73 65 6c 65 63 74 20 6c 69 73 74 73 20  or select lists 
2cf10 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22 20  like "count(*)" 
2cf20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
2cf30 45 4c 69 73 74 20 3d 20 30 3b 20 20 2f 2a 20 4c  EList = 0;  /* L
2cf40 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  ist of columns t
2cf50 6f 20 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20  o extract. */.  
2cf60 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
2cf70 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f  t;     /* List o
2cf80 66 20 74 61 62 6c 65 73 20 74 6f 20 73 65 6c 65  f tables to sele
2cf90 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70  ct from */.  Exp
2cfa0 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20  r *pWhere;      
2cfb0 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
2cfc0 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
2cfd0 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c   NULL */.  ExprL
2cfe0 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20  ist *pGroupBy;  
2cff0 20 20 2f 2a 20 54 68 65 20 47 52 4f 55 50 20 42    /* The GROUP B
2d000 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  Y clause.  May b
2d010 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  e NULL */.  Expr
2d020 20 2a 70 48 61 76 69 6e 67 3b 20 20 20 20 20 20   *pHaving;      
2d030 20 20 20 2f 2a 20 54 68 65 20 48 41 56 49 4e 47     /* The HAVING
2d040 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
2d050 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 72   NULL */.  int r
2d060 63 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  c = 1;          
2d070 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65    /* Value to re
2d080 74 75 72 6e 20 66 72 6f 6d 20 74 68 69 73 20 66  turn from this f
2d090 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 44 69 73  unction */.  Dis
2d0a0 74 69 6e 63 74 43 74 78 20 73 44 69 73 74 69 6e  tinctCtx sDistin
2d0b0 63 74 3b 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20 68  ct; /* Info on h
2d0c0 6f 77 20 74 6f 20 63 6f 64 65 20 74 68 65 20 44  ow to code the D
2d0d0 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
2d0e0 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 73 53 6f  */.  SortCtx sSo
2d0f0 72 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49  rt;         /* I
2d100 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 63 6f  nfo on how to co
2d110 64 65 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  de the ORDER BY 
2d120 63 6c 61 75 73 65 20 2a 2f 0a 20 20 41 67 67 49  clause */.  AggI
2d130 6e 66 6f 20 73 41 67 67 49 6e 66 6f 3b 20 20 20  nfo sAggInfo;   
2d140 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f     /* Informatio
2d150 6e 20 75 73 65 64 20 62 79 20 61 67 67 72 65 67  n used by aggreg
2d160 61 74 65 20 71 75 65 72 69 65 73 20 2a 2f 0a 20  ate queries */. 
2d170 20 69 6e 74 20 69 45 6e 64 3b 20 20 20 20 20 20   int iEnd;      
2d180 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
2d190 73 73 20 6f 66 20 74 68 65 20 65 6e 64 20 6f 66  ss of the end of
2d1a0 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20   the query */.  
2d1b0 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
2d1c0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
2d1d0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
2d1e0 6e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  n */..#ifndef SQ
2d1f0 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
2d200 4e 0a 20 20 69 6e 74 20 69 52 65 73 74 6f 72 65  N.  int iRestore
2d210 53 65 6c 65 63 74 49 64 20 3d 20 70 50 61 72 73  SelectId = pPars
2d220 65 2d 3e 69 53 65 6c 65 63 74 49 64 3b 0a 20 20  e->iSelectId;.  
2d230 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49  pParse->iSelectI
2d240 64 20 3d 20 70 50 61 72 73 65 2d 3e 69 4e 65 78  d = pParse->iNex
2d250 74 53 65 6c 65 63 74 49 64 2b 2b 3b 0a 23 65 6e  tSelectId++;.#en
2d260 64 69 66 0a 0a 20 20 64 62 20 3d 20 70 50 61 72  dif..  db = pPar
2d270 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 3d  se->db;.  if( p=
2d280 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  =0 || db->malloc
2d290 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65  Failed || pParse
2d2a0 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 72 65  ->nErr ){.    re
2d2b0 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66  turn 1;.  }.  if
2d2c0 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
2d2d0 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
2d2e0 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20  E_SELECT, 0, 0, 
2d2f0 30 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  0) ) return 1;. 
2d300 20 6d 65 6d 73 65 74 28 26 73 41 67 67 49 6e 66   memset(&sAggInf
2d310 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 67  o, 0, sizeof(sAg
2d320 67 49 6e 66 6f 29 29 3b 0a 23 69 66 20 53 45 4c  gInfo));.#if SEL
2d330 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ECTTRACE_ENABLED
2d340 0a 20 20 70 50 61 72 73 65 2d 3e 6e 53 65 6c 65  .  pParse->nSele
2d350 63 74 49 6e 64 65 6e 74 2b 2b 3b 0a 20 20 53 45  ctIndent++;.  SE
2d360 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50 61 72  LECTTRACE(1,pPar
2d370 73 65 2c 70 2c 20 28 22 62 65 67 69 6e 20 70 72  se,p, ("begin pr
2d380 6f 63 65 73 73 69 6e 67 3a 5c 6e 22 29 29 3b 0a  ocessing:\n"));.
2d390 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
2d3a0 65 63 74 54 72 61 63 65 20 26 20 30 78 31 30 30  ectTrace & 0x100
2d3b0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54   ){.    sqlite3T
2d3c0 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c  reeViewSelect(0,
2d3d0 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   p, 0);.  }.#end
2d3e0 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  if..  assert( p-
2d3f0 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20  >pOrderBy==0 || 
2d400 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52  pDest->eDest!=SR
2d410 54 5f 44 69 73 74 46 69 66 6f 20 29 3b 0a 20 20  T_DistFifo );.  
2d420 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65  assert( p->pOrde
2d430 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d  rBy==0 || pDest-
2d440 3e 65 44 65 73 74 21 3d 53 52 54 5f 46 69 66 6f  >eDest!=SRT_Fifo
2d450 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
2d460 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20  >pOrderBy==0 || 
2d470 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52  pDest->eDest!=SR
2d480 54 5f 44 69 73 74 51 75 65 75 65 20 29 3b 0a 20  T_DistQueue );. 
2d490 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64   assert( p->pOrd
2d4a0 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74  erBy==0 || pDest
2d4b0 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 51 75 65  ->eDest!=SRT_Que
2d4c0 75 65 20 29 3b 0a 20 20 69 66 28 20 49 67 6e 6f  ue );.  if( Igno
2d4d0 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65  rableOrderby(pDe
2d4e0 73 74 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  st) ){.    asser
2d4f0 74 28 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  t(pDest->eDest==
2d500 53 52 54 5f 45 78 69 73 74 73 20 7c 7c 20 70 44  SRT_Exists || pD
2d510 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
2d520 55 6e 69 6f 6e 20 7c 7c 20 0a 20 20 20 20 20 20  Union || .      
2d530 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73       pDest->eDes
2d540 74 3d 3d 53 52 54 5f 45 78 63 65 70 74 20 7c 7c  t==SRT_Except ||
2d550 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
2d560 52 54 5f 44 69 73 63 61 72 64 20 7c 7c 0a 20 20  RT_Discard ||.  
2d570 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e           pDest->
2d580 65 44 65 73 74 3d 3d 53 52 54 5f 51 75 65 75 65  eDest==SRT_Queue
2d590 20 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73    || pDest->eDes
2d5a0 74 3d 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20  t==SRT_DistFifo 
2d5b0 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 70 44  ||.           pD
2d5c0 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
2d5d0 44 69 73 74 51 75 65 75 65 20 7c 7c 20 70 44 65  DistQueue || pDe
2d5e0 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 46  st->eDest==SRT_F
2d5f0 69 66 6f 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20  ifo);.    /* If 
2d600 4f 52 44 45 52 20 42 59 20 6d 61 6b 65 73 20 6e  ORDER BY makes n
2d610 6f 20 64 69 66 66 65 72 65 6e 63 65 20 69 6e 20  o difference in 
2d620 74 68 65 20 6f 75 74 70 75 74 20 74 68 65 6e 20  the output then 
2d630 6e 65 69 74 68 65 72 20 64 6f 65 73 0a 20 20 20  neither does.   
2d640 20 2a 2a 20 44 49 53 54 49 4e 43 54 20 73 6f 20   ** DISTINCT so 
2d650 69 74 20 63 61 6e 20 62 65 20 72 65 6d 6f 76 65  it can be remove
2d660 64 20 74 6f 6f 2e 20 2a 2f 0a 20 20 20 20 73 71  d too. */.    sq
2d670 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
2d680 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65  ete(db, p->pOrde
2d690 72 42 79 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 72  rBy);.    p->pOr
2d6a0 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 70  derBy = 0;.    p
2d6b0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53  ->selFlags &= ~S
2d6c0 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a  F_Distinct;.  }.
2d6d0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50    sqlite3SelectP
2d6e0 72 65 70 28 70 50 61 72 73 65 2c 20 70 2c 20 30  rep(pParse, p, 0
2d6f0 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 53 6f  );.  memset(&sSo
2d700 72 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 53  rt, 0, sizeof(sS
2d710 6f 72 74 29 29 3b 0a 20 20 73 53 6f 72 74 2e 70  ort));.  sSort.p
2d720 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
2d730 64 65 72 42 79 3b 0a 20 20 70 54 61 62 4c 69 73  derBy;.  pTabLis
2d740 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 69  t = p->pSrc;.  i
2d750 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
2d760 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
2d770 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
2d780 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
2d790 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
2d7a0 69 73 74 21 3d 30 20 29 3b 0a 20 20 69 73 41 67  ist!=0 );.  isAg
2d7b0 67 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  g = (p->selFlags
2d7c0 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 29   & SF_Aggregate)
2d7d0 21 3d 30 3b 0a 23 69 66 20 53 45 4c 45 43 54 54  !=0;.#if SELECTT
2d7e0 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69  RACE_ENABLED.  i
2d7f0 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
2d800 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b  Trace & 0x100 ){
2d810 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45  .    SELECTTRACE
2d820 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c  (0x100,pParse,p,
2d830 20 28 22 61 66 74 65 72 20 6e 61 6d 65 20 72 65   ("after name re
2d840 73 6f 6c 75 74 69 6f 6e 3a 5c 6e 22 29 29 3b 0a  solution:\n"));.
2d850 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
2d860 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20  iewSelect(0, p, 
2d870 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  0);.  }.#endif..
2d880 20 20 2f 2a 20 47 65 74 20 61 20 70 6f 69 6e 74    /* Get a point
2d890 65 72 20 74 68 65 20 56 44 42 45 20 75 6e 64 65  er the VDBE unde
2d8a0 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2c 20  r construction, 
2d8b0 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77  allocating a new
2d8c0 20 56 44 42 45 20 69 66 20 6f 6e 65 0a 20 20 2a   VDBE if one.  *
2d8d0 2a 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61  * does not alrea
2d8e0 64 79 20 65 78 69 73 74 20 2a 2f 0a 20 20 76 20  dy exist */.  v 
2d8f0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
2d900 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
2d910 76 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  v==0 ) goto sele
2d920 63 74 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70 44  ct_end;.  if( pD
2d930 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
2d940 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 67 65  Output ){.    ge
2d950 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
2d960 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  s(pParse, p);.  
2d970 7d 0a 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66  }..  /* Try to f
2d980 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72 69 65  latten subquerie
2d990 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
2d9a0 61 75 73 65 20 75 70 20 69 6e 74 6f 20 74 68 65  ause up into the
2d9b0 20 6d 61 69 6e 20 71 75 65 72 79 0a 20 20 2a 2f   main query.  */
2d9c0 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
2d9d0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
2d9e0 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
2d9f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
2da00 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20 21 70 2d  ).  for(i=0; !p-
2da10 3e 70 50 72 69 6f 72 20 26 26 20 69 3c 70 54 61  >pPrior && i<pTa
2da20 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
2da30 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  ){.    struct Sr
2da40 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
2da50 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61  m = &pTabList->a
2da60 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74 20  [i];.    Select 
2da70 2a 70 53 75 62 20 3d 20 70 49 74 65 6d 2d 3e 70  *pSub = pItem->p
2da80 53 65 6c 65 63 74 3b 0a 20 20 20 20 69 6e 74 20  Select;.    int 
2da90 69 73 41 67 67 53 75 62 3b 0a 20 20 20 20 54 61  isAggSub;.    Ta
2daa0 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 74 65  ble *pTab = pIte
2dab0 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28  m->pTab;.    if(
2dac0 20 70 53 75 62 3d 3d 30 20 29 20 63 6f 6e 74 69   pSub==0 ) conti
2dad0 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 43 61 74  nue;..    /* Cat
2dae0 63 68 20 6d 69 73 6d 61 74 63 68 20 69 6e 20 74  ch mismatch in t
2daf0 68 65 20 64 65 63 6c 61 72 65 64 20 63 6f 6c 75  he declared colu
2db00 6d 6e 73 20 6f 66 20 61 20 76 69 65 77 20 61 6e  mns of a view an
2db10 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  d the number of.
2db20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69      ** columns i
2db30 6e 20 74 68 65 20 53 45 4c 45 43 54 20 6f 6e 20  n the SELECT on 
2db40 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 20 20 69  the RHS */.    i
2db50 66 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 21 3d 70  f( pTab->nCol!=p
2db60 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  Sub->pEList->nEx
2db70 70 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  pr ){.      sqli
2db80 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
2db90 73 65 2c 20 22 65 78 70 65 63 74 65 64 20 25 64  se, "expected %d
2dba0 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 27 25 73   columns for '%s
2dbb0 27 20 62 75 74 20 67 6f 74 20 25 64 22 2c 0a 20  ' but got %d",. 
2dbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dbd0 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c       pTab->nCol,
2dbe0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 70 53   pTab->zName, pS
2dbf0 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ub->pEList->nExp
2dc00 72 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  r);.      goto s
2dc10 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
2dc20 0a 0a 20 20 20 20 69 73 41 67 67 53 75 62 20 3d  ..    isAggSub =
2dc30 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73   (pSub->selFlags
2dc40 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 29   & SF_Aggregate)
2dc50 21 3d 30 3b 0a 20 20 20 20 69 66 28 20 66 6c 61  !=0;.    if( fla
2dc60 74 74 65 6e 53 75 62 71 75 65 72 79 28 70 50 61  ttenSubquery(pPa
2dc70 72 73 65 2c 20 70 2c 20 69 2c 20 69 73 41 67 67  rse, p, i, isAgg
2dc80 2c 20 69 73 41 67 67 53 75 62 29 20 29 7b 0a 20  , isAggSub) ){. 
2dc90 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 75 62       /* This sub
2dca0 71 75 65 72 79 20 63 61 6e 20 62 65 20 61 62 73  query can be abs
2dcb0 6f 72 62 65 64 20 69 6e 74 6f 20 69 74 73 20 70  orbed into its p
2dcc0 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20  arent. */.      
2dcd0 69 66 28 20 69 73 41 67 67 53 75 62 20 29 7b 0a  if( isAggSub ){.
2dce0 20 20 20 20 20 20 20 20 69 73 41 67 67 20 3d 20          isAgg = 
2dcf0 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 65  1;.        p->se
2dd00 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 41 67 67  lFlags |= SF_Agg
2dd10 72 65 67 61 74 65 3b 0a 20 20 20 20 20 20 7d 0a  regate;.      }.
2dd20 20 20 20 20 20 20 69 20 3d 20 2d 31 3b 0a 20 20        i = -1;.  
2dd30 20 20 7d 0a 20 20 20 20 70 54 61 62 4c 69 73 74    }.    pTabList
2dd40 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20   = p->pSrc;.    
2dd50 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
2dd60 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65  iled ) goto sele
2dd70 63 74 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20  ct_end;.    if( 
2dd80 21 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62  !IgnorableOrderb
2dd90 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20  y(pDest) ){.    
2dda0 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79    sSort.pOrderBy
2ddb0 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
2ddc0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
2ddd0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2dde0 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
2ddf0 45 4c 45 43 54 0a 20 20 2f 2a 20 48 61 6e 64 6c  ELECT.  /* Handl
2de00 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  e compound SELEC
2de10 54 20 73 74 61 74 65 6d 65 6e 74 73 20 75 73 69  T statements usi
2de20 6e 67 20 74 68 65 20 73 65 70 61 72 61 74 65 20  ng the separate 
2de30 6d 75 6c 74 69 53 65 6c 65 63 74 28 29 0a 20 20  multiSelect().  
2de40 2a 2a 20 70 72 6f 63 65 64 75 72 65 2e 0a 20 20  ** procedure..  
2de50 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  */.  if( p->pPri
2de60 6f 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d  or ){.    rc = m
2de70 75 6c 74 69 53 65 6c 65 63 74 28 70 50 61 72 73  ultiSelect(pPars
2de80 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20  e, p, pDest);.  
2de90 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
2dea0 67 65 72 28 70 50 61 72 73 65 2d 3e 69 53 65 6c  ger(pParse->iSel
2deb0 65 63 74 49 64 2c 20 69 52 65 73 74 6f 72 65 53  ectId, iRestoreS
2dec0 65 6c 65 63 74 49 64 29 3b 0a 23 69 66 20 53 45  electId);.#if SE
2ded0 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45  LECTTRACE_ENABLE
2dee0 44 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43  D.    SELECTTRAC
2def0 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 65  E(1,pParse,p,("e
2df00 6e 64 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65  nd compound-sele
2df10 63 74 20 70 72 6f 63 65 73 73 69 6e 67 5c 6e 22  ct processing\n"
2df20 29 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  ));.    pParse->
2df30 6e 53 65 6c 65 63 74 49 6e 64 65 6e 74 2d 2d 3b  nSelectIndent--;
2df40 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75  .#endif.    retu
2df50 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69  rn rc;.  }.#endi
2df60 66 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 61 63 68  f..  /* For each
2df70 20 74 65 72 6d 20 69 6e 20 74 68 65 20 46 52 4f   term in the FRO
2df80 4d 20 63 6c 61 75 73 65 2c 20 64 6f 20 74 77 6f  M clause, do two
2df90 20 74 68 69 6e 67 73 3a 0a 20 20 2a 2a 20 28 31   things:.  ** (1
2dfa0 29 20 41 75 74 68 6f 72 69 7a 65 64 20 75 6e 72  ) Authorized unr
2dfb0 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65 73  eferenced tables
2dfc0 0a 20 20 2a 2a 20 28 32 29 20 47 65 6e 65 72 61  .  ** (2) Genera
2dfd0 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20  te code for all 
2dfe0 73 75 62 2d 71 75 65 72 69 65 73 0a 20 20 2a 2f  sub-queries.  */
2dff0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54  .  for(i=0; i<pT
2e000 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
2e010 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53  +){.    struct S
2e020 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
2e030 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
2e040 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74  a[i];.    Select
2e050 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20 53  Dest dest;.    S
2e060 65 6c 65 63 74 20 2a 70 53 75 62 3b 0a 0a 20 20  elect *pSub;..  
2e070 20 20 2f 2a 20 49 73 73 75 65 20 53 51 4c 49 54    /* Issue SQLIT
2e080 45 5f 52 45 41 44 20 61 75 74 68 6f 72 69 7a 61  E_READ authoriza
2e090 74 69 6f 6e 73 20 77 69 74 68 20 61 20 66 61 6b  tions with a fak
2e0a0 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 66 6f  e column name fo
2e0b0 72 20 61 6e 79 20 74 61 62 6c 65 73 20 74 68 61  r any tables tha
2e0c0 74 0a 20 20 20 20 2a 2a 20 61 72 65 20 72 65 66  t.    ** are ref
2e0d0 65 72 65 6e 63 65 64 20 62 75 74 20 66 72 6f 6d  erenced but from
2e0e0 20 77 68 69 63 68 20 6e 6f 20 76 61 6c 75 65 73   which no values
2e0f0 20 61 72 65 20 65 78 74 72 61 63 74 65 64 2e 20   are extracted. 
2e100 45 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 65 72  Examples of wher
2e110 65 20 74 68 65 73 65 0a 20 20 20 20 2a 2a 20 6b  e these.    ** k
2e120 69 6e 64 73 20 6f 66 20 6e 75 6c 6c 20 53 51 4c  inds of null SQL
2e130 49 54 45 5f 52 45 41 44 20 61 75 74 68 6f 72 69  ITE_READ authori
2e140 7a 61 74 69 6f 6e 73 20 77 6f 75 6c 64 20 6f 63  zations would oc
2e150 63 75 72 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  cur:.    **.    
2e160 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63 6f  **     SELECT co
2e170 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b 20  unt(*) FROM t1; 
2e180 20 20 2d 2d 20 53 51 4c 49 54 45 5f 52 45 41 44    -- SQLITE_READ
2e190 20 74 31 2e 22 22 0a 20 20 20 20 2a 2a 20 20 20   t1."".    **   
2e1a0 20 20 53 45 4c 45 43 54 20 74 31 2e 2a 20 46 52    SELECT t1.* FR
2e1b0 4f 4d 20 74 31 2c 20 74 32 3b 20 20 20 2d 2d 20  OM t1, t2;   -- 
2e1c0 53 51 4c 49 54 45 5f 52 45 41 44 20 74 32 2e 22  SQLITE_READ t2."
2e1d0 22 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ".    **.    ** 
2e1e0 54 68 65 20 66 61 6b 65 20 63 6f 6c 75 6d 6e 20  The fake column 
2e1f0 6e 61 6d 65 20 69 73 20 61 6e 20 65 6d 70 74 79  name is an empty
2e200 20 73 74 72 69 6e 67 2e 20 20 49 74 20 69 73 20   string.  It is 
2e210 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20 74  possible for a t
2e220 61 62 6c 65 20 74 6f 0a 20 20 20 20 2a 2a 20 68  able to.    ** h
2e230 61 76 65 20 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d  ave a column nam
2e240 65 64 20 62 79 20 74 68 65 20 65 6d 70 74 79 20  ed by the empty 
2e250 73 74 72 69 6e 67 2c 20 69 6e 20 77 68 69 63 68  string, in which
2e260 20 63 61 73 65 20 74 68 65 72 65 20 69 73 20 6e   case there is n
2e270 6f 20 77 61 79 20 74 6f 0a 20 20 20 20 2a 2a 20  o way to.    ** 
2e280 64 69 73 74 69 6e 67 75 69 73 68 20 62 65 74 77  distinguish betw
2e290 65 65 6e 20 61 6e 20 75 6e 72 65 66 65 72 65 6e  een an unreferen
2e2a0 63 65 64 20 74 61 62 6c 65 20 61 6e 64 20 61 6e  ced table and an
2e2b0 20 61 63 74 75 61 6c 20 72 65 66 65 72 65 6e 63   actual referenc
2e2c0 65 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20  e to the.    ** 
2e2d0 22 22 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20  "" column.  The 
2e2e0 6f 72 69 67 69 6e 61 6c 20 64 65 73 69 67 6e 20  original design 
2e2f0 77 61 73 20 66 6f 72 20 74 68 65 20 66 61 6b 65  was for the fake
2e300 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 74 6f 20   column name to 
2e310 62 65 20 61 20 4e 55 4c 4c 2c 0a 20 20 20 20 2a  be a NULL,.    *
2e320 2a 20 77 68 69 63 68 20 77 6f 75 6c 64 20 62 65  * which would be
2e330 20 75 6e 61 6d 62 69 67 75 6f 75 73 2e 20 20 42   unambiguous.  B
2e340 75 74 20 6c 65 67 61 63 79 20 61 75 74 68 6f 72  ut legacy author
2e350 69 7a 61 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b  ization callback
2e360 73 20 6d 69 67 68 74 0a 20 20 20 20 2a 2a 20 61  s might.    ** a
2e370 73 73 75 6d 65 20 74 68 65 20 63 6f 6c 75 6d 6e  ssume the column
2e380 20 6e 61 6d 65 20 69 73 20 6e 6f 6e 2d 4e 55 4c   name is non-NUL
2e390 4c 20 61 6e 64 20 73 65 67 66 61 75 6c 74 2e 20  L and segfault. 
2e3a0 20 54 68 65 20 75 73 65 20 6f 66 20 61 6e 20 65   The use of an e
2e3b0 6d 70 74 79 20 73 74 72 69 6e 67 0a 20 20 20 20  mpty string.    
2e3c0 2a 2a 20 66 6f 72 20 74 68 65 20 66 61 6b 65 20  ** for the fake 
2e3d0 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 73 65 65 6d  column name seem
2e3e0 73 20 73 61 66 65 72 2e 0a 20 20 20 20 2a 2f 0a  s safer..    */.
2e3f0 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 63      if( pItem->c
2e400 6f 6c 55 73 65 64 3d 3d 30 20 29 7b 0a 20 20 20  olUsed==0 ){.   
2e410 20 20 20 73 71 6c 69 74 65 33 41 75 74 68 43 68     sqlite3AuthCh
2e420 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
2e430 54 45 5f 52 45 41 44 2c 20 70 49 74 65 6d 2d 3e  TE_READ, pItem->
2e440 7a 4e 61 6d 65 2c 20 22 22 2c 20 70 49 74 65 6d  zName, "", pItem
2e450 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ->zDatabase);.  
2e460 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65    }..#if !define
2e470 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
2e480 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69  BQUERY) || !defi
2e490 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
2e4a0 56 49 45 57 29 0a 20 20 20 20 2f 2a 20 47 65 6e  VIEW).    /* Gen
2e4b0 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
2e4c0 6c 6c 20 73 75 62 2d 71 75 65 72 69 65 73 20 69  ll sub-queries i
2e4d0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
2e4e0 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 53 75  e.    */.    pSu
2e4f0 62 20 3d 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  b = pItem->pSele
2e500 63 74 3b 0a 20 20 20 20 69 66 28 20 70 53 75 62  ct;.    if( pSub
2e510 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
2e520 0a 20 20 20 20 2f 2a 20 53 6f 6d 65 74 69 6d 65  .    /* Sometime
2e530 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20 61  s the code for a
2e540 20 73 75 62 71 75 65 72 79 20 77 69 6c 6c 20 62   subquery will b
2e550 65 20 67 65 6e 65 72 61 74 65 64 20 6d 6f 72 65  e generated more
2e560 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e 63   than.    ** onc
2e570 65 2c 20 69 66 20 74 68 65 20 73 75 62 71 75 65  e, if the subque
2e580 72 79 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  ry is part of th
2e590 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  e WHERE clause i
2e5a0 6e 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 0a 20  n a LEFT JOIN,. 
2e5b0 20 20 20 2a 2a 20 66 6f 72 20 65 78 61 6d 70 6c     ** for exampl
2e5c0 65 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65  e.  In that case
2e5d0 2c 20 64 6f 20 6e 6f 74 20 72 65 67 65 6e 65 72  , do not regener
2e5e0 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20  ate the code to 
2e5f0 6d 61 6e 69 66 65 73 74 0a 20 20 20 20 2a 2a 20  manifest.    ** 
2e600 61 20 76 69 65 77 20 6f 72 20 74 68 65 20 63 6f  a view or the co
2e610 2d 72 6f 75 74 69 6e 65 20 74 6f 20 69 6d 70 6c  -routine to impl
2e620 65 6d 65 6e 74 20 61 20 76 69 65 77 2e 20 20 54  ement a view.  T
2e630 68 65 20 66 69 72 73 74 20 69 6e 73 74 61 6e 63  he first instanc
2e640 65 0a 20 20 20 20 2a 2a 20 69 73 20 73 75 66 66  e.    ** is suff
2e650 69 63 69 65 6e 74 2c 20 74 68 6f 75 67 68 20 74  icient, though t
2e660 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f  he subroutine to
2e670 20 6d 61 6e 69 66 65 73 74 20 74 68 65 20 76 69   manifest the vi
2e680 65 77 20 64 6f 65 73 20 6e 65 65 64 0a 20 20 20  ew does need.   
2e690 20 2a 2a 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65   ** to be invoke
2e6a0 64 20 61 67 61 69 6e 2e 20 2a 2f 0a 20 20 20 20  d again. */.    
2e6b0 69 66 28 20 70 49 74 65 6d 2d 3e 61 64 64 72 46  if( pItem->addrF
2e6c0 69 6c 6c 53 75 62 20 29 7b 0a 20 20 20 20 20 20  illSub ){.      
2e6d0 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 76 69  if( pItem->fg.vi
2e6e0 61 43 6f 72 6f 75 74 69 6e 65 3d 3d 30 20 29 7b  aCoroutine==0 ){
2e6f0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
2e700 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
2e710 6d 61 6e 69 66 65 73 74 73 20 74 68 65 20 76 69  manifests the vi
2e720 65 77 20 6d 69 67 68 74 20 62 65 20 61 20 6f 6e  ew might be a on
2e730 65 2d 74 69 6d 65 20 72 6f 75 74 69 6e 65 2c 0a  e-time routine,.
2e740 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 69 74          ** or it
2e750 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 62   might need to b
2e760 65 20 72 65 72 75 6e 20 6f 6e 20 65 61 63 68 20  e rerun on each 
2e770 69 74 65 72 61 74 69 6f 6e 20 62 65 63 61 75 73  iteration becaus
2e780 65 20 69 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  e it.        ** 
2e790 65 6e 63 6f 64 65 73 20 61 20 63 6f 72 72 65 6c  encodes a correl
2e7a0 61 74 65 64 20 73 75 62 71 75 65 72 79 2e 20 2a  ated subquery. *
2e7b0 2f 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  /.        testca
2e7c0 73 65 28 20 73 71 6c 69 74 65 33 56 64 62 65 47  se( sqlite3VdbeG
2e7d0 65 74 4f 70 28 76 2c 20 70 49 74 65 6d 2d 3e 61  etOp(v, pItem->a
2e7e0 64 64 72 46 69 6c 6c 53 75 62 29 2d 3e 6f 70 63  ddrFillSub)->opc
2e7f0 6f 64 65 3d 3d 4f 50 5f 4f 6e 63 65 20 29 3b 0a  ode==OP_Once );.
2e800 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2e810 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2e820 47 6f 73 75 62 2c 20 70 49 74 65 6d 2d 3e 72 65  Gosub, pItem->re
2e830 67 52 65 74 75 72 6e 2c 20 70 49 74 65 6d 2d 3e  gReturn, pItem->
2e840 61 64 64 72 46 69 6c 6c 53 75 62 29 3b 0a 20 20  addrFillSub);.  
2e850 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6f 6e 74      }.      cont
2e860 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  inue;.    }..   
2e870 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 50 61   /* Increment Pa
2e880 72 73 65 2e 6e 48 65 69 67 68 74 20 62 79 20 74  rse.nHeight by t
2e890 68 65 20 68 65 69 67 68 74 20 6f 66 20 74 68 65  he height of the
2e8a0 20 6c 61 72 67 65 73 74 20 65 78 70 72 65 73 73   largest express
2e8b0 69 6f 6e 0a 20 20 20 20 2a 2a 20 74 72 65 65 20  ion.    ** tree 
2e8c0 72 65 66 65 72 72 65 64 20 74 6f 20 62 79 20 74  referred to by t
2e8d0 68 69 73 2c 20 74 68 65 20 70 61 72 65 6e 74 20  his, the parent 
2e8e0 73 65 6c 65 63 74 2e 20 54 68 65 20 63 68 69 6c  select. The chil
2e8f0 64 20 73 65 6c 65 63 74 0a 20 20 20 20 2a 2a 20  d select.    ** 
2e900 6d 61 79 20 63 6f 6e 74 61 69 6e 20 65 78 70 72  may contain expr
2e910 65 73 73 69 6f 6e 20 74 72 65 65 73 20 6f 66 20  ession trees of 
2e920 61 74 20 6d 6f 73 74 0a 20 20 20 20 2a 2a 20 28  at most.    ** (
2e930 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f  SQLITE_MAX_EXPR_
2e940 44 45 50 54 48 2d 50 61 72 73 65 2e 6e 48 65 69  DEPTH-Parse.nHei
2e950 67 68 74 29 20 68 65 69 67 68 74 2e 20 54 68 69  ght) height. Thi
2e960 73 20 69 73 20 61 20 62 69 74 0a 20 20 20 20 2a  s is a bit.    *
2e970 2a 20 6d 6f 72 65 20 63 6f 6e 73 65 72 76 61 74  * more conservat
2e980 69 76 65 20 74 68 61 6e 20 6e 65 63 65 73 73 61  ive than necessa
2e990 72 79 2c 20 62 75 74 20 6d 75 63 68 20 65 61 73  ry, but much eas
2e9a0 69 65 72 20 74 68 61 6e 20 65 6e 66 6f 72 63 69  ier than enforci
2e9b0 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 20 65 78 61  ng.    ** an exa
2e9c0 63 74 20 6c 69 6d 69 74 2e 0a 20 20 20 20 2a 2f  ct limit..    */
2e9d0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65  .    pParse->nHe
2e9e0 69 67 68 74 20 2b 3d 20 73 71 6c 69 74 65 33 53  ight += sqlite3S
2e9f0 65 6c 65 63 74 45 78 70 72 48 65 69 67 68 74 28  electExprHeight(
2ea00 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65  p);..    /* Make
2ea10 20 63 6f 70 69 65 73 20 6f 66 20 63 6f 6e 73 74   copies of const
2ea20 61 6e 74 20 57 48 45 52 45 2d 63 6c 61 75 73 65  ant WHERE-clause
2ea30 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 6f 75   terms in the ou
2ea40 74 65 72 20 71 75 65 72 79 20 64 6f 77 6e 0a 20  ter query down. 
2ea50 20 20 20 2a 2a 20 69 6e 73 69 64 65 20 74 68 65     ** inside the
2ea60 20 73 75 62 71 75 65 72 79 2e 20 20 54 68 69 73   subquery.  This
2ea70 20 63 61 6e 20 68 65 6c 70 20 74 68 65 20 73 75   can help the su
2ea80 62 71 75 65 72 79 20 74 6f 20 72 75 6e 20 6d 6f  bquery to run mo
2ea90 72 65 20 65 66 66 69 63 69 65 6e 74 6c 79 2e 0a  re efficiently..
2eaa0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
2eab0 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79  pItem->fg.jointy
2eac0 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 3d 3d  pe & JT_OUTER)==
2ead0 30 0a 20 20 20 20 20 26 26 20 70 75 73 68 44 6f  0.     && pushDo
2eae0 77 6e 57 68 65 72 65 54 65 72 6d 73 28 70 50 61  wnWhereTerms(pPa
2eaf0 72 73 65 2c 20 70 53 75 62 2c 20 70 2d 3e 70 57  rse, pSub, p->pW
2eb00 68 65 72 65 2c 20 70 49 74 65 6d 2d 3e 69 43 75  here, pItem->iCu
2eb10 72 73 6f 72 29 0a 20 20 20 20 29 7b 0a 23 69 66  rsor).    ){.#if
2eb20 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
2eb30 42 4c 45 44 0a 20 20 20 20 20 20 69 66 28 20 73  BLED.      if( s
2eb40 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
2eb50 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20 20 20  e & 0x100 ){.   
2eb60 20 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45       SELECTTRACE
2eb70 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c  (0x100,pParse,p,
2eb80 28 22 41 66 74 65 72 20 57 48 45 52 45 2d 63 6c  ("After WHERE-cl
2eb90 61 75 73 65 20 70 75 73 68 2d 64 6f 77 6e 3a 5c  ause push-down:\
2eba0 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71  n"));.        sq
2ebb0 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c  lite3TreeViewSel
2ebc0 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20  ect(0, p, 0);.  
2ebd0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
2ebe0 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72   }..    /* Gener
2ebf0 61 74 65 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c  ate code to impl
2ec00 65 6d 65 6e 74 20 74 68 65 20 73 75 62 71 75 65  ement the subque
2ec10 72 79 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  ry.    **.    **
2ec20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
2ec30 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20   implemented as 
2ec40 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 69 66 20  a co-routine if 
2ec50 61 6c 6c 20 6f 66 20 74 68 65 73 65 20 61 72 65  all of these are
2ec60 20 74 72 75 65 3a 0a 20 20 20 20 2a 2a 20 20 20   true:.    **   
2ec70 28 31 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (1)  The subquer
2ec80 79 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  y is guaranteed 
2ec90 74 6f 20 62 65 20 74 68 65 20 6f 75 74 65 72 20  to be the outer 
2eca0 6c 6f 6f 70 20 28 73 6f 20 74 68 61 74 20 69 74  loop (so that it
2ecb0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 64  .    **        d
2ecc0 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
2ecd0 62 65 20 63 6f 6d 70 75 74 65 64 20 6d 6f 72 65  be computed more
2ece0 20 74 68 61 6e 20 6f 6e 63 65 29 0a 20 20 20 20   than once).    
2ecf0 2a 2a 20 20 20 28 32 29 20 20 54 68 65 20 41 4c  **   (2)  The AL
2ed00 4c 20 6b 65 79 77 6f 72 64 20 61 66 74 65 72 20  L keyword after 
2ed10 53 45 4c 45 43 54 20 69 73 20 6f 6d 69 74 74 65  SELECT is omitte
2ed20 64 2e 20 20 28 41 70 70 6c 69 63 61 74 69 6f 6e  d.  (Application
2ed30 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 20 20 20  s are.    **    
2ed40 20 20 20 20 61 6c 6c 6f 77 65 64 20 74 6f 20 73      allowed to s
2ed50 61 79 20 22 53 45 4c 45 43 54 20 41 4c 4c 22 20  ay "SELECT ALL" 
2ed60 69 6e 73 74 65 61 64 20 6f 66 20 6a 75 73 74 20  instead of just 
2ed70 22 53 45 4c 45 43 54 22 20 74 6f 20 64 69 73 61  "SELECT" to disa
2ed80 62 6c 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ble.    **      
2ed90 20 20 74 68 65 20 75 73 65 20 6f 66 20 63 6f 2d    the use of co-
2eda0 72 6f 75 74 69 6e 65 73 2e 29 0a 20 20 20 20 2a  routines.).    *
2edb0 2a 20 20 20 28 33 29 20 20 43 6f 2d 72 6f 75 74  *   (3)  Co-rout
2edc0 69 6e 65 73 20 61 72 65 20 6e 6f 74 20 64 69 73  ines are not dis
2edd0 61 62 6c 65 64 20 75 73 69 6e 67 20 73 71 6c 69  abled using sqli
2ede0 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
2edf0 28 29 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  ().    **       
2ee00 20 77 69 74 68 20 53 51 4c 49 54 45 5f 54 45 53   with SQLITE_TES
2ee10 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49  TCTRL_OPTIMIZATI
2ee20 4f 4e 53 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ONS..    **.    
2ee30 2a 2a 20 54 4f 44 4f 3a 20 41 72 65 20 74 68 65  ** TODO: Are the
2ee40 72 65 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 73  re other reasons
2ee50 20 62 65 73 69 64 65 20 28 31 29 20 74 6f 20 75   beside (1) to u
2ee60 73 65 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 0a  se a co-routine.
2ee70 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74      ** implement
2ee80 61 74 69 6f 6e 3f 0a 20 20 20 20 2a 2f 0a 20 20  ation?.    */.  
2ee90 20 20 69 66 28 20 69 3d 3d 30 0a 20 20 20 20 20    if( i==0.     
2eea0 26 26 20 28 70 54 61 62 4c 69 73 74 2d 3e 6e 53  && (pTabList->nS
2eeb0 72 63 3d 3d 31 0a 20 20 20 20 20 20 20 20 20 20  rc==1.          
2eec0 20 20 7c 7c 20 28 70 54 61 62 4c 69 73 74 2d 3e    || (pTabList->
2eed0 61 5b 31 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65  a[1].fg.jointype
2eee0 26 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f  &(JT_LEFT|JT_CRO
2eef0 53 53 29 29 21 3d 30 29 20 20 2f 2a 20 28 31 29  SS))!=0)  /* (1)
2ef00 20 2a 2f 0a 20 20 20 20 20 26 26 20 28 70 2d 3e   */.     && (p->
2ef10 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 6c  selFlags & SF_Al
2ef20 6c 29 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20  l)==0           
2ef30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ef40 20 20 20 20 20 20 20 20 2f 2a 20 28 32 29 20 2a          /* (2) *
2ef50 2f 0a 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69  /.     && Optimi
2ef60 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62  zationEnabled(db
2ef70 2c 20 53 51 4c 49 54 45 5f 53 75 62 71 43 6f 72  , SQLITE_SubqCor
2ef80 6f 75 74 69 6e 65 29 20 20 20 20 20 20 20 20 20  outine)         
2ef90 20 20 20 20 20 20 2f 2a 20 28 33 29 20 2a 2f 0a        /* (3) */.
2efa0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20      ){.      /* 
2efb0 49 6d 70 6c 65 6d 65 6e 74 20 61 20 63 6f 2d 72  Implement a co-r
2efc0 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c  outine that will
2efd0 20 72 65 74 75 72 6e 20 61 20 73 69 6e 67 6c 65   return a single
2efe0 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75   row of the resu
2eff0 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 20  lt.      ** set 
2f000 6f 6e 20 65 61 63 68 20 69 6e 76 6f 63 61 74 69  on each invocati
2f010 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  on..      */.   
2f020 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70 20 3d     int addrTop =
2f030 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
2f040 65 6e 74 41 64 64 72 28 76 29 2b 31 3b 0a 20 20  entAddr(v)+1;.  
2f050 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65      pItem->regRe
2f060 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d  turn = ++pParse-
2f070 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c  >nMem;.      sql
2f080 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
2f090 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69  , OP_InitCorouti
2f0a0 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65  ne, pItem->regRe
2f0b0 74 75 72 6e 2c 20 30 2c 20 61 64 64 72 54 6f 70  turn, 0, addrTop
2f0c0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
2f0d0 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70  ment((v, "%s", p
2f0e0 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  Item->pTab->zNam
2f0f0 65 29 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  e));.      pItem
2f100 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20  ->addrFillSub = 
2f110 61 64 64 72 54 6f 70 3b 0a 20 20 20 20 20 20 73  addrTop;.      s
2f120 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
2f130 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f  Init(&dest, SRT_
2f140 43 6f 72 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d  Coroutine, pItem
2f150 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20  ->regReturn);.  
2f160 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
2f170 74 65 67 65 72 28 70 49 74 65 6d 2d 3e 69 53 65  teger(pItem->iSe
2f180 6c 65 63 74 49 64 2c 20 28 75 38 29 70 50 61 72  lectId, (u8)pPar
2f190 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
2f1a0 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
2f1b0 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
2f1c0 70 53 75 62 2c 20 26 64 65 73 74 29 3b 0a 20 20  pSub, &dest);.  
2f1d0 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d      pItem->pTab-
2f1e0 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 70 53  >nRowLogEst = pS
2f1f0 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a  ub->nSelectRow;.
2f200 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e        pItem->fg.
2f210 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 3d 20 31  viaCoroutine = 1
2f220 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72  ;.      pItem->r
2f230 65 67 52 65 73 75 6c 74 20 3d 20 64 65 73 74 2e  egResult = dest.
2f240 69 53 64 73 74 3b 0a 20 20 20 20 20 20 73 71 6c  iSdst;.      sql
2f250 69 74 65 33 56 64 62 65 45 6e 64 43 6f 72 6f 75  ite3VdbeEndCorou
2f260 74 69 6e 65 28 76 2c 20 70 49 74 65 6d 2d 3e 72  tine(v, pItem->r
2f270 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20  egReturn);.     
2f280 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
2f290 48 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70 2d  Here(v, addrTop-
2f2a0 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
2f2b0 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63  3ClearTempRegCac
2f2c0 68 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  he(pParse);.    
2f2d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
2f2e0 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
2f2f0 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20  utine that will 
2f300 66 69 6c 6c 20 61 6e 20 65 70 68 65 6d 65 72 61  fill an ephemera
2f310 6c 20 74 61 62 6c 65 20 77 69 74 68 0a 20 20 20  l table with.   
2f320 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e     ** the conten
2f330 74 20 6f 66 20 74 68 69 73 20 73 75 62 71 75 65  t of this subque
2f340 72 79 2e 20 20 70 49 74 65 6d 2d 3e 61 64 64 72  ry.  pItem->addr
2f350 46 69 6c 6c 53 75 62 20 77 69 6c 6c 20 70 6f 69  FillSub will poi
2f360 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74  nt.      ** to t
2f370 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  he address of th
2f380 65 20 67 65 6e 65 72 61 74 65 64 20 73 75 62 72  e generated subr
2f390 6f 75 74 69 6e 65 2e 20 20 70 49 74 65 6d 2d 3e  outine.  pItem->
2f3a0 72 65 67 52 65 74 75 72 6e 0a 20 20 20 20 20 20  regReturn.      
2f3b0 2a 2a 20 69 73 20 61 20 72 65 67 69 73 74 65 72  ** is a register
2f3c0 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 68 6f   allocated to ho
2f3d0 6c 64 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  ld the subroutin
2f3e0 65 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73  e return address
2f3f0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2f400 69 6e 74 20 74 6f 70 41 64 64 72 3b 0a 20 20 20  int topAddr;.   
2f410 20 20 20 69 6e 74 20 6f 6e 63 65 41 64 64 72 20     int onceAddr 
2f420 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 72  = 0;.      int r
2f430 65 74 41 64 64 72 3b 0a 20 20 20 20 20 20 73 74  etAddr;.      st
2f440 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2f450 6d 20 2a 70 50 72 69 6f 72 3b 0a 0a 20 20 20 20  m *pPrior;..    
2f460 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
2f470 3e 61 64 64 72 46 69 6c 6c 53 75 62 3d 3d 30 20  >addrFillSub==0 
2f480 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  );.      pItem->
2f490 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50  regReturn = ++pP
2f4a0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
2f4b0 20 20 74 6f 70 41 64 64 72 20 3d 20 73 71 6c 69    topAddr = sqli
2f4c0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2f4d0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
2f4e0 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
2f4f0 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  );.      pItem->
2f500 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 74 6f  addrFillSub = to
2f510 70 41 64 64 72 2b 31 3b 0a 20 20 20 20 20 20 69  pAddr+1;.      i
2f520 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 43  f( pItem->fg.isC
2f530 6f 72 72 65 6c 61 74 65 64 3d 3d 30 20 29 7b 0a  orrelated==0 ){.
2f540 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
2f550 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f  e subquery is no
2f560 74 20 63 6f 72 72 65 6c 61 74 65 64 20 61 6e 64  t correlated and
2f570 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 69   if we are not i
2f580 6e 73 69 64 65 20 6f 66 0a 20 20 20 20 20 20 20  nside of.       
2f590 20 2a 2a 20 61 20 74 72 69 67 67 65 72 2c 20 74   ** a trigger, t
2f5a0 68 65 6e 20 77 65 20 6f 6e 6c 79 20 6e 65 65 64  hen we only need
2f5b0 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20   to compute the 
2f5c0 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 75 62  value of the sub
2f5d0 71 75 65 72 79 0a 20 20 20 20 20 20 20 20 2a 2a  query.        **
2f5e0 20 6f 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 20 20   once. */.      
2f5f0 20 20 6f 6e 63 65 41 64 64 72 20 3d 20 73 71 6c    onceAddr = sql
2f600 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
2f610 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65  , OP_Once); Vdbe
2f620 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
2f630 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
2f640 28 28 76 2c 20 22 6d 61 74 65 72 69 61 6c 69 7a  ((v, "materializ
2f650 65 20 5c 22 25 73 5c 22 22 2c 20 70 49 74 65 6d  e \"%s\"", pItem
2f660 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b  ->pTab->zName));
2f670 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2f680 20 20 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f        VdbeNoopCo
2f690 6d 6d 65 6e 74 28 28 76 2c 20 22 6d 61 74 65 72  mment((v, "mater
2f6a0 69 61 6c 69 7a 65 20 5c 22 25 73 5c 22 22 2c 20  ialize \"%s\"", 
2f6b0 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61  pItem->pTab->zNa
2f6c0 6d 65 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  me));.      }.  
2f6d0 20 20 20 20 70 50 72 69 6f 72 20 3d 20 69 73 53      pPrior = isS
2f6e0 65 6c 66 4a 6f 69 6e 56 69 65 77 28 70 54 61 62  elfJoinView(pTab
2f6f0 4c 69 73 74 2c 20 70 49 74 65 6d 29 3b 0a 20 20  List, pItem);.  
2f700 20 20 20 20 69 66 28 20 70 50 72 69 6f 72 20 29      if( pPrior )
2f710 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2f720 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2f730 50 5f 4f 70 65 6e 44 75 70 2c 20 70 49 74 65 6d  P_OpenDup, pItem
2f740 2d 3e 69 43 75 72 73 6f 72 2c 20 70 50 72 69 6f  ->iCursor, pPrio
2f750 72 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  r->iCursor);.   
2f760 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49       explainSetI
2f770 6e 74 65 67 65 72 28 70 49 74 65 6d 2d 3e 69 53  nteger(pItem->iS
2f780 65 6c 65 63 74 49 64 2c 20 70 50 72 69 6f 72 2d  electId, pPrior-
2f790 3e 69 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  >iSelectId);.   
2f7a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72       assert( pPr
2f7b0 69 6f 72 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20  ior->pSelect!=0 
2f7c0 29 3b 0a 20 20 20 20 20 20 20 20 70 53 75 62 2d  );.        pSub-
2f7d0 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 50  >nSelectRow = pP
2f7e0 72 69 6f 72 2d 3e 70 53 65 6c 65 63 74 2d 3e 6e  rior->pSelect->n
2f7f0 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20  SelectRow;.     
2f800 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2f810 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
2f820 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54  tInit(&dest, SRT
2f830 5f 45 70 68 65 6d 54 61 62 2c 20 70 49 74 65 6d  _EphemTab, pItem
2f840 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ->iCursor);.    
2f850 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
2f860 74 65 67 65 72 28 70 49 74 65 6d 2d 3e 69 53 65  teger(pItem->iSe
2f870 6c 65 63 74 49 64 2c 20 28 75 38 29 70 50 61 72  lectId, (u8)pPar
2f880 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
2f890 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  d);.        sqli
2f8a0 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
2f8b0 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29 3b 0a  , pSub, &dest);.
2f8c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49        }.      pI
2f8d0 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 4c  tem->pTab->nRowL
2f8e0 6f 67 45 73 74 20 3d 20 70 53 75 62 2d 3e 6e 53  ogEst = pSub->nS
2f8f0 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20  electRow;.      
2f900 69 66 28 20 6f 6e 63 65 41 64 64 72 20 29 20 73  if( onceAddr ) s
2f910 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
2f920 72 65 28 76 2c 20 6f 6e 63 65 41 64 64 72 29 3b  re(v, onceAddr);
2f930 0a 20 20 20 20 20 20 72 65 74 41 64 64 72 20 3d  .      retAddr =
2f940 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2f950 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p1(v, OP_Return,
2f960 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72   pItem->regRetur
2f970 6e 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  n);.      VdbeCo
2f980 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 25  mment((v, "end %
2f990 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d  s", pItem->pTab-
2f9a0 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  >zName));.      
2f9b0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
2f9c0 65 50 31 28 76 2c 20 74 6f 70 41 64 64 72 2c 20  eP1(v, topAddr, 
2f9d0 72 65 74 41 64 64 72 29 3b 0a 20 20 20 20 20 20  retAddr);.      
2f9e0 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d 70  sqlite3ClearTemp
2f9f0 52 65 67 43 61 63 68 65 28 70 50 61 72 73 65 29  RegCache(pParse)
2fa00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2fa10 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2fa20 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
2fa30 6e 64 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  nd;.    pParse->
2fa40 6e 48 65 69 67 68 74 20 2d 3d 20 73 71 6c 69 74  nHeight -= sqlit
2fa50 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69 67  e3SelectExprHeig
2fa60 68 74 28 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ht(p);.#endif.  
2fa70 7d 0a 0a 20 20 2f 2a 20 56 61 72 69 6f 75 73 20  }..  /* Various 
2fa80 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20  elements of the 
2fa90 53 45 4c 45 43 54 20 63 6f 70 69 65 64 20 69 6e  SELECT copied in
2faa0 74 6f 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c  to local variabl
2fab0 65 73 20 66 6f 72 0a 20 20 2a 2a 20 63 6f 6e 76  es for.  ** conv
2fac0 65 6e 69 65 6e 63 65 20 2a 2f 0a 20 20 70 45 4c  enience */.  pEL
2fad0 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
2fae0 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70  .  pWhere = p->p
2faf0 57 68 65 72 65 3b 0a 20 20 70 47 72 6f 75 70 42  Where;.  pGroupB
2fb00 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b  y = p->pGroupBy;
2fb10 0a 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e  .  pHaving = p->
2fb20 70 48 61 76 69 6e 67 3b 0a 20 20 73 44 69 73 74  pHaving;.  sDist
2fb30 69 6e 63 74 2e 69 73 54 6e 63 74 20 3d 20 28 70  inct.isTnct = (p
2fb40 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
2fb50 44 69 73 74 69 6e 63 74 29 21 3d 30 3b 0a 0a 23  Distinct)!=0;..#
2fb60 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45  if SELECTTRACE_E
2fb70 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c  NABLED.  if( sql
2fb80 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20  ite3SelectTrace 
2fb90 26 20 30 78 34 30 30 20 29 7b 0a 20 20 20 20 53  & 0x400 ){.    S
2fba0 45 4c 45 43 54 54 52 41 43 45 28 30 78 34 30 30  ELECTTRACE(0x400
2fbb0 2c 70 50 61 72 73 65 2c 70 2c 28 22 41 66 74 65  ,pParse,p,("Afte
2fbc0 72 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73  r all FROM-claus
2fbd0 65 20 61 6e 61 6c 79 73 69 73 3a 5c 6e 22 29 29  e analysis:\n"))
2fbe0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65  ;.    sqlite3Tre
2fbf0 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70  eViewSelect(0, p
2fc00 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  , 0);.  }.#endif
2fc10 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
2fc20 43 4f 55 4e 54 4f 46 56 49 45 57 5f 4f 50 54 49  COUNTOFVIEW_OPTI
2fc30 4d 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20 4f  MIZATION.  if( O
2fc40 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
2fc50 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 51 75  ed(db, SQLITE_Qu
2fc60 65 72 79 46 6c 61 74 74 65 6e 65 72 7c 53 51 4c  eryFlattener|SQL
2fc70 49 54 45 5f 43 6f 75 6e 74 4f 66 56 69 65 77 29  ITE_CountOfView)
2fc80 0a 20 20 20 26 26 20 63 6f 75 6e 74 4f 66 56 69  .   && countOfVi
2fc90 65 77 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 28 70  ewOptimization(p
2fca0 50 61 72 73 65 2c 20 70 29 0a 20 20 29 7b 0a 20  Parse, p).  ){. 
2fcb0 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
2fcc0 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73  cFailed ) goto s
2fcd0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 70  elect_end;.    p
2fce0 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  EList = p->pELis
2fcf0 74 3b 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20  t;.    pTabList 
2fd00 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 7d 0a 23  = p->pSrc;.  }.#
2fd10 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74  endif..  /* If t
2fd20 68 65 20 71 75 65 72 79 20 69 73 20 44 49 53 54  he query is DIST
2fd30 49 4e 43 54 20 77 69 74 68 20 61 6e 20 4f 52 44  INCT with an ORD
2fd40 45 52 20 42 59 20 62 75 74 20 69 73 20 6e 6f 74  ER BY but is not
2fd50 20 61 6e 20 61 67 67 72 65 67 61 74 65 2c 20 61   an aggregate, a
2fd60 6e 64 20 0a 20 20 2a 2a 20 69 66 20 74 68 65 20  nd .  ** if the 
2fd70 73 65 6c 65 63 74 2d 6c 69 73 74 20 69 73 20 74  select-list is t
2fd80 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 4f  he same as the O
2fd90 52 44 45 52 20 42 59 20 6c 69 73 74 2c 20 74 68  RDER BY list, th
2fda0 65 6e 20 74 68 69 73 20 71 75 65 72 79 0a 20 20  en this query.  
2fdb0 2a 2a 20 63 61 6e 20 62 65 20 72 65 77 72 69 74  ** can be rewrit
2fdc0 74 65 6e 20 61 73 20 61 20 47 52 4f 55 50 20 42  ten as a GROUP B
2fdd0 59 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  Y. In other word
2fde0 73 2c 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20  s, this:.  **.  
2fdf0 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 44 49  **     SELECT DI
2fe00 53 54 49 4e 43 54 20 78 79 7a 20 46 52 4f 4d 20  STINCT xyz FROM 
2fe10 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20 78 79 7a  ... ORDER BY xyz
2fe20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 74 72  .  **.  ** is tr
2fe30 61 6e 73 66 6f 72 6d 65 64 20 74 6f 3a 0a 20 20  ansformed to:.  
2fe40 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  **.  **     SELE
2fe50 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20  CT xyz FROM ... 
2fe60 47 52 4f 55 50 20 42 59 20 78 79 7a 20 4f 52 44  GROUP BY xyz ORD
2fe70 45 52 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20  ER BY xyz.  **. 
2fe80 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 66   ** The second f
2fe90 6f 72 6d 20 69 73 20 70 72 65 66 65 72 72 65 64  orm is preferred
2fea0 20 61 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 64   as a single ind
2feb0 65 78 20 28 6f 72 20 74 65 6d 70 2d 74 61 62 6c  ex (or temp-tabl
2fec0 65 29 20 6d 61 79 20 62 65 20 0a 20 20 2a 2a 20  e) may be .  ** 
2fed0 75 73 65 64 20 66 6f 72 20 62 6f 74 68 20 74 68  used for both th
2fee0 65 20 4f 52 44 45 52 20 42 59 20 61 6e 64 20 44  e ORDER BY and D
2fef0 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73 73 69  ISTINCT processi
2ff00 6e 67 2e 20 41 73 20 6f 72 69 67 69 6e 61 6c 6c  ng. As originall
2ff10 79 20 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e 20  y .  ** written 
2ff20 74 68 65 20 71 75 65 72 79 20 6d 75 73 74 20 75  the query must u
2ff30 73 65 20 61 20 74 65 6d 70 2d 74 61 62 6c 65 20  se a temp-table 
2ff40 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  for at least one
2ff50 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 0a 20   of the ORDER . 
2ff60 20 2a 2a 20 42 59 20 61 6e 64 20 44 49 53 54 49   ** BY and DISTI
2ff70 4e 43 54 2c 20 61 6e 64 20 61 6e 20 69 6e 64 65  NCT, and an inde
2ff80 78 20 6f 72 20 73 65 70 61 72 61 74 65 20 74 65  x or separate te
2ff90 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20 74 68 65  mp-table for the
2ffa0 20 6f 74 68 65 72 2e 0a 20 20 2a 2f 0a 20 20 69   other..  */.  i
2ffb0 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  f( (p->selFlags 
2ffc0 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53  & (SF_Distinct|S
2ffd0 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53  F_Aggregate))==S
2ffe0 46 5f 44 69 73 74 69 6e 63 74 20 0a 20 20 20 26  F_Distinct .   &
2fff0 26 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  & sqlite3ExprLis
30000 74 43 6f 6d 70 61 72 65 28 73 53 6f 72 74 2e 70  tCompare(sSort.p
30010 4f 72 64 65 72 42 79 2c 20 70 45 4c 69 73 74 2c  OrderBy, pEList,
30020 20 2d 31 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20   -1)==0.  ){.   
30030 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20   p->selFlags &= 
30040 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20  ~SF_Distinct;.  
30050 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e    pGroupBy = p->
30060 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74  pGroupBy = sqlit
30070 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
30080 2c 20 70 45 4c 69 73 74 2c 20 30 29 3b 0a 20 20  , pEList, 0);.  
30090 20 20 2f 2a 20 4e 6f 74 69 63 65 20 74 68 61 74    /* Notice that
300a0 20 65 76 65 6e 20 74 68 6f 75 67 68 74 20 53 46   even thought SF
300b0 5f 44 69 73 74 69 6e 63 74 20 68 61 73 20 62 65  _Distinct has be
300c0 65 6e 20 63 6c 65 61 72 65 64 20 66 72 6f 6d 20  en cleared from 
300d0 70 2d 3e 73 65 6c 46 6c 61 67 73 2c 0a 20 20 20  p->selFlags,.   
300e0 20 2a 2a 20 74 68 65 20 73 44 69 73 74 69 6e 63   ** the sDistinc
300f0 74 2e 69 73 54 6e 63 74 20 69 73 20 73 74 69 6c  t.isTnct is stil
30100 6c 20 73 65 74 2e 20 20 48 65 6e 63 65 2c 20 69  l set.  Hence, i
30110 73 54 6e 63 74 20 72 65 70 72 65 73 65 6e 74 73  sTnct represents
30120 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 72 69 67   the.    ** orig
30130 69 6e 61 6c 20 73 65 74 74 69 6e 67 20 6f 66 20  inal setting of 
30140 74 68 65 20 53 46 5f 44 69 73 74 69 6e 63 74 20  the SF_Distinct 
30150 66 6c 61 67 2c 20 6e 6f 74 20 74 68 65 20 63 75  flag, not the cu
30160 72 72 65 6e 74 20 73 65 74 74 69 6e 67 20 2a 2f  rrent setting */
30170 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 44 69  .    assert( sDi
30180 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 29 3b  stinct.isTnct );
30190 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  ..#if SELECTTRAC
301a0 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 69 66  E_ENABLED.    if
301b0 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54  ( sqlite3SelectT
301c0 72 61 63 65 20 26 20 30 78 34 30 30 20 29 7b 0a  race & 0x400 ){.
301d0 20 20 20 20 20 20 53 45 4c 45 43 54 54 52 41 43        SELECTTRAC
301e0 45 28 30 78 34 30 30 2c 70 50 61 72 73 65 2c 70  E(0x400,pParse,p
301f0 2c 28 22 54 72 61 6e 73 66 6f 72 6d 20 44 49 53  ,("Transform DIS
30200 54 49 4e 43 54 20 69 6e 74 6f 20 47 52 4f 55 50  TINCT into GROUP
30210 20 42 59 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 20   BY:\n"));.     
30220 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
30230 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b  Select(0, p, 0);
30240 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
30250 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
30260 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
30270 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 63 72 65  clause, then cre
30280 61 74 65 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  ate an ephemeral
30290 20 69 6e 64 65 78 20 74 6f 0a 20 20 2a 2a 20 64   index to.  ** d
302a0 6f 20 74 68 65 20 73 6f 72 74 69 6e 67 2e 20 20  o the sorting.  
302b0 42 75 74 20 74 68 69 73 20 73 6f 72 74 69 6e 67  But this sorting
302c0 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78   ephemeral index
302d0 20 6d 69 67 68 74 20 65 6e 64 20 75 70 0a 20 20   might end up.  
302e0 2a 2a 20 62 65 69 6e 67 20 75 6e 75 73 65 64 20  ** being unused 
302f0 69 66 20 74 68 65 20 64 61 74 61 20 63 61 6e 20  if the data can 
30300 62 65 20 65 78 74 72 61 63 74 65 64 20 69 6e 20  be extracted in 
30310 70 72 65 2d 73 6f 72 74 65 64 20 6f 72 64 65 72  pre-sorted order
30320 2e 0a 20 20 2a 2a 20 49 66 20 74 68 61 74 20 69  ..  ** If that i
30330 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e  s the case, then
30340 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65   the OP_OpenEphe
30350 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f  meral instructio
30360 6e 20 77 69 6c 6c 20 62 65 0a 20 20 2a 2a 20 63  n will be.  ** c
30370 68 61 6e 67 65 64 20 74 6f 20 61 6e 20 4f 50 5f  hanged to an OP_
30380 4e 6f 6f 70 20 6f 6e 63 65 20 77 65 20 66 69 67  Noop once we fig
30390 75 72 65 20 6f 75 74 20 74 68 61 74 20 74 68 65  ure out that the
303a0 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69   sorting index i
303b0 73 0a 20 20 2a 2a 20 6e 6f 74 20 6e 65 65 64 65  s.  ** not neede
303c0 64 2e 20 20 54 68 65 20 73 53 6f 72 74 2e 61 64  d.  The sSort.ad
303d0 64 72 53 6f 72 74 49 6e 64 65 78 20 76 61 72 69  drSortIndex vari
303e0 61 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20  able is used to 
303f0 66 61 63 69 6c 69 74 61 74 65 0a 20 20 2a 2a 20  facilitate.  ** 
30400 74 68 61 74 20 63 68 61 6e 67 65 2e 0a 20 20 2a  that change..  *
30410 2f 0a 20 20 69 66 28 20 73 53 6f 72 74 2e 70 4f  /.  if( sSort.pO
30420 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 4b 65  rderBy ){.    Ke
30430 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
30440 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20  .    pKeyInfo = 
30450 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
30460 69 73 74 28 70 50 61 72 73 65 2c 20 73 53 6f 72  ist(pParse, sSor
30470 74 2e 70 4f 72 64 65 72 42 79 2c 20 30 2c 20 70  t.pOrderBy, 0, p
30480 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
30490 20 20 20 73 53 6f 72 74 2e 69 45 43 75 72 73 6f     sSort.iECurso
304a0 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
304b0 2b 2b 3b 0a 20 20 20 20 73 53 6f 72 74 2e 61 64  ++;.    sSort.ad
304c0 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 0a 20 20  drSortIndex =.  
304d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
304e0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp4(v, OP_Open
304f0 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20  Ephemeral,.     
30500 20 20 20 20 20 73 53 6f 72 74 2e 69 45 43 75 72       sSort.iECur
30510 73 6f 72 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65  sor, sSort.pOrde
30520 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2b 70 45 4c  rBy->nExpr+1+pEL
30530 69 73 74 2d 3e 6e 45 78 70 72 2c 20 30 2c 0a 20  ist->nExpr, 0,. 
30540 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
30550 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
30560 49 4e 46 4f 0a 20 20 20 20 20 20 29 3b 0a 20 20  INFO.      );.  
30570 7d 65 6c 73 65 7b 0a 20 20 20 20 73 53 6f 72 74  }else{.    sSort
30580 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d  .addrSortIndex =
30590 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49   -1;.  }..  /* I
305a0 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20  f the output is 
305b0 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20 74  destined for a t
305c0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20  emporary table, 
305d0 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65 2e  open that table.
305e0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65 73  .  */.  if( pDes
305f0 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70  t->eDest==SRT_Ep
30600 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 73 71  hemTab ){.    sq
30610 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
30620 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
30630 72 61 6c 2c 20 70 44 65 73 74 2d 3e 69 53 44 50  ral, pDest->iSDP
30640 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  arm, pEList->nEx
30650 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  pr);.  }..  /* S
30660 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a  et the limiter..
30670 20 20 2a 2f 0a 20 20 69 45 6e 64 20 3d 20 73 71    */.  iEnd = sq
30680 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
30690 65 6c 28 76 29 3b 0a 20 20 69 66 28 20 28 70 2d  el(v);.  if( (p-
306a0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 46  >selFlags & SF_F
306b0 69 78 65 64 4c 69 6d 69 74 29 3d 3d 30 20 29 7b  ixedLimit)==0 ){
306c0 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52  .    p->nSelectR
306d0 6f 77 20 3d 20 33 32 30 3b 20 20 2f 2a 20 34 20  ow = 320;  /* 4 
306e0 62 69 6c 6c 69 6f 6e 20 72 6f 77 73 20 2a 2f 0a  billion rows */.
306f0 20 20 7d 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d    }.  computeLim
30700 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
30710 73 65 2c 20 70 2c 20 69 45 6e 64 29 3b 0a 20 20  se, p, iEnd);.  
30720 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3d 3d 30  if( p->iLimit==0
30730 20 26 26 20 73 53 6f 72 74 2e 61 64 64 72 53 6f   && sSort.addrSo
30740 72 74 49 6e 64 65 78 3e 3d 30 20 29 7b 0a 20 20  rtIndex>=0 ){.  
30750 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
30760 6e 67 65 4f 70 63 6f 64 65 28 76 2c 20 73 53 6f  ngeOpcode(v, sSo
30770 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78  rt.addrSortIndex
30780 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 29  , OP_SorterOpen)
30790 3b 0a 20 20 20 20 73 53 6f 72 74 2e 73 6f 72 74  ;.    sSort.sort
307a0 46 6c 61 67 73 20 7c 3d 20 53 4f 52 54 46 4c 41  Flags |= SORTFLA
307b0 47 5f 55 73 65 53 6f 72 74 65 72 3b 0a 20 20 7d  G_UseSorter;.  }
307c0 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6e 20 65  ..  /* Open an e
307d0 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20 74  phemeral index t
307e0 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20 64 69  o use for the di
307f0 73 74 69 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f  stinct set..  */
30800 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
30810 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74  gs & SF_Distinct
30820 20 29 7b 0a 20 20 20 20 73 44 69 73 74 69 6e 63   ){.    sDistinc
30830 74 2e 74 61 62 54 6e 63 74 20 3d 20 70 50 61 72  t.tabTnct = pPar
30840 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
30850 73 44 69 73 74 69 6e 63 74 2e 61 64 64 72 54 6e  sDistinct.addrTn
30860 63 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ct = sqlite3Vdbe
30870 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
30880 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20  nEphemeral,.    
30890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
308a0 20 20 20 20 20 20 20 20 20 73 44 69 73 74 69 6e           sDistin
308b0 63 74 2e 74 61 62 54 6e 63 74 2c 20 30 2c 20 30  ct.tabTnct, 0, 0
308c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
308d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
308e0 63 68 61 72 2a 29 6b 65 79 49 6e 66 6f 46 72 6f  char*)keyInfoFro
308f0 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
30900 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 30 2c 30 29  , p->pEList,0,0)
30910 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
30920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
30930 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
30940 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
30950 65 50 35 28 76 2c 20 42 54 52 45 45 5f 55 4e 4f  eP5(v, BTREE_UNO
30960 52 44 45 52 45 44 29 3b 0a 20 20 20 20 73 44 69  RDERED);.    sDi
30970 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65  stinct.eTnctType
30980 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   = WHERE_DISTINC
30990 54 5f 55 4e 4f 52 44 45 52 45 44 3b 0a 20 20 7d  T_UNORDERED;.  }
309a0 65 6c 73 65 7b 0a 20 20 20 20 73 44 69 73 74 69  else{.    sDisti
309b0 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20  nct.eTnctType = 
309c0 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e  WHERE_DISTINCT_N
309d0 4f 4f 50 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  OOP;.  }..  if( 
309e0 21 69 73 41 67 67 20 26 26 20 70 47 72 6f 75 70  !isAgg && pGroup
309f0 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  By==0 ){.    /* 
30a00 4e 6f 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  No aggregate fun
30a10 63 74 69 6f 6e 73 20 61 6e 64 20 6e 6f 20 47 52  ctions and no GR
30a20 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  OUP BY clause */
30a30 0a 20 20 20 20 75 31 36 20 77 63 74 72 6c 46 6c  .    u16 wctrlFl
30a40 61 67 73 20 3d 20 28 73 44 69 73 74 69 6e 63 74  ags = (sDistinct
30a50 2e 69 73 54 6e 63 74 20 3f 20 57 48 45 52 45 5f  .isTnct ? WHERE_
30a60 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 3a 20  WANT_DISTINCT : 
30a70 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  0);.    assert( 
30a80 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54 3d  WHERE_USE_LIMIT=
30a90 3d 53 46 5f 46 69 78 65 64 4c 69 6d 69 74 20 29  =SF_FixedLimit )
30aa0 3b 0a 20 20 20 20 77 63 74 72 6c 46 6c 61 67 73  ;.    wctrlFlags
30ab0 20 7c 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20   |= p->selFlags 
30ac0 26 20 53 46 5f 46 69 78 65 64 4c 69 6d 69 74 3b  & SF_FixedLimit;
30ad0 0a 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 74  ..    /* Begin t
30ae0 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e  he database scan
30af0 2e 20 2a 2f 0a 20 20 20 20 70 57 49 6e 66 6f 20  . */.    pWInfo 
30b00 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  = sqlite3WhereBe
30b10 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  gin(pParse, pTab
30b20 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 73 53  List, pWhere, sS
30b30 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 0a 20 20  ort.pOrderBy,.  
30b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30b50 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
30b60 70 45 4c 69 73 74 2c 20 77 63 74 72 6c 46 6c 61  pEList, wctrlFla
30b70 67 73 2c 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  gs, p->nSelectRo
30b80 77 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e  w);.    if( pWIn
30b90 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c  fo==0 ) goto sel
30ba0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28  ect_end;.    if(
30bb0 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f 75 74   sqlite3WhereOut
30bc0 70 75 74 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e  putRowCount(pWIn
30bd0 66 6f 29 20 3c 20 70 2d 3e 6e 53 65 6c 65 63 74  fo) < p->nSelect
30be0 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  Row ){.      p->
30bf0 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c  nSelectRow = sql
30c00 69 74 65 33 57 68 65 72 65 4f 75 74 70 75 74 52  ite3WhereOutputR
30c10 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66 6f 29 3b  owCount(pWInfo);
30c20 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
30c30 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20  Distinct.isTnct 
30c40 26 26 20 73 71 6c 69 74 65 33 57 68 65 72 65 49  && sqlite3WhereI
30c50 73 44 69 73 74 69 6e 63 74 28 70 57 49 6e 66 6f  sDistinct(pWInfo
30c60 29 20 29 7b 0a 20 20 20 20 20 20 73 44 69 73 74  ) ){.      sDist
30c70 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d  inct.eTnctType =
30c80 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 44   sqlite3WhereIsD
30c90 69 73 74 69 6e 63 74 28 70 57 49 6e 66 6f 29 3b  istinct(pWInfo);
30ca0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
30cb0 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 29 7b  Sort.pOrderBy ){
30cc0 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 6e 4f 42  .      sSort.nOB
30cd0 53 61 74 20 3d 20 73 71 6c 69 74 65 33 57 68 65  Sat = sqlite3Whe
30ce0 72 65 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e  reIsOrdered(pWIn
30cf0 66 6f 29 3b 0a 20 20 20 20 20 20 73 53 6f 72 74  fo);.      sSort
30d00 2e 62 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f  .bOrderedInnerLo
30d10 6f 70 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  op = sqlite3Wher
30d20 65 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f 6f  eOrderedInnerLoo
30d30 70 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20  p(pWInfo);.     
30d40 20 69 66 28 20 73 53 6f 72 74 2e 6e 4f 42 53 61   if( sSort.nOBSa
30d50 74 3d 3d 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  t==sSort.pOrderB
30d60 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  y->nExpr ){.    
30d70 20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72      sSort.pOrder
30d80 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  By = 0;.      }.
30d90 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
30da0 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74   sorting index t
30db0 68 61 74 20 77 61 73 20 63 72 65 61 74 65 64 20  hat was created 
30dc0 62 79 20 61 20 70 72 69 6f 72 20 4f 50 5f 4f 70  by a prior OP_Op
30dd0 65 6e 45 70 68 65 6d 65 72 61 6c 20 0a 20 20 20  enEphemeral .   
30de0 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   ** instruction 
30df0 65 6e 64 65 64 20 75 70 20 6e 6f 74 20 62 65 69  ended up not bei
30e00 6e 67 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20  ng needed, then 
30e10 63 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70  change the OP_Op
30e20 65 6e 45 70 68 65 6d 65 72 61 6c 0a 20 20 20 20  enEphemeral.    
30e30 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f  ** into an OP_No
30e40 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  op..    */.    i
30e50 66 28 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72  f( sSort.addrSor
30e60 74 49 6e 64 65 78 3e 3d 30 20 26 26 20 73 53 6f  tIndex>=0 && sSo
30e70 72 74 2e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  rt.pOrderBy==0 )
30e80 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
30e90 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28  dbeChangeToNoop(
30ea0 76 2c 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72  v, sSort.addrSor
30eb0 74 49 6e 64 65 78 29 3b 0a 20 20 20 20 7d 0a 0a  tIndex);.    }..
30ec0 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 73      /* Use the s
30ed0 74 61 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f  tandard inner lo
30ee0 6f 70 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  op. */.    asser
30ef0 74 28 20 70 2d 3e 70 45 4c 69 73 74 3d 3d 70 45  t( p->pEList==pE
30f00 4c 69 73 74 20 29 3b 0a 20 20 20 20 73 65 6c 65  List );.    sele
30f10 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
30f20 73 65 2c 20 70 2c 20 2d 31 2c 20 26 73 53 6f 72  se, p, -1, &sSor
30f30 74 2c 20 26 73 44 69 73 74 69 6e 63 74 2c 20 70  t, &sDistinct, p
30f40 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Dest,.          
30f50 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
30f60 33 57 68 65 72 65 43 6f 6e 74 69 6e 75 65 4c 61  3WhereContinueLa
30f70 62 65 6c 28 70 57 49 6e 66 6f 29 2c 0a 20 20 20  bel(pWInfo),.   
30f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30f90 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 72 65   sqlite3WhereBre
30fa0 61 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 29  akLabel(pWInfo))
30fb0 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e 64 20 74 68  ;..    /* End th
30fc0 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 20  e database scan 
30fd0 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  loop..    */.   
30fe0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
30ff0 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73  (pWInfo);.  }els
31000 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63  e{.    /* This c
31010 61 73 65 20 77 68 65 6e 20 74 68 65 72 65 20 65  ase when there e
31020 78 69 73 74 20 61 67 67 72 65 67 61 74 65 20 66  xist aggregate f
31030 75 6e 63 74 69 6f 6e 73 20 6f 72 20 61 20 47 52  unctions or a GR
31040 4f 55 50 20 42 59 20 63 6c 61 75 73 65 0a 20 20  OUP BY clause.  
31050 20 20 2a 2a 20 6f 72 20 62 6f 74 68 20 2a 2f 0a    ** or both */.
31060 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20      NameContext 
31070 73 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20  sNC;    /* Name 
31080 63 6f 6e 74 65 78 74 20 66 6f 72 20 70 72 6f 63  context for proc
31090 65 73 73 69 6e 67 20 61 67 67 72 65 67 61 74 65  essing aggregate
310a0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
310b0 20 20 20 20 69 6e 74 20 69 41 4d 65 6d 3b 20 20      int iAMem;  
310c0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
310d0 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72   Mem address for
310e0 20 73 74 6f 72 69 6e 67 20 63 75 72 72 65 6e 74   storing current
310f0 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20   GROUP BY */.   
31100 20 69 6e 74 20 69 42 4d 65 6d 3b 20 20 20 20 20   int iBMem;     
31110 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65       /* First Me
31120 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20 70 72  m address for pr
31130 65 76 69 6f 75 73 20 47 52 4f 55 50 20 42 59 20  evious GROUP BY 
31140 2a 2f 0a 20 20 20 20 69 6e 74 20 69 55 73 65 46  */.    int iUseF
31150 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65  lag;       /* Me
31160 6d 20 61 64 64 72 65 73 73 20 68 6f 6c 64 69 6e  m address holdin
31170 67 20 66 6c 61 67 20 69 6e 64 69 63 61 74 69 6e  g flag indicatin
31180 67 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 0a  g that at least.
31190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
311a0 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 65 20 72          ** one r
311b0 6f 77 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  ow of the input 
311c0 74 6f 20 74 68 65 20 61 67 67 72 65 67 61 74 6f  to the aggregato
311d0 72 20 68 61 73 20 62 65 65 6e 0a 20 20 20 20 20  r has been.     
311e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
311f0 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 64 20     ** processed 
31200 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 62 6f 72  */.    int iAbor
31210 74 46 6c 61 67 3b 20 20 20 20 20 2f 2a 20 4d 65  tFlag;     /* Me
31220 6d 20 61 64 64 72 65 73 73 20 77 68 69 63 68 20  m address which 
31230 63 61 75 73 65 73 20 71 75 65 72 79 20 61 62 6f  causes query abo
31240 72 74 20 69 66 20 70 6f 73 69 74 69 76 65 20 2a  rt if positive *
31250 2f 0a 20 20 20 20 69 6e 74 20 67 72 6f 75 70 42  /.    int groupB
31260 79 53 6f 72 74 3b 20 20 20 20 2f 2a 20 52 6f 77  ySort;    /* Row
31270 73 20 63 6f 6d 65 20 66 72 6f 6d 20 73 6f 75 72  s come from sour
31280 63 65 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f  ce in GROUP BY o
31290 72 64 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  rder */.    int 
312a0 61 64 64 72 45 6e 64 3b 20 20 20 20 20 20 20 20  addrEnd;        
312b0 2f 2a 20 45 6e 64 20 6f 66 20 70 72 6f 63 65 73  /* End of proces
312c0 73 69 6e 67 20 66 6f 72 20 74 68 69 73 20 53 45  sing for this SE
312d0 4c 45 43 54 20 2a 2f 0a 20 20 20 20 69 6e 74 20  LECT */.    int 
312e0 73 6f 72 74 50 54 61 62 20 3d 20 30 3b 20 20 20  sortPTab = 0;   
312f0 2f 2a 20 50 73 65 75 64 6f 74 61 62 6c 65 20 75  /* Pseudotable u
31300 73 65 64 20 74 6f 20 64 65 63 6f 64 65 20 73 6f  sed to decode so
31310 72 74 69 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f  rting results */
31320 0a 20 20 20 20 69 6e 74 20 73 6f 72 74 4f 75 74  .    int sortOut
31330 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4f 75 74 70   = 0;    /* Outp
31340 75 74 20 72 65 67 69 73 74 65 72 20 66 72 6f 6d  ut register from
31350 20 74 68 65 20 73 6f 72 74 65 72 20 2a 2f 0a 20   the sorter */. 
31360 20 20 20 69 6e 74 20 6f 72 64 65 72 42 79 47 72     int orderByGr
31370 70 20 3d 20 30 3b 20 2f 2a 20 54 72 75 65 20 69  p = 0; /* True i
31380 66 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 61  f the GROUP BY a
31390 6e 64 20 4f 52 44 45 52 20 42 59 20 61 72 65 20  nd ORDER BY are 
313a0 74 68 65 20 73 61 6d 65 20 2a 2f 0a 0a 20 20 20  the same */..   
313b0 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 61   /* Remove any a
313c0 6e 64 20 61 6c 6c 20 61 6c 69 61 73 65 73 20 62  nd all aliases b
313d0 65 74 77 65 65 6e 20 74 68 65 20 72 65 73 75 6c  etween the resul
313e0 74 20 73 65 74 20 61 6e 64 20 74 68 65 0a 20 20  t set and the.  
313f0 20 20 2a 2a 20 47 52 4f 55 50 20 42 59 20 63 6c    ** GROUP BY cl
31400 61 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ause..    */.   
31410 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b   if( pGroupBy ){
31420 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 20 20 20  .      int k;   
31430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31440 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
31450 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 73 74  nter */.      st
31460 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
31470 65 6d 20 2a 70 49 74 65 6d 3b 20 20 2f 2a 20 46  em *pItem;  /* F
31480 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
31490 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 20  expression in a 
314a0 6c 69 73 74 20 2a 2f 0a 0a 20 20 20 20 20 20 66  list */..      f
314b0 6f 72 28 6b 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e  or(k=p->pEList->
314c0 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 2d 3e  nExpr, pItem=p->
314d0 70 45 4c 69 73 74 2d 3e 61 3b 20 6b 3e 30 3b 20  pEList->a; k>0; 
314e0 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  k--, pItem++){. 
314f0 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e         pItem->u.
31500 78 2e 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20  x.iAlias = 0;.  
31510 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
31520 6b 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  k=pGroupBy->nExp
31530 72 2c 20 70 49 74 65 6d 3d 70 47 72 6f 75 70 42  r, pItem=pGroupB
31540 79 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20  y->a; k>0; k--, 
31550 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
31560 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c    pItem->u.x.iAl
31570 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ias = 0;.      }
31580 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 36  .      assert( 6
31590 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  6==sqlite3LogEst
315a0 28 31 30 30 29 20 29 3b 0a 20 20 20 20 20 20 69  (100) );.      i
315b0 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  f( p->nSelectRow
315c0 3e 36 36 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74  >66 ) p->nSelect
315d0 52 6f 77 20 3d 20 36 36 3b 0a 20 20 20 20 7d 65  Row = 66;.    }e
315e0 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
315f0 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  t( 0==sqlite3Log
31600 45 73 74 28 31 29 20 29 3b 0a 20 20 20 20 20 20  Est(1) );.      
31610 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
31620 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  0;.    }..    /*
31630 20 49 66 20 74 68 65 72 65 20 69 73 20 62 6f 74   If there is bot
31640 68 20 61 20 47 52 4f 55 50 20 42 59 20 61 6e 64  h a GROUP BY and
31650 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
31660 75 73 65 20 61 6e 64 20 74 68 65 79 20 61 72 65  use and they are
31670 0a 20 20 20 20 2a 2a 20 69 64 65 6e 74 69 63 61  .    ** identica
31680 6c 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 62  l, then it may b
31690 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 69  e possible to di
316a0 73 61 62 6c 65 20 74 68 65 20 4f 52 44 45 52 20  sable the ORDER 
316b0 42 59 20 63 6c 61 75 73 65 20 0a 20 20 20 20 2a  BY clause .    *
316c0 2a 20 6f 6e 20 74 68 65 20 67 72 6f 75 6e 64 73  * on the grounds
316d0 20 74 68 61 74 20 74 68 65 20 47 52 4f 55 50 20   that the GROUP 
316e0 42 59 20 77 69 6c 6c 20 63 61 75 73 65 20 65 6c  BY will cause el
316f0 65 6d 65 6e 74 73 20 74 6f 20 63 6f 6d 65 20 6f  ements to come o
31700 75 74 20 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  ut .    ** in th
31710 65 20 63 6f 72 72 65 63 74 20 6f 72 64 65 72 2e  e correct order.
31720 20 49 74 20 61 6c 73 6f 20 6d 61 79 20 6e 6f 74   It also may not
31730 20 2d 20 74 68 65 20 47 52 4f 55 50 20 42 59 20   - the GROUP BY 
31740 6d 69 67 68 74 20 75 73 65 20 61 0a 20 20 20 20  might use a.    
31750 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6e 64 65  ** database inde
31760 78 20 74 68 61 74 20 63 61 75 73 65 73 20 72 6f  x that causes ro
31770 77 73 20 74 6f 20 62 65 20 67 72 6f 75 70 65 64  ws to be grouped
31780 20 74 6f 67 65 74 68 65 72 20 61 73 20 72 65 71   together as req
31790 75 69 72 65 64 0a 20 20 20 20 2a 2a 20 62 75 74  uired.    ** but
317a0 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 73 6f   not actually so
317b0 72 74 65 64 2e 20 45 69 74 68 65 72 20 77 61 79  rted. Either way
317c0 2c 20 72 65 63 6f 72 64 20 74 68 65 20 66 61 63  , record the fac
317d0 74 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a  t that the.    *
317e0 2a 20 4f 52 44 45 52 20 42 59 20 61 6e 64 20 47  * ORDER BY and G
317f0 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 73 20  ROUP BY clauses 
31800 61 72 65 20 74 68 65 20 73 61 6d 65 20 62 79 20  are the same by 
31810 73 65 74 74 69 6e 67 20 74 68 65 20 6f 72 64 65  setting the orde
31820 72 42 79 47 72 70 0a 20 20 20 20 2a 2a 20 76 61  rByGrp.    ** va
31830 72 69 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20  riable.  */.    
31840 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c  if( sqlite3ExprL
31850 69 73 74 43 6f 6d 70 61 72 65 28 70 47 72 6f 75  istCompare(pGrou
31860 70 42 79 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65  pBy, sSort.pOrde
31870 72 42 79 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a 20  rBy, -1)==0 ){. 
31880 20 20 20 20 20 6f 72 64 65 72 42 79 47 72 70 20       orderByGrp 
31890 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20  = 1;.    }. .   
318a0 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6c 61 62   /* Create a lab
318b0 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 77 68  el to jump to wh
318c0 65 6e 20 77 65 20 77 61 6e 74 20 74 6f 20 61 62  en we want to ab
318d0 6f 72 74 20 74 68 65 20 71 75 65 72 79 20 2a 2f  ort the query */
318e0 0a 20 20 20 20 61 64 64 72 45 6e 64 20 3d 20 73  .    addrEnd = s
318f0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
31900 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20  bel(v);..    /* 
31910 43 6f 6e 76 65 72 74 20 54 4b 5f 43 4f 4c 55 4d  Convert TK_COLUM
31920 4e 20 6e 6f 64 65 73 20 69 6e 74 6f 20 54 4b 5f  N nodes into TK_
31930 41 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 6d  AGG_COLUMN and m
31940 61 6b 65 20 65 6e 74 72 69 65 73 20 69 6e 0a 20  ake entries in. 
31950 20 20 20 2a 2a 20 73 41 67 67 49 6e 66 6f 20 66     ** sAggInfo f
31960 6f 72 20 61 6c 6c 20 54 4b 5f 41 47 47 5f 46 55  or all TK_AGG_FU
31970 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20 69 6e 20  NCTION nodes in 
31980 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74  expressions of t
31990 68 65 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54  he.    ** SELECT
319a0 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20   statement..    
319b0 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73  */.    memset(&s
319c0 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e  NC, 0, sizeof(sN
319d0 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61  C));.    sNC.pPa
319e0 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
319f0 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
31a00 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 20 20 73   pTabList;.    s
31a10 4e 43 2e 70 41 67 67 49 6e 66 6f 20 3d 20 26 73  NC.pAggInfo = &s
31a20 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 73 41 67  AggInfo;.    sAg
31a30 67 49 6e 66 6f 2e 6d 6e 52 65 67 20 3d 20 70 50  gInfo.mnReg = pP
31a40 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
31a50 20 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74    sAggInfo.nSort
31a60 69 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f  ingColumn = pGro
31a70 75 70 42 79 20 3f 20 70 47 72 6f 75 70 42 79 2d  upBy ? pGroupBy-
31a80 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 20 20  >nExpr : 0;.    
31a90 73 41 67 67 49 6e 66 6f 2e 70 47 72 6f 75 70 42  sAggInfo.pGroupB
31aa0 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20  y = pGroupBy;.  
31ab0 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61    sqlite3ExprAna
31ac0 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43  lyzeAggList(&sNC
31ad0 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73  , pEList);.    s
31ae0 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
31af0 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 73  eAggList(&sNC, s
31b00 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 29 3b 0a  Sort.pOrderBy);.
31b10 20 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20      if( pHaving 
31b20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 47 72  ){.      if( pGr
31b30 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 20  oupBy ){.       
31b40 20 61 73 73 65 72 74 28 20 70 57 68 65 72 65 3d   assert( pWhere=
31b50 3d 70 2d 3e 70 57 68 65 72 65 20 29 3b 0a 20 20  =p->pWhere );.  
31b60 20 20 20 20 20 20 68 61 76 69 6e 67 54 6f 57 68        havingToWh
31b70 65 72 65 28 70 50 61 72 73 65 2c 20 70 47 72 6f  ere(pParse, pGro
31b80 75 70 42 79 2c 20 70 48 61 76 69 6e 67 2c 20 26  upBy, pHaving, &
31b90 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20  p->pWhere);.    
31ba0 20 20 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e      pWhere = p->
31bb0 70 57 68 65 72 65 3b 0a 20 20 20 20 20 20 7d 0a  pWhere;.      }.
31bc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
31bd0 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
31be0 65 73 28 26 73 4e 43 2c 20 70 48 61 76 69 6e 67  es(&sNC, pHaving
31bf0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 41 67  );.    }.    sAg
31c00 67 49 6e 66 6f 2e 6e 41 63 63 75 6d 75 6c 61 74  gInfo.nAccumulat
31c10 6f 72 20 3d 20 73 41 67 67 49 6e 66 6f 2e 6e 43  or = sAggInfo.nC
31c20 6f 6c 75 6d 6e 3b 0a 20 20 20 20 66 6f 72 28 69  olumn;.    for(i
31c30 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e  =0; i<sAggInfo.n
31c40 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Func; i++){.    
31c50 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
31c60 61 73 50 72 6f 70 65 72 74 79 28 73 41 67 67 49  asProperty(sAggI
31c70 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78  nfo.aFunc[i].pEx
31c80 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
31c90 29 20 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e 6e  ) );.      sNC.n
31ca0 63 46 6c 61 67 73 20 7c 3d 20 4e 43 5f 49 6e 41  cFlags |= NC_InA
31cb0 67 67 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71  ggFunc;.      sq
31cc0 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
31cd0 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 73 41  AggList(&sNC, sA
31ce0 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e  ggInfo.aFunc[i].
31cf0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b  pExpr->x.pList);
31d00 0a 20 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61  .      sNC.ncFla
31d10 67 73 20 26 3d 20 7e 4e 43 5f 49 6e 41 67 67 46  gs &= ~NC_InAggF
31d20 75 6e 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  unc;.    }.    s
31d30 41 67 67 49 6e 66 6f 2e 6d 78 52 65 67 20 3d 20  AggInfo.mxReg = 
31d40 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
31d50 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
31d60 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65  Failed ) goto se
31d70 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f  lect_end;..    /
31d80 2a 20 50 72 6f 63 65 73 73 69 6e 67 20 66 6f 72  * Processing for
31d90 20 61 67 67 72 65 67 61 74 65 73 20 77 69 74 68   aggregates with
31da0 20 47 52 4f 55 50 20 42 59 20 69 73 20 76 65 72   GROUP BY is ver
31db0 79 20 64 69 66 66 65 72 65 6e 74 20 61 6e 64 0a  y different and.
31dc0 20 20 20 20 2a 2a 20 6d 75 63 68 20 6d 6f 72 65      ** much more
31dd0 20 63 6f 6d 70 6c 65 78 20 74 68 61 6e 20 61 67   complex than ag
31de0 67 72 65 67 61 74 65 73 20 77 69 74 68 6f 75 74  gregates without
31df0 20 61 20 47 52 4f 55 50 20 42 59 2e 0a 20 20 20   a GROUP BY..   
31e00 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f   */.    if( pGro
31e10 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 4b 65  upBy ){.      Ke
31e20 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
31e30 20 20 2f 2a 20 4b 65 79 69 6e 67 20 69 6e 66 6f    /* Keying info
31e40 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  rmation for the 
31e50 67 72 6f 75 70 20 62 79 20 63 6c 61 75 73 65 20  group by clause 
31e60 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
31e70 72 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r1;          /* 
31e80 41 2d 76 73 2d 42 20 63 6f 6d 70 61 72 69 73 69  A-vs-B comparisi
31e90 6f 6e 20 6a 75 6d 70 20 2a 2f 0a 20 20 20 20 20  on jump */.     
31ea0 20 69 6e 74 20 61 64 64 72 4f 75 74 70 75 74 52   int addrOutputR
31eb0 6f 77 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f 66  ow;  /* Start of
31ec0 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
31ed0 20 6f 75 74 70 75 74 73 20 61 20 72 65 73 75 6c   outputs a resul
31ee0 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69  t row */.      i
31ef0 6e 74 20 72 65 67 4f 75 74 70 75 74 52 6f 77 3b  nt regOutputRow;
31f00 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64     /* Return add
31f10 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
31f20 72 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74  r output subrout
31f30 69 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ine */.      int
31f40 20 61 64 64 72 53 65 74 41 62 6f 72 74 3b 20 20   addrSetAbort;  
31f50 20 2f 2a 20 53 65 74 20 74 68 65 20 61 62 6f 72   /* Set the abor
31f60 74 20 66 6c 61 67 20 61 6e 64 20 72 65 74 75 72  t flag and retur
31f70 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  n */.      int a
31f80 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20 2f  ddrTopOfLoop;  /
31f90 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 70  * Top of the inp
31fa0 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20  ut loop */.     
31fb0 20 69 6e 74 20 61 64 64 72 53 6f 72 74 69 6e 67   int addrSorting
31fc0 49 64 78 3b 20 2f 2a 20 54 68 65 20 4f 50 5f 4f  Idx; /* The OP_O
31fd0 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 66 6f 72  penEphemeral for
31fe0 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64   the sorting ind
31ff0 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ex */.      int 
32000 61 64 64 72 52 65 73 65 74 3b 20 20 20 20 20 20  addrReset;      
32010 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65 20 66 6f  /* Subroutine fo
32020 72 20 72 65 73 65 74 74 69 6e 67 20 74 68 65 20  r resetting the 
32030 61 63 63 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a 20  accumulator */. 
32040 20 20 20 20 20 69 6e 74 20 72 65 67 52 65 73 65       int regRese
32050 74 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75  t;       /* Retu
32060 72 6e 20 61 64 64 72 65 73 73 20 72 65 67 69 73  rn address regis
32070 74 65 72 20 66 6f 72 20 72 65 73 65 74 20 73 75  ter for reset su
32080 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20 20 20  broutine */..   
32090 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69     /* If there i
320a0 73 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61  s a GROUP BY cla
320b0 75 73 65 20 77 65 20 6d 69 67 68 74 20 6e 65 65  use we might nee
320c0 64 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  d a sorting inde
320d0 78 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 69 6d  x to.      ** im
320e0 70 6c 65 6d 65 6e 74 20 69 74 2e 20 20 41 6c 6c  plement it.  All
320f0 6f 63 61 74 65 20 74 68 61 74 20 73 6f 72 74 69  ocate that sorti
32100 6e 67 20 69 6e 64 65 78 20 6e 6f 77 2e 20 20 49  ng index now.  I
32110 66 20 69 74 20 74 75 72 6e 73 20 6f 75 74 0a 20  f it turns out. 
32120 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20       ** that we 
32130 64 6f 20 6e 6f 74 20 6e 65 65 64 20 69 74 20 61  do not need it a
32140 66 74 65 72 20 61 6c 6c 2c 20 74 68 65 20 4f 50  fter all, the OP
32150 5f 53 6f 72 74 65 72 4f 70 65 6e 20 69 6e 73 74  _SorterOpen inst
32160 72 75 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  ruction.      **
32170 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74   will be convert
32180 65 64 20 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20  ed into a Noop. 
32190 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20   .      */.     
321a0 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
321b0 67 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e  gIdx = pParse->n
321c0 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70 4b 65  Tab++;.      pKe
321d0 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46  yInfo = keyInfoF
321e0 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
321f0 73 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 30 2c  se, pGroupBy, 0,
32200 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d   sAggInfo.nColum
32210 6e 29 3b 0a 20 20 20 20 20 20 61 64 64 72 53 6f  n);.      addrSo
32220 72 74 69 6e 67 49 64 78 20 3d 20 73 71 6c 69 74  rtingIdx = sqlit
32230 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
32240 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 2c 20 0a  OP_SorterOpen, .
32250 20 20 20 20 20 20 20 20 20 20 73 41 67 67 49 6e            sAggIn
32260 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 73  fo.sortingIdx, s
32270 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67  AggInfo.nSorting
32280 43 6f 6c 75 6d 6e 2c 20 0a 20 20 20 20 20 20 20  Column, .       
32290 20 20 20 30 2c 20 28 63 68 61 72 2a 29 70 4b 65     0, (char*)pKe
322a0 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
322b0 4f 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e  O);..      /* In
322c0 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20  itialize memory 
322d0 6c 6f 63 61 74 69 6f 6e 73 20 75 73 65 64 20 62  locations used b
322e0 79 20 47 52 4f 55 50 20 42 59 20 61 67 67 72 65  y GROUP BY aggre
322f0 67 61 74 65 20 70 72 6f 63 65 73 73 69 6e 67 0a  gate processing.
32300 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
32310 55 73 65 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72  UseFlag = ++pPar
32320 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
32330 69 41 62 6f 72 74 46 6c 61 67 20 3d 20 2b 2b 70  iAbortFlag = ++p
32340 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
32350 20 20 20 72 65 67 4f 75 74 70 75 74 52 6f 77 20     regOutputRow 
32360 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
32370 3b 0a 20 20 20 20 20 20 61 64 64 72 4f 75 74 70  ;.      addrOutp
32380 75 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56  utRow = sqlite3V
32390 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
323a0 0a 20 20 20 20 20 20 72 65 67 52 65 73 65 74 20  .      regReset 
323b0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
323c0 3b 0a 20 20 20 20 20 20 61 64 64 72 52 65 73 65  ;.      addrRese
323d0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
323e0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
323f0 20 20 20 69 41 4d 65 6d 20 3d 20 70 50 61 72 73     iAMem = pPars
32400 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20  e->nMem + 1;.   
32410 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
32420 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  += pGroupBy->nEx
32430 70 72 3b 0a 20 20 20 20 20 20 69 42 4d 65 6d 20  pr;.      iBMem 
32440 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b  = pParse->nMem +
32450 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65   1;.      pParse
32460 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70  ->nMem += pGroup
32470 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  By->nExpr;.     
32480 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
32490 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
324a0 2c 20 30 2c 20 69 41 62 6f 72 74 46 6c 61 67 29  , 0, iAbortFlag)
324b0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
324c0 65 6e 74 28 28 76 2c 20 22 63 6c 65 61 72 20 61  ent((v, "clear a
324d0 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20  bort flag"));.  
324e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
324f0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
32500 67 65 72 2c 20 30 2c 20 69 55 73 65 46 6c 61 67  ger, 0, iUseFlag
32510 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
32520 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64 69 63 61  ment((v, "indica
32530 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 65  te accumulator e
32540 6d 70 74 79 22 29 29 3b 0a 20 20 20 20 20 20 73  mpty"));.      s
32550 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
32560 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
32570 69 41 4d 65 6d 2c 20 69 41 4d 65 6d 2b 70 47 72  iAMem, iAMem+pGr
32580 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2d 31 29 3b  oupBy->nExpr-1);
32590 0a 0a 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e  ..      /* Begin
325a0 20 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c   a loop that wil
325b0 6c 20 65 78 74 72 61 63 74 20 61 6c 6c 20 73 6f  l extract all so
325c0 75 72 63 65 20 72 6f 77 73 20 69 6e 20 47 52 4f  urce rows in GRO
325d0 55 50 20 42 59 20 6f 72 64 65 72 2e 0a 20 20 20  UP BY order..   
325e0 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74     ** This might
325f0 20 69 6e 76 6f 6c 76 65 20 74 77 6f 20 73 65 70   involve two sep
32600 61 72 61 74 65 20 6c 6f 6f 70 73 20 77 69 74 68  arate loops with
32610 20 61 6e 20 4f 50 5f 53 6f 72 74 20 69 6e 20 62   an OP_Sort in b
32620 65 74 77 65 65 6e 2c 20 6f 72 0a 20 20 20 20 20  etween, or.     
32630 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20   ** it might be 
32640 61 20 73 69 6e 67 6c 65 20 6c 6f 6f 70 20 74 68  a single loop th
32650 61 74 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78  at uses an index
32660 20 74 6f 20 65 78 74 72 61 63 74 20 69 6e 66 6f   to extract info
32670 72 6d 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  rmation.      **
32680 20 69 6e 20 74 68 65 20 72 69 67 68 74 20 6f 72   in the right or
32690 64 65 72 20 74 6f 20 62 65 67 69 6e 20 77 69 74  der to begin wit
326a0 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  h..      */.    
326b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
326c0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
326d0 20 72 65 67 52 65 73 65 74 2c 20 61 64 64 72 52   regReset, addrR
326e0 65 73 65 74 29 3b 0a 20 20 20 20 20 20 70 57 49  eset);.      pWI
326f0 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65  nfo = sqlite3Whe
32700 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20  reBegin(pParse, 
32710 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65  pTabList, pWhere
32720 2c 20 70 47 72 6f 75 70 42 79 2c 20 30 2c 0a 20  , pGroupBy, 0,. 
32730 20 20 20 20 20 20 20 20 20 57 48 45 52 45 5f 47           WHERE_G
32740 52 4f 55 50 42 59 20 7c 20 28 6f 72 64 65 72 42  ROUPBY | (orderB
32750 79 47 72 70 20 3f 20 57 48 45 52 45 5f 53 4f 52  yGrp ? WHERE_SOR
32760 54 42 59 47 52 4f 55 50 20 3a 20 30 29 2c 20 30  TBYGROUP : 0), 0
32770 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
32780 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20  if( pWInfo==0 ) 
32790 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
327a0 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
327b0 65 33 57 68 65 72 65 49 73 4f 72 64 65 72 65 64  e3WhereIsOrdered
327c0 28 70 57 49 6e 66 6f 29 3d 3d 70 47 72 6f 75 70  (pWInfo)==pGroup
327d0 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  By->nExpr ){.   
327e0 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 74 69       /* The opti
327f0 6d 69 7a 65 72 20 69 73 20 61 62 6c 65 20 74 6f  mizer is able to
32800 20 64 65 6c 69 76 65 72 20 72 6f 77 73 20 69 6e   deliver rows in
32810 20 67 72 6f 75 70 20 62 79 20 6f 72 64 65 72 20   group by order 
32820 73 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 65  so.        ** we
32830 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20   do not have to 
32840 73 6f 72 74 2e 20 20 54 68 65 20 4f 50 5f 4f 70  sort.  The OP_Op
32850 65 6e 45 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  enEphemeral tabl
32860 65 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20  e will be.      
32870 20 20 2a 2a 20 63 61 6e 63 65 6c 6c 65 64 20 6c    ** cancelled l
32880 61 74 65 72 20 62 65 63 61 75 73 65 20 77 65 20  ater because we 
32890 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 73  still need to us
328a0 65 20 74 68 65 20 70 4b 65 79 49 6e 66 6f 0a 20  e the pKeyInfo. 
328b0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
328c0 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20    groupBySort = 
328d0 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
328e0 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 73 20          /* Rows 
328f0 61 72 65 20 63 6f 6d 69 6e 67 20 6f 75 74 20 69  are coming out i
32900 6e 20 75 6e 64 65 74 65 72 6d 69 6e 65 64 20 6f  n undetermined o
32910 72 64 65 72 2e 20 20 57 65 20 68 61 76 65 20 74  rder.  We have t
32920 6f 20 70 75 73 68 0a 20 20 20 20 20 20 20 20 2a  o push.        *
32930 2a 20 65 61 63 68 20 72 6f 77 20 69 6e 74 6f 20  * each row into 
32940 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 2c  a sorting index,
32950 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 66   terminate the f
32960 69 72 73 74 20 6c 6f 6f 70 2c 0a 20 20 20 20 20  irst loop,.     
32970 20 20 20 2a 2a 20 74 68 65 6e 20 6c 6f 6f 70 20     ** then loop 
32980 6f 76 65 72 20 74 68 65 20 73 6f 72 74 69 6e 67  over the sorting
32990 20 69 6e 64 65 78 20 69 6e 20 6f 72 64 65 72 20   index in order 
329a0 74 6f 20 67 65 74 20 74 68 65 20 6f 75 74 70 75  to get the outpu
329b0 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20  t.        ** in 
329c0 73 6f 72 74 65 64 20 6f 72 64 65 72 0a 20 20 20  sorted order.   
329d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
329e0 69 6e 74 20 72 65 67 42 61 73 65 3b 0a 20 20 20  int regBase;.   
329f0 20 20 20 20 20 69 6e 74 20 72 65 67 52 65 63 6f       int regReco
32a00 72 64 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  rd;.        int 
32a10 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69 6e  nCol;.        in
32a20 74 20 6e 47 72 6f 75 70 42 79 3b 0a 0a 20 20 20  t nGroupBy;..   
32a30 20 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d 70       explainTemp
32a40 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 0a 20  Table(pParse, . 
32a50 20 20 20 20 20 20 20 20 20 20 20 28 73 44 69 73             (sDis
32a60 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 26 26 20  tinct.isTnct && 
32a70 28 70 2d 3e 73 65 6c 46 6c 61 67 73 26 53 46 5f  (p->selFlags&SF_
32a80 44 69 73 74 69 6e 63 74 29 3d 3d 30 29 20 3f 0a  Distinct)==0) ?.
32a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32aa0 20 20 20 20 22 44 49 53 54 49 4e 43 54 22 20 3a      "DISTINCT" :
32ab0 20 22 47 52 4f 55 50 20 42 59 22 29 3b 0a 0a 20   "GROUP BY");.. 
32ac0 20 20 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f         groupBySo
32ad0 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rt = 1;.        
32ae0 6e 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75  nGroupBy = pGrou
32af0 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  pBy->nExpr;.    
32b00 20 20 20 20 6e 43 6f 6c 20 3d 20 6e 47 72 6f 75      nCol = nGrou
32b10 70 42 79 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d  pBy;.        j =
32b20 20 6e 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20   nGroupBy;.     
32b30 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41     for(i=0; i<sA
32b40 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20  ggInfo.nColumn; 
32b50 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
32b60 69 66 28 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f  if( sAggInfo.aCo
32b70 6c 5b 69 5d 2e 69 53 6f 72 74 65 72 43 6f 6c 75  l[i].iSorterColu
32b80 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20  mn>=j ){.       
32b90 20 20 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 20       nCol++;.   
32ba0 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20           j++;.  
32bb0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
32bc0 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67 42    }.        regB
32bd0 61 73 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ase = sqlite3Get
32be0 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
32bf0 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  , nCol);.       
32c00 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
32c10 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
32c20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
32c30 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
32c40 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79  pParse, pGroupBy
32c50 2c 20 72 65 67 42 61 73 65 2c 20 30 2c 20 30 29  , regBase, 0, 0)
32c60 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47  ;.        j = nG
32c70 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20  roupBy;.        
32c80 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49  for(i=0; i<sAggI
32c90 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  nfo.nColumn; i++
32ca0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72  ){.          str
32cb0 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20  uct AggInfo_col 
32cc0 2a 70 43 6f 6c 20 3d 20 26 73 41 67 67 49 6e 66  *pCol = &sAggInf
32cd0 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20  o.aCol[i];.     
32ce0 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69       if( pCol->i
32cf0 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20  SorterColumn>=j 
32d00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
32d10 6e 74 20 72 31 20 3d 20 6a 20 2b 20 72 65 67 42  nt r1 = j + regB
32d20 61 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ase;.           
32d30 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
32d40 47 65 74 43 6f 6c 75 6d 6e 54 6f 52 65 67 28 70  GetColumnToReg(p
32d50 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
32d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32d70 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61         pCol->pTa
32d80 62 2c 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e  b, pCol->iColumn
32d90 2c 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20  , pCol->iTable, 
32da0 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r1);.           
32db0 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20   j++;.          
32dc0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
32dd0 20 20 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20      regRecord = 
32de0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
32df0 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
32e00 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
32e10 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
32e20 65 63 6f 72 64 2c 20 72 65 67 42 61 73 65 2c 20  ecord, regBase, 
32e30 6e 43 6f 6c 2c 20 72 65 67 52 65 63 6f 72 64 29  nCol, regRecord)
32e40 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
32e50 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
32e60 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 2c 20  P_SorterInsert, 
32e70 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
32e80 49 64 78 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  Idx, regRecord);
32e90 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
32ea0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
32eb0 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64  Parse, regRecord
32ec0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
32ed0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
32ee0 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 42 61  ge(pParse, regBa
32ef0 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20  se, nCol);.     
32f00 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
32f10 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  nd(pWInfo);.    
32f20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72      sAggInfo.sor
32f30 74 69 6e 67 49 64 78 50 54 61 62 20 3d 20 73 6f  tingIdxPTab = so
32f40 72 74 50 54 61 62 20 3d 20 70 50 61 72 73 65 2d  rtPTab = pParse-
32f50 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20  >nTab++;.       
32f60 20 73 6f 72 74 4f 75 74 20 3d 20 73 71 6c 69 74   sortOut = sqlit
32f70 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
32f80 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
32f90 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
32fa0 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f  v, OP_OpenPseudo
32fb0 2c 20 73 6f 72 74 50 54 61 62 2c 20 73 6f 72 74  , sortPTab, sort
32fc0 4f 75 74 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20  Out, nCol);.    
32fd0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
32fe0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp2(v, OP_Sort
32ff0 65 72 53 6f 72 74 2c 20 73 41 67 67 49 6e 66 6f  erSort, sAggInfo
33000 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64  .sortingIdx, add
33010 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 56  rEnd);.        V
33020 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
33030 47 52 4f 55 50 20 42 59 20 73 6f 72 74 22 29 29  GROUP BY sort"))
33040 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
33050 29 3b 0a 20 20 20 20 20 20 20 20 73 41 67 67 49  );.        sAggI
33060 6e 66 6f 2e 75 73 65 53 6f 72 74 69 6e 67 49 64  nfo.useSortingId
33070 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 73  x = 1;.        s
33080 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
33090 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 0a 20  lear(pParse);.. 
330a0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
330b0 20 49 66 20 74 68 65 20 69 6e 64 65 78 20 6f 72   If the index or
330c0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
330d0 20 75 73 65 64 20 62 79 20 74 68 65 20 47 52 4f   used by the GRO
330e0 55 50 20 42 59 20 73 6f 72 74 0a 20 20 20 20 20  UP BY sort.     
330f0 20 2a 2a 20 77 69 6c 6c 20 6e 61 74 75 72 61 6c   ** will natural
33100 6c 79 20 64 65 6c 69 76 65 72 20 72 6f 77 73 20  ly deliver rows 
33110 69 6e 20 74 68 65 20 6f 72 64 65 72 20 72 65 71  in the order req
33120 75 69 72 65 64 20 62 79 20 74 68 65 20 4f 52 44  uired by the ORD
33130 45 52 20 42 59 0a 20 20 20 20 20 20 2a 2a 20 63  ER BY.      ** c
33140 6c 61 75 73 65 2c 20 63 61 6e 63 65 6c 20 74 68  lause, cancel th
33150 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  e ephemeral tabl
33160 65 20 6f 70 65 6e 20 63 6f 64 65 64 20 65 61 72  e open coded ear
33170 6c 69 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  lier..      **. 
33180 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20       ** This is 
33190 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  an optimization 
331a0 2d 20 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e  - the correct an
331b0 73 77 65 72 20 73 68 6f 75 6c 64 20 72 65 73 75  swer should resu
331c0 6c 74 20 72 65 67 61 72 64 6c 65 73 73 2e 0a 20  lt regardless.. 
331d0 20 20 20 20 20 2a 2a 20 55 73 65 20 74 68 65 20       ** Use the 
331e0 53 51 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f 72  SQLITE_GroupByOr
331f0 64 65 72 20 66 6c 61 67 20 77 69 74 68 20 53 51  der flag with SQ
33200 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50  LITE_TESTCTRL_OP
33210 54 49 4d 49 5a 45 52 20 74 6f 20 0a 20 20 20 20  TIMIZER to .    
33220 20 20 2a 2a 20 64 69 73 61 62 6c 65 20 74 68 69    ** disable thi
33230 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66  s optimization f
33240 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f  or testing purpo
33250 73 65 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69  ses.  */.      i
33260 66 28 20 6f 72 64 65 72 42 79 47 72 70 20 26 26  f( orderByGrp &&
33270 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61   OptimizationEna
33280 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f  bled(db, SQLITE_
33290 47 72 6f 75 70 42 79 4f 72 64 65 72 29 20 0a 20  GroupByOrder) . 
332a0 20 20 20 20 20 20 26 26 20 28 67 72 6f 75 70 42        && (groupB
332b0 79 53 6f 72 74 20 7c 7c 20 73 71 6c 69 74 65 33  ySort || sqlite3
332c0 57 68 65 72 65 49 73 53 6f 72 74 65 64 28 70 57  WhereIsSorted(pW
332d0 49 6e 66 6f 29 29 0a 20 20 20 20 20 20 29 7b 0a  Info)).      ){.
332e0 20 20 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f          sSort.pO
332f0 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
33300 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
33310 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 73  hangeToNoop(v, s
33320 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64  Sort.addrSortInd
33330 65 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  ex);.      }..  
33340 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20      /* Evaluate 
33350 74 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55  the current GROU
33360 50 20 42 59 20 74 65 72 6d 73 20 61 6e 64 20 73  P BY terms and s
33370 74 6f 72 65 20 69 6e 20 62 30 2c 20 62 31 2c 20  tore in b0, b1, 
33380 62 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 28  b2....      ** (
33390 62 30 20 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63  b0 is memory loc
333a0 61 74 69 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20 62  ation iBMem+0, b
333b0 31 20 69 73 20 69 42 4d 65 6d 2b 31 2c 20 61 6e  1 is iBMem+1, an
333c0 64 20 73 6f 20 66 6f 72 74 68 29 0a 20 20 20 20  d so forth).    
333d0 20 20 2a 2a 20 54 68 65 6e 20 63 6f 6d 70 61 72    ** Then compar
333e0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 47 52  e the current GR
333f0 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61 67 61  OUP BY terms aga
33400 69 6e 73 74 20 74 68 65 20 47 52 4f 55 50 20 42  inst the GROUP B
33410 59 20 74 65 72 6d 73 0a 20 20 20 20 20 20 2a 2a  Y terms.      **
33420 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f   from the previo
33430 75 73 20 72 6f 77 20 63 75 72 72 65 6e 74 6c 79  us row currently
33440 20 73 74 6f 72 65 64 20 69 6e 20 61 30 2c 20 61   stored in a0, a
33450 31 2c 20 61 32 2e 2e 2e 0a 20 20 20 20 20 20 2a  1, a2....      *
33460 2f 0a 20 20 20 20 20 20 61 64 64 72 54 6f 70 4f  /.      addrTopO
33470 66 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  fLoop = sqlite3V
33480 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
33490 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
334a0 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
334b0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 66  Parse);.      if
334c0 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b  ( groupBySort ){
334d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
334e0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
334f0 5f 53 6f 72 74 65 72 44 61 74 61 2c 20 73 41 67  _SorterData, sAg
33500 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
33510 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
33520 20 20 20 20 20 20 20 20 20 20 20 20 73 6f 72 74              sort
33530 4f 75 74 2c 20 73 6f 72 74 50 54 61 62 29 3b 0a  Out, sortPTab);.
33540 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
33550 72 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75 70 42  r(j=0; j<pGroupB
33560 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a  y->nExpr; j++){.
33570 20 20 20 20 20 20 20 20 69 66 28 20 67 72 6f 75          if( grou
33580 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20  pBySort ){.     
33590 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
335a0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
335b0 75 6d 6e 2c 20 73 6f 72 74 50 54 61 62 2c 20 6a  umn, sortPTab, j
335c0 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20  , iBMem+j);.    
335d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
335e0 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 64 69       sAggInfo.di
335f0 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20  rectMode = 1;.  
33600 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
33610 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
33620 70 47 72 6f 75 70 42 79 2d 3e 61 5b 6a 5d 2e 70  pGroupBy->a[j].p
33630 45 78 70 72 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a  Expr, iBMem+j);.
33640 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
33650 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
33660 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
33670 43 6f 6d 70 61 72 65 2c 20 69 41 4d 65 6d 2c 20  Compare, iAMem, 
33680 69 42 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d  iBMem, pGroupBy-
33690 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20  >nExpr,.        
336a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
336b0 20 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33    (char*)sqlite3
336c0 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 49  KeyInfoRef(pKeyI
336d0 6e 66 6f 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  nfo), P4_KEYINFO
336e0 29 3b 0a 20 20 20 20 20 20 61 64 64 72 31 20 3d  );.      addr1 =
336f0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
33700 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
33710 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
33720 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20  Op3(v, OP_Jump, 
33730 61 64 64 72 31 2b 31 2c 20 30 2c 20 61 64 64 72  addr1+1, 0, addr
33740 31 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61  1+1); VdbeCovera
33750 67 65 28 76 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ge(v);..      /*
33760 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
33770 68 61 74 20 72 75 6e 73 20 77 68 65 6e 65 76 65  hat runs wheneve
33780 72 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63  r the GROUP BY c
33790 68 61 6e 67 65 73 2e 0a 20 20 20 20 20 20 2a 2a  hanges..      **
337a0 20 43 68 61 6e 67 65 73 20 69 6e 20 74 68 65 20   Changes in the 
337b0 47 52 4f 55 50 20 42 59 20 61 72 65 20 64 65 74  GROUP BY are det
337c0 65 63 74 65 64 20 62 79 20 74 68 65 20 70 72 65  ected by the pre
337d0 76 69 6f 75 73 20 63 6f 64 65 0a 20 20 20 20 20  vious code.     
337e0 20 2a 2a 20 62 6c 6f 63 6b 2e 20 20 49 66 20 74   ** block.  If t
337f0 68 65 72 65 20 77 65 72 65 20 6e 6f 20 63 68 61  here were no cha
33800 6e 67 65 73 2c 20 74 68 69 73 20 62 6c 6f 63 6b  nges, this block
33810 20 69 73 20 73 6b 69 70 70 65 64 2e 0a 20 20 20   is skipped..   
33820 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
33830 68 69 73 20 63 6f 64 65 20 63 6f 70 69 65 73 20  his code copies 
33840 63 75 72 72 65 6e 74 20 67 72 6f 75 70 20 62 79  current group by
33850 20 74 65 72 6d 73 20 69 6e 20 62 30 2c 62 31 2c   terms in b0,b1,
33860 62 32 2c 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20  b2,....      ** 
33870 6f 76 65 72 20 74 6f 20 61 30 2c 61 31 2c 61 32  over to a0,a1,a2
33880 2e 20 20 49 74 20 74 68 65 6e 20 63 61 6c 6c 73  .  It then calls
33890 20 74 68 65 20 6f 75 74 70 75 74 20 73 75 62 72   the output subr
338a0 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20  outine.      ** 
338b0 61 6e 64 20 72 65 73 65 74 73 20 74 68 65 20 61  and resets the a
338c0 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c  ggregate accumul
338d0 61 74 6f 72 20 72 65 67 69 73 74 65 72 73 20 69  ator registers i
338e0 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 0a 20 20  n preparation.  
338f0 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e      ** for the n
33900 65 78 74 20 47 52 4f 55 50 20 42 59 20 62 61 74  ext GROUP BY bat
33910 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ch..      */.   
33920 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
33930 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 69  deMove(pParse, i
33940 42 4d 65 6d 2c 20 69 41 4d 65 6d 2c 20 70 47 72  BMem, iAMem, pGr
33950 6f 75 70 42 79 2d 3e 6e 45 78 70 72 29 3b 0a 20  oupBy->nExpr);. 
33960 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
33970 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
33980 75 62 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77  ub, regOutputRow
33990 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29  , addrOutputRow)
339a0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
339b0 65 6e 74 28 28 76 2c 20 22 6f 75 74 70 75 74 20  ent((v, "output 
339c0 6f 6e 65 20 72 6f 77 22 29 29 3b 0a 20 20 20 20  one row"));.    
339d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
339e0 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c  Op2(v, OP_IfPos,
339f0 20 69 41 62 6f 72 74 46 6c 61 67 2c 20 61 64 64   iAbortFlag, add
33a00 72 45 6e 64 29 3b 20 56 64 62 65 43 6f 76 65 72  rEnd); VdbeCover
33a10 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64  age(v);.      Vd
33a20 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63  beComment((v, "c
33a30 68 65 63 6b 20 61 62 6f 72 74 20 66 6c 61 67 22  heck abort flag"
33a40 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
33a50 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
33a60 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 73 65  P_Gosub, regRese
33a70 74 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20  t, addrReset);. 
33a80 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
33a90 28 28 76 2c 20 22 72 65 73 65 74 20 61 63 63 75  ((v, "reset accu
33aa0 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20  mulator"));..   
33ab0 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
33ac0 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d   aggregate accum
33ad0 75 6c 61 74 6f 72 73 20 62 61 73 65 64 20 6f 6e  ulators based on
33ae0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a   the content of.
33af0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72        ** the cur
33b00 72 65 6e 74 20 72 6f 77 0a 20 20 20 20 20 20 2a  rent row.      *
33b10 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
33b20 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
33b30 64 64 72 31 29 3b 0a 20 20 20 20 20 20 75 70 64  ddr1);.      upd
33b40 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70  ateAccumulator(p
33b50 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
33b60 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
33b70 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
33b80 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 55 73  _Integer, 1, iUs
33b90 65 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64  eFlag);.      Vd
33ba0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69  beComment((v, "i
33bb0 6e 64 69 63 61 74 65 20 64 61 74 61 20 69 6e 20  ndicate data in 
33bc0 61 63 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a  accumulator"));.
33bd0 0a 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66  .      /* End of
33be0 20 74 68 65 20 6c 6f 6f 70 0a 20 20 20 20 20 20   the loop.      
33bf0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 67 72 6f  */.      if( gro
33c00 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20  upBySort ){.    
33c10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
33c20 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp2(v, OP_Sort
33c30 65 72 4e 65 78 74 2c 20 73 41 67 67 49 6e 66 6f  erNext, sAggInfo
33c40 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64  .sortingIdx, add
33c50 72 54 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20  rTopOfLoop);.   
33c60 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
33c70 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  e(v);.      }els
33c80 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
33c90 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66  e3WhereEnd(pWInf
33ca0 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  o);.        sqli
33cb0 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
33cc0 6f 6f 70 28 76 2c 20 61 64 64 72 53 6f 72 74 69  oop(v, addrSorti
33cd0 6e 67 49 64 78 29 3b 0a 20 20 20 20 20 20 7d 0a  ngIdx);.      }.
33ce0 0a 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74  .      /* Output
33cf0 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 20 6f   the final row o
33d00 66 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a  f result.      *
33d10 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
33d20 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
33d30 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 70 75 74  Gosub, regOutput
33d40 52 6f 77 2c 20 61 64 64 72 4f 75 74 70 75 74 52  Row, addrOutputR
33d50 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ow);.      VdbeC
33d60 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74 70  omment((v, "outp
33d70 75 74 20 66 69 6e 61 6c 20 72 6f 77 22 29 29 3b  ut final row"));
33d80 0a 0a 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20  ..      /* Jump 
33d90 6f 76 65 72 20 74 68 65 20 73 75 62 72 6f 75 74  over the subrout
33da0 69 6e 65 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ines.      */.  
33db0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
33dc0 6f 74 6f 28 76 2c 20 61 64 64 72 45 6e 64 29 3b  oto(v, addrEnd);
33dd0 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ..      /* Gener
33de0 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
33df0 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 61 20   that outputs a 
33e00 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68  single row of th
33e10 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a  e result.      *
33e20 2a 20 73 65 74 2e 20 20 54 68 69 73 20 73 75 62  * set.  This sub
33e30 72 6f 75 74 69 6e 65 20 66 69 72 73 74 20 6c 6f  routine first lo
33e40 6f 6b 73 20 61 74 20 74 68 65 20 69 55 73 65 46  oks at the iUseF
33e50 6c 61 67 2e 20 20 49 66 20 69 55 73 65 46 6c 61  lag.  If iUseFla
33e60 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6c 65  g.      ** is le
33e70 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
33e80 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 20 73 75   to zero, the su
33e90 62 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f  broutine is a no
33ea0 2d 6f 70 2e 20 20 49 66 0a 20 20 20 20 20 20 2a  -op.  If.      *
33eb0 2a 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67  * the processing
33ec0 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 71   calls for the q
33ed0 75 65 72 79 20 74 6f 20 61 62 6f 72 74 2c 20 74  uery to abort, t
33ee0 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 0a 20  his subroutine. 
33ef0 20 20 20 20 20 2a 2a 20 69 6e 63 72 65 6d 65 6e       ** incremen
33f00 74 73 20 74 68 65 20 69 41 62 6f 72 74 46 6c 61  ts the iAbortFla
33f10 67 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  g memory locatio
33f20 6e 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  n before returni
33f30 6e 67 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f  ng in.      ** o
33f40 72 64 65 72 20 74 6f 20 73 69 67 6e 61 6c 20 74  rder to signal t
33f50 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 61 62 6f  he caller to abo
33f60 72 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  rt..      */.   
33f70 20 20 20 61 64 64 72 53 65 74 41 62 6f 72 74 20     addrSetAbort 
33f80 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
33f90 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
33fa0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
33fb0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
33fc0 65 72 2c 20 31 2c 20 69 41 62 6f 72 74 46 6c 61  er, 1, iAbortFla
33fd0 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  g);.      VdbeCo
33fe0 6d 6d 65 6e 74 28 28 76 2c 20 22 73 65 74 20 61  mment((v, "set a
33ff0 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20  bort flag"));.  
34000 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
34010 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
34020 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77  rn, regOutputRow
34030 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
34040 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
34050 28 76 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f  (v, addrOutputRo
34060 77 29 3b 0a 20 20 20 20 20 20 61 64 64 72 4f 75  w);.      addrOu
34070 74 70 75 74 52 6f 77 20 3d 20 73 71 6c 69 74 65  tputRow = sqlite
34080 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
34090 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
340a0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
340b0 4f 50 5f 49 66 50 6f 73 2c 20 69 55 73 65 46 6c  OP_IfPos, iUseFl
340c0 61 67 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f  ag, addrOutputRo
340d0 77 2b 32 29 3b 0a 20 20 20 20 20 20 56 64 62 65  w+2);.      Vdbe
340e0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
340f0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
34100 76 2c 20 22 47 72 6f 75 70 62 79 20 72 65 73 75  v, "Groupby resu
34110 6c 74 20 67 65 6e 65 72 61 74 6f 72 20 65 6e 74  lt generator ent
34120 72 79 20 70 6f 69 6e 74 22 29 29 3b 0a 20 20 20  ry point"));.   
34130 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
34140 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
34150 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29  n, regOutputRow)
34160 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65  ;.      finalize
34170 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61  AggFunctions(pPa
34180 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
34190 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
341a0 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
341b0 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72 4f  , pHaving, addrO
341c0 75 74 70 75 74 52 6f 77 2b 31 2c 20 53 51 4c 49  utputRow+1, SQLI
341d0 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
341e0 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65        selectInne
341f0 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
34200 20 2d 31 2c 20 26 73 53 6f 72 74 2c 0a 20 20 20   -1, &sSort,.   
34210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34220 20 20 20 26 73 44 69 73 74 69 6e 63 74 2c 20 70     &sDistinct, p
34230 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Dest,.          
34240 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64 72              addr
34250 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 61 64 64  OutputRow+1, add
34260 72 53 65 74 41 62 6f 72 74 29 3b 0a 20 20 20 20  rSetAbort);.    
34270 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
34280 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
34290 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b  , regOutputRow);
342a0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
342b0 6e 74 28 28 76 2c 20 22 65 6e 64 20 67 72 6f 75  nt((v, "end grou
342c0 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72  pby result gener
342d0 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20  ator"));..      
342e0 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
342f0 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69  broutine that wi
34300 6c 6c 20 72 65 73 65 74 20 74 68 65 20 67 72 6f  ll reset the gro
34310 75 70 2d 62 79 20 61 63 63 75 6d 75 6c 61 74 6f  up-by accumulato
34320 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  r.      */.     
34330 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
34340 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
34350 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 72 65  Reset);.      re
34360 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70  setAccumulator(p
34370 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
34380 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
34390 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
343a0 5f 52 65 74 75 72 6e 2c 20 72 65 67 52 65 73 65  _Return, regRese
343b0 74 29 3b 0a 20 20 20 20 20 0a 20 20 20 20 7d 20  t);.     .    } 
343c0 2f 2a 20 65 6e 64 69 66 20 70 47 72 6f 75 70 42  /* endif pGroupB
343d0 79 2e 20 20 42 65 67 69 6e 20 61 67 67 72 65 67  y.  Begin aggreg
343e0 61 74 65 20 71 75 65 72 69 65 73 20 77 69 74 68  ate queries with
343f0 6f 75 74 20 47 52 4f 55 50 20 42 59 3a 20 2a 2f  out GROUP BY: */
34400 0a 20 20 20 20 65 6c 73 65 20 7b 0a 20 20 20 20  .    else {.    
34410 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44 65 6c    ExprList *pDel
34420 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
34430 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43  LITE_OMIT_BTREEC
34440 4f 55 4e 54 0a 20 20 20 20 20 20 54 61 62 6c 65  OUNT.      Table
34450 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66   *pTab;.      if
34460 28 20 28 70 54 61 62 20 3d 20 69 73 53 69 6d 70  ( (pTab = isSimp
34470 6c 65 43 6f 75 6e 74 28 70 2c 20 26 73 41 67 67  leCount(p, &sAgg
34480 49 6e 66 6f 29 29 21 3d 30 20 29 7b 0a 20 20 20  Info))!=0 ){.   
34490 20 20 20 20 20 2f 2a 20 49 66 20 69 73 53 69 6d       /* If isSim
344a0 70 6c 65 43 6f 75 6e 74 28 29 20 72 65 74 75 72  pleCount() retur
344b0 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
344c0 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  a Table structur
344d0 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20  e, then.        
344e0 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  ** the SQL state
344f0 6d 65 6e 74 20 69 73 20 6f 66 20 74 68 65 20 66  ment is of the f
34500 6f 72 6d 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a  orm:.        **.
34510 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c          **   SEL
34520 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
34530 4d 20 3c 74 62 6c 3e 0a 20 20 20 20 20 20 20 20  M <tbl>.        
34540 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 68  **.        ** wh
34550 65 72 65 20 74 68 65 20 54 61 62 6c 65 20 73 74  ere the Table st
34560 72 75 63 74 75 72 65 20 72 65 74 75 72 6e 65 64  ructure returned
34570 20 72 65 70 72 65 73 65 6e 74 73 20 74 61 62 6c   represents tabl
34580 65 20 3c 74 62 6c 3e 2e 0a 20 20 20 20 20 20 20  e <tbl>..       
34590 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
345a0 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73  his statement is
345b0 20 73 6f 20 63 6f 6d 6d 6f 6e 20 74 68 61 74 20   so common that 
345c0 69 74 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 20  it is optimized 
345d0 73 70 65 63 69 61 6c 6c 79 2e 20 54 68 65 0a 20  specially. The. 
345e0 20 20 20 20 20 20 20 2a 2a 20 4f 50 5f 43 6f 75         ** OP_Cou
345f0 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  nt instruction i
34600 73 20 65 78 65 63 75 74 65 64 20 65 69 74 68 65  s executed eithe
34610 72 20 6f 6e 20 74 68 65 20 69 6e 74 6b 65 79 20  r on the intkey 
34620 74 61 62 6c 65 20 74 68 61 74 0a 20 20 20 20 20  table that.     
34630 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74     ** contains t
34640 68 65 20 64 61 74 61 20 66 6f 72 20 74 61 62 6c  he data for tabl
34650 65 20 3c 74 62 6c 3e 20 6f 72 20 6f 6e 20 6f 6e  e <tbl> or on on
34660 65 20 6f 66 20 69 74 73 20 69 6e 64 65 78 65 73  e of its indexes
34670 2e 20 49 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  . It.        ** 
34680 69 73 20 62 65 74 74 65 72 20 74 6f 20 65 78 65  is better to exe
34690 63 75 74 65 20 74 68 65 20 6f 70 20 6f 6e 20 61  cute the op on a
346a0 6e 20 69 6e 64 65 78 2c 20 61 73 20 69 6e 64 65  n index, as inde
346b0 78 65 73 20 61 72 65 20 61 6c 6d 6f 73 74 0a 20  xes are almost. 
346c0 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73         ** always
346d0 20 73 70 72 65 61 64 20 61 63 72 6f 73 73 20 6c   spread across l
346e0 65 73 73 20 70 61 67 65 73 20 74 68 61 6e 20 74  ess pages than t
346f0 68 65 69 72 20 63 6f 72 72 65 73 70 6f 6e 64 69  heir correspondi
34700 6e 67 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20  ng tables..     
34710 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f     */.        co
34720 6e 73 74 20 69 6e 74 20 69 44 62 20 3d 20 73 71  nst int iDb = sq
34730 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
34740 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ex(pParse->db, p
34750 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
34760 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74         const int
34770 20 69 43 73 72 20 3d 20 70 50 61 72 73 65 2d 3e   iCsr = pParse->
34780 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 43  nTab++;     /* C
34790 75 72 73 6f 72 20 74 6f 20 73 63 61 6e 20 62 2d  ursor to scan b-
347a0 74 72 65 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  tree */.        
347b0 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
347c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
347d0 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
347e0 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20   variable */.   
347f0 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b       KeyInfo *pK
34800 65 79 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20  eyInfo = 0;     
34810 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79            /* Key
34820 69 6e 66 6f 20 66 6f 72 20 73 63 61 6e 6e 65 64  info for scanned
34830 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
34840 20 20 49 6e 64 65 78 20 2a 70 42 65 73 74 20 3d    Index *pBest =
34850 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
34860 20 20 20 20 20 20 20 2f 2a 20 42 65 73 74 20 69         /* Best i
34870 6e 64 65 78 20 66 6f 75 6e 64 20 73 6f 20 66 61  ndex found so fa
34880 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  r */.        int
34890 20 69 52 6f 6f 74 20 3d 20 70 54 61 62 2d 3e 74   iRoot = pTab->t
348a0 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  num;            
348b0 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f    /* Root page o
348c0 66 20 73 63 61 6e 6e 65 64 20 62 2d 74 72 65 65  f scanned b-tree
348d0 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 73 71 6c   */..        sql
348e0 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
348f0 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62  hema(pParse, iDb
34900 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
34910 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72  e3TableLock(pPar
34920 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74  se, iDb, pTab->t
34930 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e  num, 0, pTab->zN
34940 61 6d 65 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f  ame);..        /
34950 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74 68 65  * Search for the
34960 20 69 6e 64 65 78 20 74 68 61 74 20 68 61 73 20   index that has 
34970 74 68 65 20 6c 6f 77 65 73 74 20 73 63 61 6e 20  the lowest scan 
34980 63 6f 73 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a  cost..        **
34990 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 32 30 31  .        ** (201
349a0 31 2d 30 34 2d 31 35 29 20 44 6f 20 6e 6f 74 20  1-04-15) Do not 
349b0 64 6f 20 61 20 66 75 6c 6c 20 73 63 61 6e 20 6f  do a full scan o
349c0 66 20 61 6e 20 75 6e 6f 72 64 65 72 65 64 20 69  f an unordered i
349d0 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a  ndex..        **
349e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 32 30 31  .        ** (201
349f0 33 2d 31 30 2d 30 33 29 20 44 6f 20 6e 6f 74 20  3-10-03) Do not 
34a00 63 6f 75 6e 74 20 74 68 65 20 65 6e 74 72 69 65  count the entrie
34a10 73 20 69 6e 20 61 20 70 61 72 74 69 61 6c 20 69  s in a partial i
34a20 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a  ndex..        **
34a30 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 70  .        ** In p
34a40 72 61 63 74 69 63 65 20 74 68 65 20 4b 65 79 49  ractice the KeyI
34a50 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 77 69  nfo structure wi
34a60 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 20  ll not be used. 
34a70 49 74 20 69 73 20 6f 6e 6c 79 20 0a 20 20 20 20  It is only .    
34a80 20 20 20 20 2a 2a 20 70 61 73 73 65 64 20 74 6f      ** passed to
34a90 20 6b 65 65 70 20 4f 50 5f 4f 70 65 6e 52 65 61   keep OP_OpenRea
34aa0 64 20 68 61 70 70 79 2e 0a 20 20 20 20 20 20 20  d happy..       
34ab0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
34ac0 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20  !HasRowid(pTab) 
34ad0 29 20 70 42 65 73 74 20 3d 20 73 71 6c 69 74 65  ) pBest = sqlite
34ae0 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  3PrimaryKeyIndex
34af0 28 70 54 61 62 29 3b 0a 20 20 20 20 20 20 20 20  (pTab);.        
34b00 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
34b10 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
34b20 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
34b30 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49            if( pI
34b40 64 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d  dx->bUnordered==
34b50 30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  0.           && 
34b60 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77 3c 70  pIdx->szIdxRow<p
34b70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 0a 20 20  Tab->szTabRow.  
34b80 20 20 20 20 20 20 20 20 20 26 26 20 70 49 64 78           && pIdx
34b90 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 3d  ->pPartIdxWhere=
34ba0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  =0.           &&
34bb0 20 28 21 70 42 65 73 74 20 7c 7c 20 70 49 64 78   (!pBest || pIdx
34bc0 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 42 65 73 74  ->szIdxRow<pBest
34bd0 2d 3e 73 7a 49 64 78 52 6f 77 29 0a 20 20 20 20  ->szIdxRow).    
34be0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
34bf0 20 20 20 20 20 70 42 65 73 74 20 3d 20 70 49 64       pBest = pId
34c00 78 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  x;.          }. 
34c10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
34c20 20 69 66 28 20 70 42 65 73 74 20 29 7b 0a 20 20   if( pBest ){.  
34c30 20 20 20 20 20 20 20 20 69 52 6f 6f 74 20 3d 20          iRoot = 
34c40 70 42 65 73 74 2d 3e 74 6e 75 6d 3b 0a 20 20 20  pBest->tnum;.   
34c50 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20         pKeyInfo 
34c60 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  = sqlite3KeyInfo
34c70 4f 66 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  OfIndex(pParse, 
34c80 70 42 65 73 74 29 3b 0a 20 20 20 20 20 20 20 20  pBest);.        
34c90 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 70  }..        /* Op
34ca0 65 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63  en a read-only c
34cb0 75 72 73 6f 72 2c 20 65 78 65 63 75 74 65 20 74  ursor, execute t
34cc0 68 65 20 4f 50 5f 43 6f 75 6e 74 2c 20 63 6c 6f  he OP_Count, clo
34cd0 73 65 20 74 68 65 20 63 75 72 73 6f 72 2e 20 2a  se the cursor. *
34ce0 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
34cf0 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
34d00 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69  , OP_OpenRead, i
34d10 43 73 72 2c 20 69 52 6f 6f 74 2c 20 69 44 62 2c  Csr, iRoot, iDb,
34d20 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   1);.        if(
34d30 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20   pKeyInfo ){.   
34d40 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
34d50 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31  beChangeP4(v, -1
34d60 2c 20 28 63 68 61 72 20 2a 29 70 4b 65 79 49 6e  , (char *)pKeyIn
34d70 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
34d80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
34d90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
34da0 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 75 6e 74  dOp2(v, OP_Count
34db0 2c 20 69 43 73 72 2c 20 73 41 67 67 49 6e 66 6f  , iCsr, sAggInfo
34dc0 2e 61 46 75 6e 63 5b 30 5d 2e 69 4d 65 6d 29 3b  .aFunc[0].iMem);
34dd0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
34de0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
34df0 5f 43 6c 6f 73 65 2c 20 69 43 73 72 29 3b 0a 20  _Close, iCsr);. 
34e00 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 69         explainSi
34e10 6d 70 6c 65 43 6f 75 6e 74 28 70 50 61 72 73 65  mpleCount(pParse
34e20 2c 20 70 54 61 62 2c 20 70 42 65 73 74 29 3b 0a  , pTab, pBest);.
34e30 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64        }else.#end
34e40 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
34e50 54 5f 42 54 52 45 45 43 4f 55 4e 54 20 2a 2f 0a  T_BTREECOUNT */.
34e60 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
34e70 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  /* Check if the 
34e80 71 75 65 72 79 20 69 73 20 6f 66 20 6f 6e 65 20  query is of one 
34e90 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
34ea0 20 66 6f 72 6d 73 3a 0a 20 20 20 20 20 20 20 20   forms:.        
34eb0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
34ec0 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 20 46 52  SELECT min(x) FR
34ed0 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 20 20 2a  OM ....        *
34ee0 2a 20 20 20 53 45 4c 45 43 54 20 6d 61 78 28 78  *   SELECT max(x
34ef0 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20  ) FROM ....     
34f00 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
34f10 20 49 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20   If it is, then 
34f20 61 73 6b 20 74 68 65 20 63 6f 64 65 20 69 6e 20  ask the code in 
34f30 77 68 65 72 65 2e 63 20 74 6f 20 61 74 74 65 6d  where.c to attem
34f40 70 74 20 74 6f 20 73 6f 72 74 20 72 65 73 75 6c  pt to sort resul
34f50 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73  ts.        ** as
34f60 20 69 66 20 74 68 65 72 65 20 77 61 73 20 61 6e   if there was an
34f70 20 22 4f 52 44 45 52 20 4f 4e 20 78 22 20 6f 72   "ORDER ON x" or
34f80 20 22 4f 52 44 45 52 20 4f 4e 20 78 20 44 45 53   "ORDER ON x DES
34f90 43 22 20 63 6c 61 75 73 65 2e 20 0a 20 20 20 20  C" clause. .    
34fa0 20 20 20 20 2a 2a 20 49 66 20 77 68 65 72 65 2e      ** If where.
34fb0 63 20 69 73 20 61 62 6c 65 20 74 6f 20 70 72 6f  c is able to pro
34fc0 64 75 63 65 20 72 65 73 75 6c 74 73 20 73 6f 72  duce results sor
34fd0 74 65 64 20 69 6e 20 74 68 69 73 20 6f 72 64 65  ted in this orde
34fe0 72 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20  r, then.        
34ff0 2a 2a 20 61 64 64 20 76 64 62 65 20 63 6f 64 65  ** add vdbe code
35000 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66   to break out of
35010 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20   the processing 
35020 6c 6f 6f 70 20 61 66 74 65 72 20 74 68 65 20 0a  loop after the .
35030 20 20 20 20 20 20 20 20 2a 2a 20 66 69 72 73 74          ** first
35040 20 69 74 65 72 61 74 69 6f 6e 20 28 73 69 6e 63   iteration (sinc
35050 65 20 74 68 65 20 66 69 72 73 74 20 69 74 65 72  e the first iter
35060 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f  ation of the loo
35070 70 20 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a  p is .        **
35080 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 6f   guaranteed to o
35090 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 72 6f  perate on the ro
350a0 77 20 77 69 74 68 20 74 68 65 20 6d 69 6e 69 6d  w with the minim
350b0 75 6d 20 6f 72 20 6d 61 78 69 6d 75 6d 20 0a 20  um or maximum . 
350c0 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20         ** value 
350d0 6f 66 20 78 2c 20 74 68 65 20 6f 6e 6c 79 20 72  of x, the only r
350e0 6f 77 20 72 65 71 75 69 72 65 64 29 2e 0a 20 20  ow required)..  
350f0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
35100 20 2a 2a 20 41 20 73 70 65 63 69 61 6c 20 66 6c   ** A special fl
35110 61 67 20 6d 75 73 74 20 62 65 20 70 61 73 73 65  ag must be passe
35120 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72  d to sqlite3Wher
35130 65 42 65 67 69 6e 28 29 20 74 6f 20 73 6c 69 67  eBegin() to slig
35140 68 74 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  htly.        ** 
35150 6d 6f 64 69 66 79 20 62 65 68 61 76 69 6f 72 20  modify behavior 
35160 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20  as follows:.    
35170 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
35180 2a 20 20 20 2b 20 49 66 20 74 68 65 20 71 75 65  *   + If the que
35190 72 79 20 69 73 20 61 20 22 53 45 4c 45 43 54 20  ry is a "SELECT 
351a0 6d 69 6e 28 78 29 22 2c 20 74 68 65 6e 20 74 68  min(x)", then th
351b0 65 20 6c 6f 6f 70 20 63 6f 64 65 64 20 62 79 0a  e loop coded by.
351c0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 77          **     w
351d0 68 65 72 65 2e 63 20 73 68 6f 75 6c 64 20 6e 6f  here.c should no
351e0 74 20 69 74 65 72 61 74 65 20 6f 76 65 72 20 61  t iterate over a
351f0 6e 79 20 76 61 6c 75 65 73 20 77 69 74 68 20 61  ny values with a
35200 20 4e 55 4c 4c 20 76 61 6c 75 65 0a 20 20 20 20   NULL value.    
35210 20 20 20 20 2a 2a 20 20 20 20 20 66 6f 72 20 78      **     for x
35220 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
35230 20 20 20 20 20 2a 2a 20 20 20 2b 20 54 68 65 20       **   + The 
35240 6f 70 74 69 6d 69 7a 65 72 20 63 6f 64 65 20 69  optimizer code i
35250 6e 20 77 68 65 72 65 2e 63 20 28 74 68 65 20 74  n where.c (the t
35260 68 69 6e 67 20 74 68 61 74 20 64 65 63 69 64 65  hing that decide
35270 73 20 77 68 69 63 68 0a 20 20 20 20 20 20 20 20  s which.        
35280 2a 2a 20 20 20 20 20 69 6e 64 65 78 20 6f 72 20  **     index or 
35290 69 6e 64 69 63 65 73 20 74 6f 20 75 73 65 29 20  indices to use) 
352a0 73 68 6f 75 6c 64 20 70 6c 61 63 65 20 61 20 64  should place a d
352b0 69 66 66 65 72 65 6e 74 20 70 72 69 6f 72 69 74  ifferent priorit
352c0 79 20 6f 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a  y on .        **
352d0 20 20 20 20 20 73 61 74 69 73 66 79 69 6e 67 20       satisfying 
352e0 74 68 65 20 27 4f 52 44 45 52 20 42 59 27 20 63  the 'ORDER BY' c
352f0 6c 61 75 73 65 20 74 68 61 6e 20 69 74 20 64 6f  lause than it do
35300 65 73 20 69 6e 20 6f 74 68 65 72 20 63 61 73 65  es in other case
35310 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  s..        **   
35320 20 20 52 65 66 65 72 20 74 6f 20 63 6f 64 65 20    Refer to code 
35330 61 6e 64 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20  and comments in 
35340 77 68 65 72 65 2e 63 20 66 6f 72 20 64 65 74 61  where.c for deta
35350 69 6c 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ils..        */.
35360 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74          ExprList
35370 20 2a 70 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a 20   *pMinMax = 0;. 
35380 20 20 20 20 20 20 20 75 38 20 66 6c 61 67 20 3d         u8 flag =
35390 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e   WHERE_ORDERBY_N
353a0 4f 52 4d 41 4c 3b 0a 20 20 20 20 20 20 20 20 0a  ORMAL;.        .
353b0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
353c0 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29  p->pGroupBy==0 )
353d0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
353e0 28 20 66 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20  ( flag==0 );.   
353f0 20 20 20 20 20 69 66 28 20 70 2d 3e 70 48 61 76       if( p->pHav
35400 69 6e 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ing==0 ){.      
35410 20 20 20 20 66 6c 61 67 20 3d 20 6d 69 6e 4d 61      flag = minMa
35420 78 51 75 65 72 79 28 26 73 41 67 67 49 6e 66 6f  xQuery(&sAggInfo
35430 2c 20 26 70 4d 69 6e 4d 61 78 29 3b 0a 20 20 20  , &pMinMax);.   
35440 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
35450 73 73 65 72 74 28 20 66 6c 61 67 3d 3d 30 20 7c  ssert( flag==0 |
35460 7c 20 28 70 4d 69 6e 4d 61 78 21 3d 30 20 26 26  | (pMinMax!=0 &&
35470 20 70 4d 69 6e 4d 61 78 2d 3e 6e 45 78 70 72 3d   pMinMax->nExpr=
35480 3d 31 29 20 29 3b 0a 0a 20 20 20 20 20 20 20 20  =1) );..        
35490 69 66 28 20 66 6c 61 67 20 29 7b 0a 20 20 20 20  if( flag ){.    
354a0 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 20 3d 20        pMinMax = 
354b0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
354c0 75 70 28 64 62 2c 20 70 4d 69 6e 4d 61 78 2c 20  up(db, pMinMax, 
354d0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44  0);.          pD
354e0 65 6c 20 3d 20 70 4d 69 6e 4d 61 78 3b 0a 20 20  el = pMinMax;.  
354f0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
35500 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
35510 20 7c 7c 20 70 4d 69 6e 4d 61 78 21 3d 30 20 29   || pMinMax!=0 )
35520 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
35530 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
35540 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  d ){.           
35550 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 73   pMinMax->a[0].s
35560 6f 72 74 4f 72 64 65 72 20 3d 20 66 6c 61 67 21  ortOrder = flag!
35570 3d 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d  =WHERE_ORDERBY_M
35580 49 4e 20 3f 31 3a 30 3b 0a 20 20 20 20 20 20 20  IN ?1:0;.       
35590 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b       pMinMax->a[
355a0 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54  0].pExpr->op = T
355b0 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20  K_COLUMN;.      
355c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
355d0 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68    .        /* Th
355e0 69 73 20 63 61 73 65 20 72 75 6e 73 20 69 66 20  is case runs if 
355f0 74 68 65 20 61 67 67 72 65 67 61 74 65 20 68 61  the aggregate ha
35600 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c  s no GROUP BY cl
35610 61 75 73 65 2e 20 20 54 68 65 0a 20 20 20 20 20  ause.  The.     
35620 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67     ** processing
35630 20 69 73 20 6d 75 63 68 20 73 69 6d 70 6c 65 72   is much simpler
35640 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 20   since there is 
35650 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 6f  only a single ro
35660 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20  w.        ** of 
35670 6f 75 74 70 75 74 2e 0a 20 20 20 20 20 20 20 20  output..        
35680 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 73 65 74  */.        reset
35690 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72  Accumulator(pPar
356a0 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
356b0 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d          pWInfo =
356c0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
356d0 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  in(pParse, pTabL
356e0 69 73 74 2c 20 70 57 68 65 72 65 2c 20 70 4d 69  ist, pWhere, pMi
356f0 6e 4d 61 78 2c 20 30 2c 66 6c 61 67 2c 30 29 3b  nMax, 0,flag,0);
35700 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 57 49  .        if( pWI
35710 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nfo==0 ){.      
35720 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
35730 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44  istDelete(db, pD
35740 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67  el);.          g
35750 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
35760 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
35770 20 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61    updateAccumula
35780 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67  tor(pParse, &sAg
35790 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  gInfo);.        
357a0 61 73 73 65 72 74 28 20 70 4d 69 6e 4d 61 78 3d  assert( pMinMax=
357b0 3d 30 20 7c 7c 20 70 4d 69 6e 4d 61 78 2d 3e 6e  =0 || pMinMax->n
357c0 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20 20 20 20  Expr==1 );.     
357d0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
357e0 65 72 65 49 73 4f 72 64 65 72 65 64 28 70 57 49  ereIsOrdered(pWI
357f0 6e 66 6f 29 3e 30 20 29 7b 0a 20 20 20 20 20 20  nfo)>0 ){.      
35800 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
35810 6f 74 6f 28 76 2c 20 73 71 6c 69 74 65 33 57 68  oto(v, sqlite3Wh
35820 65 72 65 42 72 65 61 6b 4c 61 62 65 6c 28 70 57  ereBreakLabel(pW
35830 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20 20 20  Info));.        
35840 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
35850 2c 20 22 25 73 28 29 20 62 79 20 69 6e 64 65 78  , "%s() by index
35860 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
35870 20 20 20 28 66 6c 61 67 3d 3d 57 48 45 52 45 5f     (flag==WHERE_
35880 4f 52 44 45 52 42 59 5f 4d 49 4e 3f 22 6d 69 6e  ORDERBY_MIN?"min
35890 22 3a 22 6d 61 78 22 29 29 29 3b 0a 20 20 20 20  ":"max")));.    
358a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
358b0 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57  lite3WhereEnd(pW
358c0 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 66  Info);.        f
358d0 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69  inalizeAggFuncti
358e0 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41 67  ons(pParse, &sAg
358f0 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 7d 0a  gInfo);.      }.
35900 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72  .      sSort.pOr
35910 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20  derBy = 0;.     
35920 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
35930 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48 61 76  lse(pParse, pHav
35940 69 6e 67 2c 20 61 64 64 72 45 6e 64 2c 20 53 51  ing, addrEnd, SQ
35950 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
35960 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e  ;.      selectIn
35970 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
35980 70 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 0a 20 20  p, -1, 0, 0, .  
35990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
359a0 20 20 20 20 70 44 65 73 74 2c 20 61 64 64 72 45      pDest, addrE
359b0 6e 64 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20  nd, addrEnd);.  
359c0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
359d0 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44  istDelete(db, pD
359e0 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  el);.    }.    s
359f0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
35a00 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 45 6e  eLabel(v, addrEn
35a10 64 29 3b 0a 20 20 20 20 0a 20 20 7d 20 2f 2a 20  d);.    .  } /* 
35a20 65 6e 64 69 66 20 61 67 67 72 65 67 61 74 65 20  endif aggregate 
35a30 71 75 65 72 79 20 2a 2f 0a 0a 20 20 69 66 28 20  query */..  if( 
35a40 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54  sDistinct.eTnctT
35a50 79 70 65 3d 3d 57 48 45 52 45 5f 44 49 53 54 49  ype==WHERE_DISTI
35a60 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 20 29 7b  NCT_UNORDERED ){
35a70 0a 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d 70  .    explainTemp
35a80 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 22 44  Table(pParse, "D
35a90 49 53 54 49 4e 43 54 22 29 3b 0a 20 20 7d 0a 0a  ISTINCT");.  }..
35aa0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
35ab0 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
35ac0 75 73 65 2c 20 74 68 65 6e 20 77 65 20 6e 65 65  use, then we nee
35ad0 64 20 74 6f 20 73 6f 72 74 20 74 68 65 20 72 65  d to sort the re
35ae0 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64 20 73  sults.  ** and s
35af0 65 6e 64 20 74 68 65 6d 20 74 6f 20 74 68 65 20  end them to the 
35b00 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62 79 20  callback one by 
35b10 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  one..  */.  if( 
35b20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 29  sSort.pOrderBy )
35b30 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d  {.    explainTem
35b40 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 0a 20  pTable(pParse,. 
35b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35b60 20 20 20 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74      sSort.nOBSat
35b70 3e 30 20 3f 20 22 52 49 47 48 54 20 50 41 52 54  >0 ? "RIGHT PART
35b80 20 4f 46 20 4f 52 44 45 52 20 42 59 22 3a 22 4f   OF ORDER BY":"O
35b90 52 44 45 52 20 42 59 22 29 3b 0a 20 20 20 20 67  RDER BY");.    g
35ba0 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28  enerateSortTail(
35bb0 70 50 61 72 73 65 2c 20 70 2c 20 26 73 53 6f 72  pParse, p, &sSor
35bc0 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t, pEList->nExpr
35bd0 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a 0a 20  , pDest);.  }.. 
35be0 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
35bf0 20 73 6b 69 70 20 74 68 69 73 20 71 75 65 72 79   skip this query
35c00 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
35c10 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
35c20 76 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20  v, iEnd);..  /* 
35c30 54 68 65 20 53 45 4c 45 43 54 20 68 61 73 20 62  The SELECT has b
35c40 65 65 6e 20 63 6f 64 65 64 2e 20 49 66 20 74 68  een coded. If th
35c50 65 72 65 20 69 73 20 61 6e 20 65 72 72 6f 72 20  ere is an error 
35c60 69 6e 20 74 68 65 20 50 61 72 73 65 20 73 74 72  in the Parse str
35c70 75 63 74 75 72 65 2c 0a 20 20 2a 2a 20 73 65 74  ucture,.  ** set
35c80 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   the return code
35c90 20 74 6f 20 31 2e 20 4f 74 68 65 72 77 69 73 65   to 1. Otherwise
35ca0 20 30 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 28 70   0. */.  rc = (p
35cb0 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 29 3b 0a  Parse->nErr>0);.
35cc0 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75  .  /* Control ju
35cd0 6d 70 73 20 74 6f 20 68 65 72 65 20 69 66 20 61  mps to here if a
35ce0 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  n error is encou
35cf0 6e 74 65 72 65 64 20 61 62 6f 76 65 2c 20 6f 72  ntered above, or
35d00 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63 65   upon.  ** succe
35d10 73 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66 20  ssful coding of 
35d20 74 68 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2f  the SELECT..  */
35d30 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 65  .select_end:.  e
35d40 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
35d50 28 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74  (pParse->iSelect
35d60 49 64 2c 20 69 52 65 73 74 6f 72 65 53 65 6c 65  Id, iRestoreSele
35d70 63 74 49 64 29 3b 0a 0a 20 20 73 71 6c 69 74 65  ctId);..  sqlite
35d80 33 44 62 46 72 65 65 28 64 62 2c 20 73 41 67 67  3DbFree(db, sAgg
35d90 49 6e 66 6f 2e 61 43 6f 6c 29 3b 0a 20 20 73 71  Info.aCol);.  sq
35da0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
35db0 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 29 3b  sAggInfo.aFunc);
35dc0 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45  .#if SELECTTRACE
35dd0 5f 45 4e 41 42 4c 45 44 0a 20 20 53 45 4c 45 43  _ENABLED.  SELEC
35de0 54 54 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c  TTRACE(1,pParse,
35df0 70 2c 28 22 65 6e 64 20 70 72 6f 63 65 73 73 69  p,("end processi
35e00 6e 67 5c 6e 22 29 29 3b 0a 20 20 70 50 61 72 73  ng\n"));.  pPars
35e10 65 2d 3e 6e 53 65 6c 65 63 74 49 6e 64 65 6e 74  e->nSelectIndent
35e20 2d 2d 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74  --;.#endif.  ret
35e30 75 72 6e 20 72 63 3b 0a 7d 0a                    urn rc;.}.