/ Hex Artifact Content
Login

Artifact 7849cee0a01952a9c93cd28989daedfa57731143:


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 7d 3b 0a 23 64 65 66 69 6e  its */.};.#defin
0840: 65 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f  e SORTFLAG_UseSo
0850: 72 74 65 72 20 20 30 78 30 31 20 20 20 2f 2a 20  rter  0x01   /* 
0860: 55 73 65 20 53 6f 72 74 65 72 4f 70 65 6e 20 69  Use SorterOpen i
0870: 6e 73 74 65 61 64 20 6f 66 20 4f 70 65 6e 45 70  nstead of OpenEp
0880: 68 65 6d 65 72 61 6c 20 2a 2f 0a 0a 2f 2a 0a 2a  hemeral */../*.*
0890: 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 74 68 65  * Delete all the
08a0: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 53 65   content of a Se
08b0: 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 2e 20  lect structure. 
08c0: 20 44 65 61 6c 6c 6f 63 61 74 65 20 74 68 65 20   Deallocate the 
08d0: 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 69 74 73  structure.** its
08e0: 65 6c 66 20 6f 6e 6c 79 20 69 66 20 62 46 72 65  elf only if bFre
08f0: 65 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74  e is true..*/.st
0900: 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 53  atic void clearS
0910: 65 6c 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64  elect(sqlite3 *d
0920: 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  b, Select *p, in
0930: 74 20 62 46 72 65 65 29 7b 0a 20 20 77 68 69 6c  t bFree){.  whil
0940: 65 28 20 70 20 29 7b 0a 20 20 20 20 53 65 6c 65  e( p ){.    Sele
0950: 63 74 20 2a 70 50 72 69 6f 72 20 3d 20 70 2d 3e  ct *pPrior = p->
0960: 70 50 72 69 6f 72 3b 0a 20 20 20 20 73 71 6c 69  pPrior;.    sqli
0970: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
0980: 65 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 29  e(db, p->pEList)
0990: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 72 63  ;.    sqlite3Src
09a0: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
09b0: 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 73 71 6c  ->pSrc);.    sql
09c0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
09d0: 62 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20  b, p->pWhere);. 
09e0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
09f0: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  stDelete(db, p->
0a00: 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 73  pGroupBy);.    s
0a10: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
0a20: 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29  (db, p->pHaving)
0a30: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
0a40: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
0a50: 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  p->pOrderBy);.  
0a60: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
0a70: 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69  ete(db, p->pLimi
0a80: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
0a90: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
0aa0: 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 73  >pOffset);.    s
0ab0: 71 6c 69 74 65 33 57 69 74 68 44 65 6c 65 74 65  qlite3WithDelete
0ac0: 28 64 62 2c 20 70 2d 3e 70 57 69 74 68 29 3b 0a  (db, p->pWith);.
0ad0: 20 20 20 20 69 66 28 20 62 46 72 65 65 20 29 20      if( bFree ) 
0ae0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
0af0: 2c 20 70 29 3b 0a 20 20 20 20 70 20 3d 20 70 50  , p);.    p = pP
0b00: 72 69 6f 72 3b 0a 20 20 20 20 62 46 72 65 65 20  rior;.    bFree 
0b10: 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 1;.  }.}../*.*
0b20: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 53  * Initialize a S
0b30: 65 6c 65 63 74 44 65 73 74 20 73 74 72 75 63 74  electDest struct
0b40: 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ure..*/.void sql
0b50: 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
0b60: 69 74 28 53 65 6c 65 63 74 44 65 73 74 20 2a 70  it(SelectDest *p
0b70: 44 65 73 74 2c 20 69 6e 74 20 65 44 65 73 74 2c  Dest, int eDest,
0b80: 20 69 6e 74 20 69 50 61 72 6d 29 7b 0a 20 20 70   int iParm){.  p
0b90: 44 65 73 74 2d 3e 65 44 65 73 74 20 3d 20 28 75  Dest->eDest = (u
0ba0: 38 29 65 44 65 73 74 3b 0a 20 20 70 44 65 73 74  8)eDest;.  pDest
0bb0: 2d 3e 69 53 44 50 61 72 6d 20 3d 20 69 50 61 72  ->iSDParm = iPar
0bc0: 6d 3b 0a 20 20 70 44 65 73 74 2d 3e 61 66 66 53  m;.  pDest->affS
0bd0: 64 73 74 20 3d 20 30 3b 0a 20 20 70 44 65 73 74  dst = 0;.  pDest
0be0: 2d 3e 69 53 64 73 74 20 3d 20 30 3b 0a 20 20 70  ->iSdst = 0;.  p
0bf0: 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 30 3b  Dest->nSdst = 0;
0c00: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  .}.../*.** Alloc
0c10: 61 74 65 20 61 20 6e 65 77 20 53 65 6c 65 63 74  ate a new Select
0c20: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 72   structure and r
0c30: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
0c40: 74 6f 20 74 68 61 74 0a 2a 2a 20 73 74 72 75 63  to that.** struc
0c50: 74 75 72 65 2e 0a 2a 2f 0a 53 65 6c 65 63 74 20  ture..*/.Select 
0c60: 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 4e 65  *sqlite3SelectNe
0c70: 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  w(.  Parse *pPar
0c80: 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
0c90: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
0ca0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
0cb0: 69 73 74 2c 20 20 20 20 20 2f 2a 20 77 68 69 63  ist,     /* whic
0cc0: 68 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 69 6e 63  h columns to inc
0cd0: 6c 75 64 65 20 69 6e 20 74 68 65 20 72 65 73 75  lude in the resu
0ce0: 6c 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  lt */.  SrcList 
0cf0: 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20 2f 2a  *pSrc,        /*
0d00: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
0d10: 20 2d 2d 20 77 68 69 63 68 20 74 61 62 6c 65 73   -- which tables
0d20: 20 74 6f 20 73 63 61 6e 20 2a 2f 0a 20 20 45 78   to scan */.  Ex
0d30: 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20  pr *pWhere,     
0d40: 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45      /* the WHERE
0d50: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
0d60: 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 2c  rList *pGroupBy,
0d70: 20 20 20 2f 2a 20 74 68 65 20 47 52 4f 55 50 20     /* the GROUP 
0d80: 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  BY clause */.  E
0d90: 78 70 72 20 2a 70 48 61 76 69 6e 67 2c 20 20 20  xpr *pHaving,   
0da0: 20 20 20 20 20 2f 2a 20 74 68 65 20 48 41 56 49       /* the HAVI
0db0: 4e 47 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  NG clause */.  E
0dc0: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
0dd0: 79 2c 20 20 20 2f 2a 20 74 68 65 20 4f 52 44 45  y,   /* the ORDE
0de0: 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
0df0: 20 75 33 32 20 73 65 6c 46 6c 61 67 73 2c 20 20   u32 selFlags,  
0e00: 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 20 70         /* Flag p
0e10: 61 72 61 6d 65 74 65 72 73 2c 20 73 75 63 68 20  arameters, such 
0e20: 61 73 20 53 46 5f 44 69 73 74 69 6e 63 74 20 2a  as SF_Distinct *
0e30: 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74  /.  Expr *pLimit
0e40: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49 4d  ,         /* LIM
0e50: 49 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c 4c 20  IT value.  NULL 
0e60: 6d 65 61 6e 73 20 6e 6f 74 20 75 73 65 64 20 2a  means not used *
0e70: 2f 0a 20 20 45 78 70 72 20 2a 70 4f 66 66 73 65  /.  Expr *pOffse
0e80: 74 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 46 46  t         /* OFF
0e90: 53 45 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c 4c  SET value.  NULL
0ea0: 20 6d 65 61 6e 73 20 6e 6f 20 6f 66 66 73 65 74   means no offset
0eb0: 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20   */.){.  Select 
0ec0: 2a 70 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74 20  *pNew;.  Select 
0ed0: 73 74 61 6e 64 69 6e 3b 0a 20 20 73 71 6c 69 74  standin;.  sqlit
0ee0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
0ef0: 3e 64 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  >db;.  pNew = sq
0f00: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
0f10: 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  NN(db, sizeof(*p
0f20: 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  New) );.  if( pN
0f30: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  ew==0 ){.    ass
0f40: 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ert( db->mallocF
0f50: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 70 4e 65  ailed );.    pNe
0f60: 77 20 3d 20 26 73 74 61 6e 64 69 6e 3b 0a 20 20  w = &standin;.  
0f70: 7d 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d  }.  if( pEList==
0f80: 30 20 29 7b 0a 20 20 20 20 70 45 4c 69 73 74 20  0 ){.    pEList 
0f90: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
0fa0: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
0fb0: 30 2c 20 73 71 6c 69 74 65 33 45 78 70 72 28 64  0, sqlite3Expr(d
0fc0: 62 2c 54 4b 5f 41 53 54 45 52 49 53 4b 2c 30 29  b,TK_ASTERISK,0)
0fd0: 29 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 70  );.  }.  pNew->p
0fe0: 45 4c 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a  EList = pEList;.
0ff0: 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f    pNew->op = TK_
1000: 53 45 4c 45 43 54 3b 0a 20 20 70 4e 65 77 2d 3e  SELECT;.  pNew->
1010: 73 65 6c 46 6c 61 67 73 20 3d 20 73 65 6c 46 6c  selFlags = selFl
1020: 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c 69  ags;.  pNew->iLi
1030: 6d 69 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  mit = 0;.  pNew-
1040: 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 23 69  >iOffset = 0;.#i
1050: 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e  f SELECTTRACE_EN
1060: 41 42 4c 45 44 0a 20 20 70 4e 65 77 2d 3e 7a 53  ABLED.  pNew->zS
1070: 65 6c 4e 61 6d 65 5b 30 5d 20 3d 20 30 3b 0a 23  elName[0] = 0;.#
1080: 65 6e 64 69 66 0a 20 20 70 4e 65 77 2d 3e 61 64  endif.  pNew->ad
1090: 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20  drOpenEphm[0] = 
10a0: 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72  -1;.  pNew->addr
10b0: 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d 31  OpenEphm[1] = -1
10c0: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 65 6c 65 63  ;.  pNew->nSelec
10d0: 74 52 6f 77 20 3d 20 30 3b 0a 20 20 69 66 28 20  tRow = 0;.  if( 
10e0: 70 53 72 63 3d 3d 30 20 29 20 70 53 72 63 20 3d  pSrc==0 ) pSrc =
10f0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
1100: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
1110: 2a 70 53 72 63 29 29 3b 0a 20 20 70 4e 65 77 2d  *pSrc));.  pNew-
1120: 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20  >pSrc = pSrc;.  
1130: 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 70  pNew->pWhere = p
1140: 57 68 65 72 65 3b 0a 20 20 70 4e 65 77 2d 3e 70  Where;.  pNew->p
1150: 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70  GroupBy = pGroup
1160: 42 79 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76  By;.  pNew->pHav
1170: 69 6e 67 20 3d 20 70 48 61 76 69 6e 67 3b 0a 20  ing = pHaving;. 
1180: 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20   pNew->pOrderBy 
1190: 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 4e  = pOrderBy;.  pN
11a0: 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a  ew->pPrior = 0;.
11b0: 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20    pNew->pNext = 
11c0: 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69  0;.  pNew->pLimi
11d0: 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 70 4e  t = pLimit;.  pN
11e0: 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f  ew->pOffset = pO
11f0: 66 66 73 65 74 3b 0a 20 20 70 4e 65 77 2d 3e 70  ffset;.  pNew->p
1200: 57 69 74 68 20 3d 20 30 3b 0a 20 20 61 73 73 65  With = 0;.  asse
1210: 72 74 28 20 70 4f 66 66 73 65 74 3d 3d 30 20 7c  rt( pOffset==0 |
1220: 7c 20 70 4c 69 6d 69 74 21 3d 30 20 7c 7c 20 70  | pLimit!=0 || p
1230: 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 7c 7c  Parse->nErr>0 ||
1240: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
1250: 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 64 62  d!=0 );.  if( db
1260: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1270: 20 7b 0a 20 20 20 20 63 6c 65 61 72 53 65 6c 65   {.    clearSele
1280: 63 74 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65  ct(db, pNew, pNe
1290: 77 21 3d 26 73 74 61 6e 64 69 6e 29 3b 0a 20 20  w!=&standin);.  
12a0: 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 7d 65    pNew = 0;.  }e
12b0: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
12c0: 20 70 4e 65 77 2d 3e 70 53 72 63 21 3d 30 20 7c   pNew->pSrc!=0 |
12d0: 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30  | pParse->nErr>0
12e0: 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   );.  }.  assert
12f0: 28 20 70 4e 65 77 21 3d 26 73 74 61 6e 64 69 6e  ( pNew!=&standin
1300: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65   );.  return pNe
1310: 77 3b 0a 7d 0a 0a 23 69 66 20 53 45 4c 45 43 54  w;.}..#if SELECT
1320: 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a  TRACE_ENABLED./*
1330: 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 61 6d 65  .** Set the name
1340: 20 6f 66 20 61 20 53 65 6c 65 63 74 20 6f 62 6a   of a Select obj
1350: 65 63 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ect.*/.void sqli
1360: 74 65 33 53 65 6c 65 63 74 53 65 74 4e 61 6d 65  te3SelectSetName
1370: 28 53 65 6c 65 63 74 20 2a 70 2c 20 63 6f 6e 73  (Select *p, cons
1380: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
1390: 20 20 69 66 28 20 70 20 26 26 20 7a 4e 61 6d 65    if( p && zName
13a0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
13b0: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
13c0: 70 2d 3e 7a 53 65 6c 4e 61 6d 65 29 2c 20 70 2d  p->zSelName), p-
13d0: 3e 7a 53 65 6c 4e 61 6d 65 2c 20 22 25 73 22 2c  >zSelName, "%s",
13e0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 23   zName);.  }.}.#
13f0: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65  endif.../*.** De
1400: 6c 65 74 65 20 74 68 65 20 67 69 76 65 6e 20 53  lete the given S
1410: 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20  elect structure 
1420: 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73  and all of its s
1430: 75 62 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f  ubstructures..*/
1440: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c  .void sqlite3Sel
1450: 65 63 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65  ectDelete(sqlite
1460: 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70  3 *db, Select *p
1470: 29 7b 0a 20 20 63 6c 65 61 72 53 65 6c 65 63 74  ){.  clearSelect
1480: 28 64 62 2c 20 70 2c 20 31 29 3b 0a 7d 0a 0a 2f  (db, p, 1);.}../
1490: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
14a0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 72 69 67  inter to the rig
14b0: 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73  ht-most SELECT s
14c0: 74 61 74 65 6d 65 6e 74 20 69 6e 20 61 20 63 6f  tatement in a co
14d0: 6d 70 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69  mpound..*/.stati
14e0: 63 20 53 65 6c 65 63 74 20 2a 66 69 6e 64 52 69  c Select *findRi
14f0: 67 68 74 6d 6f 73 74 28 53 65 6c 65 63 74 20 2a  ghtmost(Select *
1500: 70 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e  p){.  while( p->
1510: 70 4e 65 78 74 20 29 20 70 20 3d 20 70 2d 3e 70  pNext ) p = p->p
1520: 4e 65 78 74 3b 0a 20 20 72 65 74 75 72 6e 20 70  Next;.  return p
1530: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
1540: 20 31 20 74 6f 20 33 20 69 64 65 6e 74 69 66 69   1 to 3 identifi
1550: 65 72 73 20 70 72 65 63 65 64 69 6e 67 20 74 68  ers preceding th
1560: 65 20 4a 4f 49 4e 20 6b 65 79 77 6f 72 64 2c 20  e JOIN keyword, 
1570: 64 65 74 65 72 6d 69 6e 65 20 74 68 65 0a 2a 2a  determine the.**
1580: 20 74 79 70 65 20 6f 66 20 6a 6f 69 6e 2e 20 20   type of join.  
1590: 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65  Return an intege
15a0: 72 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20  r constant that 
15b0: 65 78 70 72 65 73 73 65 73 20 74 68 61 74 20 74  expresses that t
15c0: 79 70 65 0a 2a 2a 20 69 6e 20 74 65 72 6d 73 20  ype.** in terms 
15d0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
15e0: 20 62 69 74 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a   bit values:.**.
15f0: 2a 2a 20 20 20 20 20 4a 54 5f 49 4e 4e 45 52 0a  **     JT_INNER.
1600: 2a 2a 20 20 20 20 20 4a 54 5f 43 52 4f 53 53 0a  **     JT_CROSS.
1610: 2a 2a 20 20 20 20 20 4a 54 5f 4f 55 54 45 52 0a  **     JT_OUTER.
1620: 2a 2a 20 20 20 20 20 4a 54 5f 4e 41 54 55 52 41  **     JT_NATURA
1630: 4c 0a 2a 2a 20 20 20 20 20 4a 54 5f 4c 45 46 54  L.**     JT_LEFT
1640: 0a 2a 2a 20 20 20 20 20 4a 54 5f 52 49 47 48 54  .**     JT_RIGHT
1650: 0a 2a 2a 0a 2a 2a 20 41 20 66 75 6c 6c 20 6f 75  .**.** A full ou
1660: 74 65 72 20 6a 6f 69 6e 20 69 73 20 74 68 65 20  ter join is the 
1670: 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 4a  combination of J
1680: 54 5f 4c 45 46 54 20 61 6e 64 20 4a 54 5f 52 49  T_LEFT and JT_RI
1690: 47 48 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  GHT..**.** If an
16a0: 20 69 6c 6c 65 67 61 6c 20 6f 72 20 75 6e 73 75   illegal or unsu
16b0: 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70  pported join typ
16c0: 65 20 69 73 20 73 65 65 6e 2c 20 74 68 65 6e 20  e is seen, then 
16d0: 73 74 69 6c 6c 20 72 65 74 75 72 6e 0a 2a 2a 20  still return.** 
16e0: 61 20 6a 6f 69 6e 20 74 79 70 65 2c 20 62 75 74  a join type, but
16f0: 20 70 75 74 20 61 6e 20 65 72 72 6f 72 20 69 6e   put an error in
1700: 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75   the pParse stru
1710: 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  cture..*/.int sq
1720: 6c 69 74 65 33 4a 6f 69 6e 54 79 70 65 28 50 61  lite3JoinType(Pa
1730: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
1740: 65 6e 20 2a 70 41 2c 20 54 6f 6b 65 6e 20 2a 70  en *pA, Token *p
1750: 42 2c 20 54 6f 6b 65 6e 20 2a 70 43 29 7b 0a 20  B, Token *pC){. 
1760: 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d 20   int jointype = 
1770: 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a 61 70 41 6c  0;.  Token *apAl
1780: 6c 5b 33 5d 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70  l[3];.  Token *p
1790: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
17a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17b0: 2a 20 20 20 30 31 32 33 34 35 36 37 38 39 20 31  *   0123456789 1
17c0: 32 33 34 35 36 37 38 39 20 31 32 33 34 35 36 37  23456789 1234567
17d0: 38 39 20 31 32 33 20 2a 2f 0a 20 20 73 74 61 74  89 123 */.  stat
17e0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 4b  ic const char zK
17f0: 65 79 54 65 78 74 5b 5d 20 3d 20 22 6e 61 74 75  eyText[] = "natu
1800: 72 61 6c 65 66 74 6f 75 74 65 72 69 67 68 74 66  raleftouterightf
1810: 75 6c 6c 69 6e 6e 65 72 63 72 6f 73 73 22 3b 0a  ullinnercross";.
1820: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
1830: 74 72 75 63 74 20 7b 0a 20 20 20 20 75 38 20 69  truct {.    u8 i
1840: 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69  ;        /* Begi
1850: 6e 6e 69 6e 67 20 6f 66 20 6b 65 79 77 6f 72 64  nning of keyword
1860: 20 74 65 78 74 20 69 6e 20 7a 4b 65 79 54 65 78   text in zKeyTex
1870: 74 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20 6e 43  t[] */.    u8 nC
1880: 68 61 72 3b 20 20 20 20 2f 2a 20 4c 65 6e 67 74  har;    /* Lengt
1890: 68 20 6f 66 20 74 68 65 20 6b 65 79 77 6f 72 64  h of the keyword
18a0: 20 69 6e 20 63 68 61 72 61 63 74 65 72 73 20 2a   in characters *
18b0: 2f 0a 20 20 20 20 75 38 20 63 6f 64 65 3b 20 20  /.    u8 code;  
18c0: 20 20 20 2f 2a 20 4a 6f 69 6e 20 74 79 70 65 20     /* Join type 
18d0: 6d 61 73 6b 20 2a 2f 0a 20 20 7d 20 61 4b 65 79  mask */.  } aKey
18e0: 77 6f 72 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f  word[] = {.    /
18f0: 2a 20 6e 61 74 75 72 61 6c 20 2a 2f 20 7b 20 30  * natural */ { 0
1900: 2c 20 20 37 2c 20 4a 54 5f 4e 41 54 55 52 41 4c  ,  7, JT_NATURAL
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1920: 7d 2c 0a 20 20 20 20 2f 2a 20 6c 65 66 74 20 20  },.    /* left  
1930: 20 20 2a 2f 20 7b 20 36 2c 20 20 34 2c 20 4a 54    */ { 6,  4, JT
1940: 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54 45 52 20 20  _LEFT|JT_OUTER  
1950: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f          },.    /
1960: 2a 20 6f 75 74 65 72 20 20 20 2a 2f 20 7b 20 31  * outer   */ { 1
1970: 30 2c 20 35 2c 20 4a 54 5f 4f 55 54 45 52 20 20  0, 5, JT_OUTER  
1980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1990: 7d 2c 0a 20 20 20 20 2f 2a 20 72 69 67 68 74 20  },.    /* right 
19a0: 20 20 2a 2f 20 7b 20 31 34 2c 20 35 2c 20 4a 54    */ { 14, 5, JT
19b0: 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20  _RIGHT|JT_OUTER 
19c0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f          },.    /
19d0: 2a 20 66 75 6c 6c 20 20 20 20 2a 2f 20 7b 20 31  * full    */ { 1
19e0: 39 2c 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54  9, 4, JT_LEFT|JT
19f0: 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20  _RIGHT|JT_OUTER 
1a00: 7d 2c 0a 20 20 20 20 2f 2a 20 69 6e 6e 65 72 20  },.    /* inner 
1a10: 20 20 2a 2f 20 7b 20 32 33 2c 20 35 2c 20 4a 54    */ { 23, 5, JT
1a20: 5f 49 4e 4e 45 52 20 20 20 20 20 20 20 20 20 20  _INNER          
1a30: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f          },.    /
1a40: 2a 20 63 72 6f 73 73 20 20 20 2a 2f 20 7b 20 32  * cross   */ { 2
1a50: 38 2c 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 7c 4a  8, 5, JT_INNER|J
1a60: 54 5f 43 52 4f 53 53 20 20 20 20 20 20 20 20 20  T_CROSS         
1a70: 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 2c  },.  };.  int i,
1a80: 20 6a 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d 20 3d   j;.  apAll[0] =
1a90: 20 70 41 3b 0a 20 20 61 70 41 6c 6c 5b 31 5d 20   pA;.  apAll[1] 
1aa0: 3d 20 70 42 3b 0a 20 20 61 70 41 6c 6c 5b 32 5d  = pB;.  apAll[2]
1ab0: 20 3d 20 70 43 3b 0a 20 20 66 6f 72 28 69 3d 30   = pC;.  for(i=0
1ac0: 3b 20 69 3c 33 20 26 26 20 61 70 41 6c 6c 5b 69  ; i<3 && apAll[i
1ad0: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d  ]; i++){.    p =
1ae0: 20 61 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20 20 66   apAll[i];.    f
1af0: 6f 72 28 6a 3d 30 3b 20 6a 3c 41 72 72 61 79 53  or(j=0; j<ArrayS
1b00: 69 7a 65 28 61 4b 65 79 77 6f 72 64 29 3b 20 6a  ize(aKeyword); j
1b10: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
1b20: 2d 3e 6e 3d 3d 61 4b 65 79 77 6f 72 64 5b 6a 5d  ->n==aKeyword[j]
1b30: 2e 6e 43 68 61 72 20 0a 20 20 20 20 20 20 20 20  .nChar .        
1b40: 20 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e    && sqlite3StrN
1b50: 49 43 6d 70 28 28 63 68 61 72 2a 29 70 2d 3e 7a  ICmp((char*)p->z
1b60: 2c 20 26 7a 4b 65 79 54 65 78 74 5b 61 4b 65 79  , &zKeyText[aKey
1b70: 77 6f 72 64 5b 6a 5d 2e 69 5d 2c 20 70 2d 3e 6e  word[j].i], p->n
1b80: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
1b90: 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 61 4b 65 79  jointype |= aKey
1ba0: 77 6f 72 64 5b 6a 5d 2e 63 6f 64 65 3b 0a 20 20  word[j].code;.  
1bb0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1bc0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 74     }.    }.    t
1bd0: 65 73 74 63 61 73 65 28 20 6a 3d 3d 30 20 7c 7c  estcase( j==0 ||
1be0: 20 6a 3d 3d 31 20 7c 7c 20 6a 3d 3d 32 20 7c 7c   j==1 || j==2 ||
1bf0: 20 6a 3d 3d 33 20 7c 7c 20 6a 3d 3d 34 20 7c 7c   j==3 || j==4 ||
1c00: 20 6a 3d 3d 35 20 7c 7c 20 6a 3d 3d 36 20 29 3b   j==5 || j==6 );
1c10: 0a 20 20 20 20 69 66 28 20 6a 3e 3d 41 72 72 61  .    if( j>=Arra
1c20: 79 53 69 7a 65 28 61 4b 65 79 77 6f 72 64 29 20  ySize(aKeyword) 
1c30: 29 7b 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70  ){.      jointyp
1c40: 65 20 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b 0a 20  e |= JT_ERROR;. 
1c50: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1c60: 7d 0a 20 20 7d 0a 20 20 69 66 28 0a 20 20 20 20  }.  }.  if(.    
1c70: 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54   (jointype & (JT
1c80: 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29  _INNER|JT_OUTER)
1c90: 29 3d 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f  )==(JT_INNER|JT_
1ca0: 4f 55 54 45 52 29 20 7c 7c 0a 20 20 20 20 20 28  OUTER) ||.     (
1cb0: 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 45 52  jointype & JT_ER
1cc0: 52 4f 52 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20  ROR)!=0.  ){.   
1cd0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 70   const char *zSp
1ce0: 20 3d 20 22 20 22 3b 0a 20 20 20 20 61 73 73 65   = " ";.    asse
1cf0: 72 74 28 20 70 42 21 3d 30 20 29 3b 0a 20 20 20  rt( pB!=0 );.   
1d00: 20 69 66 28 20 70 43 3d 3d 30 20 29 7b 20 7a 53   if( pC==0 ){ zS
1d10: 70 2b 2b 3b 20 7d 0a 20 20 20 20 73 71 6c 69 74  p++; }.    sqlit
1d20: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1d30: 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 72 20 75  e, "unknown or u
1d40: 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20  nsupported join 
1d50: 74 79 70 65 3a 20 22 0a 20 20 20 20 20 20 20 22  type: ".       "
1d60: 25 54 20 25 54 25 73 25 54 22 2c 20 70 41 2c 20  %T %T%s%T", pA, 
1d70: 70 42 2c 20 7a 53 70 2c 20 70 43 29 3b 0a 20 20  pB, zSp, pC);.  
1d80: 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f    jointype = JT_
1d90: 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c 73 65 20 69  INNER;.  }else i
1da0: 66 28 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a  f( (jointype & J
1db0: 54 5f 4f 55 54 45 52 29 21 3d 30 20 0a 20 20 20  T_OUTER)!=0 .   
1dc0: 20 20 20 20 20 20 26 26 20 28 6a 6f 69 6e 74 79        && (jointy
1dd0: 70 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54  pe & (JT_LEFT|JT
1de0: 5f 52 49 47 48 54 29 29 21 3d 4a 54 5f 4c 45 46  _RIGHT))!=JT_LEF
1df0: 54 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  T ){.    sqlite3
1e00: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1e10: 20 0a 20 20 20 20 20 20 22 52 49 47 48 54 20 61   .      "RIGHT a
1e20: 6e 64 20 46 55 4c 4c 20 4f 55 54 45 52 20 4a 4f  nd FULL OUTER JO
1e30: 49 4e 73 20 61 72 65 20 6e 6f 74 20 63 75 72 72  INs are not curr
1e40: 65 6e 74 6c 79 20 73 75 70 70 6f 72 74 65 64 22  ently supported"
1e50: 29 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20  );.    jointype 
1e60: 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 0a  = JT_INNER;.  }.
1e70: 20 20 72 65 74 75 72 6e 20 6a 6f 69 6e 74 79 70    return jointyp
1e80: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  e;.}../*.** Retu
1e90: 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  rn the index of 
1ea0: 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 74 61  a column in a ta
1eb0: 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 2d 31 20  ble.  Return -1 
1ec0: 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a  if the column.**
1ed0: 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65   is not containe
1ee0: 64 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a  d in the table..
1ef0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
1f00: 6c 75 6d 6e 49 6e 64 65 78 28 54 61 62 6c 65 20  lumnIndex(Table 
1f10: 2a 70 54 61 62 2c 20 63 6f 6e 73 74 20 63 68 61  *pTab, const cha
1f20: 72 20 2a 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74 20  r *zCol){.  int 
1f30: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
1f40: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  pTab->nCol; i++)
1f50: 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
1f60: 33 53 74 72 49 43 6d 70 28 70 54 61 62 2d 3e 61  3StrICmp(pTab->a
1f70: 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 43  Col[i].zName, zC
1f80: 6f 6c 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ol)==0 ) return 
1f90: 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  i;.  }.  return 
1fa0: 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61  -1;.}../*.** Sea
1fb0: 72 63 68 20 74 68 65 20 66 69 72 73 74 20 4e 20  rch the first N 
1fc0: 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63 2c 20  tables in pSrc, 
1fd0: 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67  from left to rig
1fe0: 68 74 2c 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ht, looking for 
1ff0: 61 0a 2a 2a 20 74 61 62 6c 65 20 74 68 61 74 20  a.** table that 
2000: 68 61 73 20 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d  has a column nam
2010: 65 64 20 7a 43 6f 6c 2e 20 20 0a 2a 2a 0a 2a 2a  ed zCol.  .**.**
2020: 20 57 68 65 6e 20 66 6f 75 6e 64 2c 20 73 65 74   When found, set
2030: 20 2a 70 69 54 61 62 20 61 6e 64 20 2a 70 69 43   *piTab and *piC
2040: 6f 6c 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ol to the table 
2050: 69 6e 64 65 78 20 61 6e 64 20 63 6f 6c 75 6d 6e  index and column
2060: 20 69 6e 64 65 78 0a 2a 2a 20 6f 66 20 74 68 65   index.** of the
2070: 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e   matching column
2080: 20 61 6e 64 20 72 65 74 75 72 6e 20 54 52 55 45   and return TRUE
2090: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 74 20 66  ..**.** If not f
20a0: 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 46 41 4c  ound, return FAL
20b0: 53 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  SE..*/.static in
20c0: 74 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e  t tableAndColumn
20d0: 49 6e 64 65 78 28 0a 20 20 53 72 63 4c 69 73 74  Index(.  SrcList
20e0: 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20 2f 2a   *pSrc,       /*
20f0: 20 41 72 72 61 79 20 6f 66 20 74 61 62 6c 65 73   Array of tables
2100: 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20   to search */.  
2110: 69 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20 20  int N,          
2120: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2130: 66 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63  f tables in pSrc
2140: 2d 3e 61 5b 5d 20 74 6f 20 73 65 61 72 63 68 20  ->a[] to search 
2150: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
2160: 2a 7a 43 6f 6c 2c 20 20 20 20 2f 2a 20 4e 61 6d  *zCol,    /* Nam
2170: 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  e of the column 
2180: 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 20 66  we are looking f
2190: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 54  or */.  int *piT
21a0: 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ab,          /* 
21b0: 57 72 69 74 65 20 69 6e 64 65 78 20 6f 66 20 70  Write index of p
21c0: 53 72 63 2d 3e 61 5b 5d 20 68 65 72 65 20 2a 2f  Src->a[] here */
21d0: 0a 20 20 69 6e 74 20 2a 70 69 43 6f 6c 20 20 20  .  int *piCol   
21e0: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
21f0: 20 69 6e 64 65 78 20 6f 66 20 70 53 72 63 2d 3e   index of pSrc->
2200: 61 5b 2a 70 69 54 61 62 5d 2e 70 54 61 62 2d 3e  a[*piTab].pTab->
2210: 61 43 6f 6c 5b 5d 20 68 65 72 65 20 2a 2f 0a 29  aCol[] here */.)
2220: 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
2230: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
2240: 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74 61 62  looping over tab
2250: 6c 65 73 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20  les in pSrc */. 
2260: 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20 20   int iCol;      
2270: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
2280: 66 20 63 6f 6c 75 6d 6e 20 6d 61 74 63 68 69 6e  f column matchin
2290: 67 20 7a 43 6f 6c 20 2a 2f 0a 0a 20 20 61 73 73  g zCol */..  ass
22a0: 65 72 74 28 20 28 70 69 54 61 62 3d 3d 30 29 3d  ert( (piTab==0)=
22b0: 3d 28 70 69 43 6f 6c 3d 3d 30 29 20 29 3b 20 20  =(piCol==0) );  
22c0: 2f 2a 20 42 6f 74 68 20 6f 72 20 6e 65 69 74 68  /* Both or neith
22d0: 65 72 20 61 72 65 20 4e 55 4c 4c 20 2a 2f 0a 20  er are NULL */. 
22e0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 3b 20 69   for(i=0; i<N; i
22f0: 2b 2b 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20  ++){.    iCol = 
2300: 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72 63  columnIndex(pSrc
2310: 2d 3e 61 5b 69 5d 2e 70 54 61 62 2c 20 7a 43 6f  ->a[i].pTab, zCo
2320: 6c 29 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c  l);.    if( iCol
2330: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  >=0 ){.      if(
2340: 20 70 69 54 61 62 20 29 7b 0a 20 20 20 20 20 20   piTab ){.      
2350: 20 20 2a 70 69 54 61 62 20 3d 20 69 3b 0a 20 20    *piTab = i;.  
2360: 20 20 20 20 20 20 2a 70 69 43 6f 6c 20 3d 20 69        *piCol = i
2370: 43 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Col;.      }.   
2380: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
2390: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
23a0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  0;.}../*.** This
23b0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
23c0: 64 20 74 6f 20 61 64 64 20 74 65 72 6d 73 20 69  d to add terms i
23d0: 6d 70 6c 69 65 64 20 62 79 20 4a 4f 49 4e 20 73  mplied by JOIN s
23e0: 79 6e 74 61 78 20 74 6f 20 74 68 65 0a 2a 2a 20  yntax to the.** 
23f0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 65 78 70  WHERE clause exp
2400: 72 65 73 73 69 6f 6e 20 6f 66 20 61 20 53 45 4c  ression of a SEL
2410: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 54  ECT statement. T
2420: 68 65 20 6e 65 77 20 74 65 72 6d 2c 20 77 68 69  he new term, whi
2430: 63 68 0a 2a 2a 20 69 73 20 41 4e 44 65 64 20 77  ch.** is ANDed w
2440: 69 74 68 20 74 68 65 20 65 78 69 73 74 69 6e 67  ith the existing
2450: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69   WHERE clause, i
2460: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a  s of the form:.*
2470: 2a 0a 2a 2a 20 20 20 20 28 74 61 62 31 2e 63 6f  *.**    (tab1.co
2480: 6c 31 20 3d 20 74 61 62 32 2e 63 6f 6c 32 29 0a  l1 = tab2.col2).
2490: 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61 62 31  **.** where tab1
24a0: 20 69 73 20 74 68 65 20 69 53 72 63 27 74 68 20   is the iSrc'th 
24b0: 74 61 62 6c 65 20 69 6e 20 53 72 63 4c 69 73 74  table in SrcList
24c0: 20 70 53 72 63 20 61 6e 64 20 74 61 62 32 20 69   pSrc and tab2 i
24d0: 73 20 74 68 65 20 0a 2a 2a 20 28 69 53 72 63 2b  s the .** (iSrc+
24e0: 31 29 27 74 68 2e 20 43 6f 6c 75 6d 6e 20 63 6f  1)'th. Column co
24f0: 6c 31 20 69 73 20 63 6f 6c 75 6d 6e 20 69 43 6f  l1 is column iCo
2500: 6c 4c 65 66 74 20 6f 66 20 74 61 62 31 2c 20 61  lLeft of tab1, a
2510: 6e 64 20 63 6f 6c 32 20 69 73 0a 2a 2a 20 63 6f  nd col2 is.** co
2520: 6c 75 6d 6e 20 69 43 6f 6c 52 69 67 68 74 20 6f  lumn iColRight o
2530: 66 20 74 61 62 32 2e 0a 2a 2f 0a 73 74 61 74 69  f tab2..*/.stati
2540: 63 20 76 6f 69 64 20 61 64 64 57 68 65 72 65 54  c void addWhereT
2550: 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50  erm(.  Parse *pP
2560: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
2570: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
2580: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
2590: 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20  rcList *pSrc,   
25a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25b0: 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73  * List of tables
25c0: 20 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   in FROM clause 
25d0: 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 66 74 2c 20  */.  int iLeft, 
25e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
2600: 20 66 69 72 73 74 20 74 61 62 6c 65 20 74 6f 20   first table to 
2610: 6a 6f 69 6e 20 69 6e 20 70 53 72 63 20 2a 2f 0a  join in pSrc */.
2620: 20 20 69 6e 74 20 69 43 6f 6c 4c 65 66 74 2c 20    int iColLeft, 
2630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2640: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f    /* Index of co
2650: 6c 75 6d 6e 20 69 6e 20 66 69 72 73 74 20 74 61  lumn in first ta
2660: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 69  ble */.  int iRi
2670: 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ght,            
2680: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
2690: 78 20 6f 66 20 73 65 63 6f 6e 64 20 74 61 62 6c  x of second tabl
26a0: 65 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69  e in pSrc */.  i
26b0: 6e 74 20 69 43 6f 6c 52 69 67 68 74 2c 20 20 20  nt iColRight,   
26c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26d0: 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d  * Index of colum
26e0: 6e 20 69 6e 20 73 65 63 6f 6e 64 20 74 61 62 6c  n in second tabl
26f0: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4f 75 74  e */.  int isOut
2700: 65 72 4a 6f 69 6e 2c 20 20 20 20 20 20 20 20 20  erJoin,         
2710: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2720: 66 20 74 68 69 73 20 69 73 20 61 6e 20 4f 55 54  f this is an OUT
2730: 45 52 20 6a 6f 69 6e 20 2a 2f 0a 20 20 45 78 70  ER join */.  Exp
2740: 72 20 2a 2a 70 70 57 68 65 72 65 20 20 20 20 20  r **ppWhere     
2750: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2760: 49 4e 2f 4f 55 54 3a 20 54 68 65 20 57 48 45 52  IN/OUT: The WHER
2770: 45 20 63 6c 61 75 73 65 20 74 6f 20 61 64 64 20  E clause to add 
2780: 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  to */.){.  sqlit
2790: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
27a0: 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 31  >db;.  Expr *pE1
27b0: 3b 0a 20 20 45 78 70 72 20 2a 70 45 32 3b 0a 20  ;.  Expr *pE2;. 
27c0: 20 45 78 70 72 20 2a 70 45 71 3b 0a 0a 20 20 61   Expr *pEq;..  a
27d0: 73 73 65 72 74 28 20 69 4c 65 66 74 3c 69 52 69  ssert( iLeft<iRi
27e0: 67 68 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ght );.  assert(
27f0: 20 70 53 72 63 2d 3e 6e 53 72 63 3e 69 52 69 67   pSrc->nSrc>iRig
2800: 68 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ht );.  assert( 
2810: 70 53 72 63 2d 3e 61 5b 69 4c 65 66 74 5d 2e 70  pSrc->a[iLeft].p
2820: 54 61 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Tab );.  assert(
2830: 20 70 53 72 63 2d 3e 61 5b 69 52 69 67 68 74 5d   pSrc->a[iRight]
2840: 2e 70 54 61 62 20 29 3b 0a 0a 20 20 70 45 31 20  .pTab );..  pE1 
2850: 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 43  = sqlite3CreateC
2860: 6f 6c 75 6d 6e 45 78 70 72 28 64 62 2c 20 70 53  olumnExpr(db, pS
2870: 72 63 2c 20 69 4c 65 66 74 2c 20 69 43 6f 6c 4c  rc, iLeft, iColL
2880: 65 66 74 29 3b 0a 20 20 70 45 32 20 3d 20 73 71  eft);.  pE2 = sq
2890: 6c 69 74 65 33 43 72 65 61 74 65 43 6f 6c 75 6d  lite3CreateColum
28a0: 6e 45 78 70 72 28 64 62 2c 20 70 53 72 63 2c 20  nExpr(db, pSrc, 
28b0: 69 52 69 67 68 74 2c 20 69 43 6f 6c 52 69 67 68  iRight, iColRigh
28c0: 74 29 3b 0a 0a 20 20 70 45 71 20 3d 20 73 71 6c  t);..  pEq = sql
28d0: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
28e0: 2c 20 54 4b 5f 45 51 2c 20 70 45 31 2c 20 70 45  , TK_EQ, pE1, pE
28f0: 32 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 45 71  2, 0);.  if( pEq
2900: 20 26 26 20 69 73 4f 75 74 65 72 4a 6f 69 6e 20   && isOuterJoin 
2910: 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50 72  ){.    ExprSetPr
2920: 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50 5f 46  operty(pEq, EP_F
2930: 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 61 73  romJoin);.    as
2940: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
2950: 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50 5f 54  operty(pEq, EP_T
2960: 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75  okenOnly|EP_Redu
2970: 63 65 64 29 20 29 3b 0a 20 20 20 20 45 78 70 72  ced) );.    Expr
2980: 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70  SetVVAProperty(p
2990: 45 71 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29  Eq, EP_NoReduce)
29a0: 3b 0a 20 20 20 20 70 45 71 2d 3e 69 52 69 67 68  ;.    pEq->iRigh
29b0: 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 28 69 31  tJoinTable = (i1
29c0: 36 29 70 45 32 2d 3e 69 54 61 62 6c 65 3b 0a 20  6)pE2->iTable;. 
29d0: 20 7d 0a 20 20 2a 70 70 57 68 65 72 65 20 3d 20   }.  *ppWhere = 
29e0: 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64  sqlite3ExprAnd(d
29f0: 62 2c 20 2a 70 70 57 68 65 72 65 2c 20 70 45 71  b, *ppWhere, pEq
2a00: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  );.}../*.** Set 
2a10: 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20  the EP_FromJoin 
2a20: 70 72 6f 70 65 72 74 79 20 6f 6e 20 61 6c 6c 20  property on all 
2a30: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 67 69 76  terms of the giv
2a40: 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  en expression..*
2a50: 2a 20 41 6e 64 20 73 65 74 20 74 68 65 20 45 78  * And set the Ex
2a60: 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  pr.iRightJoinTab
2a70: 6c 65 20 74 6f 20 69 54 61 62 6c 65 20 66 6f 72  le to iTable for
2a80: 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74   every term in t
2a90: 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  he.** expression
2aa0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 50 5f 46  ..**.** The EP_F
2ab0: 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79  romJoin property
2ac0: 20 69 73 20 75 73 65 64 20 6f 6e 20 74 65 72 6d   is used on term
2ad0: 73 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  s of an expressi
2ae0: 6f 6e 20 74 6f 20 74 65 6c 6c 0a 2a 2a 20 74 68  on to tell.** th
2af0: 65 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  e LEFT OUTER JOI
2b00: 4e 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67  N processing log
2b10: 69 63 20 74 68 61 74 20 74 68 69 73 20 74 65 72  ic that this ter
2b20: 6d 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  m is part of the
2b30: 0a 2a 2a 20 6a 6f 69 6e 20 72 65 73 74 72 69 63  .** join restric
2b40: 74 69 6f 6e 20 73 70 65 63 69 66 69 65 64 20 69  tion specified i
2b50: 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e  n the ON or USIN
2b60: 47 20 63 6c 61 75 73 65 20 61 6e 64 20 6e 6f 74  G clause and not
2b70: 20 61 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68   a part.** of th
2b80: 65 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c 20 57  e more general W
2b90: 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 54 68  HERE clause.  Th
2ba0: 65 73 65 20 74 65 72 6d 73 20 61 72 65 20 6d 6f  ese terms are mo
2bb0: 76 65 64 20 6f 76 65 72 20 74 6f 20 74 68 65 0a  ved over to the.
2bc0: 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ** WHERE clause 
2bd0: 64 75 72 69 6e 67 20 6a 6f 69 6e 20 70 72 6f 63  during join proc
2be0: 65 73 73 69 6e 67 20 62 75 74 20 77 65 20 6e 65  essing but we ne
2bf0: 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74  ed to remember t
2c00: 68 61 74 20 74 68 65 79 0a 2a 2a 20 6f 72 69 67  hat they.** orig
2c10: 69 6e 61 74 65 64 20 69 6e 20 74 68 65 20 4f 4e  inated in the ON
2c20: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
2c30: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 78 70 72  ..**.** The Expr
2c40: 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  .iRightJoinTable
2c50: 20 74 65 6c 6c 73 20 74 68 65 20 57 48 45 52 45   tells the WHERE
2c60: 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69   clause processi
2c70: 6e 67 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 65  ng that the.** e
2c80: 78 70 72 65 73 73 69 6f 6e 20 64 65 70 65 6e 64  xpression depend
2c90: 73 20 6f 6e 20 74 61 62 6c 65 20 69 52 69 67 68  s on table iRigh
2ca0: 74 4a 6f 69 6e 54 61 62 6c 65 20 65 76 65 6e 20  tJoinTable even 
2cb0: 69 66 20 74 68 61 74 20 74 61 62 6c 65 20 69 73  if that table is
2cc0: 20 6e 6f 74 0a 2a 2a 20 65 78 70 6c 69 63 69 74   not.** explicit
2cd0: 6c 79 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20  ly mentioned in 
2ce0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  the expression. 
2cf0: 20 54 68 61 74 20 69 6e 66 6f 72 6d 61 74 69 6f   That informatio
2d00: 6e 20 69 73 20 6e 65 65 64 65 64 0a 2a 2a 20 66  n is needed.** f
2d10: 6f 72 20 63 61 73 65 73 20 6c 69 6b 65 20 74 68  or cases like th
2d20: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c  is:.**.**    SEL
2d30: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45  ECT * FROM t1 LE
2d40: 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31  FT JOIN t2 ON t1
2d50: 2e 61 3d 74 32 2e 62 20 41 4e 44 20 74 31 2e 78  .a=t2.b AND t1.x
2d60: 3d 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 68 65  =5.**.** The whe
2d70: 72 65 20 63 6c 61 75 73 65 20 6e 65 65 64 73 20  re clause needs 
2d80: 74 6f 20 64 65 66 65 72 20 74 68 65 20 68 61 6e  to defer the han
2d90: 64 6c 69 6e 67 20 6f 66 20 74 68 65 20 74 31 2e  dling of the t1.
2da0: 78 3d 35 0a 2a 2a 20 74 65 72 6d 20 75 6e 74 69  x=5.** term unti
2db0: 6c 20 61 66 74 65 72 20 74 68 65 20 74 32 20 6c  l after the t2 l
2dc0: 6f 6f 70 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e  oop of the join.
2dd0: 20 20 49 6e 20 74 68 61 74 20 77 61 79 2c 20 61    In that way, a
2de0: 0a 2a 2a 20 4e 55 4c 4c 20 74 32 20 72 6f 77 20  .** NULL t2 row 
2df0: 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 65 64  will be inserted
2e00: 20 77 68 65 6e 65 76 65 72 20 74 31 2e 78 21 3d   whenever t1.x!=
2e10: 35 2e 20 20 49 66 20 77 65 20 64 6f 20 6e 6f 74  5.  If we do not
2e20: 0a 2a 2a 20 64 65 66 65 72 20 74 68 65 20 68 61  .** defer the ha
2e30: 6e 64 6c 69 6e 67 20 6f 66 20 74 31 2e 78 3d 35  ndling of t1.x=5
2e40: 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 70 72 6f  , it will be pro
2e50: 63 65 73 73 65 64 20 69 6d 6d 65 64 69 61 74 65  cessed immediate
2e60: 6c 79 0a 2a 2a 20 61 66 74 65 72 20 74 68 65 20  ly.** after the 
2e70: 74 31 20 6c 6f 6f 70 20 61 6e 64 20 72 6f 77 73  t1 loop and rows
2e80: 20 77 69 74 68 20 74 31 2e 78 21 3d 35 20 77 69   with t1.x!=5 wi
2e90: 6c 6c 20 6e 65 76 65 72 20 61 70 70 65 61 72 20  ll never appear 
2ea0: 69 6e 0a 2a 2a 20 74 68 65 20 6f 75 74 70 75 74  in.** the output
2eb0: 2c 20 77 68 69 63 68 20 69 73 20 69 6e 63 6f 72  , which is incor
2ec0: 72 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rect..*/.static 
2ed0: 76 6f 69 64 20 73 65 74 4a 6f 69 6e 45 78 70 72  void setJoinExpr
2ee0: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 54  (Expr *p, int iT
2ef0: 61 62 6c 65 29 7b 0a 20 20 77 68 69 6c 65 28 20  able){.  while( 
2f00: 70 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74  p ){.    ExprSet
2f10: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46  Property(p, EP_F
2f20: 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 61 73  romJoin);.    as
2f30: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
2f40: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b  operty(p, EP_Tok
2f50: 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65  enOnly|EP_Reduce
2f60: 64 29 20 29 3b 0a 20 20 20 20 45 78 70 72 53 65  d) );.    ExprSe
2f70: 74 56 56 41 50 72 6f 70 65 72 74 79 28 70 2c 20  tVVAProperty(p, 
2f80: 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20  EP_NoReduce);.  
2f90: 20 20 70 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54    p->iRightJoinT
2fa0: 61 62 6c 65 20 3d 20 28 69 31 36 29 69 54 61 62  able = (i16)iTab
2fb0: 6c 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f  le;.    if( p->o
2fc0: 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 26  p==TK_FUNCTION &
2fd0: 26 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a  & p->x.pList ){.
2fe0: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
2ff0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
3000: 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  >x.pList->nExpr;
3010: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73   i++){.        s
3020: 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 78 2e  etJoinExpr(p->x.
3030: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
3040: 72 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 20 20  r, iTable);.    
3050: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 65    }.    }.    se
3060: 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 70 4c 65  tJoinExpr(p->pLe
3070: 66 74 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 20  ft, iTable);.   
3080: 20 70 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a   p = p->pRight;.
3090: 20 20 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68    } .}../*.** Th
30a0: 69 73 20 72 6f 75 74 69 6e 65 20 70 72 6f 63 65  is routine proce
30b0: 73 73 65 73 20 74 68 65 20 6a 6f 69 6e 20 69 6e  sses the join in
30c0: 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20  formation for a 
30d0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
30e0: 2e 0a 2a 2a 20 4f 4e 20 61 6e 64 20 55 53 49 4e  ..** ON and USIN
30f0: 47 20 63 6c 61 75 73 65 73 20 61 72 65 20 63 6f  G clauses are co
3100: 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 65 78 74  nverted into ext
3110: 72 61 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  ra terms of the 
3120: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a  WHERE clause..**
3130: 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 73 20 61   NATURAL joins a
3140: 6c 73 6f 20 63 72 65 61 74 65 20 65 78 74 72 61  lso create extra
3150: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
3160: 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  rms..**.** The t
3170: 65 72 6d 73 20 6f 66 20 61 20 46 52 4f 4d 20 63  erms of a FROM c
3180: 6c 61 75 73 65 20 61 72 65 20 63 6f 6e 74 61 69  lause are contai
3190: 6e 65 64 20 69 6e 20 74 68 65 20 53 65 6c 65 63  ned in the Selec
31a0: 74 2e 70 53 72 63 20 73 74 72 75 63 74 75 72 65  t.pSrc structure
31b0: 2e 0a 2a 2a 20 54 68 65 20 6c 65 66 74 20 6d 6f  ..** The left mo
31c0: 73 74 20 74 61 62 6c 65 20 69 73 20 74 68 65 20  st table is the 
31d0: 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 53  first entry in S
31e0: 65 6c 65 63 74 2e 70 53 72 63 2e 20 20 54 68 65  elect.pSrc.  The
31f0: 20 72 69 67 68 74 2d 6d 6f 73 74 0a 2a 2a 20 74   right-most.** t
3200: 61 62 6c 65 20 69 73 20 74 68 65 20 6c 61 73 74  able is the last
3210: 20 65 6e 74 72 79 2e 20 20 54 68 65 20 6a 6f 69   entry.  The joi
3220: 6e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 68 65  n operator is he
3230: 6c 64 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20  ld in the entry 
3240: 74 6f 0a 2a 2a 20 74 68 65 20 6c 65 66 74 2e 20  to.** the left. 
3250: 20 54 68 75 73 20 65 6e 74 72 79 20 30 20 63 6f   Thus entry 0 co
3260: 6e 74 61 69 6e 73 20 74 68 65 20 6a 6f 69 6e 20  ntains the join 
3270: 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 74 68 65  operator for the
3280: 20 6a 6f 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a   join between.**
3290: 20 65 6e 74 72 69 65 73 20 30 20 61 6e 64 20 31   entries 0 and 1
32a0: 2e 20 20 41 6e 79 20 4f 4e 20 6f 72 20 55 53 49  .  Any ON or USI
32b0: 4e 47 20 63 6c 61 75 73 65 73 20 61 73 73 6f 63  NG clauses assoc
32c0: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6a  iated with the j
32d0: 6f 69 6e 20 61 72 65 0a 2a 2a 20 61 6c 73 6f 20  oin are.** also 
32e0: 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20  attached to the 
32f0: 6c 65 66 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a  left entry..**.*
3300: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
3310: 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65  eturns the numbe
3320: 72 20 6f 66 20 65 72 72 6f 72 73 20 65 6e 63 6f  r of errors enco
3330: 75 6e 74 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74  untered..*/.stat
3340: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 50 72 6f  ic int sqlitePro
3350: 63 65 73 73 4a 6f 69 6e 28 50 61 72 73 65 20 2a  cessJoin(Parse *
3360: 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
3370: 70 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  p){.  SrcList *p
3380: 53 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Src;            
3390: 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 74 61 62        /* All tab
33a0: 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  les in the FROM 
33b0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
33c0: 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
33d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
33e0: 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
33f0: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
3400: 5f 69 74 65 6d 20 2a 70 4c 65 66 74 3b 20 20 20  _item *pLeft;   
3410: 20 20 2f 2a 20 4c 65 66 74 20 74 61 62 6c 65 20    /* Left table 
3420: 62 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a  being joined */.
3430: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
3440: 5f 69 74 65 6d 20 2a 70 52 69 67 68 74 3b 20 20  _item *pRight;  
3450: 20 20 2f 2a 20 52 69 67 68 74 20 74 61 62 6c 65    /* Right table
3460: 20 62 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f   being joined */
3470: 0a 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53  ..  pSrc = p->pS
3480: 72 63 3b 0a 20 20 70 4c 65 66 74 20 3d 20 26 70  rc;.  pLeft = &p
3490: 53 72 63 2d 3e 61 5b 30 5d 3b 0a 20 20 70 52 69  Src->a[0];.  pRi
34a0: 67 68 74 20 3d 20 26 70 4c 65 66 74 5b 31 5d 3b  ght = &pLeft[1];
34b0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53  .  for(i=0; i<pS
34c0: 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 2b 2b 2c  rc->nSrc-1; i++,
34d0: 20 70 52 69 67 68 74 2b 2b 2c 20 70 4c 65 66 74   pRight++, pLeft
34e0: 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  ++){.    Table *
34f0: 70 4c 65 66 74 54 61 62 20 3d 20 70 4c 65 66 74  pLeftTab = pLeft
3500: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 54 61 62 6c  ->pTab;.    Tabl
3510: 65 20 2a 70 52 69 67 68 74 54 61 62 20 3d 20 70  e *pRightTab = p
3520: 52 69 67 68 74 2d 3e 70 54 61 62 3b 0a 20 20 20  Right->pTab;.   
3530: 20 69 6e 74 20 69 73 4f 75 74 65 72 3b 0a 0a 20   int isOuter;.. 
3540: 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 4c 65     if( NEVER(pLe
3550: 66 74 54 61 62 3d 3d 30 20 7c 7c 20 70 52 69 67  ftTab==0 || pRig
3560: 68 74 54 61 62 3d 3d 30 29 20 29 20 63 6f 6e 74  htTab==0) ) cont
3570: 69 6e 75 65 3b 0a 20 20 20 20 69 73 4f 75 74 65  inue;.    isOute
3580: 72 20 3d 20 28 70 52 69 67 68 74 2d 3e 66 67 2e  r = (pRight->fg.
3590: 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55  jointype & JT_OU
35a0: 54 45 52 29 21 3d 30 3b 0a 0a 20 20 20 20 2f 2a  TER)!=0;..    /*
35b0: 20 57 68 65 6e 20 74 68 65 20 4e 41 54 55 52 41   When the NATURA
35c0: 4c 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65  L keyword is pre
35d0: 73 65 6e 74 2c 20 61 64 64 20 57 48 45 52 45 20  sent, add WHERE 
35e0: 63 6c 61 75 73 65 20 74 65 72 6d 73 20 66 6f 72  clause terms for
35f0: 0a 20 20 20 20 2a 2a 20 65 76 65 72 79 20 63 6f  .    ** every co
3600: 6c 75 6d 6e 20 74 68 61 74 20 74 68 65 20 74 77  lumn that the tw
3610: 6f 20 74 61 62 6c 65 73 20 68 61 76 65 20 69 6e  o tables have in
3620: 20 63 6f 6d 6d 6f 6e 2e 0a 20 20 20 20 2a 2f 0a   common..    */.
3630: 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e      if( pRight->
3640: 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  fg.jointype & JT
3650: 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20 20 20 20  _NATURAL ){.    
3660: 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f    if( pRight->pO
3670: 6e 20 7c 7c 20 70 52 69 67 68 74 2d 3e 70 55 73  n || pRight->pUs
3680: 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ing ){.        s
3690: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
36a0: 50 61 72 73 65 2c 20 22 61 20 4e 41 54 55 52 41  Parse, "a NATURA
36b0: 4c 20 6a 6f 69 6e 20 6d 61 79 20 6e 6f 74 20 68  L join may not h
36c0: 61 76 65 20 22 0a 20 20 20 20 20 20 20 20 20 20  ave ".          
36d0: 20 22 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47   "an ON or USING
36e0: 20 63 6c 61 75 73 65 22 2c 20 30 29 3b 0a 20 20   clause", 0);.  
36f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
3700: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
3710: 72 28 6a 3d 30 3b 20 6a 3c 70 52 69 67 68 74 54  r(j=0; j<pRightT
3720: 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  ab->nCol; j++){.
3730: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
3740: 61 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  ame;   /* Name o
3750: 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  f column in the 
3760: 72 69 67 68 74 20 74 61 62 6c 65 20 2a 2f 0a 20  right table */. 
3770: 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66 74         int iLeft
3780: 3b 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 69 6e  ;     /* Matchin
3790: 67 20 6c 65 66 74 20 74 61 62 6c 65 20 2a 2f 0a  g left table */.
37a0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66          int iLef
37b0: 74 43 6f 6c 3b 20 20 2f 2a 20 4d 61 74 63 68 69  tCol;  /* Matchi
37c0: 6e 67 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  ng column in the
37d0: 20 6c 65 66 74 20 74 61 62 6c 65 20 2a 2f 0a 0a   left table */..
37e0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
37f0: 70 52 69 67 68 74 54 61 62 2d 3e 61 43 6f 6c 5b  pRightTab->aCol[
3800: 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  j].zName;.      
3810: 20 20 69 66 28 20 74 61 62 6c 65 41 6e 64 43 6f    if( tableAndCo
3820: 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72 63 2c 20  lumnIndex(pSrc, 
3830: 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c 65  i+1, zName, &iLe
3840: 66 74 2c 20 26 69 4c 65 66 74 43 6f 6c 29 20 29  ft, &iLeftCol) )
3850: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 57  {.          addW
3860: 68 65 72 65 54 65 72 6d 28 70 50 61 72 73 65 2c  hereTerm(pParse,
3870: 20 70 53 72 63 2c 20 69 4c 65 66 74 2c 20 69 4c   pSrc, iLeft, iL
3880: 65 66 74 43 6f 6c 2c 20 69 2b 31 2c 20 6a 2c 0a  eftCol, i+1, j,.
3890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38a0: 20 20 20 20 20 20 20 69 73 4f 75 74 65 72 2c 20         isOuter, 
38b0: 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20  &p->pWhere);.   
38c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
38d0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 73     }..    /* Dis
38e0: 61 6c 6c 6f 77 20 62 6f 74 68 20 4f 4e 20 61 6e  allow both ON an
38f0: 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  d USING clauses 
3900: 69 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e  in the same join
3910: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
3920: 70 52 69 67 68 74 2d 3e 70 4f 6e 20 26 26 20 70  pRight->pOn && p
3930: 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b  Right->pUsing ){
3940: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
3950: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
3960: 63 61 6e 6e 6f 74 20 68 61 76 65 20 62 6f 74 68  cannot have both
3970: 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 22 0a   ON and USING ".
3980: 20 20 20 20 20 20 20 20 22 63 6c 61 75 73 65 73          "clauses
3990: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f 69   in the same joi
39a0: 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  n");.      retur
39b0: 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  n 1;.    }..    
39c0: 2f 2a 20 41 64 64 20 74 68 65 20 4f 4e 20 63 6c  /* Add the ON cl
39d0: 61 75 73 65 20 74 6f 20 74 68 65 20 65 6e 64 20  ause to the end 
39e0: 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
39f0: 75 73 65 2c 20 63 6f 6e 6e 65 63 74 65 64 20 62  use, connected b
3a00: 79 0a 20 20 20 20 2a 2a 20 61 6e 20 41 4e 44 20  y.    ** an AND 
3a10: 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a 2f  operator..    */
3a20: 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d  .    if( pRight-
3a30: 3e 70 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69 66  >pOn ){.      if
3a40: 28 20 69 73 4f 75 74 65 72 20 29 20 73 65 74 4a  ( isOuter ) setJ
3a50: 6f 69 6e 45 78 70 72 28 70 52 69 67 68 74 2d 3e  oinExpr(pRight->
3a60: 70 4f 6e 2c 20 70 52 69 67 68 74 2d 3e 69 43 75  pOn, pRight->iCu
3a70: 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 70 2d 3e  rsor);.      p->
3a80: 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
3a90: 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e  ExprAnd(pParse->
3aa0: 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 70  db, p->pWhere, p
3ab0: 52 69 67 68 74 2d 3e 70 4f 6e 29 3b 0a 20 20 20  Right->pOn);.   
3ac0: 20 20 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 3d     pRight->pOn =
3ad0: 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
3ae0: 2a 20 43 72 65 61 74 65 20 65 78 74 72 61 20 74  * Create extra t
3af0: 65 72 6d 73 20 6f 6e 20 74 68 65 20 57 48 45 52  erms on the WHER
3b00: 45 20 63 6c 61 75 73 65 20 66 6f 72 20 65 61 63  E clause for eac
3b10: 68 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 0a 20  h column named. 
3b20: 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 55 53 49     ** in the USI
3b30: 4e 47 20 63 6c 61 75 73 65 2e 20 20 45 78 61 6d  NG clause.  Exam
3b40: 70 6c 65 3a 20 49 66 20 74 68 65 20 74 77 6f 20  ple: If the two 
3b50: 74 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69  tables to be joi
3b60: 6e 65 64 20 61 72 65 20 0a 20 20 20 20 2a 2a 20  ned are .    ** 
3b70: 41 20 61 6e 64 20 42 20 61 6e 64 20 74 68 65 20  A and B and the 
3b80: 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6e 61 6d  USING clause nam
3b90: 65 73 20 58 2c 20 59 2c 20 61 6e 64 20 5a 2c 20  es X, Y, and Z, 
3ba0: 74 68 65 6e 20 61 64 64 20 74 68 69 73 0a 20 20  then add this.  
3bb0: 20 20 2a 2a 20 74 6f 20 74 68 65 20 57 48 45 52    ** to the WHER
3bc0: 45 20 63 6c 61 75 73 65 3a 20 20 20 20 41 2e 58  E clause:    A.X
3bd0: 3d 42 2e 58 20 41 4e 44 20 41 2e 59 3d 42 2e 59  =B.X AND A.Y=B.Y
3be0: 20 41 4e 44 20 41 2e 5a 3d 42 2e 5a 0a 20 20 20   AND A.Z=B.Z.   
3bf0: 20 2a 2a 20 52 65 70 6f 72 74 20 61 6e 20 65 72   ** Report an er
3c00: 72 6f 72 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d  ror if any colum
3c10: 6e 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74  n mentioned in t
3c20: 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  he USING clause 
3c30: 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f  is.    ** not co
3c40: 6e 74 61 69 6e 65 64 20 69 6e 20 62 6f 74 68 20  ntained in both 
3c50: 74 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69  tables to be joi
3c60: 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ned..    */.    
3c70: 69 66 28 20 70 52 69 67 68 74 2d 3e 70 55 73 69  if( pRight->pUsi
3c80: 6e 67 20 29 7b 0a 20 20 20 20 20 20 49 64 4c 69  ng ){.      IdLi
3c90: 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 52 69 67  st *pList = pRig
3ca0: 68 74 2d 3e 70 55 73 69 6e 67 3b 0a 20 20 20 20  ht->pUsing;.    
3cb0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c 69    for(j=0; j<pLi
3cc0: 73 74 2d 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a 20  st->nId; j++){. 
3cd0: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61         char *zNa
3ce0: 6d 65 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  me;     /* Name 
3cf0: 6f 66 20 74 68 65 20 74 65 72 6d 20 69 6e 20 74  of the term in t
3d00: 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  he USING clause 
3d10: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
3d20: 4c 65 66 74 3b 20 20 20 20 20 20 20 2f 2a 20 54  Left;       /* T
3d30: 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 65 66 74  able on the left
3d40: 20 77 69 74 68 20 6d 61 74 63 68 69 6e 67 20 63   with matching c
3d50: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  olumn name */.  
3d60: 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66 74 43        int iLeftC
3d70: 6f 6c 3b 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e  ol;    /* Column
3d80: 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68   number of match
3d90: 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68  ing column on th
3da0: 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20 20 20 20  e left */.      
3db0: 20 20 69 6e 74 20 69 52 69 67 68 74 43 6f 6c 3b    int iRightCol;
3dc0: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d     /* Column num
3dd0: 62 65 72 20 6f 66 20 6d 61 74 63 68 69 6e 67 20  ber of matching 
3de0: 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65 20 72 69  column on the ri
3df0: 67 68 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  ght */..        
3e00: 7a 4e 61 6d 65 20 3d 20 70 4c 69 73 74 2d 3e 61  zName = pList->a
3e10: 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [j].zName;.     
3e20: 20 20 20 69 52 69 67 68 74 43 6f 6c 20 3d 20 63     iRightCol = c
3e30: 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 52 69 67 68  olumnIndex(pRigh
3e40: 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  tTab, zName);.  
3e50: 20 20 20 20 20 20 69 66 28 20 69 52 69 67 68 74        if( iRight
3e60: 43 6f 6c 3c 30 0a 20 20 20 20 20 20 20 20 20 7c  Col<0.         |
3e70: 7c 20 21 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d  | !tableAndColum
3e80: 6e 49 6e 64 65 78 28 70 53 72 63 2c 20 69 2b 31  nIndex(pSrc, i+1
3e90: 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c 65 66 74 2c  , zName, &iLeft,
3ea0: 20 26 69 4c 65 66 74 43 6f 6c 29 0a 20 20 20 20   &iLeftCol).    
3eb0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
3ec0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
3ed0: 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74  (pParse, "cannot
3ee0: 20 6a 6f 69 6e 20 75 73 69 6e 67 20 63 6f 6c 75   join using colu
3ef0: 6d 6e 20 25 73 20 2d 20 63 6f 6c 75 6d 6e 20 22  mn %s - column "
3f00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 6e 6f  .            "no
3f10: 74 20 70 72 65 73 65 6e 74 20 69 6e 20 62 6f 74  t present in bot
3f20: 68 20 74 61 62 6c 65 73 22 2c 20 7a 4e 61 6d 65  h tables", zName
3f30: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
3f40: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  urn 1;.        }
3f50: 0a 20 20 20 20 20 20 20 20 61 64 64 57 68 65 72  .        addWher
3f60: 65 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70 53  eTerm(pParse, pS
3f70: 72 63 2c 20 69 4c 65 66 74 2c 20 69 4c 65 66 74  rc, iLeft, iLeft
3f80: 43 6f 6c 2c 20 69 2b 31 2c 20 69 52 69 67 68 74  Col, i+1, iRight
3f90: 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Col,.           
3fa0: 20 20 20 20 20 20 20 20 20 20 69 73 4f 75 74 65            isOute
3fb0: 72 2c 20 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a  r, &p->pWhere);.
3fc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
3fd0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
3fe0: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
3ff0: 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20  rence */.static 
4000: 4b 65 79 49 6e 66 6f 20 2a 6b 65 79 49 6e 66 6f  KeyInfo *keyInfo
4010: 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20 20  FromExprList(.  
4020: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
4030: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
4040: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
4050: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
4060: 20 20 2f 2a 20 46 6f 72 6d 20 74 68 65 20 4b 65    /* Form the Ke
4070: 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 66 72 6f  yInfo object fro
4080: 6d 20 74 68 69 73 20 45 78 70 72 4c 69 73 74 20  m this ExprList 
4090: 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 74 2c  */.  int iStart,
40a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67            /* Beg
40b0: 69 6e 20 77 69 74 68 20 74 68 69 73 20 63 6f 6c  in with this col
40c0: 75 6d 6e 20 6f 66 20 70 4c 69 73 74 20 2a 2f 0a  umn of pList */.
40d0: 20 20 69 6e 74 20 6e 45 78 74 72 61 20 20 20 20    int nExtra    
40e0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
40f0: 69 73 20 6d 61 6e 79 20 65 78 74 72 61 20 63 6f  is many extra co
4100: 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20 65 6e 64  lumns to the end
4110: 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47 65   */.);../*.** Ge
4120: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
4130: 20 77 69 6c 6c 20 70 75 73 68 20 74 68 65 20 72   will push the r
4140: 65 63 6f 72 64 20 69 6e 20 72 65 67 69 73 74 65  ecord in registe
4150: 72 73 20 72 65 67 44 61 74 61 0a 2a 2a 20 74 68  rs regData.** th
4160: 72 6f 75 67 68 20 72 65 67 44 61 74 61 2b 6e 44  rough regData+nD
4170: 61 74 61 2d 31 20 6f 6e 74 6f 20 74 68 65 20 73  ata-1 onto the s
4180: 6f 72 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  orter..*/.static
4190: 20 76 6f 69 64 20 70 75 73 68 4f 6e 74 6f 53 6f   void pushOntoSo
41a0: 72 74 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70  rter(.  Parse *p
41b0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
41c0: 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74  * Parser context
41d0: 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a 70   */.  SortCtx *p
41e0: 53 6f 72 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  Sort,        /* 
41f0: 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  Information abou
4200: 74 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  t the ORDER BY c
4210: 6c 61 75 73 65 20 2a 2f 0a 20 20 53 65 6c 65 63  lause */.  Selec
4220: 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20  t *pSelect,     
4230: 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 53    /* The whole S
4240: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
4250: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 44 61 74 61  */.  int regData
4260: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ,           /* F
4270: 69 72 73 74 20 72 65 67 69 73 74 65 72 20 68 6f  irst register ho
4280: 6c 64 69 6e 67 20 64 61 74 61 20 74 6f 20 62 65  lding data to be
4290: 20 73 6f 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74   sorted */.  int
42a0: 20 72 65 67 4f 72 69 67 44 61 74 61 2c 20 20 20   regOrigData,   
42b0: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 72 65 67      /* First reg
42c0: 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 64 61  ister holding da
42d0: 74 61 20 62 65 66 6f 72 65 20 70 61 63 6b 69 6e  ta before packin
42e0: 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 61 74 61  g */.  int nData
42f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
4300: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   Number of eleme
4310: 6e 74 73 20 69 6e 20 74 68 65 20 64 61 74 61 20  nts in the data 
4320: 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 6e  array */.  int n
4330: 50 72 65 66 69 78 52 65 67 20 20 20 20 20 20 20  PrefixReg       
4340: 20 20 2f 2a 20 4e 6f 2e 20 6f 66 20 72 65 67 20    /* No. of reg 
4350: 70 72 69 6f 72 20 74 6f 20 72 65 67 44 61 74 61  prior to regData
4360: 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75   available for u
4370: 73 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  se */.){.  Vdbe 
4380: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
4390: 62 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  be;             
43a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
43b0: 74 6d 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tmt under constr
43c0: 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  uction */.  int 
43d0: 62 53 65 71 20 3d 20 28 28 70 53 6f 72 74 2d 3e  bSeq = ((pSort->
43e0: 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54  sortFlags & SORT
43f0: 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 29 3d  FLAG_UseSorter)=
4400: 3d 30 29 3b 0a 20 20 69 6e 74 20 6e 45 78 70 72  =0);.  int nExpr
4410: 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72   = pSort->pOrder
4420: 42 79 2d 3e 6e 45 78 70 72 3b 20 20 20 20 20 20  By->nExpr;      
4430: 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2e 20 6f          /* No. o
4440: 66 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73  f ORDER BY terms
4450: 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 61 73 65 20   */.  int nBase 
4460: 3d 20 6e 45 78 70 72 20 2b 20 62 53 65 71 20 2b  = nExpr + bSeq +
4470: 20 6e 44 61 74 61 3b 20 20 20 20 20 20 20 20 20   nData;         
4480: 20 20 20 20 20 20 20 2f 2a 20 46 69 65 6c 64 73         /* Fields
4490: 20 69 6e 20 73 6f 72 74 65 72 20 72 65 63 6f 72   in sorter recor
44a0: 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42 61  d */.  int regBa
44b0: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
44c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44d0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 73 20          /* Regs 
44e0: 66 6f 72 20 73 6f 72 74 65 72 20 72 65 63 6f 72  for sorter recor
44f0: 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65  d */.  int regRe
4500: 63 6f 72 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d  cord = ++pParse-
4510: 3e 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20  >nMem;          
4520: 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 65 6d          /* Assem
4530: 62 6c 65 64 20 73 6f 72 74 65 72 20 72 65 63 6f  bled sorter reco
4540: 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 42 53  rd */.  int nOBS
4550: 61 74 20 3d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53  at = pSort->nOBS
4560: 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  at;             
4570: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 52 44 45           /* ORDE
4580: 52 20 42 59 20 74 65 72 6d 73 20 74 6f 20 73 6b  R BY terms to sk
4590: 69 70 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20  ip */.  int op; 
45a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
45c0: 63 6f 64 65 20 74 6f 20 61 64 64 20 73 6f 72 74  code to add sort
45d0: 65 72 20 72 65 63 6f 72 64 20 74 6f 20 73 6f 72  er record to sor
45e0: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69  ter */.  int iLi
45f0: 6d 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  mit;            
4600: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
4610: 49 4d 49 54 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  IMIT counter */.
4620: 0a 20 20 61 73 73 65 72 74 28 20 62 53 65 71 3d  .  assert( bSeq=
4630: 3d 30 20 7c 7c 20 62 53 65 71 3d 3d 31 20 29 3b  =0 || bSeq==1 );
4640: 0a 20 20 61 73 73 65 72 74 28 20 6e 44 61 74 61  .  assert( nData
4650: 3d 3d 31 20 7c 7c 20 72 65 67 44 61 74 61 3d 3d  ==1 || regData==
4660: 72 65 67 4f 72 69 67 44 61 74 61 20 29 3b 0a 20  regOrigData );. 
4670: 20 69 66 28 20 6e 50 72 65 66 69 78 52 65 67 20   if( nPrefixReg 
4680: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  ){.    assert( n
4690: 50 72 65 66 69 78 52 65 67 3d 3d 6e 45 78 70 72  PrefixReg==nExpr
46a0: 2b 62 53 65 71 20 29 3b 0a 20 20 20 20 72 65 67  +bSeq );.    reg
46b0: 42 61 73 65 20 3d 20 72 65 67 44 61 74 61 20 2d  Base = regData -
46c0: 20 6e 45 78 70 72 20 2d 20 62 53 65 71 3b 0a 20   nExpr - bSeq;. 
46d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 42   }else{.    regB
46e0: 61 73 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  ase = pParse->nM
46f0: 65 6d 20 2b 20 31 3b 0a 20 20 20 20 70 50 61 72  em + 1;.    pPar
4700: 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 42 61 73  se->nMem += nBas
4710: 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  e;.  }.  assert(
4720: 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65   pSelect->iOffse
4730: 74 3d 3d 30 20 7c 7c 20 70 53 65 6c 65 63 74 2d  t==0 || pSelect-
4740: 3e 69 4c 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20  >iLimit!=0 );.  
4750: 69 4c 69 6d 69 74 20 3d 20 70 53 65 6c 65 63 74  iLimit = pSelect
4760: 2d 3e 69 4f 66 66 73 65 74 20 3f 20 70 53 65 6c  ->iOffset ? pSel
4770: 65 63 74 2d 3e 69 4f 66 66 73 65 74 2b 31 20 3a  ect->iOffset+1 :
4780: 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74   pSelect->iLimit
4790: 3b 0a 20 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c  ;.  pSort->label
47a0: 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 56 64  Done = sqlite3Vd
47b0: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
47c0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
47d0: 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
47e0: 2c 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42  , pSort->pOrderB
47f0: 79 2c 20 72 65 67 42 61 73 65 2c 20 72 65 67 4f  y, regBase, regO
4800: 72 69 67 44 61 74 61 2c 0a 20 20 20 20 20 20 20  rigData,.       
4810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4820: 20 20 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44     SQLITE_ECEL_D
4830: 55 50 7c 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52  UP|SQLITE_ECEL_R
4840: 45 46 29 3b 0a 20 20 69 66 28 20 62 53 65 71 20  EF);.  if( bSeq 
4850: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
4860: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
4870: 65 71 75 65 6e 63 65 2c 20 70 53 6f 72 74 2d 3e  equence, pSort->
4880: 69 45 43 75 72 73 6f 72 2c 20 72 65 67 42 61 73  iECursor, regBas
4890: 65 2b 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20  e+nExpr);.  }.  
48a0: 69 66 28 20 6e 50 72 65 66 69 78 52 65 67 3d 3d  if( nPrefixReg==
48b0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
48c0: 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61  ExprCodeMove(pPa
48d0: 72 73 65 2c 20 72 65 67 44 61 74 61 2c 20 72 65  rse, regData, re
48e0: 67 42 61 73 65 2b 6e 45 78 70 72 2b 62 53 65 71  gBase+nExpr+bSeq
48f0: 2c 20 6e 44 61 74 61 29 3b 0a 20 20 7d 0a 20 20  , nData);.  }.  
4900: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4910: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
4920: 72 64 2c 20 72 65 67 42 61 73 65 2b 6e 4f 42 53  rd, regBase+nOBS
4930: 61 74 2c 20 6e 42 61 73 65 2d 6e 4f 42 53 61 74  at, nBase-nOBSat
4940: 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
4950: 69 66 28 20 6e 4f 42 53 61 74 3e 30 20 29 7b 0a  if( nOBSat>0 ){.
4960: 20 20 20 20 69 6e 74 20 72 65 67 50 72 65 76 4b      int regPrevK
4970: 65 79 3b 20 20 20 2f 2a 20 54 68 65 20 66 69 72  ey;   /* The fir
4980: 73 74 20 6e 4f 42 53 61 74 20 63 6f 6c 75 6d 6e  st nOBSat column
4990: 73 20 6f 66 20 74 68 65 20 70 72 65 76 69 6f 75  s of the previou
49a0: 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74  s row */.    int
49b0: 20 61 64 64 72 46 69 72 73 74 3b 20 20 20 20 2f   addrFirst;    /
49c0: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
49d0: 20 4f 50 5f 49 66 4e 6f 74 20 6f 70 63 6f 64 65   OP_IfNot opcode
49e0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
49f0: 4a 6d 70 3b 20 20 20 20 20 20 2f 2a 20 41 64 64  Jmp;      /* Add
4a00: 72 65 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 4a  ress of the OP_J
4a10: 75 6d 70 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  ump opcode */.  
4a20: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 20 20    VdbeOp *pOp;  
4a30: 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20 74 68      /* Opcode th
4a40: 61 74 20 6f 70 65 6e 73 20 74 68 65 20 73 6f 72  at opens the sor
4a50: 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ter */.    int n
4a60: 4b 65 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Key;         /* 
4a70: 4e 75 6d 62 65 72 20 6f 66 20 73 6f 72 74 69 6e  Number of sortin
4a80: 67 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 2c 20 69  g key columns, i
4a90: 6e 63 6c 75 64 69 6e 67 20 4f 50 5f 53 65 71 75  ncluding OP_Sequ
4aa0: 65 6e 63 65 20 2a 2f 0a 20 20 20 20 4b 65 79 49  ence */.    KeyI
4ab0: 6e 66 6f 20 2a 70 4b 49 3b 20 20 20 20 20 2f 2a  nfo *pKI;     /*
4ac0: 20 4f 72 69 67 69 6e 61 6c 20 4b 65 79 49 6e 66   Original KeyInf
4ad0: 6f 20 6f 6e 20 74 68 65 20 73 6f 72 74 65 72 20  o on the sorter 
4ae0: 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 72 65  table */..    re
4af0: 67 50 72 65 76 4b 65 79 20 3d 20 70 50 61 72 73  gPrevKey = pPars
4b00: 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70  e->nMem+1;.    p
4b10: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70  Parse->nMem += p
4b20: 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20  Sort->nOBSat;.  
4b30: 20 20 6e 4b 65 79 20 3d 20 6e 45 78 70 72 20 2d    nKey = nExpr -
4b40: 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 20 2b   pSort->nOBSat +
4b50: 20 62 53 65 71 3b 0a 20 20 20 20 69 66 28 20 62   bSeq;.    if( b
4b60: 53 65 71 20 29 7b 0a 20 20 20 20 20 20 61 64 64  Seq ){.      add
4b70: 72 46 69 72 73 74 20 3d 20 73 71 6c 69 74 65 33  rFirst = sqlite3
4b80: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
4b90: 5f 49 66 4e 6f 74 2c 20 72 65 67 42 61 73 65 2b  _IfNot, regBase+
4ba0: 6e 45 78 70 72 29 3b 20 0a 20 20 20 20 7d 65 6c  nExpr); .    }el
4bb0: 73 65 7b 0a 20 20 20 20 20 20 61 64 64 72 46 69  se{.      addrFi
4bc0: 72 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  rst = sqlite3Vdb
4bd0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 53 65  eAddOp1(v, OP_Se
4be0: 71 75 65 6e 63 65 54 65 73 74 2c 20 70 53 6f 72  quenceTest, pSor
4bf0: 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20  t->iECursor);.  
4c00: 20 20 7d 0a 20 20 20 20 56 64 62 65 43 6f 76 65    }.    VdbeCove
4c10: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
4c20: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
4c30: 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 72 65  , OP_Compare, re
4c40: 67 50 72 65 76 4b 65 79 2c 20 72 65 67 42 61 73  gPrevKey, regBas
4c50: 65 2c 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74  e, pSort->nOBSat
4c60: 29 3b 0a 20 20 20 20 70 4f 70 20 3d 20 73 71 6c  );.    pOp = sql
4c70: 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c  ite3VdbeGetOp(v,
4c80: 20 70 53 6f 72 74 2d 3e 61 64 64 72 53 6f 72 74   pSort->addrSort
4c90: 49 6e 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20  Index);.    if( 
4ca0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
4cb0: 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
4cc0: 6e 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d  n;.    pOp->p2 =
4cd0: 20 6e 4b 65 79 20 2b 20 6e 44 61 74 61 3b 0a 20   nKey + nData;. 
4ce0: 20 20 20 70 4b 49 20 3d 20 70 4f 70 2d 3e 70 34     pKI = pOp->p4
4cf0: 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 6d  .pKeyInfo;.    m
4d00: 65 6d 73 65 74 28 70 4b 49 2d 3e 61 53 6f 72 74  emset(pKI->aSort
4d10: 4f 72 64 65 72 2c 20 30 2c 20 70 4b 49 2d 3e 6e  Order, 0, pKI->n
4d20: 46 69 65 6c 64 29 3b 20 2f 2a 20 4d 61 6b 65 73  Field); /* Makes
4d30: 20 4f 50 5f 4a 75 6d 70 20 62 65 6c 6f 77 20 74   OP_Jump below t
4d40: 65 73 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 73  estable */.    s
4d50: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
4d60: 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a  P4(v, -1, (char*
4d70: 29 70 4b 49 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  )pKI, P4_KEYINFO
4d80: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
4d90: 20 70 4b 49 2d 3e 6e 58 46 69 65 6c 64 3e 32 20   pKI->nXField>2 
4da0: 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70  );.    pOp->p4.p
4db0: 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66  KeyInfo = keyInf
4dc0: 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  oFromExprList(pP
4dd0: 61 72 73 65 2c 20 70 53 6f 72 74 2d 3e 70 4f 72  arse, pSort->pOr
4de0: 64 65 72 42 79 2c 20 6e 4f 42 53 61 74 2c 0a 20  derBy, nOBSat,. 
4df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e10: 20 20 20 20 20 20 20 20 20 20 70 4b 49 2d 3e 6e            pKI->n
4e20: 58 46 69 65 6c 64 2d 31 29 3b 0a 20 20 20 20 61  XField-1);.    a
4e30: 64 64 72 4a 6d 70 20 3d 20 73 71 6c 69 74 65 33  ddrJmp = sqlite3
4e40: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
4e50: 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
4e60: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
4e70: 4a 75 6d 70 2c 20 61 64 64 72 4a 6d 70 2b 31 2c  Jump, addrJmp+1,
4e80: 20 30 2c 20 61 64 64 72 4a 6d 70 2b 31 29 3b 20   0, addrJmp+1); 
4e90: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
4ea0: 0a 20 20 20 20 70 53 6f 72 74 2d 3e 6c 61 62 65  .    pSort->labe
4eb0: 6c 42 6b 4f 75 74 20 3d 20 73 71 6c 69 74 65 33  lBkOut = sqlite3
4ec0: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
4ed0: 3b 0a 20 20 20 20 70 53 6f 72 74 2d 3e 72 65 67  ;.    pSort->reg
4ee0: 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73  Return = ++pPars
4ef0: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c  e->nMem;.    sql
4f00: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
4f10: 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 53 6f 72  , OP_Gosub, pSor
4f20: 74 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 53  t->regReturn, pS
4f30: 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29  ort->labelBkOut)
4f40: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
4f50: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
4f60: 73 65 74 53 6f 72 74 65 72 2c 20 70 53 6f 72 74  setSorter, pSort
4f70: 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20  ->iECursor);.   
4f80: 20 69 66 28 20 69 4c 69 6d 69 74 20 29 7b 0a 20   if( iLimit ){. 
4f90: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4fa0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 4e  AddOp2(v, OP_IfN
4fb0: 6f 74 2c 20 69 4c 69 6d 69 74 2c 20 70 53 6f 72  ot, iLimit, pSor
4fc0: 74 2d 3e 6c 61 62 65 6c 44 6f 6e 65 29 3b 0a 20  t->labelDone);. 
4fd0: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
4fe0: 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  e(v);.    }.    
4ff0: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
5000: 65 72 65 28 76 2c 20 61 64 64 72 46 69 72 73 74  ere(v, addrFirst
5010: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
5020: 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73  prCodeMove(pPars
5030: 65 2c 20 72 65 67 42 61 73 65 2c 20 72 65 67 50  e, regBase, regP
5040: 72 65 76 4b 65 79 2c 20 70 53 6f 72 74 2d 3e 6e  revKey, pSort->n
5050: 4f 42 53 61 74 29 3b 0a 20 20 20 20 73 71 6c 69  OBSat);.    sqli
5060: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
5070: 76 2c 20 61 64 64 72 4a 6d 70 29 3b 0a 20 20 7d  v, addrJmp);.  }
5080: 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f  .  if( pSort->so
5090: 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c  rtFlags & SORTFL
50a0: 41 47 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a  AG_UseSorter ){.
50b0: 20 20 20 20 6f 70 20 3d 20 4f 50 5f 53 6f 72 74      op = OP_Sort
50c0: 65 72 49 6e 73 65 72 74 3b 0a 20 20 7d 65 6c 73  erInsert;.  }els
50d0: 65 7b 0a 20 20 20 20 6f 70 20 3d 20 4f 50 5f 49  e{.    op = OP_I
50e0: 64 78 49 6e 73 65 72 74 3b 0a 20 20 7d 0a 20 20  dxInsert;.  }.  
50f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5100: 32 28 76 2c 20 6f 70 2c 20 70 53 6f 72 74 2d 3e  2(v, op, pSort->
5110: 69 45 43 75 72 73 6f 72 2c 20 72 65 67 52 65 63  iECursor, regRec
5120: 6f 72 64 29 3b 0a 20 20 69 66 28 20 69 4c 69 6d  ord);.  if( iLim
5130: 69 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64  it ){.    int ad
5140: 64 72 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 73  dr;.    addr = s
5150: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
5160: 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 5a 65 72 6f  (v, OP_IfNotZero
5170: 2c 20 69 4c 69 6d 69 74 2c 20 30 2c 20 31 29 3b  , iLimit, 0, 1);
5180: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
5190: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
51a0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4c 61  eAddOp1(v, OP_La
51b0: 73 74 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72  st, pSort->iECur
51c0: 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  sor);.    sqlite
51d0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
51e0: 50 5f 44 65 6c 65 74 65 2c 20 70 53 6f 72 74 2d  P_Delete, pSort-
51f0: 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  >iECursor);.    
5200: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
5210: 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20  ere(v, addr);.  
5220: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63  }.}../*.** Add c
5230: 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ode to implement
5240: 20 74 68 65 20 4f 46 46 53 45 54 0a 2a 2f 0a 73   the OFFSET.*/.s
5250: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 4f  tatic void codeO
5260: 66 66 73 65 74 28 0a 20 20 56 64 62 65 20 2a 76  ffset(.  Vdbe *v
5270: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65  ,          /* Ge
5280: 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f  nerate code into
5290: 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e   this VM */.  in
52a0: 74 20 69 4f 66 66 73 65 74 2c 20 20 20 20 20 20  t iOffset,      
52b0: 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
52c0: 69 6e 67 20 74 68 65 20 6f 66 66 73 65 74 20 63  ing the offset c
52d0: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
52e0: 69 43 6f 6e 74 69 6e 75 65 20 20 20 20 20 2f 2a  iContinue     /*
52f0: 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b   Jump here to sk
5300: 69 70 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  ip the current r
5310: 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 69 66  ecord */.){.  if
5320: 28 20 69 4f 66 66 73 65 74 3e 30 20 29 7b 0a 20  ( iOffset>0 ){. 
5330: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5340: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 50 6f 73  dOp3(v, OP_IfPos
5350: 2c 20 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74  , iOffset, iCont
5360: 69 6e 75 65 2c 20 31 29 3b 20 56 64 62 65 43 6f  inue, 1); VdbeCo
5370: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 56  verage(v);.    V
5380: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
5390: 4f 46 46 53 45 54 22 29 29 3b 0a 20 20 7d 0a 7d  OFFSET"));.  }.}
53a0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65  ../*.** Add code
53b0: 20 74 68 61 74 20 77 69 6c 6c 20 63 68 65 63 6b   that will check
53c0: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
53d0: 65 20 4e 20 72 65 67 69 73 74 65 72 73 20 73 74  e N registers st
53e0: 61 72 74 69 6e 67 20 61 74 20 69 4d 65 6d 0a 2a  arting at iMem.*
53f0: 2a 20 66 6f 72 6d 20 61 20 64 69 73 74 69 6e 63  * form a distinc
5400: 74 20 65 6e 74 72 79 2e 20 20 69 54 61 62 20 69  t entry.  iTab i
5410: 73 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  s a sorting inde
5420: 78 20 74 68 61 74 20 68 6f 6c 64 73 20 70 72 65  x that holds pre
5430: 76 69 6f 75 73 6c 79 0a 2a 2a 20 73 65 65 6e 20  viously.** seen 
5440: 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20  combinations of 
5450: 74 68 65 20 4e 20 76 61 6c 75 65 73 2e 20 20 41  the N values.  A
5460: 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 6d 61   new entry is ma
5470: 64 65 20 69 6e 20 69 54 61 62 0a 2a 2a 20 69 66  de in iTab.** if
5480: 20 74 68 65 20 63 75 72 72 65 6e 74 20 4e 20 76   the current N v
5490: 61 6c 75 65 73 20 61 72 65 20 6e 65 77 2e 0a 2a  alues are new..*
54a0: 2a 0a 2a 2a 20 41 20 6a 75 6d 70 20 74 6f 20 61  *.** A jump to a
54b0: 64 64 72 52 65 70 65 61 74 20 69 73 20 6d 61 64  ddrRepeat is mad
54c0: 65 20 61 6e 64 20 74 68 65 20 4e 2b 31 20 76 61  e and the N+1 va
54d0: 6c 75 65 73 20 61 72 65 20 70 6f 70 70 65 64 20  lues are popped 
54e0: 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 73 74 61 63  from the.** stac
54f0: 6b 20 69 66 20 74 68 65 20 74 6f 70 20 4e 20 65  k if the top N e
5500: 6c 65 6d 65 6e 74 73 20 61 72 65 20 6e 6f 74 20  lements are not 
5510: 64 69 73 74 69 6e 63 74 2e 0a 2a 2f 0a 73 74 61  distinct..*/.sta
5520: 74 69 63 20 76 6f 69 64 20 63 6f 64 65 44 69 73  tic void codeDis
5530: 74 69 6e 63 74 28 0a 20 20 50 61 72 73 65 20 2a  tinct(.  Parse *
5540: 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50  pParse,     /* P
5550: 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20  arsing and code 
5560: 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
5570: 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  xt */.  int iTab
5580: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20  ,          /* A 
5590: 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 75 73  sorting index us
55a0: 65 64 20 74 6f 20 74 65 73 74 20 66 6f 72 20 64  ed to test for d
55b0: 69 73 74 69 6e 63 74 6e 65 73 73 20 2a 2f 0a 20  istinctness */. 
55c0: 20 69 6e 74 20 61 64 64 72 52 65 70 65 61 74 2c   int addrRepeat,
55d0: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68      /* Jump to h
55e0: 65 72 65 20 69 66 20 6e 6f 74 20 64 69 73 74 69  ere if not disti
55f0: 6e 63 74 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20  nct */.  int N, 
5600: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
5610: 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
5620: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 65 6d 20  s */.  int iMem 
5630: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
5640: 73 74 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b  st element */.){
5650: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e  .  Vdbe *v;.  in
5660: 74 20 72 31 3b 0a 0a 20 20 76 20 3d 20 70 50 61  t r1;..  v = pPa
5670: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 72 31  rse->pVdbe;.  r1
5680: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
5690: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
56a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
56b0: 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64  4Int(v, OP_Found
56c0: 2c 20 69 54 61 62 2c 20 61 64 64 72 52 65 70 65  , iTab, addrRepe
56d0: 61 74 2c 20 69 4d 65 6d 2c 20 4e 29 3b 20 56 64  at, iMem, N); Vd
56e0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
56f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5700: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
5710: 6f 72 64 2c 20 69 4d 65 6d 2c 20 4e 2c 20 72 31  ord, iMem, N, r1
5720: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
5730: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
5740: 49 6e 73 65 72 74 2c 20 69 54 61 62 2c 20 72 31  Insert, iTab, r1
5750: 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
5760: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
5770: 65 2c 20 72 31 29 3b 0a 7d 0a 0a 23 69 66 6e 64  e, r1);.}..#ifnd
5780: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
5790: 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65  UBQUERY./*.** Ge
57a0: 6e 65 72 61 74 65 20 61 6e 20 65 72 72 6f 72 20  nerate an error 
57b0: 6d 65 73 73 61 67 65 20 77 68 65 6e 20 61 20 53  message when a S
57c0: 45 4c 45 43 54 20 69 73 20 75 73 65 64 20 77 69  ELECT is used wi
57d0: 74 68 69 6e 20 61 20 73 75 62 65 78 70 72 65 73  thin a subexpres
57e0: 73 69 6f 6e 0a 2a 2a 20 28 65 78 61 6d 70 6c 65  sion.** (example
57f0: 3a 20 20 22 61 20 49 4e 20 28 53 45 4c 45 43 54  :  "a IN (SELECT
5800: 20 2a 20 46 52 4f 4d 20 74 61 62 6c 65 29 22 29   * FROM table)")
5810: 20 62 75 74 20 69 74 20 68 61 73 20 6d 6f 72 65   but it has more
5820: 20 74 68 61 6e 20 31 20 72 65 73 75 6c 74 0a 2a   than 1 result.*
5830: 2a 20 63 6f 6c 75 6d 6e 2e 20 20 57 65 20 64 6f  * column.  We do
5840: 20 74 68 69 73 20 69 6e 20 61 20 73 75 62 72 6f   this in a subro
5850: 75 74 69 6e 65 20 62 65 63 61 75 73 65 20 74 68  utine because th
5860: 65 20 65 72 72 6f 72 20 75 73 65 64 20 74 6f 20  e error used to 
5870: 6f 63 63 75 72 0a 2a 2a 20 69 6e 20 6d 75 6c 74  occur.** in mult
5880: 69 70 6c 65 20 70 6c 61 63 65 73 2e 20 20 28 54  iple places.  (T
5890: 68 65 20 65 72 72 6f 72 20 6f 6e 6c 79 20 6f 63  he error only oc
58a0: 63 75 72 73 20 69 6e 20 6f 6e 65 20 70 6c 61 63  curs in one plac
58b0: 65 20 6e 6f 77 2c 20 62 75 74 20 77 65 0a 2a 2a  e now, but we.**
58c0: 20 72 65 74 61 69 6e 20 74 68 65 20 73 75 62 72   retain the subr
58d0: 6f 75 74 69 6e 65 20 74 6f 20 6d 69 6e 69 6d 69  outine to minimi
58e0: 7a 65 20 63 6f 64 65 20 64 69 73 72 75 70 74 69  ze code disrupti
58f0: 6f 6e 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69  on.).*/.static i
5900: 6e 74 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69  nt checkForMulti
5910: 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f  ColumnSelectErro
5920: 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  r(.  Parse *pPar
5930: 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
5940: 73 65 20 63 6f 6e 74 65 78 74 2e 20 2a 2f 0a 20  se context. */. 
5950: 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
5960: 73 74 2c 20 20 20 2f 2a 20 44 65 73 74 69 6e 61  st,   /* Destina
5970: 74 69 6f 6e 20 6f 66 20 53 45 4c 45 43 54 20 72  tion of SELECT r
5980: 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20  esults */.  int 
5990: 6e 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20  nExpr           
59a0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
59b0: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 72 65 74  sult columns ret
59c0: 75 72 6e 65 64 20 62 79 20 53 45 4c 45 43 54 20  urned by SELECT 
59d0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 65 44 65 73  */.){.  int eDes
59e0: 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74  t = pDest->eDest
59f0: 3b 0a 20 20 69 66 28 20 6e 45 78 70 72 3e 31 20  ;.  if( nExpr>1 
5a00: 26 26 20 28 65 44 65 73 74 3d 3d 53 52 54 5f 4d  && (eDest==SRT_M
5a10: 65 6d 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54  em || eDest==SRT
5a20: 5f 53 65 74 29 20 29 7b 0a 20 20 20 20 73 71 6c  _Set) ){.    sql
5a30: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
5a40: 72 73 65 2c 20 22 6f 6e 6c 79 20 61 20 73 69 6e  rse, "only a sin
5a50: 67 6c 65 20 72 65 73 75 6c 74 20 61 6c 6c 6f 77  gle result allow
5a60: 65 64 20 66 6f 72 20 22 0a 20 20 20 20 20 20 20  ed for ".       
5a70: 22 61 20 53 45 4c 45 43 54 20 74 68 61 74 20 69  "a SELECT that i
5a80: 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70  s part of an exp
5a90: 72 65 73 73 69 6f 6e 22 29 3b 0a 20 20 20 20 72  ression");.    r
5aa0: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73 65  eturn 1;.  }else
5ab0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
5ac0: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a    }.}.#endif../*
5ad0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
5ae0: 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63   generates the c
5af0: 6f 64 65 20 66 6f 72 20 74 68 65 20 69 6e 73 69  ode for the insi
5b00: 64 65 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20  de of the inner 
5b10: 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c  loop.** of a SEL
5b20: 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72  ECT..**.** If sr
5b30: 63 54 61 62 20 69 73 20 6e 65 67 61 74 69 76 65  cTab is negative
5b40: 2c 20 74 68 65 6e 20 74 68 65 20 70 45 4c 69 73  , then the pELis
5b50: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  t expressions.**
5b60: 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 69   are evaluated i
5b70: 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74  n order to get t
5b80: 68 65 20 64 61 74 61 20 66 6f 72 20 74 68 69 73  he data for this
5b90: 20 72 6f 77 2e 20 20 49 66 20 73 72 63 54 61 62   row.  If srcTab
5ba0: 20 69 73 0a 2a 2a 20 7a 65 72 6f 20 6f 72 20 6d   is.** zero or m
5bb0: 6f 72 65 2c 20 74 68 65 6e 20 64 61 74 61 20 69  ore, then data i
5bc0: 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20 73 72  s pulled from sr
5bd0: 63 54 61 62 20 61 6e 64 20 70 45 4c 69 73 74 20  cTab and pEList 
5be0: 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 0a 2a 2a  is used only .**
5bf0: 20 74 6f 20 67 65 74 20 6e 75 6d 62 65 72 20 63   to get number c
5c00: 6f 6c 75 6d 6e 73 20 61 6e 64 20 74 68 65 20 64  olumns and the d
5c10: 61 74 61 74 79 70 65 20 66 6f 72 20 65 61 63 68  atatype for each
5c20: 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74   column..*/.stat
5c30: 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74 49 6e  ic void selectIn
5c40: 6e 65 72 4c 6f 6f 70 28 0a 20 20 50 61 72 73 65  nerLoop(.  Parse
5c50: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
5c60: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
5c70: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
5c80: 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
5c90: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d        /* The com
5ca0: 70 6c 65 74 65 20 73 65 6c 65 63 74 20 73 74 61  plete select sta
5cb0: 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64  tement being cod
5cc0: 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  ed */.  ExprList
5cd0: 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20   *pEList,       
5ce0: 2f 2a 20 4c 69 73 74 20 6f 66 20 76 61 6c 75 65  /* List of value
5cf0: 73 20 62 65 69 6e 67 20 65 78 74 72 61 63 74 65  s being extracte
5d00: 64 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 54 61  d */.  int srcTa
5d10: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  b,             /
5d20: 2a 20 50 75 6c 6c 20 64 61 74 61 20 66 72 6f 6d  * Pull data from
5d30: 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20   this table */. 
5d40: 20 53 6f 72 74 43 74 78 20 2a 70 53 6f 72 74 2c   SortCtx *pSort,
5d50: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e           /* If n
5d60: 6f 74 20 4e 55 4c 4c 2c 20 69 6e 66 6f 20 6f 6e  ot NULL, info on
5d70: 20 68 6f 77 20 74 6f 20 70 72 6f 63 65 73 73 20   how to process 
5d80: 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20 20 44 69  ORDER BY */.  Di
5d90: 73 74 69 6e 63 74 43 74 78 20 2a 70 44 69 73 74  stinctCtx *pDist
5da0: 69 6e 63 74 2c 20 2f 2a 20 49 66 20 6e 6f 74 20  inct, /* If not 
5db0: 4e 55 4c 4c 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f  NULL, info on ho
5dc0: 77 20 74 6f 20 70 72 6f 63 65 73 73 20 44 49 53  w to process DIS
5dd0: 54 49 4e 43 54 20 2a 2f 0a 20 20 53 65 6c 65 63  TINCT */.  Selec
5de0: 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20  tDest *pDest,   
5df0: 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73     /* How to dis
5e00: 70 6f 73 65 20 6f 66 20 74 68 65 20 72 65 73 75  pose of the resu
5e10: 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  lts */.  int iCo
5e20: 6e 74 69 6e 75 65 2c 20 20 20 20 20 20 20 20 20  ntinue,         
5e30: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
5e40: 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 6e   continue with n
5e50: 65 78 74 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74  ext row */.  int
5e60: 20 69 42 72 65 61 6b 20 20 20 20 20 20 20 20 20   iBreak         
5e70: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
5e80: 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f  e to break out o
5e90: 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  f the inner loop
5ea0: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
5eb0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
5ec0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
5ed0: 20 68 61 73 44 69 73 74 69 6e 63 74 3b 20 20 20   hasDistinct;   
5ee0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
5ef0: 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79  the DISTINCT key
5f00: 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20  word is present 
5f10: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 73 75  */.  int regResu
5f20: 6c 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  lt;             
5f30: 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6d 65 6d   /* Start of mem
5f40: 6f 72 79 20 68 6f 6c 64 69 6e 67 20 72 65 73 75  ory holding resu
5f50: 6c 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20  lt set */.  int 
5f60: 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65  eDest = pDest->e
5f70: 44 65 73 74 3b 20 20 20 2f 2a 20 48 6f 77 20 74  Dest;   /* How t
5f80: 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 72 65 73  o dispose of res
5f90: 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 50  ults */.  int iP
5fa0: 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69 53 44  arm = pDest->iSD
5fb0: 50 61 72 6d 3b 20 2f 2a 20 46 69 72 73 74 20 61  Parm; /* First a
5fc0: 72 67 75 6d 65 6e 74 20 74 6f 20 64 69 73 70 6f  rgument to dispo
5fd0: 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  sal method */.  
5fe0: 69 6e 74 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 20  int nResultCol; 
5ff0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
6000: 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20  umber of result 
6010: 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74  columns */.  int
6020: 20 6e 50 72 65 66 69 78 52 65 67 20 3d 20 30 3b   nPrefixReg = 0;
6030: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
6040: 65 72 20 6f 66 20 65 78 74 72 61 20 72 65 67 69  er of extra regi
6050: 73 74 65 72 73 20 62 65 66 6f 72 65 20 72 65 67  sters before reg
6060: 52 65 73 75 6c 74 20 2a 2f 0a 0a 20 20 61 73 73  Result */..  ass
6070: 65 72 74 28 20 76 20 29 3b 0a 20 20 61 73 73 65  ert( v );.  asse
6080: 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b  rt( pEList!=0 );
6090: 0a 20 20 68 61 73 44 69 73 74 69 6e 63 74 20 3d  .  hasDistinct =
60a0: 20 70 44 69 73 74 69 6e 63 74 20 3f 20 70 44 69   pDistinct ? pDi
60b0: 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70  stinct->eTnctTyp
60c0: 65 20 3a 20 57 48 45 52 45 5f 44 49 53 54 49 4e  e : WHERE_DISTIN
60d0: 43 54 5f 4e 4f 4f 50 3b 0a 20 20 69 66 28 20 70  CT_NOOP;.  if( p
60e0: 53 6f 72 74 20 26 26 20 70 53 6f 72 74 2d 3e 70  Sort && pSort->p
60f0: 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 70 53 6f  OrderBy==0 ) pSo
6100: 72 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 53  rt = 0;.  if( pS
6110: 6f 72 74 3d 3d 30 20 26 26 20 21 68 61 73 44 69  ort==0 && !hasDi
6120: 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 61 73  stinct ){.    as
6130: 73 65 72 74 28 20 69 43 6f 6e 74 69 6e 75 65 21  sert( iContinue!
6140: 3d 30 20 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66  =0 );.    codeOf
6150: 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73  fset(v, p->iOffs
6160: 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a  et, iContinue);.
6170: 20 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20 74    }..  /* Pull t
6180: 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c  he requested col
6190: 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20 6e 52 65  umns..  */.  nRe
61a0: 73 75 6c 74 43 6f 6c 20 3d 20 70 45 4c 69 73 74  sultCol = pEList
61b0: 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 69 66 28 20  ->nExpr;..  if( 
61c0: 70 44 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20  pDest->iSdst==0 
61d0: 29 7b 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74  ){.    if( pSort
61e0: 20 29 7b 0a 20 20 20 20 20 20 6e 50 72 65 66 69   ){.      nPrefi
61f0: 78 52 65 67 20 3d 20 70 53 6f 72 74 2d 3e 70 4f  xReg = pSort->pO
6200: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
6210: 20 20 20 20 20 69 66 28 20 21 28 70 53 6f 72 74       if( !(pSort
6220: 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f  ->sortFlags & SO
6230: 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72  RTFLAG_UseSorter
6240: 29 20 29 20 6e 50 72 65 66 69 78 52 65 67 2b 2b  ) ) nPrefixReg++
6250: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
6260: 6e 4d 65 6d 20 2b 3d 20 6e 50 72 65 66 69 78 52  nMem += nPrefixR
6270: 65 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44  eg;.    }.    pD
6280: 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 70 50 61  est->iSdst = pPa
6290: 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20  rse->nMem+1;.   
62a0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
62b0: 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d   nResultCol;.  }
62c0: 65 6c 73 65 20 69 66 28 20 70 44 65 73 74 2d 3e  else if( pDest->
62d0: 69 53 64 73 74 2b 6e 52 65 73 75 6c 74 43 6f 6c  iSdst+nResultCol
62e0: 20 3e 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20   > pParse->nMem 
62f0: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69  ){.    /* This i
6300: 73 20 61 6e 20 65 72 72 6f 72 20 63 6f 6e 64 69  s an error condi
6310: 74 69 6f 6e 20 74 68 61 74 20 63 61 6e 20 72 65  tion that can re
6320: 73 75 6c 74 2c 20 66 6f 72 20 65 78 61 6d 70 6c  sult, for exampl
6330: 65 2c 20 77 68 65 6e 20 61 20 53 45 4c 45 43 54  e, when a SELECT
6340: 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 72  .    ** on the r
6350: 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f  ight-hand side o
6360: 66 20 61 6e 20 49 4e 53 45 52 54 20 63 6f 6e 74  f an INSERT cont
6370: 61 69 6e 73 20 6d 6f 72 65 20 72 65 73 75 6c 74  ains more result
6380: 20 63 6f 6c 75 6d 6e 73 20 74 68 61 6e 0a 20 20   columns than.  
6390: 20 20 2a 2a 20 74 68 65 72 65 20 61 72 65 20 63    ** there are c
63a0: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61  olumns in the ta
63b0: 62 6c 65 20 6f 6e 20 74 68 65 20 6c 65 66 74 2e  ble on the left.
63c0: 20 20 54 68 65 20 65 72 72 6f 72 20 77 69 6c 6c    The error will
63d0: 20 62 65 20 63 61 75 67 68 74 0a 20 20 20 20 2a   be caught.    *
63e0: 2a 20 61 6e 64 20 72 65 70 6f 72 74 65 64 20 6c  * and reported l
63f0: 61 74 65 72 2e 20 20 42 75 74 20 77 65 20 6e 65  ater.  But we ne
6400: 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ed to make sure 
6410: 65 6e 6f 75 67 68 20 6d 65 6d 6f 72 79 20 69 73  enough memory is
6420: 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 2a   allocated.    *
6430: 2a 20 74 6f 20 61 76 6f 69 64 20 6f 74 68 65 72  * to avoid other
6440: 20 73 70 75 72 69 6f 75 73 20 65 72 72 6f 72 73   spurious errors
6450: 20 69 6e 20 74 68 65 20 6d 65 61 6e 74 69 6d 65   in the meantime
6460: 2e 20 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d  . */.    pParse-
6470: 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74  >nMem += nResult
6480: 43 6f 6c 3b 0a 20 20 7d 0a 20 20 70 44 65 73 74  Col;.  }.  pDest
6490: 2d 3e 6e 53 64 73 74 20 3d 20 6e 52 65 73 75 6c  ->nSdst = nResul
64a0: 74 43 6f 6c 3b 0a 20 20 72 65 67 52 65 73 75 6c  tCol;.  regResul
64b0: 74 20 3d 20 70 44 65 73 74 2d 3e 69 53 64 73 74  t = pDest->iSdst
64c0: 3b 0a 20 20 69 66 28 20 73 72 63 54 61 62 3e 3d  ;.  if( srcTab>=
64d0: 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  0 ){.    for(i=0
64e0: 3b 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b 20  ; i<nResultCol; 
64f0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
6500: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
6510: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54   OP_Column, srcT
6520: 61 62 2c 20 69 2c 20 72 65 67 52 65 73 75 6c 74  ab, i, regResult
6530: 2b 69 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  +i);.      VdbeC
6540: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c  omment((v, "%s",
6550: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e   pEList->a[i].zN
6560: 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ame));.    }.  }
6570: 65 6c 73 65 20 69 66 28 20 65 44 65 73 74 21 3d  else if( eDest!=
6580: 53 52 54 5f 45 78 69 73 74 73 20 29 7b 0a 20 20  SRT_Exists ){.  
6590: 20 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74    /* If the dest
65a0: 69 6e 61 74 69 6f 6e 20 69 73 20 61 6e 20 45 58  ination is an EX
65b0: 49 53 54 53 28 2e 2e 2e 29 20 65 78 70 72 65 73  ISTS(...) expres
65c0: 73 69 6f 6e 2c 20 74 68 65 20 61 63 74 75 61 6c  sion, the actual
65d0: 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20 72  .    ** values r
65e0: 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 53  eturned by the S
65f0: 45 4c 45 43 54 20 61 72 65 20 6e 6f 74 20 72 65  ELECT are not re
6600: 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  quired..    */. 
6610: 20 20 20 75 38 20 65 63 65 6c 46 6c 61 67 73 3b     u8 ecelFlags;
6620: 0a 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d  .    if( eDest==
6630: 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74  SRT_Mem || eDest
6640: 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20  ==SRT_Output || 
6650: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
6660: 74 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 65 63  tine ){.      ec
6670: 65 6c 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  elFlags = SQLITE
6680: 5f 45 43 45 4c 5f 44 55 50 3b 0a 20 20 20 20 7d  _ECEL_DUP;.    }
6690: 65 6c 73 65 7b 0a 20 20 20 20 20 20 65 63 65 6c  else{.      ecel
66a0: 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 7d  Flags = 0;.    }
66b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
66c0: 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61  CodeExprList(pPa
66d0: 72 73 65 2c 20 70 45 4c 69 73 74 2c 20 72 65 67  rse, pEList, reg
66e0: 52 65 73 75 6c 74 2c 20 30 2c 20 65 63 65 6c 46  Result, 0, ecelF
66f0: 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  lags);.  }..  /*
6700: 20 49 66 20 74 68 65 20 44 49 53 54 49 4e 43 54   If the DISTINCT
6710: 20 6b 65 79 77 6f 72 64 20 77 61 73 20 70 72 65   keyword was pre
6720: 73 65 6e 74 20 6f 6e 20 74 68 65 20 53 45 4c 45  sent on the SELE
6730: 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a  CT statement.  *
6740: 2a 20 61 6e 64 20 74 68 69 73 20 72 6f 77 20 68  * and this row h
6750: 61 73 20 62 65 65 6e 20 73 65 65 6e 20 62 65 66  as been seen bef
6760: 6f 72 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74  ore, then do not
6770: 20 6d 61 6b 65 20 74 68 69 73 20 72 6f 77 0a 20   make this row. 
6780: 20 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20   ** part of the 
6790: 72 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69  result..  */.  i
67a0: 66 28 20 68 61 73 44 69 73 74 69 6e 63 74 20 29  f( hasDistinct )
67b0: 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 44  {.    switch( pD
67c0: 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79  istinct->eTnctTy
67d0: 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  pe ){.      case
67e0: 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
67f0: 4f 52 44 45 52 45 44 3a 20 7b 0a 20 20 20 20 20  ORDERED: {.     
6800: 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 20     VdbeOp *pOp; 
6810: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f             /* No
6820: 20 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64   longer required
6830: 20 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69   OpenEphemeral i
6840: 6e 73 74 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20  nstr. */.       
6850: 20 69 6e 74 20 69 4a 75 6d 70 3b 20 20 20 20 20   int iJump;     
6860: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
6870: 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a   destination */.
6880: 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 67 50          int regP
6890: 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20  rev;            
68a0: 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 6f 77 20  /* Previous row 
68b0: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 20 20  content */..    
68c0: 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20      /* Allocate 
68d0: 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 70 72  space for the pr
68e0: 65 76 69 6f 75 73 20 72 6f 77 20 2a 2f 0a 20 20  evious row */.  
68f0: 20 20 20 20 20 20 72 65 67 50 72 65 76 20 3d 20        regPrev = 
6900: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
6910: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
6920: 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43  nMem += nResultC
6930: 6f 6c 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  ol;..        /* 
6940: 43 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70  Change the OP_Op
6950: 65 6e 45 70 68 65 6d 65 72 61 6c 20 63 6f 64 65  enEphemeral code
6960: 64 20 65 61 72 6c 69 65 72 20 74 6f 20 61 6e 20  d earlier to an 
6970: 4f 50 5f 4e 75 6c 6c 0a 20 20 20 20 20 20 20 20  OP_Null.        
6980: 2a 2a 20 73 65 74 73 20 74 68 65 20 4d 45 4d 5f  ** sets the MEM_
6990: 43 6c 65 61 72 65 64 20 62 69 74 20 6f 6e 20 74  Cleared bit on t
69a0: 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65  he first registe
69b0: 72 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20  r of the.       
69c0: 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 76 61 6c   ** previous val
69d0: 75 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 63  ue.  This will c
69e0: 61 75 73 65 20 74 68 65 20 4f 50 5f 4e 65 20 62  ause the OP_Ne b
69f0: 65 6c 6f 77 20 74 6f 20 61 6c 77 61 79 73 0a 20  elow to always. 
6a00: 20 20 20 20 20 20 20 2a 2a 20 66 61 69 6c 20 6f         ** fail o
6a10: 6e 20 74 68 65 20 66 69 72 73 74 20 69 74 65 72  n the first iter
6a20: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f  ation of the loo
6a30: 70 20 65 76 65 6e 20 69 66 20 74 68 65 20 66 69  p even if the fi
6a40: 72 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  rst.        ** r
6a50: 6f 77 20 69 73 20 61 6c 6c 20 4e 55 4c 4c 73 2e  ow is all NULLs.
6a60: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
6a70: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
6a80: 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 70  hangeToNoop(v, p
6a90: 44 69 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e  Distinct->addrTn
6aa0: 63 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70  ct);.        pOp
6ab0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65   = sqlite3VdbeGe
6ac0: 74 4f 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74  tOp(v, pDistinct
6ad0: 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20  ->addrTnct);.   
6ae0: 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65       pOp->opcode
6af0: 20 3d 20 4f 50 5f 4e 75 6c 6c 3b 0a 20 20 20 20   = OP_Null;.    
6b00: 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 31 3b      pOp->p1 = 1;
6b10: 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32  .        pOp->p2
6b20: 20 3d 20 72 65 67 50 72 65 76 3b 0a 0a 20 20 20   = regPrev;..   
6b30: 20 20 20 20 20 69 4a 75 6d 70 20 3d 20 73 71 6c       iJump = sql
6b40: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
6b50: 64 64 72 28 76 29 20 2b 20 6e 52 65 73 75 6c 74  ddr(v) + nResult
6b60: 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  Col;.        for
6b70: 28 69 3d 30 3b 20 69 3c 6e 52 65 73 75 6c 74 43  (i=0; i<nResultC
6b80: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
6b90: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
6ba0: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
6bb0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
6bc0: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
6bd0: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  pr);.          i
6be0: 66 28 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 2d  f( i<nResultCol-
6bf0: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
6c00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6c10: 70 33 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 65 67  p3(v, OP_Ne, reg
6c20: 52 65 73 75 6c 74 2b 69 2c 20 69 4a 75 6d 70 2c  Result+i, iJump,
6c30: 20 72 65 67 50 72 65 76 2b 69 29 3b 0a 20 20 20   regPrev+i);.   
6c40: 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76           VdbeCov
6c50: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
6c60: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6c70: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
6c80: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45  beAddOp3(v, OP_E
6c90: 71 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 2c 20  q, regResult+i, 
6ca0: 69 43 6f 6e 74 69 6e 75 65 2c 20 72 65 67 50 72  iContinue, regPr
6cb0: 65 76 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 20  ev+i);.         
6cc0: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
6cd0: 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 7d  v);.           }
6ce0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
6cf0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76  e3VdbeChangeP4(v
6d00: 2c 20 2d 31 2c 20 28 63 6f 6e 73 74 20 63 68 61  , -1, (const cha
6d10: 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f  r *)pColl, P4_CO
6d20: 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 20 20  LLSEQ);.        
6d30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
6d40: 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f  ngeP5(v, SQLITE_
6d50: 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 20  NULLEQ);.       
6d60: 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
6d70: 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  t( sqlite3VdbeCu
6d80: 72 72 65 6e 74 41 64 64 72 28 76 29 3d 3d 69 4a  rrentAddr(v)==iJ
6d90: 75 6d 70 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64  ump || pParse->d
6da0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
6db0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
6dc0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
6dd0: 4f 50 5f 43 6f 70 79 2c 20 72 65 67 52 65 73 75  OP_Copy, regResu
6de0: 6c 74 2c 20 72 65 67 50 72 65 76 2c 20 6e 52 65  lt, regPrev, nRe
6df0: 73 75 6c 74 43 6f 6c 2d 31 29 3b 0a 20 20 20 20  sultCol-1);.    
6e00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
6e10: 20 7d 0a 0a 20 20 20 20 20 20 63 61 73 65 20 57   }..      case W
6e20: 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
6e30: 49 51 55 45 3a 20 7b 0a 20 20 20 20 20 20 20 20  IQUE: {.        
6e40: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
6e50: 65 54 6f 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74  eToNoop(v, pDist
6e60: 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b  inct->addrTnct);
6e70: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
6e80: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 64        }..      d
6e90: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
6ea0: 20 20 61 73 73 65 72 74 28 20 70 44 69 73 74 69    assert( pDisti
6eb0: 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65 3d 3d  nct->eTnctType==
6ec0: 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
6ed0: 4e 4f 52 44 45 52 45 44 20 29 3b 0a 20 20 20 20  NORDERED );.    
6ee0: 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74      codeDistinct
6ef0: 28 70 50 61 72 73 65 2c 20 70 44 69 73 74 69 6e  (pParse, pDistin
6f00: 63 74 2d 3e 74 61 62 54 6e 63 74 2c 20 69 43 6f  ct->tabTnct, iCo
6f10: 6e 74 69 6e 75 65 2c 20 6e 52 65 73 75 6c 74 43  ntinue, nResultC
6f20: 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ol,.            
6f30: 20 20 20 20 20 20 20 20 20 72 65 67 52 65 73 75           regResu
6f40: 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  lt);.        bre
6f50: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
6f60: 7d 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 3d  }.    if( pSort=
6f70: 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65  =0 ){.      code
6f80: 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66  Offset(v, p->iOf
6f90: 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29  fset, iContinue)
6fa0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73  ;.    }.  }..  s
6fb0: 77 69 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a  witch( eDest ){.
6fc0: 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 6d      /* In this m
6fd0: 6f 64 65 2c 20 77 72 69 74 65 20 65 61 63 68 20  ode, write each 
6fe0: 71 75 65 72 79 20 72 65 73 75 6c 74 20 74 6f 20  query result to 
6ff0: 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 74  the key of the t
7000: 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 2a 2a 20  emporary.    ** 
7010: 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20  table iParm..   
7020: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
7030: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
7040: 5f 53 45 4c 45 43 54 0a 20 20 20 20 63 61 73 65  _SELECT.    case
7050: 20 53 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20   SRT_Union: {.  
7060: 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20      int r1;.    
7070: 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
7080: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
7090: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
70a0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
70b0: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52  MakeRecord, regR
70c0: 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f  esult, nResultCo
70d0: 6c 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  l, r1);.      sq
70e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
70f0: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
7100: 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20   iParm, r1);.   
7110: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
7120: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
7130: 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61   r1);.      brea
7140: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
7150: 20 43 6f 6e 73 74 72 75 63 74 20 61 20 72 65 63   Construct a rec
7160: 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 71 75 65  ord from the que
7170: 72 79 20 72 65 73 75 6c 74 2c 20 62 75 74 20 69  ry result, but i
7180: 6e 73 74 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a  nstead of.    **
7190: 20 73 61 76 69 6e 67 20 74 68 61 74 20 72 65 63   saving that rec
71a0: 6f 72 64 2c 20 75 73 65 20 69 74 20 61 73 20 61  ord, use it as a
71b0: 20 6b 65 79 20 74 6f 20 64 65 6c 65 74 65 20 65   key to delete e
71c0: 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20 20 20  lements from.   
71d0: 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72   ** the temporar
71e0: 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20  y table iParm.. 
71f0: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
7200: 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a 20 20 20  RT_Except: {.   
7210: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7220: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78 44 65  dOp3(v, OP_IdxDe
7230: 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20 72 65 67  lete, iParm, reg
7240: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
7250: 6f 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ol);.      break
7260: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
7270: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  * SQLITE_OMIT_CO
7280: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f  MPOUND_SELECT */
7290: 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74  ..    /* Store t
72a0: 68 65 20 72 65 73 75 6c 74 20 61 73 20 64 61 74  he result as dat
72b0: 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65  a using a unique
72c0: 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   key..    */.   
72d0: 20 63 61 73 65 20 53 52 54 5f 46 69 66 6f 3a 0a   case SRT_Fifo:.
72e0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 44 69 73      case SRT_Dis
72f0: 74 46 69 66 6f 3a 0a 20 20 20 20 63 61 73 65 20  tFifo:.    case 
7300: 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63  SRT_Table:.    c
7310: 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62  ase SRT_EphemTab
7320: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  : {.      int r1
7330: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
7340: 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
7350: 50 72 65 66 69 78 52 65 67 2b 31 29 3b 0a 20 20  PrefixReg+1);.  
7360: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
7370: 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29  est==SRT_Table )
7380: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
7390: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68  ( eDest==SRT_Eph
73a0: 65 6d 54 61 62 20 29 3b 0a 20 20 20 20 20 20 74  emTab );.      t
73b0: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
73c0: 53 52 54 5f 46 69 66 6f 20 29 3b 0a 20 20 20 20  SRT_Fifo );.    
73d0: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
73e0: 74 3d 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20  t==SRT_DistFifo 
73f0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
7400: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
7410: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
7420: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
7430: 6f 6c 2c 20 72 31 2b 6e 50 72 65 66 69 78 52 65  ol, r1+nPrefixRe
7440: 67 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  g);.#ifndef SQLI
7450: 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20  TE_OMIT_CTE.    
7460: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
7470: 5f 44 69 73 74 46 69 66 6f 20 29 7b 0a 20 20 20  _DistFifo ){.   
7480: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64       /* If the d
7490: 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 44 69  estination is Di
74a0: 73 74 46 69 66 6f 2c 20 74 68 65 6e 20 63 75 72  stFifo, then cur
74b0: 73 6f 72 20 28 69 50 61 72 6d 2b 31 29 20 69 73  sor (iParm+1) is
74c0: 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   open.        **
74d0: 20 6f 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c   on an ephemeral
74e0: 20 69 6e 64 65 78 2e 20 49 66 20 74 68 65 20 63   index. If the c
74f0: 75 72 72 65 6e 74 20 72 6f 77 20 69 73 20 61 6c  urrent row is al
7500: 72 65 61 64 79 20 70 72 65 73 65 6e 74 0a 20 20  ready present.  
7510: 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20        ** in the 
7520: 69 6e 64 65 78 2c 20 64 6f 20 6e 6f 74 20 77 72  index, do not wr
7530: 69 74 65 20 69 74 20 74 6f 20 74 68 65 20 6f 75  ite it to the ou
7540: 74 70 75 74 2e 20 49 66 20 6e 6f 74 2c 20 61 64  tput. If not, ad
7550: 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  d the.        **
7560: 20 63 75 72 72 65 6e 74 20 72 6f 77 20 74 6f 20   current row to 
7570: 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 70 72  the index and pr
7580: 6f 63 65 65 64 20 77 69 74 68 20 77 72 69 74 69  oceed with writi
7590: 6e 67 20 69 74 20 74 6f 20 74 68 65 0a 20 20 20  ng it to the.   
75a0: 20 20 20 20 20 2a 2a 20 6f 75 74 70 75 74 20 74       ** output t
75b0: 61 62 6c 65 20 61 73 20 77 65 6c 6c 2e 20 20 2a  able as well.  *
75c0: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64  /.        int ad
75d0: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
75e0: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b  CurrentAddr(v) +
75f0: 20 34 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   4;.        sqli
7600: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
7610: 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 50  (v, OP_Found, iP
7620: 61 72 6d 2b 31 2c 20 61 64 64 72 2c 20 72 31 2c  arm+1, addr, r1,
7630: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62   0);.        Vdb
7640: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
7650: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7660: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
7670: 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2b 31  xInsert, iParm+1
7680: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 61  , r1);.        a
7690: 73 73 65 72 74 28 20 70 53 6f 72 74 3d 3d 30 20  ssert( pSort==0 
76a0: 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
76b0: 66 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f 72  f.      if( pSor
76c0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73  t ){.        pus
76d0: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72  hOntoSorter(pPar
76e0: 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 31  se, pSort, p, r1
76f0: 2b 6e 50 72 65 66 69 78 52 65 67 2c 72 65 67 52  +nPrefixReg,regR
7700: 65 73 75 6c 74 2c 31 2c 6e 50 72 65 66 69 78 52  esult,1,nPrefixR
7710: 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eg);.      }else
7720: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 32  {.        int r2
7730: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
7740: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
7750: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7760: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
7770: 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 72  wRowid, iParm, r
7780: 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  2);.        sqli
7790: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
77a0: 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72   OP_Insert, iPar
77b0: 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20  m, r1, r2);.    
77c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
77d0: 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
77e0: 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20  G_APPEND);.     
77f0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
7800: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
7810: 20 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   r2);.      }.  
7820: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
7830: 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  seTempRange(pPar
7840: 73 65 2c 20 72 31 2c 20 6e 50 72 65 66 69 78 52  se, r1, nPrefixR
7850: 65 67 2b 31 29 3b 0a 20 20 20 20 20 20 62 72 65  eg+1);.      bre
7860: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64  ak;.    }..#ifnd
7870: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
7880: 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49  UBQUERY.    /* I
7890: 66 20 77 65 20 61 72 65 20 63 72 65 61 74 69 6e  f we are creatin
78a0: 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22  g a set for an "
78b0: 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20  expr IN (SELECT 
78c0: 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c  ...)" construct,
78d0: 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65  .    ** then the
78e0: 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73  re should be a s
78f0: 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68  ingle item on th
7900: 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20  e stack.  Write 
7910: 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d  this.    ** item
7920: 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61   into the set ta
7930: 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20 64  ble with bogus d
7940: 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ata..    */.    
7950: 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a  case SRT_Set: {.
7960: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 52        assert( nR
7970: 65 73 75 6c 74 43 6f 6c 3d 3d 31 20 29 3b 0a 20  esultCol==1 );. 
7980: 20 20 20 20 20 70 44 65 73 74 2d 3e 61 66 66 53       pDest->affS
7990: 64 73 74 20 3d 0a 20 20 20 20 20 20 20 20 20 20  dst =.          
79a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
79b0: 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70  ompareAffinity(p
79c0: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
79d0: 72 2c 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73  r, pDest->affSds
79e0: 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53  t);.      if( pS
79f0: 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ort ){.        /
7a00: 2a 20 41 74 20 66 69 72 73 74 20 67 6c 61 6e 63  * At first glanc
7a10: 65 20 79 6f 75 20 77 6f 75 6c 64 20 74 68 69 6e  e you would thin
7a20: 6b 20 77 65 20 63 6f 75 6c 64 20 6f 70 74 69 6d  k we could optim
7a30: 69 7a 65 20 6f 75 74 20 74 68 65 0a 20 20 20 20  ize out the.    
7a40: 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20      ** ORDER BY 
7a50: 69 6e 20 74 68 69 73 20 63 61 73 65 20 73 69 6e  in this case sin
7a60: 63 65 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20  ce the order of 
7a70: 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 73  entries in the s
7a80: 65 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 6f  et.        ** do
7a90: 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20 20  es not matter.  
7aa0: 42 75 74 20 74 68 65 72 65 20 6d 69 67 68 74 20  But there might 
7ab0: 62 65 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73  be a LIMIT claus
7ac0: 65 2c 20 69 6e 20 77 68 69 63 68 0a 20 20 20 20  e, in which.    
7ad0: 20 20 20 20 2a 2a 20 63 61 73 65 20 74 68 65 20      ** case the 
7ae0: 6f 72 64 65 72 20 64 6f 65 73 20 6d 61 74 74 65  order does matte
7af0: 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 73  r */.        pus
7b00: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72  hOntoSorter(pPar
7b10: 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65  se, pSort, p, re
7b20: 67 52 65 73 75 6c 74 2c 20 72 65 67 52 65 73 75  gResult, regResu
7b30: 6c 74 2c 20 31 2c 20 6e 50 72 65 66 69 78 52 65  lt, 1, nPrefixRe
7b40: 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  g);.      }else{
7b50: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20  .        int r1 
7b60: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
7b70: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
7b80: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7b90: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp4(v, OP_Mak
7ba0: 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75  eRecord, regResu
7bb0: 6c 74 2c 31 2c 72 31 2c 20 26 70 44 65 73 74 2d  lt,1,r1, &pDest-
7bc0: 3e 61 66 66 53 64 73 74 2c 20 31 29 3b 0a 20 20  >affSdst, 1);.  
7bd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
7be0: 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
7bf0: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67  ange(pParse, reg
7c00: 52 65 73 75 6c 74 2c 20 31 29 3b 0a 20 20 20 20  Result, 1);.    
7c10: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7c20: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
7c30: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31  nsert, iParm, r1
7c40: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
7c50: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
7c60: 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
7c70: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
7c80: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
7c90: 20 49 66 20 61 6e 79 20 72 6f 77 20 65 78 69 73   If any row exis
7ca0: 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  t in the result 
7cb0: 73 65 74 2c 20 72 65 63 6f 72 64 20 74 68 61 74  set, record that
7cc0: 20 66 61 63 74 20 61 6e 64 20 61 62 6f 72 74 2e   fact and abort.
7cd0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
7ce0: 20 53 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20   SRT_Exists: {. 
7cf0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7d00: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
7d10: 65 67 65 72 2c 20 31 2c 20 69 50 61 72 6d 29 3b  eger, 1, iParm);
7d20: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49  .      /* The LI
7d30: 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20  MIT clause will 
7d40: 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f  terminate the lo
7d50: 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20  op for us */.   
7d60: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7d70: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
7d80: 69 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65  is a scalar sele
7d90: 63 74 20 74 68 61 74 20 69 73 20 70 61 72 74 20  ct that is part 
7da0: 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
7db0: 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74  , then.    ** st
7dc0: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
7dd0: 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  in the appropria
7de0: 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61  te memory cell a
7df0: 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20 20  nd break out.   
7e00: 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 61 6e 20   ** of the scan 
7e10: 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  loop..    */.   
7e20: 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b   case SRT_Mem: {
7e30: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
7e40: 52 65 73 75 6c 74 43 6f 6c 3d 3d 31 20 29 3b 0a  ResultCol==1 );.
7e50: 20 20 20 20 20 20 69 66 28 20 70 53 6f 72 74 20        if( pSort 
7e60: 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  ){.        pushO
7e70: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
7e80: 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52  , pSort, p, regR
7e90: 65 73 75 6c 74 2c 20 72 65 67 52 65 73 75 6c 74  esult, regResult
7ea0: 2c 20 31 2c 20 6e 50 72 65 66 69 78 52 65 67 29  , 1, nPrefixReg)
7eb0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
7ec0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
7ed0: 65 67 52 65 73 75 6c 74 3d 3d 69 50 61 72 6d 20  egResult==iParm 
7ee0: 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  );.        /* Th
7ef0: 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77  e LIMIT clause w
7f00: 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20  ill jump out of 
7f10: 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20  the loop for us 
7f20: 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  */.      }.     
7f30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
7f40: 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20  ndif /* #ifndef 
7f50: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
7f60: 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 63 61 73  UERY */..    cas
7f70: 65 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a  e SRT_Coroutine:
7f80: 20 20 20 20 20 20 20 2f 2a 20 53 65 6e 64 20 64         /* Send d
7f90: 61 74 61 20 74 6f 20 61 20 63 6f 2d 72 6f 75 74  ata to a co-rout
7fa0: 69 6e 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ine */.    case 
7fb0: 53 52 54 5f 4f 75 74 70 75 74 3a 20 7b 20 20 20  SRT_Output: {   
7fc0: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74       /* Return t
7fd0: 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20  he results */.  
7fe0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
7ff0: 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69  est==SRT_Corouti
8000: 6e 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ne );.      test
8010: 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54  case( eDest==SRT
8020: 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20  _Output );.     
8030: 20 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20   if( pSort ){.  
8040: 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f        pushOntoSo
8050: 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 53 6f  rter(pParse, pSo
8060: 72 74 2c 20 70 2c 20 72 65 67 52 65 73 75 6c 74  rt, p, regResult
8070: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65  , regResult, nRe
8080: 73 75 6c 74 43 6f 6c 2c 0a 20 20 20 20 20 20 20  sultCol,.       
8090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
80a0: 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20  nPrefixReg);.   
80b0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65     }else if( eDe
80c0: 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st==SRT_Coroutin
80d0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
80e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
80f0: 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73  , OP_Yield, pDes
8100: 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20  t->iSDParm);.   
8110: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8120: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8130: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74  Op2(v, OP_Result
8140: 52 6f 77 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  Row, regResult, 
8150: 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20  nResultCol);.   
8160: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
8170: 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
8180: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 52  nge(pParse, regR
8190: 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f  esult, nResultCo
81a0: 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  l);.      }.    
81b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
81c0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
81d0: 4d 49 54 5f 43 54 45 0a 20 20 20 20 2f 2a 20 57  MIT_CTE.    /* W
81e0: 72 69 74 65 20 74 68 65 20 72 65 73 75 6c 74 73  rite the results
81f0: 20 69 6e 74 6f 20 61 20 70 72 69 6f 72 69 74 79   into a priority
8200: 20 71 75 65 75 65 20 74 68 61 74 20 69 73 20 6f   queue that is o
8210: 72 64 65 72 20 61 63 63 6f 72 64 69 6e 67 20 74  rder according t
8220: 6f 0a 20 20 20 20 2a 2a 20 70 44 65 73 74 2d 3e  o.    ** pDest->
8230: 70 4f 72 64 65 72 42 79 20 28 69 6e 20 70 53 4f  pOrderBy (in pSO
8240: 29 2e 20 20 70 44 65 73 74 2d 3e 69 53 44 50 61  ).  pDest->iSDPa
8250: 72 6d 20 28 69 6e 20 69 50 61 72 6d 29 20 69 73  rm (in iParm) is
8260: 20 74 68 65 20 63 75 72 73 6f 72 20 66 6f 72 20   the cursor for 
8270: 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 20  an.    ** index 
8280: 77 69 74 68 20 70 53 4f 2d 3e 6e 45 78 70 72 2b  with pSO->nExpr+
8290: 32 20 63 6f 6c 75 6d 6e 73 2e 20 20 42 75 69 6c  2 columns.  Buil
82a0: 64 20 61 20 6b 65 79 20 75 73 69 6e 67 20 70 53  d a key using pS
82b0: 4f 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 0a  O for the first.
82c0: 20 20 20 20 2a 2a 20 70 53 4f 2d 3e 6e 45 78 70      ** pSO->nExp
82d0: 72 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20  r columns, then 
82e0: 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 6b 65  make sure all ke
82f0: 79 73 20 61 72 65 20 75 6e 69 71 75 65 20 62 79  ys are unique by
8300: 20 61 64 64 69 6e 67 20 61 0a 20 20 20 20 2a 2a   adding a.    **
8310: 20 66 69 6e 61 6c 20 4f 50 5f 53 65 71 75 65 6e   final OP_Sequen
8320: 63 65 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20  ce column.  The 
8330: 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20 74  last column is t
8340: 68 65 20 72 65 63 6f 72 64 20 61 73 20 61 20 62  he record as a b
8350: 6c 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  lob..    */.    
8360: 63 61 73 65 20 53 52 54 5f 44 69 73 74 51 75 65  case SRT_DistQue
8370: 75 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  ue:.    case SRT
8380: 5f 51 75 65 75 65 3a 20 7b 0a 20 20 20 20 20 20  _Queue: {.      
8390: 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 20 20 20 20  int nKey;.      
83a0: 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 3b 0a  int r1, r2, r3;.
83b0: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54 65        int addrTe
83c0: 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 45 78  st = 0;.      Ex
83d0: 70 72 4c 69 73 74 20 2a 70 53 4f 3b 0a 20 20 20  prList *pSO;.   
83e0: 20 20 20 70 53 4f 20 3d 20 70 44 65 73 74 2d 3e     pSO = pDest->
83f0: 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20  pOrderBy;.      
8400: 61 73 73 65 72 74 28 20 70 53 4f 20 29 3b 0a 20  assert( pSO );. 
8410: 20 20 20 20 20 6e 4b 65 79 20 3d 20 70 53 4f 2d       nKey = pSO-
8420: 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 72 31  >nExpr;.      r1
8430: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
8440: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
8450: 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
8460: 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
8470: 72 73 65 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20 20  rse, nKey+2);.  
8480: 20 20 20 20 72 33 20 3d 20 72 32 2b 6e 4b 65 79      r3 = r2+nKey
8490: 2b 31 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44  +1;.      if( eD
84a0: 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 51 75 65  est==SRT_DistQue
84b0: 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ue ){.        /*
84c0: 20 49 66 20 74 68 65 20 64 65 73 74 69 6e 61 74   If the destinat
84d0: 69 6f 6e 20 69 73 20 44 69 73 74 51 75 65 75 65  ion is DistQueue
84e0: 2c 20 74 68 65 6e 20 63 75 72 73 6f 72 20 28 69  , then cursor (i
84f0: 50 61 72 6d 2b 31 29 20 69 73 20 6f 70 65 6e 0a  Parm+1) is open.
8500: 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 61 20          ** on a 
8510: 73 65 63 6f 6e 64 20 65 70 68 65 6d 65 72 61 6c  second ephemeral
8520: 20 69 6e 64 65 78 20 74 68 61 74 20 68 6f 6c 64   index that hold
8530: 73 20 61 6c 6c 20 76 61 6c 75 65 73 20 65 76 65  s all values eve
8540: 72 79 20 70 72 65 76 69 6f 75 73 6c 79 0a 20 20  ry previously.  
8550: 20 20 20 20 20 20 2a 2a 20 61 64 64 65 64 20 74        ** added t
8560: 6f 20 74 68 65 20 71 75 65 75 65 2e 20 2a 2f 0a  o the queue. */.
8570: 20 20 20 20 20 20 20 20 61 64 64 72 54 65 73 74          addrTest
8580: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
8590: 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f  dOp4Int(v, OP_Fo
85a0: 75 6e 64 2c 20 69 50 61 72 6d 2b 31 2c 20 30 2c  und, iParm+1, 0,
85b0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
85c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85d0: 20 20 20 20 20 20 20 20 20 20 72 65 67 52 65 73            regRes
85e0: 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29  ult, nResultCol)
85f0: 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
8600: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
8610: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
8620: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
8630: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
8640: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
8650: 6f 6c 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 69  ol, r3);.      i
8660: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69  f( eDest==SRT_Di
8670: 73 74 51 75 65 75 65 20 29 7b 0a 20 20 20 20 20  stQueue ){.     
8680: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8690: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
86a0: 73 65 72 74 2c 20 69 50 61 72 6d 2b 31 2c 20 72  sert, iParm+1, r
86b0: 33 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  3);.        sqli
86c0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
86d0: 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45  v, OPFLAG_USESEE
86e0: 4b 52 45 53 55 4c 54 29 3b 0a 20 20 20 20 20 20  KRESULT);.      
86f0: 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  }.      for(i=0;
8700: 20 69 3c 6e 4b 65 79 3b 20 69 2b 2b 29 7b 0a 20   i<nKey; i++){. 
8710: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
8720: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
8730: 43 6f 70 79 2c 0a 20 20 20 20 20 20 20 20 20 20  Copy,.          
8740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8750: 72 65 67 52 65 73 75 6c 74 20 2b 20 70 53 4f 2d  regResult + pSO-
8760: 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72  >a[i].u.x.iOrder
8770: 42 79 43 6f 6c 20 2d 20 31 2c 0a 20 20 20 20 20  ByCol - 1,.     
8780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8790: 20 20 20 20 20 72 32 2b 69 29 3b 0a 20 20 20 20       r2+i);.    
87a0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
87b0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
87c0: 50 5f 53 65 71 75 65 6e 63 65 2c 20 69 50 61 72  P_Sequence, iPar
87d0: 6d 2c 20 72 32 2b 6e 4b 65 79 29 3b 0a 20 20 20  m, r2+nKey);.   
87e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
87f0: 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
8800: 65 63 6f 72 64 2c 20 72 32 2c 20 6e 4b 65 79 2b  ecord, r2, nKey+
8810: 32 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  2, r1);.      sq
8820: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
8830: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
8840: 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20   iParm, r1);.   
8850: 20 20 20 69 66 28 20 61 64 64 72 54 65 73 74 20     if( addrTest 
8860: 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d  ) sqlite3VdbeJum
8870: 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 65 73  pHere(v, addrTes
8880: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
8890: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
88a0: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
88b0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
88c0: 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
88d0: 65 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 29 3b 0a  e, r2, nKey+2);.
88e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
88f0: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
8900: 49 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a  ITE_OMIT_CTE */.
8910: 0a 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  ...#if !defined(
8920: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
8930: 47 45 52 29 0a 20 20 20 20 2f 2a 20 44 69 73 63  GER).    /* Disc
8940: 61 72 64 20 74 68 65 20 72 65 73 75 6c 74 73 2e  ard the results.
8950: 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66    This is used f
8960: 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  or SELECT statem
8970: 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20 20 20  ents inside.    
8980: 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61  ** the body of a
8990: 20 54 52 49 47 47 45 52 2e 20 20 54 68 65 20 70   TRIGGER.  The p
89a0: 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68 20 73  urpose of such s
89b0: 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63 61 6c  elects is to cal
89c0: 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d 64 65  l.    ** user-de
89d0: 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20  fined functions 
89e0: 74 68 61 74 20 68 61 76 65 20 73 69 64 65 20 65  that have side e
89f0: 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f 20 6e  ffects.  We do n
8a00: 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 61  ot care.    ** a
8a10: 62 6f 75 74 20 74 68 65 20 61 63 74 75 61 6c 20  bout the actual 
8a20: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73  results of the s
8a30: 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  elect..    */.  
8a40: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
8a50: 20 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74     assert( eDest
8a60: 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20 29 3b  ==SRT_Discard );
8a70: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
8a80: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a    }.#endif.  }..
8a90: 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65    /* Jump to the
8aa0: 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70   end of the loop
8ab0: 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73   if the LIMIT is
8ac0: 20 72 65 61 63 68 65 64 2e 20 20 45 78 63 65 70   reached.  Excep
8ad0: 74 2c 20 69 66 0a 20 20 2a 2a 20 74 68 65 72 65  t, if.  ** there
8ae0: 20 69 73 20 61 20 73 6f 72 74 65 72 2c 20 69 6e   is a sorter, in
8af0: 20 77 68 69 63 68 20 63 61 73 65 20 74 68 65 20   which case the 
8b00: 73 6f 72 74 65 72 20 68 61 73 20 61 6c 72 65 61  sorter has alrea
8b10: 64 79 20 6c 69 6d 69 74 65 64 0a 20 20 2a 2a 20  dy limited.  ** 
8b20: 74 68 65 20 6f 75 74 70 75 74 20 66 6f 72 20 75  the output for u
8b30: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  s..  */.  if( pS
8b40: 6f 72 74 3d 3d 30 20 26 26 20 70 2d 3e 69 4c 69  ort==0 && p->iLi
8b50: 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  mit ){.    sqlit
8b60: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
8b70: 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c  OP_DecrJumpZero,
8b80: 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65   p->iLimit, iBre
8b90: 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ak); VdbeCoverag
8ba0: 65 28 76 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  e(v);.  }.}../*.
8bb0: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 4b 65  ** Allocate a Ke
8bc0: 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 73 75 66  yInfo object suf
8bd0: 66 69 63 69 65 6e 74 20 66 6f 72 20 61 6e 20 69  ficient for an i
8be0: 6e 64 65 78 20 6f 66 20 4e 20 6b 65 79 20 63 6f  ndex of N key co
8bf0: 6c 75 6d 6e 73 20 61 6e 64 0a 2a 2a 20 58 20 65  lumns and.** X e
8c00: 78 74 72 61 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f  xtra columns..*/
8c10: 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65  .KeyInfo *sqlite
8c20: 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 73 71  3KeyInfoAlloc(sq
8c30: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e  lite3 *db, int N
8c40: 2c 20 69 6e 74 20 58 29 7b 0a 20 20 69 6e 74 20  , int X){.  int 
8c50: 6e 45 78 74 72 61 20 3d 20 28 4e 2b 58 29 2a 28  nExtra = (N+X)*(
8c60: 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29  sizeof(CollSeq*)
8c70: 2b 31 29 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  +1);.  KeyInfo *
8c80: 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  p = sqlite3Mallo
8c90: 63 28 73 69 7a 65 6f 66 28 4b 65 79 49 6e 66 6f  c(sizeof(KeyInfo
8ca0: 29 20 2b 20 6e 45 78 74 72 61 29 3b 0a 20 20 69  ) + nExtra);.  i
8cb0: 66 28 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61  f( p ){.    p->a
8cc0: 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a  SortOrder = (u8*
8cd0: 29 26 70 2d 3e 61 43 6f 6c 6c 5b 4e 2b 58 5d 3b  )&p->aColl[N+X];
8ce0: 0a 20 20 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d  .    p->nField =
8cf0: 20 28 75 31 36 29 4e 3b 0a 20 20 20 20 70 2d 3e   (u16)N;.    p->
8d00: 6e 58 46 69 65 6c 64 20 3d 20 28 75 31 36 29 58  nXField = (u16)X
8d10: 3b 0a 20 20 20 20 70 2d 3e 65 6e 63 20 3d 20 45  ;.    p->enc = E
8d20: 4e 43 28 64 62 29 3b 0a 20 20 20 20 70 2d 3e 64  NC(db);.    p->d
8d30: 62 20 3d 20 64 62 3b 0a 20 20 20 20 70 2d 3e 6e  b = db;.    p->n
8d40: 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 6d 65 6d  Ref = 1;.    mem
8d50: 73 65 74 28 26 70 5b 31 5d 2c 20 30 2c 20 6e 45  set(&p[1], 0, nE
8d60: 78 74 72 61 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  xtra);.  }else{.
8d70: 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61      sqlite3OomFa
8d80: 75 6c 74 28 64 62 29 3b 0a 20 20 7d 0a 20 20 72  ult(db);.  }.  r
8d90: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
8da0: 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 4b  * Deallocate a K
8db0: 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f  eyInfo object.*/
8dc0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4b 65 79  .void sqlite3Key
8dd0: 49 6e 66 6f 55 6e 72 65 66 28 4b 65 79 49 6e 66  InfoUnref(KeyInf
8de0: 6f 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29  o *p){.  if( p )
8df0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
8e00: 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 70  >nRef>0 );.    p
8e10: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66  ->nRef--;.    if
8e20: 28 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 20 73  ( p->nRef==0 ) s
8e30: 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20  qlite3DbFree(0, 
8e40: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
8e50: 20 4d 61 6b 65 20 61 20 6e 65 77 20 70 6f 69 6e   Make a new poin
8e60: 74 65 72 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f  ter to a KeyInfo
8e70: 20 6f 62 6a 65 63 74 0a 2a 2f 0a 4b 65 79 49 6e   object.*/.KeyIn
8e80: 66 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e  fo *sqlite3KeyIn
8e90: 66 6f 52 65 66 28 4b 65 79 49 6e 66 6f 20 2a 70  foRef(KeyInfo *p
8ea0: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
8eb0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65    assert( p->nRe
8ec0: 66 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 52  f>0 );.    p->nR
8ed0: 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ef++;.  }.  retu
8ee0: 72 6e 20 70 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  rn p;.}..#ifdef 
8ef0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
8f00: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
8f10: 66 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65  f a KeyInfo obje
8f20: 63 74 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65  ct can be change
8f30: 2e 20 20 54 68 65 20 4b 65 79 49 6e 66 6f 20 6f  .  The KeyInfo o
8f40: 62 6a 65 63 74 0a 2a 2a 20 63 61 6e 20 6f 6e 6c  bject.** can onl
8f50: 79 20 62 65 20 63 68 61 6e 67 65 64 20 69 66 20  y be changed if 
8f60: 74 68 69 73 20 69 73 20 6a 75 73 74 20 61 20 73  this is just a s
8f70: 69 6e 67 6c 65 20 72 65 66 65 72 65 6e 63 65 20  ingle reference 
8f80: 74 6f 20 74 68 65 20 6f 62 6a 65 63 74 2e 0a 2a  to the object..*
8f90: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
8fa0: 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 69  e is used only i
8fb0: 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74 28  nside of assert(
8fc0: 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f  ) statements..*/
8fd0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 4b 65 79 49  .int sqlite3KeyI
8fe0: 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 4b  nfoIsWriteable(K
8ff0: 65 79 49 6e 66 6f 20 2a 70 29 7b 20 72 65 74 75  eyInfo *p){ retu
9000: 72 6e 20 70 2d 3e 6e 52 65 66 3d 3d 31 3b 20 7d  rn p->nRef==1; }
9010: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
9020: 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a  E_DEBUG */../*.*
9030: 2a 20 47 69 76 65 6e 20 61 6e 20 65 78 70 72 65  * Given an expre
9040: 73 73 69 6f 6e 20 6c 69 73 74 2c 20 67 65 6e 65  ssion list, gene
9050: 72 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 73  rate a KeyInfo s
9060: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65  tructure that re
9070: 63 6f 72 64 73 0a 2a 2a 20 74 68 65 20 63 6f 6c  cords.** the col
9080: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
9090: 66 6f 72 20 65 61 63 68 20 65 78 70 72 65 73 73  for each express
90a0: 69 6f 6e 20 69 6e 20 74 68 61 74 20 65 78 70 72  ion in that expr
90b0: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a  ession list..**.
90c0: 2a 2a 20 49 66 20 74 68 65 20 45 78 70 72 4c 69  ** If the ExprLi
90d0: 73 74 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  st is an ORDER B
90e0: 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c  Y or GROUP BY cl
90f0: 61 75 73 65 20 74 68 65 6e 20 74 68 65 20 72 65  ause then the re
9100: 73 75 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e  sulting.** KeyIn
9110: 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20  fo structure is 
9120: 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
9130: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76  initializing a v
9140: 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 0a  irtual index to.
9150: 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61  ** implement tha
9160: 74 20 63 6c 61 75 73 65 2e 20 20 49 66 20 74 68  t clause.  If th
9170: 65 20 45 78 70 72 4c 69 73 74 20 69 73 20 74 68  e ExprList is th
9180: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
9190: 61 20 53 45 4c 45 43 54 0a 2a 2a 20 74 68 65 6e  a SELECT.** then
91a0: 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72   the KeyInfo str
91b0: 75 63 74 75 72 65 20 69 73 20 61 70 70 72 6f 70  ucture is approp
91c0: 72 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61  riate for initia
91d0: 6c 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c  lizing a virtual
91e0: 0a 2a 2a 20 69 6e 64 65 78 20 74 6f 20 69 6d 70  .** index to imp
91f0: 6c 65 6d 65 6e 74 20 61 20 44 49 53 54 49 4e 43  lement a DISTINC
9200: 54 20 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70  T test..**.** Sp
9210: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
9220: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
9230: 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  e is obtained fr
9240: 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 54 68 65 20  om malloc.  The 
9250: 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74  calling.** funct
9260: 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73 69 62  ion is responsib
9270: 6c 65 20 66 6f 72 20 73 65 65 69 6e 67 20 74 68  le for seeing th
9280: 61 74 20 74 68 69 73 20 73 74 72 75 63 74 75 72  at this structur
9290: 65 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a  e is eventually.
92a0: 2a 2a 20 66 72 65 65 64 2e 0a 2a 2f 0a 73 74 61  ** freed..*/.sta
92b0: 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6b 65 79  tic KeyInfo *key
92c0: 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
92d0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
92e0: 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
92f0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
9300: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
9310: 2c 20 20 20 20 20 2f 2a 20 46 6f 72 6d 20 74 68  ,     /* Form th
9320: 65 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74  e KeyInfo object
9330: 20 66 72 6f 6d 20 74 68 69 73 20 45 78 70 72 4c   from this ExprL
9340: 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74  ist */.  int iSt
9350: 61 72 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  art,          /*
9360: 20 42 65 67 69 6e 20 77 69 74 68 20 74 68 69 73   Begin with this
9370: 20 63 6f 6c 75 6d 6e 20 6f 66 20 70 4c 69 73 74   column of pList
9380: 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61   */.  int nExtra
9390: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
93a0: 64 20 74 68 69 73 20 6d 61 6e 79 20 65 78 74 72  d this many extr
93b0: 61 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65  a columns to the
93c0: 20 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74   end */.){.  int
93d0: 20 6e 45 78 70 72 3b 0a 20 20 4b 65 79 49 6e 66   nExpr;.  KeyInf
93e0: 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20 73 74 72 75  o *pInfo;.  stru
93f0: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
9400: 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74   *pItem;.  sqlit
9410: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
9420: 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  >db;.  int i;.. 
9430: 20 6e 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e   nExpr = pList->
9440: 6e 45 78 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d  nExpr;.  pInfo =
9450: 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41   sqlite3KeyInfoA
9460: 6c 6c 6f 63 28 64 62 2c 20 6e 45 78 70 72 2d 69  lloc(db, nExpr-i
9470: 53 74 61 72 74 2c 20 6e 45 78 74 72 61 2b 31 29  Start, nExtra+1)
9480: 3b 0a 20 20 69 66 28 20 70 49 6e 66 6f 20 29 7b  ;.  if( pInfo ){
9490: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
94a0: 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69  ite3KeyInfoIsWri
94b0: 74 65 61 62 6c 65 28 70 49 6e 66 6f 29 20 29 3b  teable(pInfo) );
94c0: 0a 20 20 20 20 66 6f 72 28 69 3d 69 53 74 61 72  .    for(i=iStar
94d0: 74 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  t, pItem=pList->
94e0: 61 2b 69 53 74 61 72 74 3b 20 69 3c 6e 45 78 70  a+iStart; i<nExp
94f0: 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  r; i++, pItem++)
9500: 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
9510: 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 43  *pColl;.      pC
9520: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
9530: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
9540: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a   pItem->pExpr);.
9550: 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
9560: 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70   ) pColl = db->p
9570: 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
9580: 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 2d 69  pInfo->aColl[i-i
9590: 53 74 61 72 74 5d 20 3d 20 70 43 6f 6c 6c 3b 0a  Start] = pColl;.
95a0: 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 53 6f        pInfo->aSo
95b0: 72 74 4f 72 64 65 72 5b 69 2d 69 53 74 61 72 74  rtOrder[i-iStart
95c0: 5d 20 3d 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f  ] = pItem->sortO
95d0: 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rder;.    }.  }.
95e0: 20 20 72 65 74 75 72 6e 20 70 49 6e 66 6f 3b 0a    return pInfo;.
95f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66  }../*.** Name of
9600: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
9610: 6f 70 65 72 61 74 6f 72 2c 20 75 73 65 64 20 66  operator, used f
9620: 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  or error message
9630: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  s..*/.static con
9640: 73 74 20 63 68 61 72 20 2a 73 65 6c 65 63 74 4f  st char *selectO
9650: 70 4e 61 6d 65 28 69 6e 74 20 69 64 29 7b 0a 20  pName(int id){. 
9660: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77 69 74   char *z;.  swit
9670: 63 68 28 20 69 64 20 29 7b 0a 20 20 20 20 63 61  ch( id ){.    ca
9680: 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 20  se TK_ALL:      
9690: 20 7a 20 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c 22   z = "UNION ALL"
96a0: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ;   break;.    c
96b0: 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54  ase TK_INTERSECT
96c0: 3a 20 7a 20 3d 20 22 49 4e 54 45 52 53 45 43 54  : z = "INTERSECT
96d0: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
96e0: 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 20  case TK_EXCEPT: 
96f0: 20 20 20 7a 20 3d 20 22 45 58 43 45 50 54 22 3b     z = "EXCEPT";
9700: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9710: 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20   default:       
9720: 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b      z = "UNION";
9730: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
9740: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a  }.  return z;.}.
9750: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
9760: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a  OMIT_EXPLAIN./*.
9770: 2a 2a 20 55 6e 6c 65 73 73 20 61 6e 20 22 45 58  ** Unless an "EX
9780: 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
9790: 22 20 63 6f 6d 6d 61 6e 64 20 69 73 20 62 65 69  " command is bei
97a0: 6e 67 20 70 72 6f 63 65 73 73 65 64 2c 20 74 68  ng processed, th
97b0: 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  is function.** i
97c0: 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72  s a no-op. Other
97d0: 77 69 73 65 2c 20 69 74 20 61 64 64 73 20 61 20  wise, it adds a 
97e0: 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 6f 75  single row of ou
97f0: 74 70 75 74 20 74 6f 20 74 68 65 20 45 51 50 20  tput to the EQP 
9800: 72 65 73 75 6c 74 2c 0a 2a 2a 20 77 68 65 72 65  result,.** where
9810: 20 74 68 65 20 63 61 70 74 69 6f 6e 20 69 73 20   the caption is 
9820: 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a  of the form:.**.
9830: 2a 2a 20 20 20 22 55 53 45 20 54 45 4d 50 20 42  **   "USE TEMP B
9840: 2d 54 52 45 45 20 46 4f 52 20 78 78 78 22 0a 2a  -TREE FOR xxx".*
9850: 2a 0a 2a 2a 20 77 68 65 72 65 20 78 78 78 20 69  *.** where xxx i
9860: 73 20 6f 6e 65 20 6f 66 20 22 44 49 53 54 49 4e  s one of "DISTIN
9870: 43 54 22 2c 20 22 4f 52 44 45 52 20 42 59 22 20  CT", "ORDER BY" 
9880: 6f 72 20 22 47 52 4f 55 50 20 42 59 22 2e 20 45  or "GROUP BY". E
9890: 78 61 63 74 6c 79 20 77 68 69 63 68 0a 2a 2a 20  xactly which.** 
98a0: 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  is determined by
98b0: 20 74 68 65 20 7a 55 73 61 67 65 20 61 72 67 75   the zUsage argu
98c0: 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
98d0: 76 6f 69 64 20 65 78 70 6c 61 69 6e 54 65 6d 70  void explainTemp
98e0: 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
98f0: 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rse, const char 
9900: 2a 7a 55 73 61 67 65 29 7b 0a 20 20 69 66 28 20  *zUsage){.  if( 
9910: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d  pParse->explain=
9920: 3d 32 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a  =2 ){.    Vdbe *
9930: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
9940: 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73  e;.    char *zMs
9950: 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  g = sqlite3MPrin
9960: 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22  tf(pParse->db, "
9970: 55 53 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20  USE TEMP B-TREE 
9980: 46 4f 52 20 25 73 22 2c 20 7a 55 73 61 67 65 29  FOR %s", zUsage)
9990: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
99a0: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78  eAddOp4(v, OP_Ex
99b0: 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69  plain, pParse->i
99c0: 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20  SelectId, 0, 0, 
99d0: 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43  zMsg, P4_DYNAMIC
99e0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
99f0: 41 73 73 69 67 6e 20 65 78 70 72 65 73 73 69 6f  Assign expressio
9a00: 6e 20 62 20 74 6f 20 6c 76 61 6c 75 65 20 61 2e  n b to lvalue a.
9a10: 20 41 20 73 65 63 6f 6e 64 2c 20 6e 6f 2d 6f 70   A second, no-op
9a20: 2c 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 69  , version of thi
9a30: 73 20 6d 61 63 72 6f 0a 2a 2a 20 69 73 20 70 72  s macro.** is pr
9a40: 6f 76 69 64 65 64 20 77 68 65 6e 20 53 51 4c 49  ovided when SQLI
9a50: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20  TE_OMIT_EXPLAIN 
9a60: 69 73 20 64 65 66 69 6e 65 64 2e 20 54 68 69 73  is defined. This
9a70: 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 6f 64 65   allows the code
9a80: 0a 2a 2a 20 69 6e 20 73 71 6c 69 74 65 33 53 65  .** in sqlite3Se
9a90: 6c 65 63 74 28 29 20 74 6f 20 61 73 73 69 67 6e  lect() to assign
9aa0: 20 76 61 6c 75 65 73 20 74 6f 20 73 74 72 75 63   values to struc
9ab0: 74 75 72 65 20 6d 65 6d 62 65 72 20 76 61 72 69  ture member vari
9ac0: 61 62 6c 65 73 20 74 68 61 74 0a 2a 2a 20 6f 6e  ables that.** on
9ad0: 6c 79 20 65 78 69 73 74 20 69 66 20 53 51 4c 49  ly exist if SQLI
9ae0: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20  TE_OMIT_EXPLAIN 
9af0: 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 77  is not defined w
9b00: 69 74 68 6f 75 74 20 70 6f 6c 6c 75 74 69 6e 67  ithout polluting
9b10: 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69 74   the.** code wit
9b20: 68 20 23 69 66 6e 64 65 66 20 64 69 72 65 63 74  h #ifndef direct
9b30: 69 76 65 73 2e 0a 2a 2f 0a 23 20 64 65 66 69 6e  ives..*/.# defin
9b40: 65 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65  e explainSetInte
9b50: 67 65 72 28 61 2c 20 62 29 20 61 20 3d 20 62 0a  ger(a, b) a = b.
9b60: 0a 23 65 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20  .#else./* No-op 
9b70: 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  versions of the 
9b80: 65 78 70 6c 61 69 6e 58 58 58 28 29 20 66 75 6e  explainXXX() fun
9b90: 63 74 69 6f 6e 73 20 61 6e 64 20 6d 61 63 72 6f  ctions and macro
9ba0: 73 2e 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65  s. */.# define e
9bb0: 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28  xplainTempTable(
9bc0: 79 2c 7a 29 0a 23 20 64 65 66 69 6e 65 20 65 78  y,z).# define ex
9bd0: 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
9be0: 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  y,z).#endif..#if
9bf0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
9c00: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 29 20 26  _OMIT_EXPLAIN) &
9c10: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
9c20: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
9c30: 53 45 4c 45 43 54 29 0a 2f 2a 0a 2a 2a 20 55 6e  SELECT)./*.** Un
9c40: 6c 65 73 73 20 61 6e 20 22 45 58 50 4c 41 49 4e  less an "EXPLAIN
9c50: 20 51 55 45 52 59 20 50 4c 41 4e 22 20 63 6f 6d   QUERY PLAN" com
9c60: 6d 61 6e 64 20 69 73 20 62 65 69 6e 67 20 70 72  mand is being pr
9c70: 6f 63 65 73 73 65 64 2c 20 74 68 69 73 20 66 75  ocessed, this fu
9c80: 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e  nction.** is a n
9c90: 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c  o-op. Otherwise,
9ca0: 20 69 74 20 61 64 64 73 20 61 20 73 69 6e 67 6c   it adds a singl
9cb0: 65 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 20  e row of output 
9cc0: 74 6f 20 74 68 65 20 45 51 50 20 72 65 73 75 6c  to the EQP resul
9cd0: 74 2c 0a 2a 2a 20 77 68 65 72 65 20 74 68 65 20  t,.** where the 
9ce0: 63 61 70 74 69 6f 6e 20 69 73 20 6f 66 20 6f 6e  caption is of on
9cf0: 65 20 6f 66 20 74 68 65 20 74 77 6f 20 66 6f 72  e of the two for
9d00: 6d 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 43 4f 4d  ms:.**.**   "COM
9d10: 50 4f 53 49 54 45 20 53 55 42 51 55 45 52 49 45  POSITE SUBQUERIE
9d20: 53 20 69 53 75 62 31 20 61 6e 64 20 69 53 75 62  S iSub1 and iSub
9d30: 32 20 28 6f 70 29 22 0a 2a 2a 20 20 20 22 43 4f  2 (op)".**   "CO
9d40: 4d 50 4f 53 49 54 45 20 53 55 42 51 55 45 52 49  MPOSITE SUBQUERI
9d50: 45 53 20 69 53 75 62 31 20 61 6e 64 20 69 53 75  ES iSub1 and iSu
9d60: 62 32 20 55 53 49 4e 47 20 54 45 4d 50 20 42 2d  b2 USING TEMP B-
9d70: 54 52 45 45 20 28 6f 70 29 22 0a 2a 2a 0a 2a 2a  TREE (op)".**.**
9d80: 20 77 68 65 72 65 20 69 53 75 62 31 20 61 6e 64   where iSub1 and
9d90: 20 69 53 75 62 32 20 61 72 65 20 74 68 65 20 69   iSub2 are the i
9da0: 6e 74 65 67 65 72 73 20 70 61 73 73 65 64 20 61  ntegers passed a
9db0: 73 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  s the correspond
9dc0: 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  ing.** function 
9dd0: 70 61 72 61 6d 65 74 65 72 73 2c 20 61 6e 64 20  parameters, and 
9de0: 6f 70 20 69 73 20 74 68 65 20 74 65 78 74 20 72  op is the text r
9df0: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
9e00: 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 0a 2a   the parameter.*
9e10: 2a 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61  * of the same na
9e20: 6d 65 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65  me. The paramete
9e30: 72 20 22 6f 70 22 20 6d 75 73 74 20 62 65 20 6f  r "op" must be o
9e40: 6e 65 20 6f 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20  ne of TK_UNION, 
9e50: 54 4b 5f 45 58 43 45 50 54 2c 0a 2a 2a 20 54 4b  TK_EXCEPT,.** TK
9e60: 5f 49 4e 54 45 52 53 45 43 54 20 6f 72 20 54 4b  _INTERSECT or TK
9e70: 5f 41 4c 4c 2e 20 54 68 65 20 66 69 72 73 74 20  _ALL. The first 
9e80: 66 6f 72 6d 20 69 73 20 75 73 65 64 20 69 66 20  form is used if 
9e90: 61 72 67 75 6d 65 6e 74 20 62 55 73 65 54 6d 70  argument bUseTmp
9ea0: 20 69 73 20 0a 2a 2a 20 66 61 6c 73 65 2c 20 6f   is .** false, o
9eb0: 72 20 74 68 65 20 73 65 63 6f 6e 64 20 66 6f 72  r the second for
9ec0: 6d 20 69 66 20 69 74 20 69 73 20 74 72 75 65 2e  m if it is true.
9ed0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9ee0: 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65  explainComposite
9ef0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
9f00: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
9f10: 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e      /* Parse con
9f20: 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  text */.  int op
9f30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
9f40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
9f50: 20 6f 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b   of TK_UNION, TK
9f60: 5f 45 58 43 45 50 54 20 65 74 63 2e 20 2a 2f 0a  _EXCEPT etc. */.
9f70: 20 20 69 6e 74 20 69 53 75 62 31 2c 20 20 20 20    int iSub1,    
9f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f90: 20 20 2f 2a 20 53 75 62 71 75 65 72 79 20 69 64    /* Subquery id
9fa0: 20 31 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62   1 */.  int iSub
9fb0: 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2,              
9fc0: 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 71 75          /* Subqu
9fd0: 65 72 79 20 69 64 20 32 20 2a 2f 0a 20 20 69 6e  ery id 2 */.  in
9fe0: 74 20 62 55 73 65 54 6d 70 20 20 20 20 20 20 20  t bUseTmp       
9ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a000: 20 54 72 75 65 20 69 66 20 61 20 74 65 6d 70 20   True if a temp 
a010: 74 61 62 6c 65 20 77 61 73 20 75 73 65 64 20 2a  table was used *
a020: 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 6f  /.){.  assert( o
a030: 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 7c 7c 20 6f  p==TK_UNION || o
a040: 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 7c 7c 20  p==TK_EXCEPT || 
a050: 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54  op==TK_INTERSECT
a060: 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29   || op==TK_ALL )
a070: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
a080: 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20  explain==2 ){.  
a090: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
a0a0: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 63  se->pVdbe;.    c
a0b0: 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69  har *zMsg = sqli
a0c0: 74 65 33 4d 50 72 69 6e 74 66 28 0a 20 20 20 20  te3MPrintf(.    
a0d0: 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2c 20      pParse->db, 
a0e0: 22 43 4f 4d 50 4f 55 4e 44 20 53 55 42 51 55 45  "COMPOUND SUBQUE
a0f0: 52 49 45 53 20 25 64 20 41 4e 44 20 25 64 20 25  RIES %d AND %d %
a100: 73 28 25 73 29 22 2c 20 69 53 75 62 31 2c 20 69  s(%s)", iSub1, i
a110: 53 75 62 32 2c 0a 20 20 20 20 20 20 20 20 62 55  Sub2,.        bU
a120: 73 65 54 6d 70 3f 22 55 53 49 4e 47 20 54 45 4d  seTmp?"USING TEM
a130: 50 20 42 2d 54 52 45 45 20 22 3a 22 22 2c 20 73  P B-TREE ":"", s
a140: 65 6c 65 63 74 4f 70 4e 61 6d 65 28 6f 70 29 0a  electOpName(op).
a150: 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74      );.    sqlit
a160: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
a170: 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72  OP_Explain, pPar
a180: 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30  se->iSelectId, 0
a190: 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59  , 0, zMsg, P4_DY
a1a0: 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65  NAMIC);.  }.}.#e
a1b0: 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72  lse./* No-op ver
a1c0: 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 65 78 70  sions of the exp
a1d0: 6c 61 69 6e 58 58 58 28 29 20 66 75 6e 63 74 69  lainXXX() functi
a1e0: 6f 6e 73 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20  ons and macros. 
a1f0: 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c  */.# define expl
a200: 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 76 2c 77  ainComposite(v,w
a210: 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a  ,x,y,z).#endif..
a220: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 6e  /*.** If the inn
a230: 65 72 20 6c 6f 6f 70 20 77 61 73 20 67 65 6e 65  er loop was gene
a240: 72 61 74 65 64 20 75 73 69 6e 67 20 61 20 6e 6f  rated using a no
a250: 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72 42 79 20  n-null pOrderBy 
a260: 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65  argument,.** the
a270: 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 77 65  n the results we
a280: 72 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20 73  re placed in a s
a290: 6f 72 74 65 72 2e 20 20 41 66 74 65 72 20 74 68  orter.  After th
a2a0: 65 20 6c 6f 6f 70 20 69 73 20 74 65 72 6d 69 6e  e loop is termin
a2b0: 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65 65 64 20  ated.** we need 
a2c0: 74 6f 20 72 75 6e 20 74 68 65 20 73 6f 72 74 65  to run the sorte
a2d0: 72 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68 65  r and output the
a2e0: 20 72 65 73 75 6c 74 73 2e 20 20 54 68 65 20 66   results.  The f
a2f0: 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74  ollowing.** rout
a300: 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68  ine generates th
a310: 65 20 63 6f 64 65 20 6e 65 65 64 65 64 20 74 6f  e code needed to
a320: 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73 74 61   do that..*/.sta
a330: 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74  tic void generat
a340: 65 53 6f 72 74 54 61 69 6c 28 0a 20 20 50 61 72  eSortTail(.  Par
a350: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
a360: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
a370: 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
a380: 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
a390: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
a3a0: 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a 70   */.  SortCtx *p
a3b0: 53 6f 72 74 2c 20 20 20 2f 2a 20 49 6e 66 6f 72  Sort,   /* Infor
a3c0: 6d 61 74 69 6f 6e 20 6f 6e 20 74 68 65 20 4f 52  mation on the OR
a3d0: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
a3e0: 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20  .  int nColumn, 
a3f0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
a400: 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74  f columns of dat
a410: 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  a */.  SelectDes
a420: 74 20 2a 70 44 65 73 74 20 2f 2a 20 57 72 69 74  t *pDest /* Writ
a430: 65 20 74 68 65 20 73 6f 72 74 65 64 20 72 65 73  e the sorted res
a440: 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ults here */.){.
a450: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
a460: 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20  se->pVdbe;      
a470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a480: 2a 20 54 68 65 20 70 72 65 70 61 72 65 64 20 73  * The prepared s
a490: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e  tatement */.  in
a4a0: 74 20 61 64 64 72 42 72 65 61 6b 20 3d 20 70 53  t addrBreak = pS
a4b0: 6f 72 74 2d 3e 6c 61 62 65 6c 44 6f 6e 65 3b 20  ort->labelDone; 
a4c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
a4d0: 6d 70 20 68 65 72 65 20 74 6f 20 65 78 69 74 20  mp here to exit 
a4e0: 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64  loop */.  int ad
a4f0: 64 72 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c  drContinue = sql
a500: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
a510: 6c 28 76 29 3b 20 20 2f 2a 20 4a 75 6d 70 20 68  l(v);  /* Jump h
a520: 65 72 65 20 66 6f 72 20 6e 65 78 74 20 63 79 63  ere for next cyc
a530: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  le */.  int addr
a540: 3b 0a 20 20 69 6e 74 20 61 64 64 72 4f 6e 63 65  ;.  int addrOnce
a550: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54 61 62   = 0;.  int iTab
a560: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  ;.  ExprList *pO
a570: 72 64 65 72 42 79 20 3d 20 70 53 6f 72 74 2d 3e  rderBy = pSort->
a580: 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e 74 20  pOrderBy;.  int 
a590: 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65  eDest = pDest->e
a5a0: 44 65 73 74 3b 0a 20 20 69 6e 74 20 69 50 61 72  Dest;.  int iPar
a5b0: 6d 20 3d 20 70 44 65 73 74 2d 3e 69 53 44 50 61  m = pDest->iSDPa
a5c0: 72 6d 3b 0a 20 20 69 6e 74 20 72 65 67 52 6f 77  rm;.  int regRow
a5d0: 3b 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64  ;.  int regRowid
a5e0: 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20  ;.  int nKey;.  
a5f0: 69 6e 74 20 69 53 6f 72 74 54 61 62 3b 20 20 20  int iSortTab;   
a600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a610: 2f 2a 20 53 6f 72 74 65 72 20 63 75 72 73 6f 72  /* Sorter cursor
a620: 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
a630: 0a 20 20 69 6e 74 20 6e 53 6f 72 74 44 61 74 61  .  int nSortData
a640: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a650: 20 20 20 2f 2a 20 54 72 61 69 6c 69 6e 67 20 76     /* Trailing v
a660: 61 6c 75 65 73 20 74 6f 20 72 65 61 64 20 66 72  alues to read fr
a670: 6f 6d 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20 69  om sorter */.  i
a680: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 62 53 65 71  nt i;.  int bSeq
a690: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a6a0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
a6b0: 69 66 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64  if sorter record
a6c0: 20 69 6e 63 6c 75 64 65 73 20 73 65 71 2e 20 6e   includes seq. n
a6d0: 6f 2e 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  o. */.#ifdef SQL
a6e0: 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41  ITE_ENABLE_EXPLA
a6f0: 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 73 74  IN_COMMENTS.  st
a700: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
a710: 65 6d 20 2a 61 4f 75 74 45 78 20 3d 20 70 2d 3e  em *aOutEx = p->
a720: 70 45 4c 69 73 74 2d 3e 61 3b 0a 23 65 6e 64 69  pEList->a;.#endi
a730: 66 0a 0a 20 20 61 73 73 65 72 74 28 20 61 64 64  f..  assert( add
a740: 72 42 72 65 61 6b 3c 30 20 29 3b 0a 20 20 69 66  rBreak<0 );.  if
a750: 28 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b  ( pSort->labelBk
a760: 4f 75 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Out ){.    sqlit
a770: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
a780: 4f 50 5f 47 6f 73 75 62 2c 20 70 53 6f 72 74 2d  OP_Gosub, pSort-
a790: 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 53 6f 72  >regReturn, pSor
a7a0: 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b 0a  t->labelBkOut);.
a7b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
a7c0: 6f 74 6f 28 76 2c 20 61 64 64 72 42 72 65 61 6b  oto(v, addrBreak
a7d0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
a7e0: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
a7f0: 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b  , pSort->labelBk
a800: 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 69 54 61 62  Out);.  }.  iTab
a810: 20 3d 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73   = pSort->iECurs
a820: 6f 72 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d  or;.  if( eDest=
a830: 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65  =SRT_Output || e
a840: 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74  Dest==SRT_Corout
a850: 69 6e 65 20 29 7b 0a 20 20 20 20 72 65 67 52 6f  ine ){.    regRo
a860: 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 72 65 67  wid = 0;.    reg
a870: 52 6f 77 20 3d 20 70 44 65 73 74 2d 3e 69 53 64  Row = pDest->iSd
a880: 73 74 3b 0a 20 20 20 20 6e 53 6f 72 74 44 61 74  st;.    nSortDat
a890: 61 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7d  a = nColumn;.  }
a8a0: 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 52 6f 77  else{.    regRow
a8b0: 69 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  id = sqlite3GetT
a8c0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
a8d0: 20 20 20 20 72 65 67 52 6f 77 20 3d 20 73 71 6c      regRow = sql
a8e0: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
a8f0: 50 61 72 73 65 29 3b 0a 20 20 20 20 6e 53 6f 72  Parse);.    nSor
a900: 74 44 61 74 61 20 3d 20 31 3b 0a 20 20 7d 0a 20  tData = 1;.  }. 
a910: 20 6e 4b 65 79 20 3d 20 70 4f 72 64 65 72 42 79   nKey = pOrderBy
a920: 2d 3e 6e 45 78 70 72 20 2d 20 70 53 6f 72 74 2d  ->nExpr - pSort-
a930: 3e 6e 4f 42 53 61 74 3b 0a 20 20 69 66 28 20 70  >nOBSat;.  if( p
a940: 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20  Sort->sortFlags 
a950: 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f  & SORTFLAG_UseSo
a960: 72 74 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20  rter ){.    int 
a970: 72 65 67 53 6f 72 74 4f 75 74 20 3d 20 2b 2b 70  regSortOut = ++p
a980: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
a990: 20 69 53 6f 72 74 54 61 62 20 3d 20 70 50 61 72   iSortTab = pPar
a9a0: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
a9b0: 69 66 28 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c  if( pSort->label
a9c0: 42 6b 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 61  BkOut ){.      a
a9d0: 64 64 72 4f 6e 63 65 20 3d 20 73 71 6c 69 74 65  ddrOnce = sqlite
a9e0: 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65  3CodeOnce(pParse
a9f0: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
aa00: 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  v);.    }.    sq
aa10: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
aa20: 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f  v, OP_OpenPseudo
aa30: 2c 20 69 53 6f 72 74 54 61 62 2c 20 72 65 67 53  , iSortTab, regS
aa40: 6f 72 74 4f 75 74 2c 20 6e 4b 65 79 2b 31 2b 6e  ortOut, nKey+1+n
aa50: 53 6f 72 74 44 61 74 61 29 3b 0a 20 20 20 20 69  SortData);.    i
aa60: 66 28 20 61 64 64 72 4f 6e 63 65 20 29 20 73 71  f( addrOnce ) sq
aa70: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
aa80: 65 28 76 2c 20 61 64 64 72 4f 6e 63 65 29 3b 0a  e(v, addrOnce);.
aa90: 20 20 20 20 61 64 64 72 20 3d 20 31 20 2b 20 73      addr = 1 + s
aaa0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
aab0: 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72  (v, OP_SorterSor
aac0: 74 2c 20 69 54 61 62 2c 20 61 64 64 72 42 72 65  t, iTab, addrBre
aad0: 61 6b 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  ak);.    VdbeCov
aae0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 63 6f  erage(v);.    co
aaf0: 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69  deOffset(v, p->i
ab00: 4f 66 66 73 65 74 2c 20 61 64 64 72 43 6f 6e 74  Offset, addrCont
ab10: 69 6e 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  inue);.    sqlit
ab20: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
ab30: 4f 50 5f 53 6f 72 74 65 72 44 61 74 61 2c 20 69  OP_SorterData, i
ab40: 54 61 62 2c 20 72 65 67 53 6f 72 74 4f 75 74 2c  Tab, regSortOut,
ab50: 20 69 53 6f 72 74 54 61 62 29 3b 0a 20 20 20 20   iSortTab);.    
ab60: 62 53 65 71 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  bSeq = 0;.  }els
ab70: 65 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 31 20  e{.    addr = 1 
ab80: 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  + sqlite3VdbeAdd
ab90: 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20  Op2(v, OP_Sort, 
aba0: 69 54 61 62 2c 20 61 64 64 72 42 72 65 61 6b 29  iTab, addrBreak)
abb0: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
abc0: 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65  );.    codeOffse
abd0: 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c  t(v, p->iOffset,
abe0: 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a   addrContinue);.
abf0: 20 20 20 20 69 53 6f 72 74 54 61 62 20 3d 20 69      iSortTab = i
ac00: 54 61 62 3b 0a 20 20 20 20 62 53 65 71 20 3d 20  Tab;.    bSeq = 
ac10: 31 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  1;.  }.  for(i=0
ac20: 3b 20 69 3c 6e 53 6f 72 74 44 61 74 61 3b 20 69  ; i<nSortData; i
ac30: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
ac40: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
ac50: 5f 43 6f 6c 75 6d 6e 2c 20 69 53 6f 72 74 54 61  _Column, iSortTa
ac60: 62 2c 20 6e 4b 65 79 2b 62 53 65 71 2b 69 2c 20  b, nKey+bSeq+i, 
ac70: 72 65 67 52 6f 77 2b 69 29 3b 0a 20 20 20 20 56  regRow+i);.    V
ac80: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
ac90: 25 73 22 2c 20 61 4f 75 74 45 78 5b 69 5d 2e 7a  %s", aOutEx[i].z
aca0: 4e 61 6d 65 20 3f 20 61 4f 75 74 45 78 5b 69 5d  Name ? aOutEx[i]
acb0: 2e 7a 4e 61 6d 65 20 3a 20 61 4f 75 74 45 78 5b  .zName : aOutEx[
acc0: 69 5d 2e 7a 53 70 61 6e 29 29 3b 0a 20 20 7d 0a  i].zSpan));.  }.
acd0: 20 20 73 77 69 74 63 68 28 20 65 44 65 73 74 20    switch( eDest 
ace0: 29 7b 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  ){.    case SRT_
acf0: 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20  EphemTab: {.    
ad00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ad10: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  Op2(v, OP_NewRow
ad20: 69 64 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f  id, iParm, regRo
ad30: 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  wid);.      sqli
ad40: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
ad50: 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72   OP_Insert, iPar
ad60: 6d 2c 20 72 65 67 52 6f 77 2c 20 72 65 67 52 6f  m, regRow, regRo
ad70: 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  wid);.      sqli
ad80: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
ad90: 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44  v, OPFLAG_APPEND
ada0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
adb0: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
adc0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
add0: 52 59 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  RY.    case SRT_
ade0: 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  Set: {.      ass
adf0: 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20  ert( nColumn==1 
ae00: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
ae10: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
ae20: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
ae30: 52 6f 77 2c 20 31 2c 20 72 65 67 52 6f 77 69 64  Row, 1, regRowid
ae40: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
ae50: 20 20 20 20 20 20 20 20 20 20 26 70 44 65 73 74            &pDest
ae60: 2d 3e 61 66 66 53 64 73 74 2c 20 31 29 3b 0a 20  ->affSdst, 1);. 
ae70: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
ae80: 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
ae90: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 52  nge(pParse, regR
aea0: 6f 77 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71  ow, 1);.      sq
aeb0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
aec0: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
aed0: 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 69 64   iParm, regRowid
aee0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
aef0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
af00: 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20  RT_Mem: {.      
af10: 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d  assert( nColumn=
af20: 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =1 );.      sqli
af30: 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28  te3ExprCodeMove(
af40: 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 2c 20  pParse, regRow, 
af50: 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20  iParm, 1);.     
af60: 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c   /* The LIMIT cl
af70: 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e  ause will termin
af80: 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72  ate the loop for
af90: 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65   us */.      bre
afa0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
afb0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
afc0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44        assert( eD
afd0: 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
afe0: 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f  || eDest==SRT_Co
aff0: 72 6f 75 74 69 6e 65 20 29 3b 20 0a 20 20 20 20  routine ); .    
b000: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
b010: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b  t==SRT_Output );
b020: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
b030: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f   eDest==SRT_Coro
b040: 75 74 69 6e 65 20 29 3b 0a 20 20 20 20 20 20 69  utine );.      i
b050: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  f( eDest==SRT_Ou
b060: 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20  tput ){.        
b070: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b080: 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
b090: 77 2c 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2c  w, pDest->iSdst,
b0a0: 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20   nColumn);.     
b0b0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
b0c0: 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
b0d0: 65 28 70 50 61 72 73 65 2c 20 70 44 65 73 74 2d  e(pParse, pDest-
b0e0: 3e 69 53 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29  >iSdst, nColumn)
b0f0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
b100: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
b110: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59  beAddOp1(v, OP_Y
b120: 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53 44  ield, pDest->iSD
b130: 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Parm);.      }. 
b140: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b150: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 67 52  }.  }.  if( regR
b160: 6f 77 69 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  owid ){.    sqli
b170: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
b180: 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77  g(pParse, regRow
b190: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
b1a0: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
b1b0: 72 73 65 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  rse, regRowid);.
b1c0: 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20 62 6f 74    }.  /* The bot
b1d0: 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a  tom of the loop.
b1e0: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
b1f0: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
b200: 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b  , addrContinue);
b210: 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f  .  if( pSort->so
b220: 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c  rtFlags & SORTFL
b230: 41 47 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a  AG_UseSorter ){.
b240: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b250: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp2(v, OP_Sort
b260: 65 72 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64  erNext, iTab, ad
b270: 64 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  dr); VdbeCoverag
b280: 65 28 76 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  e(v);.  }else{. 
b290: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b2a0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
b2b0: 20 69 54 61 62 2c 20 61 64 64 72 29 3b 20 56 64   iTab, addr); Vd
b2c0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
b2d0: 20 7d 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e   }.  if( pSort->
b2e0: 72 65 67 52 65 74 75 72 6e 20 29 20 73 71 6c 69  regReturn ) sqli
b2f0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
b300: 20 4f 50 5f 52 65 74 75 72 6e 2c 20 70 53 6f 72   OP_Return, pSor
b310: 74 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20  t->regReturn);. 
b320: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
b330: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
b340: 42 72 65 61 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Break);.}../*.**
b350: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
b360: 72 20 74 6f 20 61 20 73 74 72 69 6e 67 20 63 6f  r to a string co
b370: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 27 64 65  ntaining the 'de
b380: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 27 20  claration type' 
b390: 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73  of the.** expres
b3a0: 73 69 6f 6e 20 70 45 78 70 72 2e 20 54 68 65 20  sion pExpr. The 
b3b0: 73 74 72 69 6e 67 20 6d 61 79 20 62 65 20 74 72  string may be tr
b3c0: 65 61 74 65 64 20 61 73 20 73 74 61 74 69 63 20  eated as static 
b3d0: 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  by the caller..*
b3e0: 2a 0a 2a 2a 20 41 6c 73 6f 20 74 72 79 20 74 6f  *.** Also try to
b3f0: 20 65 73 74 69 6d 61 74 65 20 74 68 65 20 73 69   estimate the si
b400: 7a 65 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e  ze of the return
b410: 65 64 20 76 61 6c 75 65 20 61 6e 64 20 72 65 74  ed value and ret
b420: 75 72 6e 20 74 68 61 74 0a 2a 2a 20 72 65 73 75  urn that.** resu
b430: 6c 74 20 69 6e 20 2a 70 45 73 74 57 69 64 74 68  lt in *pEstWidth
b440: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 63 6c  ..**.** The decl
b450: 61 72 61 74 69 6f 6e 20 74 79 70 65 20 69 73 20  aration type is 
b460: 74 68 65 20 65 78 61 63 74 20 64 61 74 61 74 79  the exact dataty
b470: 70 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 65 78  pe definition ex
b480: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65  tracted from the
b490: 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 43 52 45  .** original CRE
b4a0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
b4b0: 65 6e 74 20 69 66 20 74 68 65 20 65 78 70 72 65  ent if the expre
b4c0: 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d  ssion is a colum
b4d0: 6e 2e 20 54 68 65 0a 2a 2a 20 64 65 63 6c 61 72  n. The.** declar
b4e0: 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61  ation type for a
b4f0: 20 52 4f 57 49 44 20 66 69 65 6c 64 20 69 73 20   ROWID field is 
b500: 49 4e 54 45 47 45 52 2e 20 45 78 61 63 74 6c 79  INTEGER. Exactly
b510: 20 77 68 65 6e 20 61 6e 20 65 78 70 72 65 73 73   when an express
b520: 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64  ion.** is consid
b530: 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 63 61  ered a column ca
b540: 6e 20 62 65 20 63 6f 6d 70 6c 65 78 20 69 6e 20  n be complex in 
b550: 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20  the presence of 
b560: 73 75 62 71 75 65 72 69 65 73 2e 20 54 68 65 0a  subqueries. The.
b570: 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78  ** result-set ex
b580: 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6c 6c 20  pression in all 
b590: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
b5a0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
b5b0: 74 73 20 69 73 20 0a 2a 2a 20 63 6f 6e 73 69 64  ts is .** consid
b5c0: 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 62 79  ered a column by
b5d0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
b5e0: 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 63  **.**   SELECT c
b5f0: 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20  ol FROM tbl;.** 
b600: 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54    SELECT (SELECT
b610: 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a   col FROM tbl;.*
b620: 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45  *   SELECT (SELE
b630: 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 29  CT col FROM tbl)
b640: 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 62  ;.**   SELECT ab
b650: 63 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 63  c FROM (SELECT c
b660: 6f 6c 20 41 53 20 61 62 63 20 46 52 4f 4d 20 74  ol AS abc FROM t
b670: 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20  bl);.** .** The 
b680: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
b690: 20 66 6f 72 20 61 6e 79 20 65 78 70 72 65 73 73   for any express
b6a0: 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 61  ion other than a
b6b0: 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 2e   column is NULL.
b6c0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
b6d0: 69 6e 65 20 68 61 73 20 65 69 74 68 65 72 20 33  ine has either 3
b6e0: 20 6f 72 20 36 20 70 61 72 61 6d 65 74 65 72 73   or 6 parameters
b6f0: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68   depending on wh
b700: 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20  ether or not.** 
b710: 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  the SQLITE_ENABL
b720: 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
b730: 41 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  A compile-time o
b740: 70 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 0a 2a  ption is used..*
b750: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
b760: 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45  ENABLE_COLUMN_ME
b770: 54 41 44 41 54 41 0a 23 20 64 65 66 69 6e 65 20  TADATA.# define 
b780: 63 6f 6c 75 6d 6e 54 79 70 65 28 41 2c 42 2c 43  columnType(A,B,C
b790: 2c 44 2c 45 2c 46 29 20 63 6f 6c 75 6d 6e 54 79  ,D,E,F) columnTy
b7a0: 70 65 49 6d 70 6c 28 41 2c 42 2c 43 2c 44 2c 45  peImpl(A,B,C,D,E
b7b0: 2c 46 29 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20  ,F).#else /* if 
b7c0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
b7d0: 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45  ENABLE_COLUMN_ME
b7e0: 54 41 44 41 54 41 29 20 2a 2f 0a 23 20 64 65 66  TADATA) */.# def
b7f0: 69 6e 65 20 63 6f 6c 75 6d 6e 54 79 70 65 28 41  ine columnType(A
b800: 2c 42 2c 43 2c 44 2c 45 2c 46 29 20 63 6f 6c 75  ,B,C,D,E,F) colu
b810: 6d 6e 54 79 70 65 49 6d 70 6c 28 41 2c 42 2c 46  mnTypeImpl(A,B,F
b820: 29 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20  ).#endif.static 
b830: 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6c 75  const char *colu
b840: 6d 6e 54 79 70 65 49 6d 70 6c 28 0a 20 20 4e 61  mnTypeImpl(.  Na
b850: 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20  meContext *pNC, 
b860: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 0a  .  Expr *pExpr,.
b870: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
b880: 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
b890: 44 41 54 41 0a 20 20 63 6f 6e 73 74 20 63 68 61  DATA.  const cha
b8a0: 72 20 2a 2a 70 7a 4f 72 69 67 44 62 2c 0a 20 20  r **pzOrigDb,.  
b8b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f  const char **pzO
b8c0: 72 69 67 54 61 62 2c 0a 20 20 63 6f 6e 73 74 20  rigTab,.  const 
b8d0: 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 43 6f 6c  char **pzOrigCol
b8e0: 2c 0a 23 65 6e 64 69 66 0a 20 20 75 38 20 2a 70  ,.#endif.  u8 *p
b8f0: 45 73 74 57 69 64 74 68 0a 29 7b 0a 20 20 63 68  EstWidth.){.  ch
b900: 61 72 20 63 6f 6e 73 74 20 2a 7a 54 79 70 65 20  ar const *zType 
b910: 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20  = 0;.  int j;.  
b920: 75 38 20 65 73 74 57 69 64 74 68 20 3d 20 31 3b  u8 estWidth = 1;
b930: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
b940: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
b950: 41 44 41 54 41 0a 20 20 63 68 61 72 20 63 6f 6e  ADATA.  char con
b960: 73 74 20 2a 7a 4f 72 69 67 44 62 20 3d 20 30 3b  st *zOrigDb = 0;
b970: 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
b980: 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a 20 20 63  OrigTab = 0;.  c
b990: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67  har const *zOrig
b9a0: 43 6f 6c 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  Col = 0;.#endif.
b9b0: 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
b9c0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
b9d0: 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 21 3d   pNC->pSrcList!=
b9e0: 30 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70  0 );.  switch( p
b9f0: 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
ba00: 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  case TK_AGG_COLU
ba10: 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  MN:.    case TK_
ba20: 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
ba30: 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
ba40: 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 4c  n is a column. L
ba50: 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c 65 20  ocate the table 
ba60: 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 62 65  the column is be
ba70: 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 65 78 74  ing.      ** ext
ba80: 72 61 63 74 65 64 20 66 72 6f 6d 20 69 6e 20 4e  racted from in N
ba90: 61 6d 65 43 6f 6e 74 65 78 74 2e 70 53 72 63 4c  ameContext.pSrcL
baa0: 69 73 74 2e 20 54 68 69 73 20 74 61 62 6c 65 20  ist. This table 
bab0: 6d 61 79 20 62 65 20 72 65 61 6c 0a 20 20 20 20  may be real.    
bac0: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 74 61    ** database ta
bad0: 62 6c 65 20 6f 72 20 61 20 73 75 62 71 75 65 72  ble or a subquer
bae0: 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  y..      */.    
baf0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
bb00: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  0;            /*
bb10: 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
bb20: 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61   column is extra
bb30: 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20  cted from */.   
bb40: 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20     Select *pS = 
bb50: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
bb60: 2a 20 53 65 6c 65 63 74 20 74 68 65 20 63 6f 6c  * Select the col
bb70: 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74 65 64  umn is extracted
bb80: 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 69   from */.      i
bb90: 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d  nt iCol = pExpr-
bba0: 3e 69 43 6f 6c 75 6d 6e 3b 20 20 2f 2a 20 49 6e  >iColumn;  /* In
bbb0: 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e  dex of column in
bbc0: 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 20 20 74   pTab */.      t
bbd0: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
bbe0: 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
bbf0: 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  N );.      testc
bc00: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
bc10: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  TK_COLUMN );.   
bc20: 20 20 20 77 68 69 6c 65 28 20 70 4e 43 20 26 26     while( pNC &&
bc30: 20 21 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20   !pTab ){.      
bc40: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
bc50: 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c  ist = pNC->pSrcL
bc60: 69 73 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  ist;.        for
bc70: 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c 69 73 74 2d  (j=0;j<pTabList-
bc80: 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c 69 73  >nSrc && pTabLis
bc90: 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21  t->a[j].iCursor!
bca0: 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 6a  =pExpr->iTable;j
bcb0: 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ++);.        if(
bcc0: 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   j<pTabList->nSr
bcd0: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  c ){.          p
bce0: 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Tab = pTabList->
bcf0: 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20  a[j].pTab;.     
bd00: 20 20 20 20 20 70 53 20 3d 20 70 54 61 62 4c 69       pS = pTabLi
bd10: 73 74 2d 3e 61 5b 6a 5d 2e 70 53 65 6c 65 63 74  st->a[j].pSelect
bd20: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
bd30: 0a 20 20 20 20 20 20 20 20 20 20 70 4e 43 20 3d  .          pNC =
bd40: 20 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pNC->pNext;.   
bd50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
bd60: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d        if( pTab==
bd70: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
bd80: 41 74 20 6f 6e 65 20 74 69 6d 65 2c 20 63 6f 64  At one time, cod
bd90: 65 20 73 75 63 68 20 61 73 20 22 53 45 4c 45 43  e such as "SELEC
bda0: 54 20 6e 65 77 2e 78 22 20 77 69 74 68 69 6e 20  T new.x" within 
bdb0: 61 20 74 72 69 67 67 65 72 20 77 6f 75 6c 64 0a  a trigger would.
bdc0: 20 20 20 20 20 20 20 20 2a 2a 20 63 61 75 73 65          ** cause
bdd0: 20 74 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20   this condition 
bde0: 74 6f 20 72 75 6e 2e 20 20 53 69 6e 63 65 20 74  to run.  Since t
bdf0: 68 65 6e 2c 20 77 65 20 68 61 76 65 20 72 65 73  hen, we have res
be00: 74 72 75 63 74 75 72 65 64 20 68 6f 77 0a 20 20  tructured how.  
be10: 20 20 20 20 20 20 2a 2a 20 74 72 69 67 67 65 72        ** trigger
be20: 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74   code is generat
be30: 65 64 20 61 6e 64 20 73 6f 20 74 68 69 73 20 63  ed and so this c
be40: 6f 6e 64 69 74 69 6f 6e 20 69 73 20 6e 6f 20 6c  ondition is no l
be50: 6f 6e 67 65 72 20 0a 20 20 20 20 20 20 20 20 2a  onger .        *
be60: 2a 20 70 6f 73 73 69 62 6c 65 2e 20 48 6f 77 65  * possible. Howe
be70: 76 65 72 2c 20 69 74 20 63 61 6e 20 73 74 69 6c  ver, it can stil
be80: 6c 20 62 65 20 74 72 75 65 20 66 6f 72 20 73 74  l be true for st
be90: 61 74 65 6d 65 6e 74 73 20 6c 69 6b 65 0a 20 20  atements like.  
bea0: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c        ** the fol
beb0: 6c 6f 77 69 6e 67 3a 0a 20 20 20 20 20 20 20 20  lowing:.        
bec0: 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
bed0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
bee0: 63 6f 6c 20 49 4e 54 45 47 45 52 29 3b 0a 20 20  col INTEGER);.  
bef0: 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43        **   SELEC
bf00: 54 20 28 53 45 4c 45 43 54 20 74 31 2e 63 6f 6c  T (SELECT t1.col
bf10: 29 20 46 52 4f 4d 20 46 52 4f 4d 20 74 31 3b 0a  ) FROM FROM t1;.
bf20: 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
bf30: 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6c 75 6d     ** when colum
bf40: 6e 54 79 70 65 28 29 20 69 73 20 63 61 6c 6c 65  nType() is calle
bf50: 64 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73  d on the express
bf60: 69 6f 6e 20 22 74 31 2e 63 6f 6c 22 20 69 6e 20  ion "t1.col" in 
bf70: 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  the .        ** 
bf80: 73 75 62 2d 73 65 6c 65 63 74 2e 20 49 6e 20 74  sub-select. In t
bf90: 68 69 73 20 63 61 73 65 2c 20 73 65 74 20 74 68  his case, set th
bfa0: 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 74 6f  e column type to
bfb0: 20 4e 55 4c 4c 2c 20 65 76 65 6e 0a 20 20 20 20   NULL, even.    
bfc0: 20 20 20 20 2a 2a 20 74 68 6f 75 67 68 20 69 74      ** though it
bfd0: 20 73 68 6f 75 6c 64 20 72 65 61 6c 6c 79 20 62   should really b
bfe0: 65 20 22 49 4e 54 45 47 45 52 22 2e 0a 20 20 20  e "INTEGER"..   
bff0: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
c000: 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61  ** This is not a
c010: 20 70 72 6f 62 6c 65 6d 2c 20 61 73 20 74 68 65   problem, as the
c020: 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6f 66 20   column type of 
c030: 22 74 31 2e 63 6f 6c 22 20 69 73 20 6e 65 76 65  "t1.col" is neve
c040: 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65  r.        ** use
c050: 64 2e 20 57 68 65 6e 20 63 6f 6c 75 6d 6e 54 79  d. When columnTy
c060: 70 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f  pe() is called o
c070: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
c080: 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 22 28 53   .        ** "(S
c090: 45 4c 45 43 54 20 74 31 2e 63 6f 6c 29 22 2c 20  ELECT t1.col)", 
c0a0: 74 68 65 20 63 6f 72 72 65 63 74 20 74 79 70 65  the correct type
c0b0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 28 73 65   is returned (se
c0c0: 65 20 74 68 65 20 54 4b 5f 53 45 4c 45 43 54 0a  e the TK_SELECT.
c0d0: 20 20 20 20 20 20 20 20 2a 2a 20 62 72 61 6e 63          ** branc
c0e0: 68 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20  h below.  */.   
c0f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c100: 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72    }..      asser
c110: 74 28 20 70 54 61 62 20 26 26 20 70 45 78 70 72  t( pTab && pExpr
c120: 2d 3e 70 54 61 62 3d 3d 70 54 61 62 20 29 3b 0a  ->pTab==pTab );.
c130: 20 20 20 20 20 20 69 66 28 20 70 53 20 29 7b 0a        if( pS ){.
c140: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22          /* The "
c150: 74 61 62 6c 65 22 20 69 73 20 61 63 74 75 61 6c  table" is actual
c160: 6c 79 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20  ly a sub-select 
c170: 6f 72 20 61 20 76 69 65 77 20 69 6e 20 74 68 65  or a view in the
c180: 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 20   FROM clause.   
c190: 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 53       ** of the S
c1a0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
c1b0: 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 63 6c   Return the decl
c1c0: 61 72 61 74 69 6f 6e 20 74 79 70 65 20 61 6e 64  aration type and
c1d0: 20 6f 72 69 67 69 6e 0a 20 20 20 20 20 20 20 20   origin.        
c1e0: 2a 2a 20 64 61 74 61 20 66 6f 72 20 74 68 65 20  ** data for the 
c1f0: 72 65 73 75 6c 74 2d 73 65 74 20 63 6f 6c 75 6d  result-set colum
c200: 6e 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c  n of the sub-sel
c210: 65 63 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ect..        */.
c220: 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
c230: 3e 3d 30 20 26 26 20 41 4c 57 41 59 53 28 69 43  >=0 && ALWAYS(iC
c240: 6f 6c 3c 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 6e  ol<pS->pEList->n
c250: 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
c260: 20 20 20 2f 2a 20 49 66 20 69 43 6f 6c 20 69 73     /* If iCol is
c270: 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c   less than zero,
c280: 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73   then the expres
c290: 73 69 6f 6e 20 72 65 71 75 65 73 74 73 20 74 68  sion requests th
c2a0: 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72  e.          ** r
c2b0: 6f 77 69 64 20 6f 66 20 74 68 65 20 73 75 62 2d  owid of the sub-
c2c0: 73 65 6c 65 63 74 20 6f 72 20 76 69 65 77 2e 20  select or view. 
c2d0: 54 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20  This expression 
c2e0: 69 73 20 6c 65 67 61 6c 20 28 73 65 65 20 0a 20  is legal (see . 
c2f0: 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65 73 74           ** test
c300: 20 63 61 73 65 20 6d 69 73 63 32 2e 32 2e 32 29   case misc2.2.2)
c310: 20 2d 20 69 74 20 61 6c 77 61 79 73 20 65 76 61   - it always eva
c320: 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 2e 0a  luates to NULL..
c330: 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20            **.   
c340: 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 41 4c         ** The AL
c350: 57 41 59 53 28 29 20 69 73 20 62 65 63 61 75 73  WAYS() is becaus
c360: 65 20 69 43 6f 6c 3e 3d 70 53 2d 3e 70 45 4c 69  e iCol>=pS->pELi
c370: 73 74 2d 3e 6e 45 78 70 72 20 77 69 6c 6c 20 68  st->nExpr will h
c380: 61 76 65 20 62 65 65 6e 0a 20 20 20 20 20 20 20  ave been.       
c390: 20 20 20 2a 2a 20 63 61 75 67 68 74 20 61 6c 72     ** caught alr
c3a0: 65 61 64 79 20 62 79 20 6e 61 6d 65 20 72 65 73  eady by name res
c3b0: 6f 6c 75 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20  olution..       
c3c0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
c3d0: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
c3e0: 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20  .          Expr 
c3f0: 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d  *p = pS->pEList-
c400: 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 3b 0a  >a[iCol].pExpr;.
c410: 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 53            sNC.pS
c420: 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53 72  rcList = pS->pSr
c430: 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43  c;.          sNC
c440: 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20  .pNext = pNC;.  
c450: 20 20 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72          sNC.pPar
c460: 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65  se = pNC->pParse
c470: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70  ;.          zTyp
c480: 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26  e = columnType(&
c490: 73 4e 43 2c 20 70 2c 26 7a 4f 72 69 67 44 62 2c  sNC, p,&zOrigDb,
c4a0: 26 7a 4f 72 69 67 54 61 62 2c 26 7a 4f 72 69 67  &zOrigTab,&zOrig
c4b0: 43 6f 6c 2c 20 26 65 73 74 57 69 64 74 68 29 3b  Col, &estWidth);
c4c0: 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20   .        }.    
c4d0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 61 62    }else if( pTab
c4e0: 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ->pSchema ){.   
c4f0: 20 20 20 20 20 2f 2a 20 41 20 72 65 61 6c 20 74       /* A real t
c500: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
c510: 61 73 73 65 72 74 28 20 21 70 53 20 29 3b 0a 20  assert( !pS );. 
c520: 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c         if( iCol<
c530: 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d  0 ) iCol = pTab-
c540: 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  >iPKey;.        
c550: 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31  assert( iCol==-1
c560: 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20   || (iCol>=0 && 
c570: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29  iCol<pTab->nCol)
c580: 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   );.#ifdef SQLIT
c590: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
c5a0: 4d 45 54 41 44 41 54 41 0a 20 20 20 20 20 20 20  METADATA.       
c5b0: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20   if( iCol<0 ){. 
c5c0: 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d           zType =
c5d0: 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20   "INTEGER";.    
c5e0: 20 20 20 20 20 20 7a 4f 72 69 67 43 6f 6c 20 3d        zOrigCol =
c5f0: 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20   "rowid";.      
c600: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
c610: 20 20 20 7a 4f 72 69 67 43 6f 6c 20 3d 20 70 54     zOrigCol = pT
c620: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
c630: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
c640: 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 43  zType = sqlite3C
c650: 6f 6c 75 6d 6e 54 79 70 65 28 26 70 54 61 62 2d  olumnType(&pTab-
c660: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2c 30 29 3b 0a  >aCol[iCol],0);.
c670: 20 20 20 20 20 20 20 20 20 20 65 73 74 57 69 64            estWid
c680: 74 68 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  th = pTab->aCol[
c690: 69 43 6f 6c 5d 2e 73 7a 45 73 74 3b 0a 20 20 20  iCol].szEst;.   
c6a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a       }.        z
c6b0: 4f 72 69 67 54 61 62 20 3d 20 70 54 61 62 2d 3e  OrigTab = pTab->
c6c0: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69  zName;.        i
c6d0: 66 28 20 70 4e 43 2d 3e 70 50 61 72 73 65 20 29  f( pNC->pParse )
c6e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
c6f0: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
c700: 65 6d 61 54 6f 49 6e 64 65 78 28 70 4e 43 2d 3e  emaToIndex(pNC->
c710: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
c720: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
c730: 20 20 20 20 20 20 7a 4f 72 69 67 44 62 20 3d 20        zOrigDb = 
c740: 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d  pNC->pParse->db-
c750: 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b  >aDb[iDb].zName;
c760: 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6c 73 65  .        }.#else
c770: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f  .        if( iCo
c780: 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  l<0 ){.         
c790: 20 7a 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45   zType = "INTEGE
c7a0: 52 22 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  R";.        }els
c7b0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79  e{.          zTy
c7c0: 70 65 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75  pe = sqlite3Colu
c7d0: 6d 6e 54 79 70 65 28 26 70 54 61 62 2d 3e 61 43  mnType(&pTab->aC
c7e0: 6f 6c 5b 69 43 6f 6c 5d 2c 30 29 3b 0a 20 20 20  ol[iCol],0);.   
c7f0: 20 20 20 20 20 20 20 65 73 74 57 69 64 74 68 20         estWidth 
c800: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  = pTab->aCol[iCo
c810: 6c 5d 2e 73 7a 45 73 74 3b 0a 20 20 20 20 20 20  l].szEst;.      
c820: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
c830: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
c840: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
c850: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
c860: 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  RY.    case TK_S
c870: 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f  ELECT: {.      /
c880: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
c890: 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63 74   is a sub-select
c8a0: 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 63  . Return the dec
c8b0: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 61 6e  laration type an
c8c0: 64 0a 20 20 20 20 20 20 2a 2a 20 6f 72 69 67 69  d.      ** origi
c8d0: 6e 20 69 6e 66 6f 20 66 6f 72 20 74 68 65 20 73  n info for the s
c8e0: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 69 6e 20  ingle column in 
c8f0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
c900: 66 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20 20  f the SELECT.   
c910: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e     ** statement.
c920: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
c930: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
c940: 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
c950: 53 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  S = pExpr->x.pSe
c960: 6c 65 63 74 3b 0a 20 20 20 20 20 20 45 78 70 72  lect;.      Expr
c970: 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74   *p = pS->pEList
c980: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
c990: 20 20 20 20 61 73 73 65 72 74 28 20 45 78 70 72      assert( Expr
c9a0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
c9b0: 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
c9c0: 20 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 53   );.      sNC.pS
c9d0: 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53 72  rcList = pS->pSr
c9e0: 63 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 4e 65  c;.      sNC.pNe
c9f0: 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20  xt = pNC;.      
ca00: 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43  sNC.pParse = pNC
ca10: 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20  ->pParse;.      
ca20: 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79  zType = columnTy
ca30: 70 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72  pe(&sNC, p, &zOr
ca40: 69 67 44 62 2c 20 26 7a 4f 72 69 67 54 61 62 2c  igDb, &zOrigTab,
ca50: 20 26 7a 4f 72 69 67 43 6f 6c 2c 20 26 65 73 74   &zOrigCol, &est
ca60: 57 69 64 74 68 29 3b 20 0a 20 20 20 20 20 20 62  Width); .      b
ca70: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
ca80: 69 66 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53  if.  }..#ifdef S
ca90: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
caa0: 55 4d 4e 5f 4d 45 54 41 44 41 54 41 20 20 0a 20  UMN_METADATA  . 
cab0: 20 69 66 28 20 70 7a 4f 72 69 67 44 62 20 29 7b   if( pzOrigDb ){
cac0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 7a 4f  .    assert( pzO
cad0: 72 69 67 54 61 62 20 26 26 20 70 7a 4f 72 69 67  rigTab && pzOrig
cae0: 43 6f 6c 20 29 3b 0a 20 20 20 20 2a 70 7a 4f 72  Col );.    *pzOr
caf0: 69 67 44 62 20 3d 20 7a 4f 72 69 67 44 62 3b 0a  igDb = zOrigDb;.
cb00: 20 20 20 20 2a 70 7a 4f 72 69 67 54 61 62 20 3d      *pzOrigTab =
cb10: 20 7a 4f 72 69 67 54 61 62 3b 0a 20 20 20 20 2a   zOrigTab;.    *
cb20: 70 7a 4f 72 69 67 43 6f 6c 20 3d 20 7a 4f 72 69  pzOrigCol = zOri
cb30: 67 43 6f 6c 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  gCol;.  }.#endif
cb40: 0a 20 20 69 66 28 20 70 45 73 74 57 69 64 74 68  .  if( pEstWidth
cb50: 20 29 20 2a 70 45 73 74 57 69 64 74 68 20 3d 20   ) *pEstWidth = 
cb60: 65 73 74 57 69 64 74 68 3b 0a 20 20 72 65 74 75  estWidth;.  retu
cb70: 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a  rn zType;.}../*.
cb80: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
cb90: 20 74 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20   that will tell 
cba0: 74 68 65 20 56 44 42 45 20 74 68 65 20 64 65 63  the VDBE the dec
cbb0: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 73 20 6f  laration types o
cbc0: 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20  f columns.** in 
cbd0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a  the result set..
cbe0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67  */.static void g
cbf0: 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70  enerateColumnTyp
cc00: 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  es(.  Parse *pPa
cc10: 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72  rse,      /* Par
cc20: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
cc30: 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
cc40: 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20  st,  /* List of 
cc50: 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72  tables */.  Expr
cc60: 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20  List *pEList    
cc70: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64  /* Expressions d
cc80: 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75  efining the resu
cc90: 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 23 69 66  lt set */.){.#if
cca0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
ccb0: 5f 44 45 43 4c 54 59 50 45 0a 20 20 56 64 62 65  _DECLTYPE.  Vdbe
ccc0: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
ccd0: 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
cce0: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
ccf0: 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20  .  sNC.pSrcList 
cd00: 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 4e  = pTabList;.  sN
cd10: 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  C.pParse = pPars
cd20: 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  e;.  for(i=0; i<
cd30: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  pEList->nExpr; i
cd40: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
cd50: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
cd60: 70 45 78 70 72 3b 0a 20 20 20 20 63 6f 6e 73 74  pExpr;.    const
cd70: 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 23 69   char *zType;.#i
cd80: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
cd90: 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41  LE_COLUMN_METADA
cda0: 54 41 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  TA.    const cha
cdb0: 72 20 2a 7a 4f 72 69 67 44 62 20 3d 20 30 3b 0a  r *zOrigDb = 0;.
cdc0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
cdd0: 7a 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a 20 20  zOrigTab = 0;.  
cde0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
cdf0: 72 69 67 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  rigCol = 0;.    
ce00: 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79  zType = columnTy
ce10: 70 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72  pe(&sNC, p, &zOr
ce20: 69 67 44 62 2c 20 26 7a 4f 72 69 67 54 61 62 2c  igDb, &zOrigTab,
ce30: 20 26 7a 4f 72 69 67 43 6f 6c 2c 20 30 29 3b 0a   &zOrigCol, 0);.
ce40: 0a 20 20 20 20 2f 2a 20 54 68 65 20 76 64 62 65  .    /* The vdbe
ce50: 20 6d 75 73 74 20 6d 61 6b 65 20 69 74 73 20 6f   must make its o
ce60: 77 6e 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63  wn copy of the c
ce70: 6f 6c 75 6d 6e 2d 74 79 70 65 20 61 6e 64 20 6f  olumn-type and o
ce80: 74 68 65 72 20 0a 20 20 20 20 2a 2a 20 63 6f 6c  ther .    ** col
ce90: 75 6d 6e 20 73 70 65 63 69 66 69 63 20 73 74 72  umn specific str
cea0: 69 6e 67 73 2c 20 69 6e 20 63 61 73 65 20 74 68  ings, in case th
ceb0: 65 20 73 63 68 65 6d 61 20 69 73 20 72 65 73 65  e schema is rese
cec0: 74 20 62 65 66 6f 72 65 20 74 68 69 73 0a 20 20  t before this.  
ced0: 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63    ** virtual mac
cee0: 68 69 6e 65 20 69 73 20 64 65 6c 65 74 65 64 2e  hine is deleted.
cef0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
cf00: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
cf10: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
cf20: 44 41 54 41 42 41 53 45 2c 20 7a 4f 72 69 67 44  DATABASE, zOrigD
cf30: 62 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  b, SQLITE_TRANSI
cf40: 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ENT);.    sqlite
cf50: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
cf60: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 54 41  v, i, COLNAME_TA
cf70: 42 4c 45 2c 20 7a 4f 72 69 67 54 61 62 2c 20 53  BLE, zOrigTab, S
cf80: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
cf90: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
cfa0: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
cfb0: 2c 20 43 4f 4c 4e 41 4d 45 5f 43 4f 4c 55 4d 4e  , COLNAME_COLUMN
cfc0: 2c 20 7a 4f 72 69 67 43 6f 6c 2c 20 53 51 4c 49  , zOrigCol, SQLI
cfd0: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 23  TE_TRANSIENT);.#
cfe0: 65 6c 73 65 0a 20 20 20 20 7a 54 79 70 65 20 3d  else.    zType =
cff0: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43   columnType(&sNC
d000: 2c 20 70 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29  , p, 0, 0, 0, 0)
d010: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c  ;.#endif.    sql
d020: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
d030: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
d040: 5f 44 45 43 4c 54 59 50 45 2c 20 7a 54 79 70 65  _DECLTYPE, zType
d050: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
d060: 4e 54 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  NT);.  }.#endif 
d070: 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
d080: 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45  TE_OMIT_DECLTYPE
d090: 29 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ) */.}../*.** Ge
d0a0: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
d0b0: 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56   will tell the V
d0c0: 44 42 45 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  DBE the names of
d0d0: 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74   columns.** in t
d0e0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20  he result set.  
d0f0: 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  This information
d100: 20 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f 76   is used to prov
d110: 69 64 65 20 74 68 65 0a 2a 2a 20 61 7a 43 6f 6c  ide the.** azCol
d120: 5b 5d 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65  [] values in the
d130: 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74   callback..*/.st
d140: 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61  atic void genera
d150: 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20  teColumnNames(. 
d160: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
d170: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63       /* Parser c
d180: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
d190: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20  ist *pTabList,  
d1a0: 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65  /* List of table
d1b0: 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  s */.  ExprList 
d1c0: 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78  *pEList    /* Ex
d1d0: 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69  pressions defini
d1e0: 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ng the result se
d1f0: 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  t */.){.  Vdbe *
d200: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
d210: 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  e;.  int i, j;. 
d220: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
d230: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
d240: 20 66 75 6c 6c 4e 61 6d 65 73 2c 20 73 68 6f 72   fullNames, shor
d250: 74 4e 61 6d 65 73 3b 0a 0a 23 69 66 6e 64 65 66  tNames;..#ifndef
d260: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
d270: 4c 41 49 4e 0a 20 20 2f 2a 20 49 66 20 74 68 69  LAIN.  /* If thi
d280: 73 20 69 73 20 61 6e 20 45 58 50 4c 41 49 4e 2c  s is an EXPLAIN,
d290: 20 73 6b 69 70 20 74 68 69 73 20 73 74 65 70 20   skip this step 
d2a0: 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  */.  if( pParse-
d2b0: 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  >explain ){.    
d2c0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64  return;.  }.#end
d2d0: 69 66 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  if..  if( pParse
d2e0: 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 7c 7c  ->colNamesSet ||
d2f0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
d300: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  d ) return;.  as
d310: 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20  sert( v!=0 );.  
d320: 61 73 73 65 72 74 28 20 70 54 61 62 4c 69 73 74  assert( pTabList
d330: 21 3d 30 20 29 3b 0a 20 20 70 50 61 72 73 65 2d  !=0 );.  pParse-
d340: 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31  >colNamesSet = 1
d350: 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65 73 20 3d 20  ;.  fullNames = 
d360: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
d370: 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73  ITE_FullColNames
d380: 29 21 3d 30 3b 0a 20 20 73 68 6f 72 74 4e 61 6d  )!=0;.  shortNam
d390: 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20  es = (db->flags 
d3a0: 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f  & SQLITE_ShortCo
d3b0: 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73 71  lNames)!=0;.  sq
d3c0: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
d3d0: 6f 6c 73 28 76 2c 20 70 45 4c 69 73 74 2d 3e 6e  ols(v, pEList->n
d3e0: 45 78 70 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30  Expr);.  for(i=0
d3f0: 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
d400: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
d410: 72 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 70 45  r *p;.    p = pE
d420: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
d430: 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28  ;.    if( NEVER(
d440: 70 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75 65  p==0) ) continue
d450: 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73 74  ;.    if( pEList
d460: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a  ->a[i].zName ){.
d470: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
d480: 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  e = pEList->a[i]
d490: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 73 71  .zName;.      sq
d4a0: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
d4b0: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
d4c0: 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53  E_NAME, zName, S
d4d0: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
d4e0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
d4f0: 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  p->op==TK_COLUMN
d500: 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 47   || p->op==TK_AG
d510: 47 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  G_COLUMN ){.    
d520: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
d530: 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b       char *zCol;
d540: 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  .      int iCol 
d550: 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  = p->iColumn;.  
d560: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 41 4c 57      for(j=0; ALW
d570: 41 59 53 28 6a 3c 70 54 61 62 4c 69 73 74 2d 3e  AYS(j<pTabList->
d580: 6e 53 72 63 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nSrc); j++){.   
d590: 20 20 20 20 20 69 66 28 20 70 54 61 62 4c 69 73       if( pTabLis
d5a0: 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 3d  t->a[j].iCursor=
d5b0: 3d 70 2d 3e 69 54 61 62 6c 65 20 29 20 62 72 65  =p->iTable ) bre
d5c0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
d5d0: 20 20 61 73 73 65 72 74 28 20 6a 3c 70 54 61 62    assert( j<pTab
d5e0: 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20  List->nSrc );.  
d5f0: 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c      pTab = pTabL
d600: 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a  ist->a[j].pTab;.
d610: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
d620: 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e   ) iCol = pTab->
d630: 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 61 73 73  iPKey;.      ass
d640: 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c  ert( iCol==-1 ||
d650: 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f   (iCol>=0 && iCo
d660: 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b  l<pTab->nCol) );
d670: 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  .      if( iCol<
d680: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f  0 ){.        zCo
d690: 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20  l = "rowid";.   
d6a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d6b0: 20 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61    zCol = pTab->a
d6c0: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b  Col[iCol].zName;
d6d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
d6e0: 66 28 20 21 73 68 6f 72 74 4e 61 6d 65 73 20 26  f( !shortNames &
d6f0: 26 20 21 66 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a  & !fullNames ){.
d700: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d710: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
d720: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
d730: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  , .            s
d740: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
d750: 62 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  b, pEList->a[i].
d760: 7a 53 70 61 6e 29 2c 20 53 51 4c 49 54 45 5f 44  zSpan), SQLITE_D
d770: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d  YNAMIC);.      }
d780: 65 6c 73 65 20 69 66 28 20 66 75 6c 6c 4e 61 6d  else if( fullNam
d790: 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  es ){.        ch
d7a0: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20  ar *zName = 0;. 
d7b0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73         zName = s
d7c0: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
d7d0: 2c 20 22 25 73 2e 25 73 22 2c 20 70 54 61 62 2d  , "%s.%s", pTab-
d7e0: 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3b 0a 20  >zName, zCol);. 
d7f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d800: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
d810: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c  i, COLNAME_NAME,
d820: 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 44   zName, SQLITE_D
d830: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d  YNAMIC);.      }
d840: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
d850: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
d860: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
d870: 45 5f 4e 41 4d 45 2c 20 7a 43 6f 6c 2c 20 53 51  E_NAME, zCol, SQ
d880: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
d890: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
d8a0: 73 65 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  se{.      const 
d8b0: 63 68 61 72 20 2a 7a 20 3d 20 70 45 4c 69 73 74  char *z = pEList
d8c0: 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 3b 0a 20 20  ->a[i].zSpan;.  
d8d0: 20 20 20 20 7a 20 3d 20 7a 3d 3d 30 20 3f 20 73      z = z==0 ? s
d8e0: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
d8f0: 2c 20 22 63 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b  , "column%d", i+
d900: 31 29 20 3a 20 73 71 6c 69 74 65 33 44 62 53 74  1) : sqlite3DbSt
d910: 72 44 75 70 28 64 62 2c 20 7a 29 3b 0a 20 20 20  rDup(db, z);.   
d920: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
d930: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
d940: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 2c 20  OLNAME_NAME, z, 
d950: 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b  SQLITE_DYNAMIC);
d960: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 67 65 6e  .    }.  }.  gen
d970: 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73  erateColumnTypes
d980: 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
d990: 74 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a 2f  t, pEList);.}../
d9a0: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20 65 78  *.** Given an ex
d9b0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 28 77  pression list (w
d9c0: 68 69 63 68 20 69 73 20 72 65 61 6c 6c 79 20 74  hich is really t
d9d0: 68 65 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65  he list of expre
d9e0: 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 66  ssions.** that f
d9f0: 6f 72 6d 20 74 68 65 20 72 65 73 75 6c 74 20 73  orm the result s
da00: 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73  et of a SELECT s
da10: 74 61 74 65 6d 65 6e 74 29 20 63 6f 6d 70 75 74  tatement) comput
da20: 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a  e appropriate.**
da30: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f   column names fo
da40: 72 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 77  r a table that w
da50: 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 78  ould hold the ex
da60: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
da70: 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 6c 75 6d 6e 20  *.** All column 
da80: 6e 61 6d 65 73 20 77 69 6c 6c 20 62 65 20 75 6e  names will be un
da90: 69 71 75 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79  ique..**.** Only
daa0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
dab0: 73 20 61 72 65 20 63 6f 6d 70 75 74 65 64 2e 20  s are computed. 
dac0: 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 2c 20 43   Column.zType, C
dad0: 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 2c 0a 2a 2a 20  olumn.zColl,.** 
dae0: 61 6e 64 20 6f 74 68 65 72 20 66 69 65 6c 64 73  and other fields
daf0: 20 6f 66 20 43 6f 6c 75 6d 6e 20 61 72 65 20 7a   of Column are z
db00: 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  eroed..**.** Ret
db10: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
db20: 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 61 20   success.  If a 
db30: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
db40: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a  n error occurs,.
db50: 2a 2a 20 73 74 6f 72 65 20 4e 55 4c 4c 20 69 6e  ** store NULL in
db60: 20 2a 70 61 43 6f 6c 20 61 6e 64 20 30 20 69 6e   *paCol and 0 in
db70: 20 2a 70 6e 43 6f 6c 20 61 6e 64 20 72 65 74 75   *pnCol and retu
db80: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e  rn SQLITE_NOMEM.
db90: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43  .*/.int sqlite3C
dba0: 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69  olumnsFromExprLi
dbb0: 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
dbc0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
dbd0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
dbe0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
dbf0: 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a  pEList,       /*
dc00: 20 45 78 70 72 20 6c 69 73 74 20 66 72 6f 6d 20   Expr list from 
dc10: 77 68 69 63 68 20 74 6f 20 64 65 72 69 76 65 20  which to derive 
dc20: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a  column names */.
dc30: 20 20 69 31 36 20 2a 70 6e 43 6f 6c 2c 20 20 20    i16 *pnCol,   
dc40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
dc50: 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
dc60: 20 63 6f 6c 75 6d 6e 73 20 68 65 72 65 20 2a 2f   columns here */
dc70: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 2a 70 61 43 6f  .  Column **paCo
dc80: 6c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72  l          /* Wr
dc90: 69 74 65 20 74 68 65 20 6e 65 77 20 63 6f 6c 75  ite the new colu
dca0: 6d 6e 20 6c 69 73 74 20 68 65 72 65 20 2a 2f 0a  mn list here */.
dcb0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
dcc0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
dcd0: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
dce0: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  nection */.  int
dcf0: 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20   i, j;          
dd00: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
dd10: 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 75   counters */.  u
dd20: 33 32 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20  32 cnt;         
dd30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
dd40: 64 65 78 20 61 64 64 65 64 20 74 6f 20 6d 61 6b  dex added to mak
dd50: 65 20 74 68 65 20 6e 61 6d 65 20 75 6e 69 71 75  e the name uniqu
dd60: 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61  e */.  Column *a
dd70: 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 20 20 20 20 20  Col, *pCol;     
dd80: 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
dd90: 67 20 6f 76 65 72 20 72 65 73 75 6c 74 20 63 6f  g over result co
dda0: 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  lumns */.  int n
ddb0: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
ddc0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
ddd0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
dde0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
ddf0: 0a 20 20 45 78 70 72 20 2a 70 3b 20 20 20 20 20  .  Expr *p;     
de00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
de10: 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 66 6f 72  * Expression for
de20: 20 61 20 73 69 6e 67 6c 65 20 72 65 73 75 6c 74   a single result
de30: 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61   column */.  cha
de40: 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20  r *zName;       
de50: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
de60: 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74  mn name */.  int
de70: 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20   nName;         
de80: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
de90: 20 6f 66 20 6e 61 6d 65 20 69 6e 20 7a 4e 61 6d   of name in zNam
dea0: 65 5b 5d 20 2a 2f 0a 20 20 48 61 73 68 20 68 74  e[] */.  Hash ht
deb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
dec0: 20 20 20 20 20 2f 2a 20 48 61 73 68 20 74 61 62       /* Hash tab
ded0: 6c 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d  le of column nam
dee0: 65 73 20 2a 2f 0a 0a 20 20 73 71 6c 69 74 65 33  es */..  sqlite3
def0: 48 61 73 68 49 6e 69 74 28 26 68 74 29 3b 0a 20  HashInit(&ht);. 
df00: 20 69 66 28 20 70 45 4c 69 73 74 20 29 7b 0a 20   if( pEList ){. 
df10: 20 20 20 6e 43 6f 6c 20 3d 20 70 45 4c 69 73 74     nCol = pEList
df20: 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61 43 6f  ->nExpr;.    aCo
df30: 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  l = sqlite3DbMal
df40: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
df50: 6f 66 28 61 43 6f 6c 5b 30 5d 29 2a 6e 43 6f 6c  of(aCol[0])*nCol
df60: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
df70: 20 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 7d 65   aCol==0 );.  }e
df80: 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20  lse{.    nCol = 
df90: 30 3b 0a 20 20 20 20 61 43 6f 6c 20 3d 20 30 3b  0;.    aCol = 0;
dfa0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
dfb0: 43 6f 6c 3d 3d 28 69 31 36 29 6e 43 6f 6c 20 29  Col==(i16)nCol )
dfc0: 3b 0a 20 20 2a 70 6e 43 6f 6c 20 3d 20 6e 43 6f  ;.  *pnCol = nCo
dfd0: 6c 3b 0a 20 20 2a 70 61 43 6f 6c 20 3d 20 61 43  l;.  *paCol = aC
dfe0: 6f 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20  ol;..  for(i=0, 
dff0: 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 6e 43 6f  pCol=aCol; i<nCo
e000: 6c 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  l && !db->malloc
e010: 46 61 69 6c 65 64 3b 20 69 2b 2b 2c 20 70 43 6f  Failed; i++, pCo
e020: 6c 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 47 65 74  l++){.    /* Get
e030: 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
e040: 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 63 6f 6c  name for the col
e050: 75 6d 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  umn.    */.    p
e060: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
e070: 69 70 43 6f 6c 6c 61 74 65 28 70 45 4c 69 73 74  ipCollate(pEList
e080: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
e090: 20 20 20 69 66 28 20 28 7a 4e 61 6d 65 20 3d 20     if( (zName = 
e0a0: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  pEList->a[i].zNa
e0b0: 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)!=0 ){.      
e0c0: 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e  /* If the column
e0d0: 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 22 41 53   contains an "AS
e0e0: 20 3c 6e 61 6d 65 3e 22 20 70 68 72 61 73 65 2c   <name>" phrase,
e0f0: 20 75 73 65 20 3c 6e 61 6d 65 3e 20 61 73 20 74   use <name> as t
e100: 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 7d  he name */.    }
e110: 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72  else{.      Expr
e120: 20 2a 70 43 6f 6c 45 78 70 72 20 3d 20 70 3b 20   *pColExpr = p; 
e130: 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
e140: 6f 6e 20 74 68 61 74 20 69 73 20 74 68 65 20 72  on that is the r
e150: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d  esult column nam
e160: 65 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65  e */.      Table
e170: 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20   *pTab;         
e180: 2f 2a 20 54 61 62 6c 65 20 61 73 73 6f 63 69 61  /* Table associa
e190: 74 65 64 20 77 69 74 68 20 74 68 69 73 20 65 78  ted with this ex
e1a0: 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  pression */.    
e1b0: 20 20 77 68 69 6c 65 28 20 70 43 6f 6c 45 78 70    while( pColExp
e1c0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b  r->op==TK_DOT ){
e1d0: 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 45 78 70  .        pColExp
e1e0: 72 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 52  r = pColExpr->pR
e1f0: 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 61 73  ight;.        as
e200: 73 65 72 74 28 20 70 43 6f 6c 45 78 70 72 21 3d  sert( pColExpr!=
e210: 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  0 );.      }.   
e220: 20 20 20 69 66 28 20 70 43 6f 6c 45 78 70 72 2d     if( pColExpr-
e230: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op==TK_COLUMN &
e240: 26 20 41 4c 57 41 59 53 28 70 43 6f 6c 45 78 70  & ALWAYS(pColExp
e250: 72 2d 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a 20  r->pTab!=0) ){. 
e260: 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f         /* For co
e270: 6c 75 6d 6e 73 20 75 73 65 20 74 68 65 20 63 6f  lumns use the co
e280: 6c 75 6d 6e 20 6e 61 6d 65 20 6e 61 6d 65 20 2a  lumn name name *
e290: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43  /.        int iC
e2a0: 6f 6c 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 69  ol = pColExpr->i
e2b0: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
e2c0: 70 54 61 62 20 3d 20 70 43 6f 6c 45 78 70 72 2d  pTab = pColExpr-
e2d0: 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 69  >pTab;.        i
e2e0: 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c  f( iCol<0 ) iCol
e2f0: 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a   = pTab->iPKey;.
e300: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
e310: 69 43 6f 6c 3e 3d 30 20 3f 20 70 54 61 62 2d 3e  iCol>=0 ? pTab->
e320: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65  aCol[iCol].zName
e330: 20 3a 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20   : "rowid";.    
e340: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 6f 6c    }else if( pCol
e350: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20  Expr->op==TK_ID 
e360: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
e370: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
e380: 72 74 79 28 70 43 6f 6c 45 78 70 72 2c 20 45 50  rty(pColExpr, EP
e390: 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
e3a0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 43        zName = pC
e3b0: 6f 6c 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  olExpr->u.zToken
e3c0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
e3d0: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68         /* Use th
e3e0: 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 78 74 20  e original text 
e3f0: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 65 78  of the column ex
e400: 70 72 65 73 73 69 6f 6e 20 61 73 20 69 74 73 20  pression as its 
e410: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  name */.        
e420: 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e  zName = pEList->
e430: 61 5b 69 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20  a[i].zSpan;.    
e440: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e    }.    }.    zN
e450: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
e460: 69 6e 74 66 28 64 62 2c 20 22 25 73 22 2c 20 7a  intf(db, "%s", z
e470: 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 4d  Name);..    /* M
e480: 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 6f 6c  ake sure the col
e490: 75 6d 6e 20 6e 61 6d 65 20 69 73 20 75 6e 69 71  umn name is uniq
e4a0: 75 65 2e 20 20 49 66 20 74 68 65 20 6e 61 6d 65  ue.  If the name
e4b0: 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 2c 0a   is not unique,.
e4c0: 20 20 20 20 2a 2a 20 61 70 70 65 6e 64 20 61 6e      ** append an
e4d0: 20 69 6e 74 65 67 65 72 20 74 6f 20 74 68 65 20   integer to the 
e4e0: 6e 61 6d 65 20 73 6f 20 74 68 61 74 20 69 74 20  name so that it 
e4f0: 62 65 63 6f 6d 65 73 20 75 6e 69 71 75 65 2e 0a  becomes unique..
e500: 20 20 20 20 2a 2f 0a 20 20 20 20 63 6e 74 20 3d      */.    cnt =
e510: 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 7a   0;.    while( z
e520: 4e 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33 48  Name && sqlite3H
e530: 61 73 68 46 69 6e 64 28 26 68 74 2c 20 7a 4e 61  ashFind(&ht, zNa
e540: 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)!=0 ){.      
e550: 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  nName = sqlite3S
e560: 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a  trlen30(zName);.
e570: 20 20 20 20 20 20 69 66 28 20 6e 4e 61 6d 65 3e        if( nName>
e580: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  0 ){.        for
e590: 28 6a 3d 6e 4e 61 6d 65 2d 31 3b 20 6a 3e 30 20  (j=nName-1; j>0 
e5a0: 26 26 20 73 71 6c 69 74 65 33 49 73 64 69 67 69  && sqlite3Isdigi
e5b0: 74 28 7a 4e 61 6d 65 5b 6a 5d 29 3b 20 6a 2d 2d  t(zName[j]); j--
e5c0: 29 7b 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20  ){}.        if( 
e5d0: 7a 4e 61 6d 65 5b 6a 5d 3d 3d 27 3a 27 20 29 20  zName[j]==':' ) 
e5e0: 6e 4e 61 6d 65 20 3d 20 6a 3b 0a 20 20 20 20 20  nName = j;.     
e5f0: 20 7d 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d   }.      zName =
e600: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
e610: 64 62 2c 20 22 25 2e 2a 7a 3a 25 75 22 2c 20 6e  db, "%.*z:%u", n
e620: 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2b 2b 63  Name, zName, ++c
e630: 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63  nt);.      if( c
e640: 6e 74 3e 33 20 29 20 73 71 6c 69 74 65 33 5f 72  nt>3 ) sqlite3_r
e650: 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66  andomness(sizeof
e660: 28 63 6e 74 29 2c 20 26 63 6e 74 29 3b 0a 20 20  (cnt), &cnt);.  
e670: 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e    }.    pCol->zN
e680: 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20  ame = zName;.   
e690: 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 50 72   sqlite3ColumnPr
e6a0: 6f 70 65 72 74 69 65 73 46 72 6f 6d 4e 61 6d 65  opertiesFromName
e6b0: 28 30 2c 20 70 43 6f 6c 29 3b 0a 20 20 20 20 69  (0, pCol);.    i
e6c0: 66 28 20 7a 4e 61 6d 65 20 26 26 20 73 71 6c 69  f( zName && sqli
e6d0: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 68  te3HashInsert(&h
e6e0: 74 2c 20 7a 4e 61 6d 65 2c 20 70 43 6f 6c 29 3d  t, zName, pCol)=
e6f0: 3d 70 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73  =pCol ){.      s
e700: 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64  qlite3OomFault(d
e710: 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  b);.    }.  }.  
e720: 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72  sqlite3HashClear
e730: 28 26 68 74 29 3b 0a 20 20 69 66 28 20 64 62 2d  (&ht);.  if( db-
e740: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
e750: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
e760: 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73  i; j++){.      s
e770: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
e780: 20 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b   aCol[j].zName);
e790: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
e7a0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 61 43 6f  e3DbFree(db, aCo
e7b0: 6c 29 3b 0a 20 20 20 20 2a 70 61 43 6f 6c 20 3d  l);.    *paCol =
e7c0: 20 30 3b 0a 20 20 20 20 2a 70 6e 43 6f 6c 20 3d   0;.    *pnCol =
e7d0: 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   0;.    return S
e7e0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
e7f0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
e800: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
e810: 2a 2a 20 41 64 64 20 74 79 70 65 20 61 6e 64 20  ** Add type and 
e820: 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d  collation inform
e830: 61 74 69 6f 6e 20 74 6f 20 61 20 63 6f 6c 75 6d  ation to a colum
e840: 6e 20 6c 69 73 74 20 62 61 73 65 64 20 6f 6e 0a  n list based on.
e850: 2a 2a 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  ** a SELECT stat
e860: 65 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20 54 68  ement..** .** Th
e870: 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 70 72  e column list pr
e880: 65 73 75 6d 61 62 6c 79 20 63 61 6d 65 20 66 72  esumably came fr
e890: 6f 6d 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 4e  om selectColumnN
e8a0: 61 6d 65 73 46 72 6f 6d 45 78 70 72 4c 69 73 74  amesFromExprList
e8b0: 28 29 2e 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d  ()..** The colum
e8c0: 6e 20 6c 69 73 74 20 68 61 73 20 6f 6e 6c 79 20  n list has only 
e8d0: 6e 61 6d 65 73 2c 20 6e 6f 74 20 74 79 70 65 73  names, not types
e8e0: 20 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e 20   or collations. 
e8f0: 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   This.** routine
e900: 20 67 6f 65 73 20 74 68 72 6f 75 67 68 20 61 6e   goes through an
e910: 64 20 61 64 64 73 20 74 68 65 20 74 79 70 65 73  d adds the types
e920: 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e   and collations.
e930: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
e940: 69 6e 65 20 72 65 71 75 69 72 65 73 20 74 68 61  ine requires tha
e950: 74 20 61 6c 6c 20 69 64 65 6e 74 69 66 69 65 72  t all identifier
e960: 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 0a  s in the SELECT.
e970: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 62 65 20  ** statement be 
e980: 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f 0a 73 74 61  resolved..*/.sta
e990: 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74 41  tic void selectA
e9a0: 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43  ddColumnTypeAndC
e9b0: 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 50 61 72 73  ollation(.  Pars
e9c0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
e9d0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
e9e0: 74 65 78 74 73 20 2a 2f 0a 20 20 54 61 62 6c 65  texts */.  Table
e9f0: 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20   *pTab,         
ea00: 20 2f 2a 20 41 64 64 20 63 6f 6c 75 6d 6e 20 74   /* Add column t
ea10: 79 70 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ype information 
ea20: 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f  to this table */
ea30: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
ea40: 63 74 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45  ct       /* SELE
ea50: 43 54 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  CT used to deter
ea60: 6d 69 6e 65 20 74 79 70 65 73 20 61 6e 64 20 63  mine types and c
ea70: 6f 6c 6c 61 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a  ollations */.){.
ea80: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
ea90: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4e 61  pParse->db;.  Na
eaa0: 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20  meContext sNC;. 
eab0: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
eac0: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
ead0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78 70 72  .  int i;.  Expr
eae0: 20 2a 70 3b 0a 20 20 73 74 72 75 63 74 20 45 78   *p;.  struct Ex
eaf0: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a  prList_item *a;.
eb00: 20 20 75 36 34 20 73 7a 41 6c 6c 20 3d 20 30 3b    u64 szAll = 0;
eb10: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53 65 6c  ..  assert( pSel
eb20: 65 63 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ect!=0 );.  asse
eb30: 72 74 28 20 28 70 53 65 6c 65 63 74 2d 3e 73 65  rt( (pSelect->se
eb40: 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73 6f  lFlags & SF_Reso
eb50: 6c 76 65 64 29 21 3d 30 20 29 3b 0a 20 20 61 73  lved)!=0 );.  as
eb60: 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c  sert( pTab->nCol
eb70: 3d 3d 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  ==pSelect->pELis
eb80: 74 2d 3e 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e  t->nExpr || db->
eb90: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
eba0: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
ebb0: 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
ebc0: 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20  .  memset(&sNC, 
ebd0: 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b  0, sizeof(sNC));
ebe0: 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20  .  sNC.pSrcList 
ebf0: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b  = pSelect->pSrc;
ec00: 0a 20 20 61 20 3d 20 70 53 65 6c 65 63 74 2d 3e  .  a = pSelect->
ec10: 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 66 6f 72  pEList->a;.  for
ec20: 28 69 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62 2d  (i=0, pCol=pTab-
ec30: 3e 61 43 6f 6c 3b 20 69 3c 70 54 61 62 2d 3e 6e  >aCol; i<pTab->n
ec40: 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b  Col; i++, pCol++
ec50: 29 7b 0a 20 20 20 20 70 20 3d 20 61 5b 69 5d 2e  ){.    p = a[i].
ec60: 70 45 78 70 72 3b 0a 20 20 20 20 63 6f 6c 75 6d  pExpr;.    colum
ec70: 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 30  nType(&sNC, p, 0
ec80: 2c 20 30 2c 20 30 2c 20 26 70 43 6f 6c 2d 3e 73  , 0, 0, &pCol->s
ec90: 7a 45 73 74 29 3b 0a 20 20 20 20 73 7a 41 6c 6c  zEst);.    szAll
eca0: 20 2b 3d 20 70 43 6f 6c 2d 3e 73 7a 45 73 74 3b   += pCol->szEst;
ecb0: 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  .    pCol->affin
ecc0: 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ity = sqlite3Exp
ecd0: 72 41 66 66 69 6e 69 74 79 28 70 29 3b 0a 20 20  rAffinity(p);.  
ece0: 20 20 69 66 28 20 70 43 6f 6c 2d 3e 61 66 66 69    if( pCol->affi
ecf0: 6e 69 74 79 3d 3d 30 20 29 20 70 43 6f 6c 2d 3e  nity==0 ) pCol->
ed00: 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54  affinity = SQLIT
ed10: 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20  E_AFF_BLOB;.    
ed20: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
ed30: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
ed40: 65 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70  e, p);.    if( p
ed50: 43 6f 6c 6c 20 26 26 20 70 43 6f 6c 2d 3e 7a 43  Coll && pCol->zC
ed60: 6f 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  oll==0 ){.      
ed70: 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20 73 71  pCol->zColl = sq
ed80: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
ed90: 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b  , pColl->zName);
eda0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 54 61  .    }.  }.  pTa
edb0: 62 2d 3e 73 7a 54 61 62 52 6f 77 20 3d 20 73 71  b->szTabRow = sq
edc0: 6c 69 74 65 33 4c 6f 67 45 73 74 28 73 7a 41 6c  lite3LogEst(szAl
edd0: 6c 2a 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  l*4);.}../*.** G
ede0: 69 76 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74  iven a SELECT st
edf0: 61 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74  atement, generat
ee00: 65 20 61 20 54 61 62 6c 65 20 73 74 72 75 63 74  e a Table struct
ee10: 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62  ure that describ
ee20: 65 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  es.** the result
ee30: 20 73 65 74 20 6f 66 20 74 68 61 74 20 53 45 4c   set of that SEL
ee40: 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73  ECT..*/.Table *s
ee50: 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
ee60: 66 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70  fSelect(Parse *p
ee70: 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
ee80: 53 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65  Select){.  Table
ee90: 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65   *pTab;.  sqlite
eea0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
eeb0: 64 62 3b 0a 20 20 69 6e 74 20 73 61 76 65 64 46  db;.  int savedF
eec0: 6c 61 67 73 3b 0a 0a 20 20 73 61 76 65 64 46 6c  lags;..  savedFl
eed0: 61 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b  ags = db->flags;
eee0: 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20  .  db->flags &= 
eef0: 7e 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e  ~SQLITE_FullColN
ef00: 61 6d 65 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67  ames;.  db->flag
ef10: 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72  s |= SQLITE_Shor
ef20: 74 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 73 71 6c  tColNames;.  sql
ef30: 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 70  ite3SelectPrep(p
ef40: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20  Parse, pSelect, 
ef50: 30 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  0);.  if( pParse
ef60: 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 20  ->nErr ) return 
ef70: 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c  0;.  while( pSel
ef80: 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 53  ect->pPrior ) pS
ef90: 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74 2d  elect = pSelect-
efa0: 3e 70 50 72 69 6f 72 3b 0a 20 20 64 62 2d 3e 66  >pPrior;.  db->f
efb0: 6c 61 67 73 20 3d 20 73 61 76 65 64 46 6c 61 67  lags = savedFlag
efc0: 73 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69  s;.  pTab = sqli
efd0: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
efe0: 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65  db, sizeof(Table
eff0: 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d  ) );.  if( pTab=
f000: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
f010: 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65   0;.  }.  /* The
f020: 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65   sqlite3ResultSe
f030: 74 4f 66 53 65 6c 65 63 74 28 29 20 69 73 20 6f  tOfSelect() is o
f040: 6e 6c 79 20 75 73 65 64 20 6e 20 63 6f 6e 74 65  nly used n conte
f050: 78 74 73 20 77 68 65 72 65 20 6c 6f 6f 6b 61 73  xts where lookas
f060: 69 64 65 0a 20 20 2a 2a 20 69 73 20 64 69 73 61  ide.  ** is disa
f070: 62 6c 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74  bled */.  assert
f080: 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e  ( db->lookaside.
f090: 62 44 69 73 61 62 6c 65 20 29 3b 0a 20 20 70 54  bDisable );.  pT
f0a0: 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  ab->nRef = 1;.  
f0b0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b  pTab->zName = 0;
f0c0: 0a 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67  .  pTab->nRowLog
f0d0: 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72  Est = 200; asser
f0e0: 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c  t( 200==sqlite3L
f0f0: 6f 67 45 73 74 28 31 30 34 38 35 37 36 29 20 29  ogEst(1048576) )
f100: 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d  ;.  sqlite3Colum
f110: 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  nsFromExprList(p
f120: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e  Parse, pSelect->
f130: 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e  pEList, &pTab->n
f140: 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c  Col, &pTab->aCol
f150: 29 3b 0a 20 20 73 65 6c 65 63 74 41 64 64 43 6f  );.  selectAddCo
f160: 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61  lumnTypeAndColla
f170: 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61  tion(pParse, pTa
f180: 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 70  b, pSelect);.  p
f190: 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b  Tab->iPKey = -1;
f1a0: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
f1b0: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73  cFailed ){.    s
f1c0: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
f1d0: 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20  e(db, pTab);.   
f1e0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
f1f0: 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a   return pTab;.}.
f200: 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 56 44 42  ./*.** Get a VDB
f210: 45 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  E for the given 
f220: 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 2e 20  parser context. 
f230: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e   Create a new on
f240: 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  e if necessary..
f250: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
f260: 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e 55  ccurs, return NU
f270: 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20 61 20 6d  LL and leave a m
f280: 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65  essage in pParse
f290: 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74  ..*/.Vdbe *sqlit
f2a0: 65 33 47 65 74 56 64 62 65 28 50 61 72 73 65 20  e3GetVdbe(Parse 
f2b0: 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65  *pParse){.  Vdbe
f2c0: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
f2d0: 64 62 65 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  dbe;.  if( v==0 
f2e0: 29 7b 0a 20 20 20 20 76 20 3d 20 70 50 61 72 73  ){.    v = pPars
f2f0: 65 2d 3e 70 56 64 62 65 20 3d 20 73 71 6c 69 74  e->pVdbe = sqlit
f300: 65 33 56 64 62 65 43 72 65 61 74 65 28 70 50 61  e3VdbeCreate(pPa
f310: 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 20  rse);.    if( v 
f320: 29 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  ) sqlite3VdbeAdd
f330: 4f 70 30 28 76 2c 20 4f 50 5f 49 6e 69 74 29 3b  Op0(v, OP_Init);
f340: 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
f350: 3e 70 54 6f 70 6c 65 76 65 6c 3d 3d 30 0a 20 20  >pToplevel==0.  
f360: 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69     && Optimizati
f370: 6f 6e 45 6e 61 62 6c 65 64 28 70 50 61 72 73 65  onEnabled(pParse
f380: 2d 3e 64 62 2c 53 51 4c 49 54 45 5f 46 61 63 74  ->db,SQLITE_Fact
f390: 6f 72 4f 75 74 43 6f 6e 73 74 29 0a 20 20 20 20  orOutConst).    
f3a0: 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
f3b0: 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72 20 3d  >okConstFactor =
f3c0: 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 0a 20   1;.    }..  }. 
f3d0: 20 72 65 74 75 72 6e 20 76 3b 0a 7d 0a 0a 0a 2f   return v;.}.../
f3e0: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65  *.** Compute the
f3f0: 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66   iLimit and iOff
f400: 73 65 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68  set fields of th
f410: 65 20 53 45 4c 45 43 54 20 62 61 73 65 64 20 6f  e SELECT based o
f420: 6e 20 74 68 65 0a 2a 2a 20 70 4c 69 6d 69 74 20  n the.** pLimit 
f430: 61 6e 64 20 70 4f 66 66 73 65 74 20 65 78 70 72  and pOffset expr
f440: 65 73 73 69 6f 6e 73 2e 20 20 70 4c 69 6d 69 74  essions.  pLimit
f450: 20 61 6e 64 20 70 4f 66 66 73 65 74 20 68 6f 6c   and pOffset hol
f460: 64 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  d the expression
f470: 73 0a 2a 2a 20 74 68 61 74 20 61 70 70 65 61 72  s.** that appear
f480: 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   in the original
f490: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 61   SQL statement a
f4a0: 66 74 65 72 20 74 68 65 20 4c 49 4d 49 54 20 61  fter the LIMIT a
f4b0: 6e 64 20 4f 46 46 53 45 54 0a 2a 2a 20 6b 65 79  nd OFFSET.** key
f4c0: 77 6f 72 64 73 2e 20 20 4f 72 20 4e 55 4c 4c 20  words.  Or NULL 
f4d0: 69 66 20 74 68 6f 73 65 20 6b 65 79 77 6f 72 64  if those keyword
f4e0: 73 20 61 72 65 20 6f 6d 69 74 74 65 64 2e 20 69  s are omitted. i
f4f0: 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65  Limit and iOffse
f500: 74 20 0a 2a 2a 20 61 72 65 20 74 68 65 20 69 6e  t .** are the in
f510: 74 65 67 65 72 20 6d 65 6d 6f 72 79 20 72 65 67  teger memory reg
f520: 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20 66 6f  ister numbers fo
f530: 72 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20  r counters used 
f540: 74 6f 20 63 6f 6d 70 75 74 65 20 0a 2a 2a 20 74  to compute .** t
f550: 68 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66  he limit and off
f560: 73 65 74 2e 20 20 49 66 20 74 68 65 72 65 20 69  set.  If there i
f570: 73 20 6e 6f 20 6c 69 6d 69 74 20 61 6e 64 2f 6f  s no limit and/o
f580: 72 20 6f 66 66 73 65 74 2c 20 74 68 65 6e 20 0a  r offset, then .
f590: 2a 2a 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f  ** iLimit and iO
f5a0: 66 66 73 65 74 20 61 72 65 20 6e 65 67 61 74 69  ffset are negati
f5b0: 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ve..**.** This r
f5c0: 6f 75 74 69 6e 65 20 63 68 61 6e 67 65 73 20 74  outine changes t
f5d0: 68 65 20 76 61 6c 75 65 73 20 6f 66 20 69 4c 69  he values of iLi
f5e0: 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20  mit and iOffset 
f5f0: 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61 20 6c 69 6d  only if.** a lim
f600: 69 74 20 6f 72 20 6f 66 66 73 65 74 20 69 73 20  it or offset is 
f610: 64 65 66 69 6e 65 64 20 62 79 20 70 4c 69 6d 69  defined by pLimi
f620: 74 20 61 6e 64 20 70 4f 66 66 73 65 74 2e 20 20  t and pOffset.  
f630: 69 4c 69 6d 69 74 20 61 6e 64 0a 2a 2a 20 69 4f  iLimit and.** iO
f640: 66 66 73 65 74 20 73 68 6f 75 6c 64 20 68 61 76  ffset should hav
f650: 65 20 62 65 65 6e 20 70 72 65 73 65 74 20 74 6f  e been preset to
f660: 20 61 70 70 72 6f 70 72 69 61 74 65 20 64 65 66   appropriate def
f670: 61 75 6c 74 20 76 61 6c 75 65 73 20 28 7a 65 72  ault values (zer
f680: 6f 29 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63  o).** prior to c
f690: 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
f6a0: 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ine..**.** The i
f6b0: 4f 66 66 73 65 74 20 72 65 67 69 73 74 65 72 20  Offset register 
f6c0: 28 69 66 20 69 74 20 65 78 69 73 74 73 29 20 69  (if it exists) i
f6d0: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
f6e0: 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 6f 66   the value.** of
f6f0: 20 74 68 65 20 4f 46 46 53 45 54 2e 20 20 54 68   the OFFSET.  Th
f700: 65 20 69 4c 69 6d 69 74 20 72 65 67 69 73 74 65  e iLimit registe
f710: 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  r is initialized
f720: 20 74 6f 20 4c 49 4d 49 54 2e 20 20 52 65 67 69   to LIMIT.  Regi
f730: 73 74 65 72 0a 2a 2a 20 69 4f 66 66 73 65 74 2b  ster.** iOffset+
f740: 31 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  1 is initialized
f750: 20 74 6f 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54   to LIMIT+OFFSET
f760: 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20  ..**.** Only if 
f770: 70 4c 69 6d 69 74 21 3d 30 20 6f 72 20 70 4f 66  pLimit!=0 or pOf
f780: 66 73 65 74 21 3d 30 20 64 6f 20 74 68 65 20 6c  fset!=0 do the l
f790: 69 6d 69 74 20 72 65 67 69 73 74 65 72 73 20 67  imit registers g
f7a0: 65 74 0a 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e  et.** redefined.
f7b0: 20 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20    The UNION ALL 
f7c0: 6f 70 65 72 61 74 6f 72 20 75 73 65 73 20 74 68  operator uses th
f7d0: 69 73 20 70 72 6f 70 65 72 74 79 20 74 6f 20 66  is property to f
f7e0: 6f 72 63 65 0a 2a 2a 20 74 68 65 20 72 65 75 73  orce.** the reus
f7f0: 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6c 69  e of the same li
f800: 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74 20 72  mit and offset r
f810: 65 67 69 73 74 65 72 73 20 61 63 72 6f 73 73 20  egisters across 
f820: 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 53 45 4c 45  multiple.** SELE
f830: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  CT statements..*
f840: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
f850: 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
f860: 65 72 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ers(Parse *pPars
f870: 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  e, Select *p, in
f880: 74 20 69 42 72 65 61 6b 29 7b 0a 20 20 56 64 62  t iBreak){.  Vdb
f890: 65 20 2a 76 20 3d 20 30 3b 0a 20 20 69 6e 74 20  e *v = 0;.  int 
f8a0: 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 69 6e  iLimit = 0;.  in
f8b0: 74 20 69 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74  t iOffset;.  int
f8c0: 20 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69   n;.  if( p->iLi
f8d0: 6d 69 74 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  mit ) return;.. 
f8e0: 20 2f 2a 20 0a 20 20 2a 2a 20 22 4c 49 4d 49 54   /* .  ** "LIMIT
f8f0: 20 2d 31 22 20 61 6c 77 61 79 73 20 73 68 6f 77   -1" always show
f900: 73 20 61 6c 6c 20 72 6f 77 73 2e 20 20 54 68 65  s all rows.  The
f910: 72 65 20 69 73 20 73 6f 6d 65 0a 20 20 2a 2a 20  re is some.  ** 
f920: 63 6f 6e 74 72 6f 76 65 72 73 79 20 61 62 6f 75  controversy abou
f930: 74 20 77 68 61 74 20 74 68 65 20 63 6f 72 72 65  t what the corre
f940: 63 74 20 62 65 68 61 76 69 6f 72 20 73 68 6f 75  ct behavior shou
f950: 6c 64 20 62 65 2e 0a 20 20 2a 2a 20 54 68 65 20  ld be..  ** The 
f960: 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e  current implemen
f970: 74 61 74 69 6f 6e 20 69 6e 74 65 72 70 72 65 74  tation interpret
f980: 73 20 22 4c 49 4d 49 54 20 30 22 20 74 6f 20 6d  s "LIMIT 0" to m
f990: 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77 73  ean.  ** no rows
f9a0: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
f9b0: 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
f9c0: 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74  Parse);.  assert
f9d0: 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20  ( p->pOffset==0 
f9e0: 7c 7c 20 70 2d 3e 70 4c 69 6d 69 74 21 3d 30 20  || p->pLimit!=0 
f9f0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d  );.  if( p->pLim
fa00: 69 74 20 29 7b 0a 20 20 20 20 70 2d 3e 69 4c 69  it ){.    p->iLi
fa10: 6d 69 74 20 3d 20 69 4c 69 6d 69 74 20 3d 20 2b  mit = iLimit = +
fa20: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
fa30: 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65     v = sqlite3Ge
fa40: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
fa50: 20 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20     assert( v!=0 
fa60: 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
fa70: 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
fa80: 70 2d 3e 70 4c 69 6d 69 74 2c 20 26 6e 29 20 29  p->pLimit, &n) )
fa90: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
faa0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
fab0: 49 6e 74 65 67 65 72 2c 20 6e 2c 20 69 4c 69 6d  Integer, n, iLim
fac0: 69 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  it);.      VdbeC
fad0: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49  omment((v, "LIMI
fae0: 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20  T counter"));.  
faf0: 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a      if( n==0 ){.
fb00: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
fb10: 64 62 65 47 6f 74 6f 28 76 2c 20 69 42 72 65 61  dbeGoto(v, iBrea
fb20: 6b 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  k);.      }else 
fb30: 69 66 28 20 6e 3e 3d 30 20 26 26 20 70 2d 3e 6e  if( n>=0 && p->n
fb40: 53 65 6c 65 63 74 52 6f 77 3e 73 71 6c 69 74 65  SelectRow>sqlite
fb50: 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e 29 20  3LogEst((u64)n) 
fb60: 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 53  ){.        p->nS
fb70: 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74  electRow = sqlit
fb80: 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e 29  e3LogEst((u64)n)
fb90: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 65 6c  ;.        p->sel
fba0: 46 6c 61 67 73 20 7c 3d 20 53 46 5f 46 69 78 65  Flags |= SF_Fixe
fbb0: 64 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 7d 0a  dLimit;.      }.
fbc0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
fbd0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
fbe0: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c 69 6d  (pParse, p->pLim
fbf0: 69 74 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20  it, iLimit);.   
fc00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
fc10: 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42  dOp1(v, OP_MustB
fc20: 65 49 6e 74 2c 20 69 4c 69 6d 69 74 29 3b 20 56  eInt, iLimit); V
fc30: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
fc40: 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
fc50: 74 28 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75  t((v, "LIMIT cou
fc60: 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20 73  nter"));.      s
fc70: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
fc80: 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 69 4c  (v, OP_IfNot, iL
fc90: 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 20 56  imit, iBreak); V
fca0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
fcb0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d      }.    if( p-
fcc0: 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20  >pOffset ){.    
fcd0: 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 69    p->iOffset = i
fce0: 4f 66 66 73 65 74 20 3d 20 2b 2b 70 50 61 72 73  Offset = ++pPars
fcf0: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70  e->nMem;.      p
fd00: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20  Parse->nMem++;  
fd10: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20   /* Allocate an 
fd20: 65 78 74 72 61 20 72 65 67 69 73 74 65 72 20 66  extra register f
fd30: 6f 72 20 6c 69 6d 69 74 2b 6f 66 66 73 65 74 20  or limit+offset 
fd40: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
fd50: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
fd60: 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20 69 4f 66   p->pOffset, iOf
fd70: 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  fset);.      sql
fd80: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
fd90: 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20  , OP_MustBeInt, 
fda0: 69 4f 66 66 73 65 74 29 3b 20 56 64 62 65 43 6f  iOffset); VdbeCo
fdb0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
fdc0: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
fdd0: 20 22 4f 46 46 53 45 54 20 63 6f 75 6e 74 65 72   "OFFSET counter
fde0: 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
fdf0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
fe00: 4f 50 5f 4f 66 66 73 65 74 4c 69 6d 69 74 2c 20  OP_OffsetLimit, 
fe10: 69 4c 69 6d 69 74 2c 20 69 4f 66 66 73 65 74 2b  iLimit, iOffset+
fe20: 31 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20  1, iOffset);.   
fe30: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
fe40: 76 2c 20 22 4c 49 4d 49 54 2b 4f 46 46 53 45 54  v, "LIMIT+OFFSET
fe50: 22 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  "));.    }.  }.}
fe60: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
fe70: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
fe80: 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ELECT./*.** Retu
fe90: 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  rn the appropria
fea0: 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  te collating seq
feb0: 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 69 43  uence for the iC
fec0: 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a  ol-th column of.
fed0: 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ** the result se
fee0: 74 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75  t for the compou
fef0: 6e 64 2d 73 65 6c 65 63 74 20 73 74 61 74 65 6d  nd-select statem
ff00: 65 6e 74 20 22 70 22 2e 20 20 52 65 74 75 72 6e  ent "p".  Return
ff10: 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74 68 65 20   NULL if.** the 
ff20: 63 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f 20 64 65  column has no de
ff30: 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20  fault collating 
ff40: 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20  sequence..**.** 
ff50: 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  The collating se
ff60: 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 63  quence for the c
ff70: 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 69  ompound select i
ff80: 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68 65  s taken from the
ff90: 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65  .** left-most te
ffa0: 72 6d 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  rm of the select
ffb0: 20 74 68 61 74 20 68 61 73 20 61 20 63 6f 6c 6c   that has a coll
ffc0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a  ating sequence..
ffd0: 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53 65  */.static CollSe
ffe0: 71 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f  q *multiSelectCo
fff0: 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61  llSeq(Parse *pPa
10000 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20  rse, Select *p, 
10010 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c  int iCol){.  Col
10020 6c 53 65 71 20 2a 70 52 65 74 3b 0a 20 20 69 66  lSeq *pRet;.  if
10030 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  ( p->pPrior ){. 
10040 20 20 20 70 52 65 74 20 3d 20 6d 75 6c 74 69 53     pRet = multiS
10050 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61  electCollSeq(pPa
10060 72 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20  rse, p->pPrior, 
10070 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  iCol);.  }else{.
10080 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20      pRet = 0;.  
10090 7d 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c  }.  assert( iCol
100a0 3e 3d 30 20 29 3b 0a 20 20 2f 2a 20 69 43 6f 6c  >=0 );.  /* iCol
100b0 20 6d 75 73 74 20 62 65 20 6c 65 73 73 20 74 68   must be less th
100c0 61 6e 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  an p->pEList->nE
100d0 78 70 72 2e 20 20 4f 74 68 65 72 77 69 73 65 20  xpr.  Otherwise 
100e0 61 6e 20 65 72 72 6f 72 20 77 6f 75 6c 64 0a 20  an error would. 
100f0 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 74 68   ** have been th
10100 72 6f 77 6e 20 64 75 72 69 6e 67 20 6e 61 6d 65  rown during name
10110 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6e 64 20   resolution and 
10120 77 65 20 77 6f 75 6c 64 20 6e 6f 74 20 68 61 76  we would not hav
10130 65 20 67 6f 74 74 65 6e 0a 20 20 2a 2a 20 74 68  e gotten.  ** th
10140 69 73 20 66 61 72 20 2a 2f 0a 20 20 69 66 28 20  is far */.  if( 
10150 70 52 65 74 3d 3d 30 20 26 26 20 41 4c 57 41 59  pRet==0 && ALWAY
10160 53 28 69 43 6f 6c 3c 70 2d 3e 70 45 4c 69 73 74  S(iCol<p->pEList
10170 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ->nExpr) ){.    
10180 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78  pRet = sqlite3Ex
10190 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
101a0 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69  , p->pEList->a[i
101b0 43 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d  Col].pExpr);.  }
101c0 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
101d0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c  }../*.** The sel
101e0 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61  ect statement pa
101f0 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
10200 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nd parameter is 
10210 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  a compound SELEC
10220 54 0a 2a 2a 20 77 69 74 68 20 61 6e 20 4f 52 44  T.** with an ORD
10230 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 54 68  ER BY clause. Th
10240 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f  is function allo
10250 63 61 74 65 73 20 61 6e 64 20 72 65 74 75 72 6e  cates and return
10260 73 20 61 20 4b 65 79 49 6e 66 6f 0a 2a 2a 20 73  s a KeyInfo.** s
10270 74 72 75 63 74 75 72 65 20 73 75 69 74 61 62 6c  tructure suitabl
10280 65 20 66 6f 72 20 69 6d 70 6c 65 6d 65 6e 74 69  e for implementi
10290 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42 59 2e  ng the ORDER BY.
102a0 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20  .**.** Space to 
102b0 68 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e 66 6f  hold the KeyInfo
102c0 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6f 62   structure is ob
102d0 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c  tained from mall
102e0 6f 63 2e 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a  oc. The calling.
102f0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72  ** function is r
10300 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 65  esponsible for e
10310 6e 73 75 72 69 6e 67 20 74 68 61 74 20 74 68 69  nsuring that thi
10320 73 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65  s structure is e
10330 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72 65  ventually.** fre
10340 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65  ed..*/.static Ke
10350 79 49 6e 66 6f 20 2a 6d 75 6c 74 69 53 65 6c 65  yInfo *multiSele
10360 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e 66 6f  ctOrderByKeyInfo
10370 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
10380 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 6e  Select *p, int n
10390 45 78 74 72 61 29 7b 0a 20 20 45 78 70 72 4c 69  Extra){.  ExprLi
103a0 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70  st *pOrderBy = p
103b0 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e  ->pOrderBy;.  in
103c0 74 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e  t nOrderBy = p->
103d0 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
103e0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
103f0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4b   pParse->db;.  K
10400 65 79 49 6e 66 6f 20 2a 70 52 65 74 20 3d 20 73  eyInfo *pRet = s
10410 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c  qlite3KeyInfoAll
10420 6f 63 28 64 62 2c 20 6e 4f 72 64 65 72 42 79 2b  oc(db, nOrderBy+
10430 6e 45 78 74 72 61 2c 20 31 29 3b 0a 20 20 69 66  nExtra, 1);.  if
10440 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 69 6e  ( pRet ){.    in
10450 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
10460 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b  ; i<nOrderBy; i+
10470 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74  +){.      struct
10480 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
10490 70 49 74 65 6d 20 3d 20 26 70 4f 72 64 65 72 42  pItem = &pOrderB
104a0 79 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 45  y->a[i];.      E
104b0 78 70 72 20 2a 70 54 65 72 6d 20 3d 20 70 49 74  xpr *pTerm = pIt
104c0 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  em->pExpr;.     
104d0 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
104e0 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ..      if( pTer
104f0 6d 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f  m->flags & EP_Co
10500 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20  llate ){.       
10510 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
10520 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
10530 73 65 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20  se, pTerm);.    
10540 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
10550 20 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65   pColl = multiSe
10560 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72  lectCollSeq(pPar
10570 73 65 2c 20 70 2c 20 70 49 74 65 6d 2d 3e 75 2e  se, p, pItem->u.
10580 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 2d 31 29  x.iOrderByCol-1)
10590 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43  ;.        if( pC
105a0 6f 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c 20 3d  oll==0 ) pColl =
105b0 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a   db->pDfltColl;.
105c0 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79          pOrderBy
105d0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 0a 20  ->a[i].pExpr =. 
105e0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
105f0 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 53 74  ExprAddCollateSt
10600 72 69 6e 67 28 70 50 61 72 73 65 2c 20 70 54 65  ring(pParse, pTe
10610 72 6d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  rm, pColl->zName
10620 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
10630 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
10640 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62  KeyInfoIsWriteab
10650 6c 65 28 70 52 65 74 29 20 29 3b 0a 20 20 20 20  le(pRet) );.    
10660 20 20 70 52 65 74 2d 3e 61 43 6f 6c 6c 5b 69 5d    pRet->aColl[i]
10670 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20   = pColl;.      
10680 70 52 65 74 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pRet->aSortOrder
10690 5b 69 5d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  [i] = pOrderBy->
106a0 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a  a[i].sortOrder;.
106b0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
106c0 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23 69 66  urn pRet;.}..#if
106d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
106e0 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  _CTE./*.** This 
106f0 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65  routine generate
10700 73 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20 63  s VDBE code to c
10710 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6e 74 65  ompute the conte
10720 6e 74 20 6f 66 20 61 20 57 49 54 48 20 52 45 43  nt of a WITH REC
10730 55 52 53 49 56 45 0a 2a 2a 20 71 75 65 72 79 20  URSIVE.** query 
10740 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a  of the form:.**.
10750 2a 2a 20 20 20 3c 72 65 63 75 72 73 69 76 65 2d  **   <recursive-
10760 74 61 62 6c 65 3e 20 41 53 20 28 3c 73 65 74 75  table> AS (<setu
10770 70 2d 71 75 65 72 79 3e 20 55 4e 49 4f 4e 20 5b  p-query> UNION [
10780 41 4c 4c 5d 20 3c 72 65 63 75 72 73 69 76 65 2d  ALL] <recursive-
10790 71 75 65 72 79 3e 29 0a 2a 2a 20 20 20 20 20 20  query>).**      
107a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
107b0 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f     \___________/
107c0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f               \__
107d0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a  _____________/.*
107e0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
107f0 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70              p->p
10800 50 72 69 6f 72 20 20 20 20 20 20 20 20 20 20 20  Prior           
10810 20 20 20 20 20 20 20 20 20 20 20 70 0a 2a 2a 0a             p.**.
10820 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 65  **.** There is e
10830 78 61 63 74 6c 79 20 6f 6e 65 20 72 65 66 65 72  xactly one refer
10840 65 6e 63 65 20 74 6f 20 74 68 65 20 72 65 63 75  ence to the recu
10850 72 73 69 76 65 2d 74 61 62 6c 65 20 69 6e 20 74  rsive-table in t
10860 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a  he FROM clause.*
10870 2a 20 6f 66 20 72 65 63 75 72 73 69 76 65 2d 71  * of recursive-q
10880 75 65 72 79 2c 20 6d 61 72 6b 65 64 20 77 69 74  uery, marked wit
10890 68 20 74 68 65 20 53 72 63 4c 69 73 74 2d 3e 61  h the SrcList->a
108a0 5b 5d 2e 66 67 2e 69 73 52 65 63 75 72 73 69 76  [].fg.isRecursiv
108b0 65 20 66 6c 61 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  e flag..**.** Th
108c0 65 20 73 65 74 75 70 2d 71 75 65 72 79 20 72 75  e setup-query ru
108d0 6e 73 20 6f 6e 63 65 20 74 6f 20 67 65 6e 65 72  ns once to gener
108e0 61 74 65 20 61 6e 20 69 6e 69 74 69 61 6c 20 73  ate an initial s
108f0 65 74 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20  et of rows that 
10900 67 6f 0a 2a 2a 20 69 6e 74 6f 20 61 20 51 75 65  go.** into a Que
10910 75 65 20 74 61 62 6c 65 2e 20 20 52 6f 77 73 20  ue table.  Rows 
10920 61 72 65 20 65 78 74 72 61 63 74 65 64 20 66 72  are extracted fr
10930 6f 6d 20 74 68 65 20 51 75 65 75 65 20 74 61 62  om the Queue tab
10940 6c 65 20 6f 6e 65 20 62 79 0a 2a 2a 20 6f 6e 65  le one by.** one
10950 2e 20 20 45 61 63 68 20 72 6f 77 20 65 78 74 72  .  Each row extr
10960 61 63 74 65 64 20 66 72 6f 6d 20 51 75 65 75 65  acted from Queue
10970 20 69 73 20 6f 75 74 70 75 74 20 74 6f 20 70 44   is output to pD
10980 65 73 74 2e 20 20 54 68 65 6e 20 74 68 65 20 73  est.  Then the s
10990 69 6e 67 6c 65 0a 2a 2a 20 65 78 74 72 61 63 74  ingle.** extract
109a0 65 64 20 72 6f 77 20 28 6e 6f 77 20 69 6e 20 74  ed row (now in t
109b0 68 65 20 69 43 75 72 72 65 6e 74 20 74 61 62 6c  he iCurrent tabl
109c0 65 29 20 62 65 63 6f 6d 65 73 20 74 68 65 20 63  e) becomes the c
109d0 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 0a 2a 2a  ontent of the.**
109e0 20 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65   recursive-table
109f0 20 66 6f 72 20 61 20 72 65 63 75 72 73 69 76 65   for a recursive
10a00 2d 71 75 65 72 79 20 72 75 6e 2e 20 20 54 68 65  -query run.  The
10a10 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20 72   output of the r
10a20 65 63 75 72 73 69 76 65 2d 71 75 65 72 79 0a 2a  ecursive-query.*
10a30 2a 20 69 73 20 61 64 64 65 64 20 62 61 63 6b 20  * is added back 
10a40 69 6e 74 6f 20 74 68 65 20 51 75 65 75 65 20 74  into the Queue t
10a50 61 62 6c 65 2e 20 20 54 68 65 6e 20 61 6e 6f 74  able.  Then anot
10a60 68 65 72 20 72 6f 77 20 69 73 20 65 78 74 72 61  her row is extra
10a70 63 74 65 64 20 66 72 6f 6d 20 51 75 65 75 65 0a  cted from Queue.
10a80 2a 2a 20 61 6e 64 20 74 68 65 20 69 74 65 72 61  ** and the itera
10a90 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 20 75  tion continues u
10aa0 6e 74 69 6c 20 74 68 65 20 51 75 65 75 65 20 74  ntil the Queue t
10ab0 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  able is empty..*
10ac0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 70  *.** If the comp
10ad0 6f 75 6e 64 20 71 75 65 72 79 20 6f 70 65 72 61  ound query opera
10ae0 74 6f 72 20 69 73 20 55 4e 49 4f 4e 20 74 68 65  tor is UNION the
10af0 6e 20 6e 6f 20 64 75 70 6c 69 63 61 74 65 20 72  n no duplicate r
10b00 6f 77 73 20 61 72 65 20 65 76 65 72 0a 2a 2a 20  ows are ever.** 
10b10 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68  inserted into th
10b20 65 20 51 75 65 75 65 20 74 61 62 6c 65 2e 20 20  e Queue table.  
10b30 54 68 65 20 69 44 69 73 74 69 6e 63 74 20 74 61  The iDistinct ta
10b40 62 6c 65 20 6b 65 65 70 73 20 61 20 63 6f 70 79  ble keeps a copy
10b50 20 6f 66 20 61 6c 6c 20 72 6f 77 73 0a 2a 2a 20   of all rows.** 
10b60 74 68 61 74 20 68 61 76 65 20 65 76 65 72 20 62  that have ever b
10b70 65 65 6e 20 69 6e 73 65 72 74 65 64 20 69 6e 74  een inserted int
10b80 6f 20 51 75 65 75 65 20 61 6e 64 20 63 61 75 73  o Queue and caus
10b90 65 73 20 64 75 70 6c 69 63 61 74 65 73 20 74 6f  es duplicates to
10ba0 20 62 65 0a 2a 2a 20 64 69 73 63 61 72 64 65 64   be.** discarded
10bb0 2e 20 20 49 66 20 74 68 65 20 6f 70 65 72 61 74  .  If the operat
10bc0 6f 72 20 69 73 20 55 4e 49 4f 4e 20 41 4c 4c 2c  or is UNION ALL,
10bd0 20 74 68 65 6e 20 64 75 70 6c 69 63 61 74 65 73   then duplicates
10be0 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2a   are allowed..**
10bf0 20 0a 2a 2a 20 49 66 20 74 68 65 20 71 75 65 72   .** If the quer
10c00 79 20 68 61 73 20 61 6e 20 4f 52 44 45 52 20 42  y has an ORDER B
10c10 59 2c 20 74 68 65 6e 20 65 6e 74 72 69 65 73 20  Y, then entries 
10c20 69 6e 20 74 68 65 20 51 75 65 75 65 20 74 61 62  in the Queue tab
10c30 6c 65 20 61 72 65 20 6b 65 70 74 20 69 6e 0a 2a  le are kept in.*
10c40 2a 20 4f 52 44 45 52 20 42 59 20 6f 72 64 65 72  * ORDER BY order
10c50 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20 65   and the first e
10c60 6e 74 72 79 20 69 73 20 65 78 74 72 61 63 74 65  ntry is extracte
10c70 64 20 66 6f 72 20 65 61 63 68 20 63 79 63 6c 65  d for each cycle
10c80 2e 20 20 57 69 74 68 6f 75 74 0a 2a 2a 20 61 6e  .  Without.** an
10c90 20 4f 52 44 45 52 20 42 59 2c 20 74 68 65 20 51   ORDER BY, the Q
10ca0 75 65 75 65 20 74 61 62 6c 65 20 69 73 20 6a 75  ueue table is ju
10cb0 73 74 20 61 20 46 49 46 4f 2e 0a 2a 2a 0a 2a 2a  st a FIFO..**.**
10cc0 20 49 66 20 61 20 4c 49 4d 49 54 20 63 6c 61 75   If a LIMIT clau
10cd0 73 65 20 69 73 20 70 72 6f 76 69 64 65 64 2c 20  se is provided, 
10ce0 74 68 65 6e 20 74 68 65 20 69 74 65 72 61 74 69  then the iterati
10cf0 6f 6e 20 73 74 6f 70 73 20 61 66 74 65 72 20 4c  on stops after L
10d00 49 4d 49 54 20 72 6f 77 73 0a 2a 2a 20 68 61 76  IMIT rows.** hav
10d10 65 20 62 65 65 6e 20 6f 75 74 70 75 74 20 74 6f  e been output to
10d20 20 70 44 65 73 74 2e 20 20 41 20 4c 49 4d 49 54   pDest.  A LIMIT
10d30 20 6f 66 20 7a 65 72 6f 20 6d 65 61 6e 73 20 74   of zero means t
10d40 6f 20 6f 75 74 70 75 74 20 6e 6f 20 72 6f 77 73  o output no rows
10d50 20 61 6e 64 20 61 0a 2a 2a 20 6e 65 67 61 74 69   and a.** negati
10d60 76 65 20 4c 49 4d 49 54 20 6d 65 61 6e 73 20 74  ve LIMIT means t
10d70 6f 20 6f 75 74 70 75 74 20 61 6c 6c 20 72 6f 77  o output all row
10d80 73 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20  s.  If there is 
10d90 61 6c 73 6f 20 61 6e 20 4f 46 46 53 45 54 20 63  also an OFFSET c
10da0 6c 61 75 73 65 0a 2a 2a 20 77 69 74 68 20 61 20  lause.** with a 
10db0 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65 2c 20  positive value, 
10dc0 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 4f  then the first O
10dd0 46 46 53 45 54 20 6f 75 74 70 75 74 73 20 61 72  FFSET outputs ar
10de0 65 20 64 69 73 63 61 72 64 65 64 20 72 61 74 68  e discarded rath
10df0 65 72 0a 2a 2a 20 74 68 61 6e 20 62 65 69 6e 67  er.** than being
10e00 20 73 65 6e 74 20 74 6f 20 70 44 65 73 74 2e 20   sent to pDest. 
10e10 20 54 68 65 20 4c 49 4d 49 54 20 63 6f 75 6e 74   The LIMIT count
10e20 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20   does not begin 
10e30 75 6e 74 69 6c 20 61 66 74 65 72 20 4f 46 46 53  until after OFFS
10e40 45 54 0a 2a 2a 20 72 6f 77 73 20 68 61 76 65 20  ET.** rows have 
10e50 62 65 65 6e 20 73 6b 69 70 70 65 64 2e 0a 2a 2f  been skipped..*/
10e60 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e  .static void gen
10e70 65 72 61 74 65 57 69 74 68 52 65 63 75 72 73 69  erateWithRecursi
10e80 76 65 51 75 65 72 79 28 0a 20 20 50 61 72 73 65  veQuery(.  Parse
10e90 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
10ea0 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
10eb0 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
10ec0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
10ed0 2a 20 54 68 65 20 72 65 63 75 72 73 69 76 65 20  * The recursive 
10ee0 53 45 4c 45 43 54 20 74 6f 20 62 65 20 63 6f 64  SELECT to be cod
10ef0 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ed */.  SelectDe
10f00 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a  st *pDest     /*
10f10 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
10f20 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
10f30 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a  /.){.  SrcList *
10f40 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 20  pSrc = p->pSrc; 
10f50 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d       /* The FROM
10f60 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 72   clause of the r
10f70 65 63 75 72 73 69 76 65 20 71 75 65 72 79 20 2a  ecursive query *
10f80 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70  /.  int nCol = p
10f90 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  ->pEList->nExpr;
10fa0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
10fb0 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
10fc0 63 75 72 73 69 76 65 20 74 61 62 6c 65 20 2a 2f  cursive table */
10fd0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
10fe0 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20  rse->pVdbe;     
10ff0 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65 64   /* The prepared
11000 20 73 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72   statement under
11010 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
11020 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 74 75  .  Select *pSetu
11030 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 20 20  p = p->pPrior;  
11040 20 2f 2a 20 54 68 65 20 73 65 74 75 70 20 71 75   /* The setup qu
11050 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ery */.  int add
11060 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  rTop;           
11070 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66         /* Top of
11080 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69   the loop */.  i
11090 6e 74 20 61 64 64 72 43 6f 6e 74 2c 20 61 64 64  nt addrCont, add
110a0 72 42 72 65 61 6b 3b 20 20 20 20 20 20 2f 2a 20  rBreak;      /* 
110b0 43 4f 4e 54 49 4e 55 45 20 61 6e 64 20 42 52 45  CONTINUE and BRE
110c0 41 4b 20 61 64 64 72 65 73 73 65 73 20 2a 2f 0a  AK addresses */.
110d0 20 20 69 6e 74 20 69 43 75 72 72 65 6e 74 20 3d    int iCurrent =
110e0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
110f0 2f 2a 20 54 68 65 20 43 75 72 72 65 6e 74 20 74  /* The Current t
11100 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  able */.  int re
11110 67 43 75 72 72 65 6e 74 3b 20 20 20 20 20 20 20  gCurrent;       
11120 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
11130 74 65 72 20 68 6f 6c 64 69 6e 67 20 43 75 72 72  ter holding Curr
11140 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  ent table */.  i
11150 6e 74 20 69 51 75 65 75 65 3b 20 20 20 20 20 20  nt iQueue;      
11160 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11170 54 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20  The Queue table 
11180 2a 2f 0a 20 20 69 6e 74 20 69 44 69 73 74 69 6e  */.  int iDistin
11190 63 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ct = 0;         
111a0 20 20 20 2f 2a 20 54 6f 20 65 6e 73 75 72 65 20     /* To ensure 
111b0 75 6e 69 71 75 65 20 72 65 73 75 6c 74 73 20 69  unique results i
111c0 66 20 55 4e 49 4f 4e 20 2a 2f 0a 20 20 69 6e 74  f UNION */.  int
111d0 20 65 44 65 73 74 20 3d 20 53 52 54 5f 46 69 66   eDest = SRT_Fif
111e0 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f  o;         /* Ho
111f0 77 20 74 6f 20 77 72 69 74 65 20 74 6f 20 51 75  w to write to Qu
11200 65 75 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  eue */.  SelectD
11210 65 73 74 20 64 65 73 74 51 75 65 75 65 3b 20 20  est destQueue;  
11220 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74         /* Select
11230 44 65 73 74 20 74 61 72 67 65 74 74 69 6e 67 20  Dest targetting 
11240 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20  the Queue table 
11250 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
11260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11270 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
11280 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  er */.  int rc; 
11290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112a0 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
112b0 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  code */.  ExprLi
112c0 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20  st *pOrderBy;   
112d0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f          /* The O
112e0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
112f0 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74  /.  Expr *pLimit
11300 2c 20 2a 70 4f 66 66 73 65 74 3b 20 20 20 20 20  , *pOffset;     
11310 20 20 2f 2a 20 53 61 76 65 64 20 4c 49 4d 49 54    /* Saved LIMIT
11320 20 61 6e 64 20 4f 46 46 53 45 54 20 2a 2f 0a 20   and OFFSET */. 
11330 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 2c 20 72   int regLimit, r
11340 65 67 4f 66 66 73 65 74 3b 20 20 20 20 20 20 2f  egOffset;      /
11350 2a 20 52 65 67 69 73 74 65 72 73 20 75 73 65 64  * Registers used
11360 20 62 79 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46   by LIMIT and OF
11370 46 53 45 54 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 62  FSET */..  /* Ob
11380 74 61 69 6e 20 61 75 74 68 6f 72 69 7a 61 74 69  tain authorizati
11390 6f 6e 20 74 6f 20 64 6f 20 61 20 72 65 63 75 72  on to do a recur
113a0 73 69 76 65 20 71 75 65 72 79 20 2a 2f 0a 20 20  sive query */.  
113b0 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
113c0 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
113d0 49 54 45 5f 52 45 43 55 52 53 49 56 45 2c 20 30  ITE_RECURSIVE, 0
113e0 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e  , 0, 0) ) return
113f0 3b 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20  ;..  /* Process 
11400 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46  the LIMIT and OF
11410 46 53 45 54 20 63 6c 61 75 73 65 73 2c 20 69 66  FSET clauses, if
11420 20 74 68 65 79 20 65 78 69 73 74 20 2a 2f 0a 20   they exist */. 
11430 20 61 64 64 72 42 72 65 61 6b 20 3d 20 73 71 6c   addrBreak = sql
11440 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
11450 6c 28 76 29 3b 0a 20 20 63 6f 6d 70 75 74 65 4c  l(v);.  computeL
11460 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
11470 61 72 73 65 2c 20 70 2c 20 61 64 64 72 42 72 65  arse, p, addrBre
11480 61 6b 29 3b 0a 20 20 70 4c 69 6d 69 74 20 3d 20  ak);.  pLimit = 
11490 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 70 4f 66  p->pLimit;.  pOf
114a0 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65  fset = p->pOffse
114b0 74 3b 0a 20 20 72 65 67 4c 69 6d 69 74 20 3d 20  t;.  regLimit = 
114c0 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 72 65 67  p->iLimit;.  reg
114d0 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66  Offset = p->iOff
114e0 73 65 74 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74  set;.  p->pLimit
114f0 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20   = p->pOffset = 
11500 30 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d  0;.  p->iLimit =
11510 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b   p->iOffset = 0;
11520 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d  .  pOrderBy = p-
11530 3e 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a  >pOrderBy;..  /*
11540 20 4c 6f 63 61 74 65 20 74 68 65 20 63 75 72 73   Locate the curs
11550 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  or number of the
11560 20 43 75 72 72 65 6e 74 20 74 61 62 6c 65 20 2a   Current table *
11570 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 41 4c 57  /.  for(i=0; ALW
11580 41 59 53 28 69 3c 70 53 72 63 2d 3e 6e 53 72 63  AYS(i<pSrc->nSrc
11590 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ); i++){.    if(
115a0 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 66 67 2e 69   pSrc->a[i].fg.i
115b0 73 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20  sRecursive ){.  
115c0 20 20 20 20 69 43 75 72 72 65 6e 74 20 3d 20 70      iCurrent = p
115d0 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f  Src->a[i].iCurso
115e0 72 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  r;.      break;.
115f0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
11600 41 6c 6c 6f 63 61 74 65 20 63 75 72 73 6f 72 73  Allocate cursors
11610 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 51 75 65   numbers for Que
11620 75 65 20 61 6e 64 20 44 69 73 74 69 6e 63 74 2e  ue and Distinct.
11630 20 20 54 68 65 20 63 75 72 73 6f 72 20 6e 75 6d    The cursor num
11640 62 65 72 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65  ber for.  ** the
11650 20 44 69 73 74 69 6e 63 74 20 74 61 62 6c 65 20   Distinct table 
11660 6d 75 73 74 20 62 65 20 65 78 61 63 74 6c 79 20  must be exactly 
11670 6f 6e 65 20 67 72 65 61 74 65 72 20 74 68 61 6e  one greater than
11680 20 51 75 65 75 65 20 69 6e 20 6f 72 64 65 72 0a   Queue in order.
11690 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 53 52 54    ** for the SRT
116a0 5f 44 69 73 74 46 69 66 6f 20 61 6e 64 20 53 52  _DistFifo and SR
116b0 54 5f 44 69 73 74 51 75 65 75 65 20 64 65 73 74  T_DistQueue dest
116c0 69 6e 61 74 69 6f 6e 73 20 74 6f 20 77 6f 72 6b  inations to work
116d0 2e 20 2a 2f 0a 20 20 69 51 75 65 75 65 20 3d 20  . */.  iQueue = 
116e0 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
116f0 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
11700 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 65 44 65  UNION ){.    eDe
11710 73 74 20 3d 20 70 4f 72 64 65 72 42 79 20 3f 20  st = pOrderBy ? 
11720 53 52 54 5f 44 69 73 74 51 75 65 75 65 20 3a 20  SRT_DistQueue : 
11730 53 52 54 5f 44 69 73 74 46 69 66 6f 3b 0a 20 20  SRT_DistFifo;.  
11740 20 20 69 44 69 73 74 69 6e 63 74 20 3d 20 70 50    iDistinct = pP
11750 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
11760 7d 65 6c 73 65 7b 0a 20 20 20 20 65 44 65 73 74  }else{.    eDest
11770 20 3d 20 70 4f 72 64 65 72 42 79 20 3f 20 53 52   = pOrderBy ? SR
11780 54 5f 51 75 65 75 65 20 3a 20 53 52 54 5f 46 69  T_Queue : SRT_Fi
11790 66 6f 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  fo;.  }.  sqlite
117a0 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
117b0 26 64 65 73 74 51 75 65 75 65 2c 20 65 44 65 73  &destQueue, eDes
117c0 74 2c 20 69 51 75 65 75 65 29 3b 0a 0a 20 20 2f  t, iQueue);..  /
117d0 2a 20 41 6c 6c 6f 63 61 74 65 20 63 75 72 73 6f  * Allocate curso
117e0 72 73 20 66 6f 72 20 43 75 72 72 65 6e 74 2c 20  rs for Current, 
117f0 51 75 65 75 65 2c 20 61 6e 64 20 44 69 73 74 69  Queue, and Disti
11800 6e 63 74 2e 20 2a 2f 0a 20 20 72 65 67 43 75 72  nct. */.  regCur
11810 72 65 6e 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  rent = ++pParse-
11820 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33  >nMem;.  sqlite3
11830 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
11840 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 69 43 75  _OpenPseudo, iCu
11850 72 72 65 6e 74 2c 20 72 65 67 43 75 72 72 65 6e  rrent, regCurren
11860 74 2c 20 6e 43 6f 6c 29 3b 0a 20 20 69 66 28 20  t, nCol);.  if( 
11870 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
11880 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
11890 6f 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  o = multiSelectO
118a0 72 64 65 72 42 79 4b 65 79 49 6e 66 6f 28 70 50  rderByKeyInfo(pP
118b0 61 72 73 65 2c 20 70 2c 20 31 29 3b 0a 20 20 20  arse, p, 1);.   
118c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
118d0 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p4(v, OP_OpenEph
118e0 65 6d 65 72 61 6c 2c 20 69 51 75 65 75 65 2c 20  emeral, iQueue, 
118f0 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b  pOrderBy->nExpr+
11900 32 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  2, 0,.          
11910 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
11920 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f  r*)pKeyInfo, P4_
11930 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 64 65  KEYINFO);.    de
11940 73 74 51 75 65 75 65 2e 70 4f 72 64 65 72 42 79  stQueue.pOrderBy
11950 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 7d   = pOrderBy;.  }
11960 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
11970 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
11980 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
11990 20 69 51 75 65 75 65 2c 20 6e 43 6f 6c 29 3b 0a   iQueue, nCol);.
119a0 20 20 7d 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e    }.  VdbeCommen
119b0 74 28 28 76 2c 20 22 51 75 65 75 65 20 74 61 62  t((v, "Queue tab
119c0 6c 65 22 29 29 3b 0a 20 20 69 66 28 20 69 44 69  le"));.  if( iDi
119d0 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 70 2d  stinct ){.    p-
119e0 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
119f0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
11a00 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
11a10 70 68 65 6d 65 72 61 6c 2c 20 69 44 69 73 74 69  phemeral, iDisti
11a20 6e 63 74 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e  nct, 0);.    p->
11a30 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55  selFlags |= SF_U
11a40 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20  sesEphemeral;.  
11a50 7d 0a 0a 20 20 2f 2a 20 44 65 74 61 63 68 20 74  }..  /* Detach t
11a60 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
11a70 73 65 20 66 72 6f 6d 20 74 68 65 20 63 6f 6d 70  se from the comp
11a80 6f 75 6e 64 20 53 45 4c 45 43 54 20 2a 2f 0a 20  ound SELECT */. 
11a90 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30   p->pOrderBy = 0
11aa0 3b 0a 0a 20 20 2f 2a 20 53 74 6f 72 65 20 74 68  ;..  /* Store th
11ab0 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  e results of the
11ac0 20 73 65 74 75 70 2d 71 75 65 72 79 20 69 6e 20   setup-query in 
11ad0 51 75 65 75 65 2e 20 2a 2f 0a 20 20 70 53 65 74  Queue. */.  pSet
11ae0 75 70 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20  up->pNext = 0;. 
11af0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
11b00 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 74  ect(pParse, pSet
11b10 75 70 2c 20 26 64 65 73 74 51 75 65 75 65 29 3b  up, &destQueue);
11b20 0a 20 20 70 53 65 74 75 70 2d 3e 70 4e 65 78 74  .  pSetup->pNext
11b30 20 3d 20 70 3b 0a 20 20 69 66 28 20 72 63 20 29   = p;.  if( rc )
11b40 20 67 6f 74 6f 20 65 6e 64 5f 6f 66 5f 72 65 63   goto end_of_rec
11b50 75 72 73 69 76 65 5f 71 75 65 72 79 3b 0a 0a 20  ursive_query;.. 
11b60 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 6e 65 78   /* Find the nex
11b70 74 20 72 6f 77 20 69 6e 20 74 68 65 20 51 75 65  t row in the Que
11b80 75 65 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68  ue and output th
11b90 61 74 20 72 6f 77 20 2a 2f 0a 20 20 61 64 64 72  at row */.  addr
11ba0 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Top = sqlite3Vdb
11bb0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
11bc0 77 69 6e 64 2c 20 69 51 75 65 75 65 2c 20 61 64  wind, iQueue, ad
11bd0 64 72 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f  drBreak); VdbeCo
11be0 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a  verage(v);..  /*
11bf0 20 54 72 61 6e 73 66 65 72 20 74 68 65 20 6e 65   Transfer the ne
11c00 78 74 20 72 6f 77 20 69 6e 20 51 75 65 75 65 20  xt row in Queue 
11c10 6f 76 65 72 20 74 6f 20 43 75 72 72 65 6e 74 20  over to Current 
11c20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
11c30 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp1(v, OP_Nul
11c40 6c 52 6f 77 2c 20 69 43 75 72 72 65 6e 74 29 3b  lRow, iCurrent);
11c50 20 2f 2a 20 54 6f 20 72 65 73 65 74 20 63 6f 6c   /* To reset col
11c60 75 6d 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20 69  umn cache */.  i
11c70 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
11c80 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11c90 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
11ca0 6e 2c 20 69 51 75 65 75 65 2c 20 70 4f 72 64 65  n, iQueue, pOrde
11cb0 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2c 20 72 65  rBy->nExpr+1, re
11cc0 67 43 75 72 72 65 6e 74 29 3b 0a 20 20 7d 65 6c  gCurrent);.  }el
11cd0 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  se{.    sqlite3V
11ce0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
11cf0 52 6f 77 44 61 74 61 2c 20 69 51 75 65 75 65 2c  RowData, iQueue,
11d00 20 72 65 67 43 75 72 72 65 6e 74 29 3b 0a 20 20   regCurrent);.  
11d10 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
11d20 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65  ddOp1(v, OP_Dele
11d30 74 65 2c 20 69 51 75 65 75 65 29 3b 0a 0a 20 20  te, iQueue);..  
11d40 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 73 69  /* Output the si
11d50 6e 67 6c 65 20 72 6f 77 20 69 6e 20 43 75 72 72  ngle row in Curr
11d60 65 6e 74 20 2a 2f 0a 20 20 61 64 64 72 43 6f 6e  ent */.  addrCon
11d70 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
11d80 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 63  akeLabel(v);.  c
11d90 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 72 65 67  odeOffset(v, reg
11da0 4f 66 66 73 65 74 2c 20 61 64 64 72 43 6f 6e 74  Offset, addrCont
11db0 29 3b 0a 20 20 73 65 6c 65 63 74 49 6e 6e 65 72  );.  selectInner
11dc0 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
11dd0 70 2d 3e 70 45 4c 69 73 74 2c 20 69 43 75 72 72  p->pEList, iCurr
11de0 65 6e 74 2c 0a 20 20 20 20 20 20 30 2c 20 30 2c  ent,.      0, 0,
11df0 20 70 44 65 73 74 2c 20 61 64 64 72 43 6f 6e 74   pDest, addrCont
11e00 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20  , addrBreak);.  
11e10 69 66 28 20 72 65 67 4c 69 6d 69 74 20 29 7b 0a  if( regLimit ){.
11e20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11e30 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63 72  ddOp2(v, OP_Decr
11e40 4a 75 6d 70 5a 65 72 6f 2c 20 72 65 67 4c 69 6d  JumpZero, regLim
11e50 69 74 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a  it, addrBreak);.
11e60 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
11e70 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  (v);.  }.  sqlit
11e80 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
11e90 65 6c 28 76 2c 20 61 64 64 72 43 6f 6e 74 29 3b  el(v, addrCont);
11ea0 0a 0a 20 20 2f 2a 20 45 78 65 63 75 74 65 20 74  ..  /* Execute t
11eb0 68 65 20 72 65 63 75 72 73 69 76 65 20 53 45 4c  he recursive SEL
11ec0 45 43 54 20 74 61 6b 69 6e 67 20 74 68 65 20 73  ECT taking the s
11ed0 69 6e 67 6c 65 20 72 6f 77 20 69 6e 20 43 75 72  ingle row in Cur
11ee0 72 65 6e 74 20 61 73 0a 20 20 2a 2a 20 74 68 65  rent as.  ** the
11ef0 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 72   value for the r
11f00 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65 2e 20  ecursive-table. 
11f10 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  Store the result
11f20 73 20 69 6e 20 74 68 65 20 51 75 65 75 65 2e 0a  s in the Queue..
11f30 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65    */.  if( p->se
11f40 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72  lFlags & SF_Aggr
11f50 65 67 61 74 65 20 29 7b 0a 20 20 20 20 73 71 6c  egate ){.    sql
11f60 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
11f70 72 73 65 2c 20 22 72 65 63 75 72 73 69 76 65 20  rse, "recursive 
11f80 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65  aggregate querie
11f90 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22  s not supported"
11fa0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
11fb0 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
11fc0 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
11fd0 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73  (pParse, p, &des
11fe0 74 51 75 65 75 65 29 3b 0a 20 20 20 20 61 73 73  tQueue);.    ass
11ff0 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d  ert( p->pPrior==
12000 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69  0 );.    p->pPri
12010 6f 72 20 3d 20 70 53 65 74 75 70 3b 0a 20 20 7d  or = pSetup;.  }
12020 0a 0a 20 20 2f 2a 20 4b 65 65 70 20 72 75 6e 6e  ..  /* Keep runn
12030 69 6e 67 20 74 68 65 20 6c 6f 6f 70 20 75 6e 74  ing the loop unt
12040 69 6c 20 74 68 65 20 51 75 65 75 65 20 69 73 20  il the Queue is 
12050 65 6d 70 74 79 20 2a 2f 0a 20 20 73 71 6c 69 74  empty */.  sqlit
12060 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64  e3VdbeGoto(v, ad
12070 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c 69 74 65  drTop);.  sqlite
12080 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
12090 6c 28 76 2c 20 61 64 64 72 42 72 65 61 6b 29 3b  l(v, addrBreak);
120a0 0a 0a 65 6e 64 5f 6f 66 5f 72 65 63 75 72 73 69  ..end_of_recursi
120b0 76 65 5f 71 75 65 72 79 3a 0a 20 20 73 71 6c 69  ve_query:.  sqli
120c0 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
120d0 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d  e(pParse->db, p-
120e0 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 70 2d  >pOrderBy);.  p-
120f0 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  >pOrderBy = pOrd
12100 65 72 42 79 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69  erBy;.  p->pLimi
12110 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 70 2d  t = pLimit;.  p-
12120 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73  >pOffset = pOffs
12130 65 74 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  et;.  return;.}.
12140 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
12150 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a 2f 2a  _OMIT_CTE */../*
12160 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
12170 63 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ces */.static in
12180 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64  t multiSelectOrd
12190 65 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70  erBy(.  Parse *p
121a0 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
121b0 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
121c0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
121d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
121e0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66  he right-most of
121f0 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63   SELECTs to be c
12200 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74  oded */.  Select
12210 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20  Dest *pDest     
12220 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
12230 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  th query results
12240 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 48 61   */.);../*.** Ha
12250 6e 64 6c 65 20 74 68 65 20 73 70 65 63 69 61 6c  ndle the special
12260 20 63 61 73 65 20 6f 66 20 61 20 63 6f 6d 70 6f   case of a compo
12270 75 6e 64 2d 73 65 6c 65 63 74 20 74 68 61 74 20  und-select that 
12280 6f 72 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 20  originates from 
12290 61 0a 2a 2a 20 56 41 4c 55 45 53 20 63 6c 61 75  a.** VALUES clau
122a0 73 65 2e 20 20 42 79 20 68 61 6e 64 6c 69 6e 67  se.  By handling
122b0 20 74 68 69 73 20 61 73 20 61 20 73 70 65 63 69   this as a speci
122c0 61 6c 20 63 61 73 65 2c 20 77 65 20 61 76 6f 69  al case, we avoi
122d0 64 20 64 65 65 70 0a 2a 2a 20 72 65 63 75 72 73  d deep.** recurs
122e0 69 6f 6e 2c 20 61 6e 64 20 74 68 75 73 20 64 6f  ion, and thus do
122f0 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 65 6e 66   not need to enf
12300 6f 72 63 65 20 74 68 65 20 53 51 4c 49 54 45 5f  orce the SQLITE_
12310 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  LIMIT_COMPOUND_S
12320 45 4c 45 43 54 0a 2a 2a 20 6f 6e 20 61 20 56 41  ELECT.** on a VA
12330 4c 55 45 53 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  LUES clause..**.
12340 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 53  ** Because the S
12350 65 6c 65 63 74 20 6f 62 6a 65 63 74 20 6f 72 69  elect object ori
12360 67 69 6e 61 74 65 73 20 66 72 6f 6d 20 61 20 56  ginates from a V
12370 41 4c 55 45 53 20 63 6c 61 75 73 65 3a 0a 2a 2a  ALUES clause:.**
12380 20 20 20 28 31 29 20 49 74 20 68 61 73 20 6e 6f     (1) It has no
12390 20 4c 49 4d 49 54 20 6f 72 20 4f 46 46 53 45 54   LIMIT or OFFSET
123a0 0a 2a 2a 20 20 20 28 32 29 20 41 6c 6c 20 74 65  .**   (2) All te
123b0 72 6d 73 20 61 72 65 20 55 4e 49 4f 4e 20 41 4c  rms are UNION AL
123c0 4c 0a 2a 2a 20 20 20 28 33 29 20 54 68 65 72 65  L.**   (3) There
123d0 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20   is no ORDER BY 
123e0 63 6c 61 75 73 65 0a 2a 2f 0a 73 74 61 74 69 63  clause.*/.static
123f0 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74   int multiSelect
12400 56 61 6c 75 65 73 28 0a 20 20 50 61 72 73 65 20  Values(.  Parse 
12410 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
12420 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
12430 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
12440 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
12450 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
12460 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65  of SELECTs to be
12470 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65   coded */.  Sele
12480 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20  ctDest *pDest   
12490 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
124a0 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c  with query resul
124b0 74 73 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63  ts */.){.  Selec
124c0 74 20 2a 70 50 72 69 6f 72 3b 0a 20 20 69 6e 74  t *pPrior;.  int
124d0 20 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 69 6e 74   nRow = 1;.  int
124e0 20 72 63 20 3d 20 30 3b 0a 20 20 61 73 73 65 72   rc = 0;.  asser
124f0 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  t( p->selFlags &
12500 20 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65 20 29   SF_MultiValue )
12510 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 61 73 73 65  ;.  do{.    asse
12520 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  rt( p->selFlags 
12530 26 20 53 46 5f 56 61 6c 75 65 73 20 29 3b 0a 20  & SF_Values );. 
12540 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70     assert( p->op
12550 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 28 70 2d 3e  ==TK_ALL || (p->
12560 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26  op==TK_SELECT &&
12570 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 29 20 29   p->pPrior==0) )
12580 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
12590 3e 70 4c 69 6d 69 74 3d 3d 30 20 29 3b 0a 20 20  >pLimit==0 );.  
125a0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 66    assert( p->pOf
125b0 66 73 65 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61  fset==0 );.    a
125c0 73 73 65 72 74 28 20 70 2d 3e 70 4e 65 78 74 3d  ssert( p->pNext=
125d0 3d 30 20 7c 7c 20 70 2d 3e 70 45 4c 69 73 74 2d  =0 || p->pEList-
125e0 3e 6e 45 78 70 72 3d 3d 70 2d 3e 70 4e 65 78 74  >nExpr==p->pNext
125f0 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
12600 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 50  );.    if( p->pP
12610 72 69 6f 72 3d 3d 30 20 29 20 62 72 65 61 6b 3b  rior==0 ) break;
12620 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
12630 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 3d 3d 70  pPrior->pNext==p
12640 20 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70   );.    p = p->p
12650 50 72 69 6f 72 3b 0a 20 20 20 20 6e 52 6f 77 2b  Prior;.    nRow+
12660 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 31 29 3b 0a  +;.  }while(1);.
12670 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
12680 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50    pPrior = p->pP
12690 72 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70 50 72  rior;.    p->pPr
126a0 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  ior = 0;.    rc 
126b0 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
126c0 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74  pParse, p, pDest
126d0 29 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  );.    p->pPrior
126e0 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 69   = pPrior;.    i
126f0 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20  f( rc ) break;. 
12700 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77     p->nSelectRow
12710 20 3d 20 6e 52 6f 77 3b 0a 20 20 20 20 70 20 3d   = nRow;.    p =
12720 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20   p->pNext;.  }. 
12730 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
12740 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
12750 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 70  e is called to p
12760 72 6f 63 65 73 73 20 61 20 63 6f 6d 70 6f 75 6e  rocess a compoun
12770 64 20 71 75 65 72 79 20 66 6f 72 6d 20 66 72 6f  d query form fro
12780 6d 0a 2a 2a 20 74 77 6f 20 6f 72 20 6d 6f 72 65  m.** two or more
12790 20 73 65 70 61 72 61 74 65 20 71 75 65 72 69 65   separate querie
127a0 73 20 75 73 69 6e 67 20 55 4e 49 4f 4e 2c 20 55  s using UNION, U
127b0 4e 49 4f 4e 20 41 4c 4c 2c 20 45 58 43 45 50 54  NION ALL, EXCEPT
127c0 2c 20 6f 72 0a 2a 2a 20 49 4e 54 45 52 53 45 43  , or.** INTERSEC
127d0 54 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e  T.**.** "p" poin
127e0 74 73 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d  ts to the right-
127f0 6d 6f 73 74 20 6f 66 20 74 68 65 20 74 77 6f 20  most of the two 
12800 71 75 65 72 69 65 73 2e 20 20 74 68 65 20 71 75  queries.  the qu
12810 65 72 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65  ery on the.** le
12820 66 74 20 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e  ft is p->pPrior.
12830 20 20 54 68 65 20 6c 65 66 74 20 71 75 65 72 79    The left query
12840 20 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20 61   could also be a
12850 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a   compound query.
12860 2a 2a 20 69 6e 20 77 68 69 63 68 20 63 61 73 65  ** in which case
12870 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
12880 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 72 65 63  ll be called rec
12890 75 72 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a  ursively. .**.**
128a0 20 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   The results of 
128b0 74 68 65 20 74 6f 74 61 6c 20 71 75 65 72 79 20  the total query 
128c0 61 72 65 20 74 6f 20 62 65 20 77 72 69 74 74 65  are to be writte
128d0 6e 20 69 6e 74 6f 20 61 20 64 65 73 74 69 6e 61  n into a destina
128e0 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20  tion.** of type 
128f0 65 44 65 73 74 20 77 69 74 68 20 70 61 72 61 6d  eDest with param
12900 65 74 65 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a  eter iParm..**.*
12910 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f  * Example 1:  Co
12920 6e 73 69 64 65 72 20 61 20 74 68 72 65 65 2d 77  nsider a three-w
12930 61 79 20 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20  ay compound SQL 
12940 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
12950 20 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52       SELECT a FR
12960 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45  OM t1 UNION SELE
12970 43 54 20 62 20 46 52 4f 4d 20 74 32 20 55 4e 49  CT b FROM t2 UNI
12980 4f 4e 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d  ON SELECT c FROM
12990 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73   t3.**.** This s
129a0 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73  tatement is pars
129b0 65 64 20 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73  ed up as follows
129c0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  :.**.**     SELE
129d0 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20  CT c FROM t3.** 
129e0 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60       |.**      `
129f0 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62  ----->  SELECT b
12a00 20 46 52 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20   FROM t2.**     
12a10 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20             |.** 
12a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 60                 `
12a30 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20  ------>  SELECT 
12a40 61 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20  a FROM t1.**.** 
12a50 54 68 65 20 61 72 72 6f 77 73 20 69 6e 20 74 68  The arrows in th
12a60 65 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20  e diagram above 
12a70 72 65 70 72 65 73 65 6e 74 20 74 68 65 20 53 65  represent the Se
12a80 6c 65 63 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e  lect.pPrior poin
12a90 74 65 72 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68  ter..** So if th
12aa0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
12ab0 6c 6c 65 64 20 77 69 74 68 20 70 20 65 71 75 61  lled with p equa
12ac0 6c 20 74 6f 20 74 68 65 20 74 33 20 71 75 65 72  l to the t3 quer
12ad0 79 2c 20 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f  y, then.** pPrio
12ae0 72 20 77 69 6c 6c 20 62 65 20 74 68 65 20 74 32  r will be the t2
12af0 20 71 75 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77   query.  p->op w
12b00 69 6c 6c 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20  ill be TK_UNION 
12b10 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
12b20 0a 2a 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20  .** Notice that 
12b30 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 77  because of the w
12b40 61 79 20 53 51 4c 69 74 65 20 70 61 72 73 65 73  ay SQLite parses
12b50 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
12b60 73 2c 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69  s, the.** indivi
12b70 64 75 61 6c 20 73 65 6c 65 63 74 73 20 61 6c 77  dual selects alw
12b80 61 79 73 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c  ays group from l
12b90 65 66 74 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f  eft to right..*/
12ba0 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74  .static int mult
12bb0 69 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65  iSelect(.  Parse
12bc0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
12bd0 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
12be0 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
12bf0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
12c00 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
12c10 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62   of SELECTs to b
12c20 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c  e coded */.  Sel
12c30 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20  ectDest *pDest  
12c40 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
12c50 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75   with query resu
12c60 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lts */.){.  int 
12c70 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
12c80 20 20 2f 2a 20 53 75 63 63 65 73 73 20 63 6f 64    /* Success cod
12c90 65 20 66 72 6f 6d 20 61 20 73 75 62 72 6f 75 74  e from a subrout
12ca0 69 6e 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ine */.  Select 
12cb0 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f  *pPrior;       /
12cc0 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54  * Another SELECT
12cd0 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20   immediately to 
12ce0 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64  our left */.  Vd
12cf0 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
12d00 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
12d10 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44 42  code to this VDB
12d20 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  E */.  SelectDes
12d30 74 20 64 65 73 74 3b 20 20 20 20 20 20 2f 2a 20  t dest;      /* 
12d40 41 6c 74 65 72 6e 61 74 69 76 65 20 64 61 74 61  Alternative data
12d50 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a   destination */.
12d60 20 20 53 65 6c 65 63 74 20 2a 70 44 65 6c 65 74    Select *pDelet
12d70 65 20 3d 20 30 3b 20 20 2f 2a 20 43 68 61 69 6e  e = 0;  /* Chain
12d80 20 6f 66 20 73 69 6d 70 6c 65 20 73 65 6c 65 63   of simple selec
12d90 74 73 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a  ts to delete */.
12da0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
12db0 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
12dc0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
12dd0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
12de0 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20  _OMIT_EXPLAIN.  
12df0 69 6e 74 20 69 53 75 62 31 20 3d 20 30 3b 20 20  int iSub1 = 0;  
12e00 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20        /* EQP id 
12e10 6f 66 20 6c 65 66 74 2d 68 61 6e 64 20 71 75 65  of left-hand que
12e20 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62  ry */.  int iSub
12e30 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  2 = 0;        /*
12e40 20 45 51 50 20 69 64 20 6f 66 20 72 69 67 68 74   EQP id of right
12e50 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 23  -hand query */.#
12e60 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65  endif..  /* Make
12e70 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20 6e   sure there is n
12e80 6f 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49  o ORDER BY or LI
12e90 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e 20 70 72  MIT clause on pr
12ea0 69 6f 72 20 53 45 4c 45 43 54 73 2e 20 20 4f 6e  ior SELECTs.  On
12eb0 6c 79 0a 20 20 2a 2a 20 74 68 65 20 6c 61 73 74  ly.  ** the last
12ec0 20 28 72 69 67 68 74 2d 6d 6f 73 74 29 20 53 45   (right-most) SE
12ed0 4c 45 43 54 20 69 6e 20 74 68 65 20 73 65 72 69  LECT in the seri
12ee0 65 73 20 6d 61 79 20 68 61 76 65 20 61 6e 20 4f  es may have an O
12ef0 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54  RDER BY or LIMIT
12f00 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
12f10 20 70 20 26 26 20 70 2d 3e 70 50 72 69 6f 72 20   p && p->pPrior 
12f20 29 3b 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20 66  );  /* Calling f
12f30 75 6e 63 74 69 6f 6e 20 67 75 61 72 61 6e 74 65  unction guarante
12f40 65 73 20 74 68 69 73 20 6d 75 63 68 20 2a 2f 0a  es this much */.
12f50 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65    assert( (p->se
12f60 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75  lFlags & SF_Recu
12f70 72 73 69 76 65 29 3d 3d 30 20 7c 7c 20 70 2d 3e  rsive)==0 || p->
12f80 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 2d  op==TK_ALL || p-
12f90 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b  >op==TK_UNION );
12fa0 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
12fb0 64 62 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 70  db;.  pPrior = p
12fc0 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64 65 73 74  ->pPrior;.  dest
12fd0 20 3d 20 2a 70 44 65 73 74 3b 0a 20 20 69 66 28   = *pDest;.  if(
12fe0 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42   pPrior->pOrderB
12ff0 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
13000 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
13010 22 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65  "ORDER BY clause
13020 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74   should come aft
13030 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65  er %s not before
13040 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f  ",.      selectO
13050 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20  pName(p->op));. 
13060 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67     rc = 1;.    g
13070 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
13080 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20  _end;.  }.  if( 
13090 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29  pPrior->pLimit )
130a0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
130b0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4c 49  orMsg(pParse,"LI
130c0 4d 49 54 20 63 6c 61 75 73 65 20 73 68 6f 75 6c  MIT clause shoul
130d0 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20  d come after %s 
130e0 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20  not before",.   
130f0 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28     selectOpName(
13100 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20  p->op));.    rc 
13110 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75  = 1;.    goto mu
13120 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
13130 20 20 7d 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74    }..  v = sqlit
13140 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
13150 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d  );.  assert( v!=
13160 30 20 29 3b 20 20 2f 2a 20 54 68 65 20 56 44 42  0 );  /* The VDB
13170 45 20 61 6c 72 65 61 64 79 20 63 72 65 61 74 65  E already create
13180 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 66 75 6e  d by calling fun
13190 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43  ction */..  /* C
131a0 72 65 61 74 65 20 74 68 65 20 64 65 73 74 69 6e  reate the destin
131b0 61 74 69 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20  ation temporary 
131c0 74 61 62 6c 65 20 69 66 20 6e 65 63 65 73 73 61  table if necessa
131d0 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65  ry.  */.  if( de
131e0 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70  st.eDest==SRT_Ep
131f0 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 61 73  hemTab ){.    as
13200 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
13210 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
13220 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
13230 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 64 65  penEphemeral, de
13240 73 74 2e 69 53 44 50 61 72 6d 2c 20 70 2d 3e 70  st.iSDParm, p->p
13250 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
13260 20 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20     dest.eDest = 
13270 53 52 54 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a  SRT_Table;.  }..
13280 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 68 61 6e    /* Special han
13290 64 6c 69 6e 67 20 66 6f 72 20 61 20 63 6f 6d 70  dling for a comp
132a0 6f 75 6e 64 2d 73 65 6c 65 63 74 20 74 68 61 74  ound-select that
132b0 20 6f 72 69 67 69 6e 61 74 65 73 20 61 73 20 61   originates as a
132c0 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65 2e 0a   VALUES clause..
132d0 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65    */.  if( p->se
132e0 6c 46 6c 61 67 73 20 26 20 53 46 5f 4d 75 6c 74  lFlags & SF_Mult
132f0 69 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 72 63  iValue ){.    rc
13300 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 56 61   = multiSelectVa
13310 6c 75 65 73 28 70 50 61 72 73 65 2c 20 70 2c 20  lues(pParse, p, 
13320 26 64 65 73 74 29 3b 0a 20 20 20 20 67 6f 74 6f  &dest);.    goto
13330 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
13340 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  d;.  }..  /* Mak
13350 65 20 73 75 72 65 20 61 6c 6c 20 53 45 4c 45 43  e sure all SELEC
13360 54 73 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d  Ts in the statem
13370 65 6e 74 20 68 61 76 65 20 74 68 65 20 73 61 6d  ent have the sam
13380 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  e number of elem
13390 65 6e 74 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65  ents.  ** in the
133a0 69 72 20 72 65 73 75 6c 74 20 73 65 74 73 2e 0a  ir result sets..
133b0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
133c0 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 50 72 69  ->pEList && pPri
133d0 6f 72 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20  or->pEList );.  
133e0 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
133f0 74 2d 3e 6e 45 78 70 72 3d 3d 70 50 72 69 6f 72  t->nExpr==pPrior
13400 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
13410 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
13420 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 69 66  TE_OMIT_CTE.  if
13430 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
13440 53 46 5f 52 65 63 75 72 73 69 76 65 20 29 7b 0a  SF_Recursive ){.
13450 20 20 20 20 67 65 6e 65 72 61 74 65 57 69 74 68      generateWith
13460 52 65 63 75 72 73 69 76 65 51 75 65 72 79 28 70  RecursiveQuery(p
13470 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 29  Parse, p, &dest)
13480 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  ;.  }else.#endif
13490 0a 0a 20 20 2f 2a 20 43 6f 6d 70 6f 75 6e 64 20  ..  /* Compound 
134a0 53 45 4c 45 43 54 73 20 74 68 61 74 20 68 61 76  SELECTs that hav
134b0 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  e an ORDER BY cl
134c0 61 75 73 65 20 61 72 65 20 68 61 6e 64 6c 65 64  ause are handled
134d0 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 20 20 2a   separately..  *
134e0 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65  /.  if( p->pOrde
134f0 72 42 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72  rBy ){.    retur
13500 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64  n multiSelectOrd
13510 65 72 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20  erBy(pParse, p, 
13520 70 44 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65 0a  pDest);.  }else.
13530 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
13540 6f 64 65 20 66 6f 72 20 74 68 65 20 6c 65 66 74  ode for the left
13550 20 61 6e 64 20 72 69 67 68 74 20 53 45 4c 45 43   and right SELEC
13560 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20  T statements..  
13570 2a 2f 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e  */.  switch( p->
13580 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
13590 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69  K_ALL: {.      i
135a0 6e 74 20 61 64 64 72 20 3d 20 30 3b 0a 20 20 20  nt addr = 0;.   
135b0 20 20 20 69 6e 74 20 6e 4c 69 6d 69 74 3b 0a 20     int nLimit;. 
135c0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
135d0 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a  rior->pLimit );.
135e0 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 69 4c        pPrior->iL
135f0 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74  imit = p->iLimit
13600 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e  ;.      pPrior->
13610 69 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66  iOffset = p->iOf
13620 66 73 65 74 3b 0a 20 20 20 20 20 20 70 50 72 69  fset;.      pPri
13630 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e  or->pLimit = p->
13640 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 50  pLimit;.      pP
13650 72 69 6f 72 2d 3e 70 4f 66 66 73 65 74 20 3d 20  rior->pOffset = 
13660 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20  p->pOffset;.    
13670 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
13680 67 65 72 28 69 53 75 62 31 2c 20 70 50 61 72 73  ger(iSub1, pPars
13690 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
136a0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
136b0 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
136c0 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64 65 73  se, pPrior, &des
136d0 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69  t);.      p->pLi
136e0 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  mit = 0;.      p
136f0 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->pOffset = 0;. 
13700 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
13710 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74         goto mult
13720 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
13730 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70      }.      p->p
13740 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  Prior = 0;.     
13750 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72   p->iLimit = pPr
13760 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20  ior->iLimit;.   
13770 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20     p->iOffset = 
13780 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 3b  pPrior->iOffset;
13790 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69 4c  .      if( p->iL
137a0 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20  imit ){.        
137b0 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
137c0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
137d0 66 4e 6f 74 2c 20 70 2d 3e 69 4c 69 6d 69 74 29  fNot, p->iLimit)
137e0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
137f0 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
13800 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4a 75 6d 70  omment((v, "Jump
13810 20 61 68 65 61 64 20 69 66 20 4c 49 4d 49 54 20   ahead if LIMIT 
13820 72 65 61 63 68 65 64 22 29 29 3b 0a 20 20 20 20  reached"));.    
13830 20 20 20 20 69 66 28 20 70 2d 3e 69 4f 66 66 73      if( p->iOffs
13840 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  et ){.          
13850 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13860 33 28 76 2c 20 4f 50 5f 4f 66 66 73 65 74 4c 69  3(v, OP_OffsetLi
13870 6d 69 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  mit,.           
13880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13890 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 70 2d 3e 69   p->iLimit, p->i
138a0 4f 66 66 73 65 74 2b 31 2c 20 70 2d 3e 69 4f 66  Offset+1, p->iOf
138b0 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  fset);.        }
138c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65  .      }.      e
138d0 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
138e0 28 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e  (iSub2, pParse->
138f0 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
13900 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
13910 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
13920 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20   p, &dest);.    
13930 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
13940 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
13950 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e     pDelete = p->
13960 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d  pPrior;.      p-
13970 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
13980 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65  ;.      p->nSele
13990 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c  ctRow = sqlite3L
139a0 6f 67 45 73 74 41 64 64 28 70 2d 3e 6e 53 65 6c  ogEstAdd(p->nSel
139b0 65 63 74 52 6f 77 2c 20 70 50 72 69 6f 72 2d 3e  ectRow, pPrior->
139c0 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20 20  nSelectRow);.   
139d0 20 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70     if( pPrior->p
139e0 4c 69 6d 69 74 0a 20 20 20 20 20 20 20 26 26 20  Limit.       && 
139f0 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
13a00 65 67 65 72 28 70 50 72 69 6f 72 2d 3e 70 4c 69  eger(pPrior->pLi
13a10 6d 69 74 2c 20 26 6e 4c 69 6d 69 74 29 0a 20 20  mit, &nLimit).  
13a20 20 20 20 20 20 26 26 20 6e 4c 69 6d 69 74 3e 30       && nLimit>0
13a30 20 26 26 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f   && p->nSelectRo
13a40 77 20 3e 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  w > sqlite3LogEs
13a50 74 28 28 75 36 34 29 6e 4c 69 6d 69 74 29 20 0a  t((u64)nLimit) .
13a60 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
13a70 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
13a80 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 28   sqlite3LogEst((
13a90 75 36 34 29 6e 4c 69 6d 69 74 29 3b 0a 20 20 20  u64)nLimit);.   
13aa0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61     }.      if( a
13ab0 64 64 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ddr ){.        s
13ac0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
13ad0 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20  re(v, addr);.   
13ae0 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
13af0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
13b00 20 54 4b 5f 45 58 43 45 50 54 3a 0a 20 20 20 20   TK_EXCEPT:.    
13b10 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b  case TK_UNION: {
13b20 0a 20 20 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e  .      int union
13b30 54 61 62 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f  Tab;    /* Curso
13b40 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  r number of the 
13b50 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
13b60 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 20 2a  holding result *
13b70 2f 0a 20 20 20 20 20 20 75 38 20 6f 70 20 3d 20  /.      u8 op = 
13b80 30 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20  0;       /* One 
13b90 6f 66 20 74 68 65 20 53 52 54 5f 20 6f 70 65 72  of the SRT_ oper
13ba0 61 74 69 6f 6e 73 20 74 6f 20 61 70 70 6c 79 20  ations to apply 
13bb0 74 6f 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20 20  to self */.     
13bc0 20 69 6e 74 20 70 72 69 6f 72 4f 70 3b 20 20 20   int priorOp;   
13bd0 20 20 2f 2a 20 54 68 65 20 53 52 54 5f 20 6f 70    /* The SRT_ op
13be0 65 72 61 74 69 6f 6e 20 74 6f 20 61 70 70 6c 79  eration to apply
13bf0 20 74 6f 20 70 72 69 6f 72 20 73 65 6c 65 63 74   to prior select
13c00 73 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20  s */.      Expr 
13c10 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65  *pLimit, *pOffse
13c20 74 3b 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75  t; /* Saved valu
13c30 65 73 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74 20  es of p->nLimit 
13c40 61 6e 64 20 70 2d 3e 6e 4f 66 66 73 65 74 20 2a  and p->nOffset *
13c50 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
13c60 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44 65  ;.      SelectDe
13c70 73 74 20 75 6e 69 6f 6e 64 65 73 74 3b 0a 0a 20  st uniondest;.. 
13c80 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
13c90 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20  ->op==TK_EXCEPT 
13ca0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
13cb0 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49  e( p->op==TK_UNI
13cc0 4f 4e 20 29 3b 0a 20 20 20 20 20 20 70 72 69 6f  ON );.      prio
13cd0 72 4f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b  rOp = SRT_Union;
13ce0 0a 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e  .      if( dest.
13cf0 65 44 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20 29  eDest==priorOp )
13d00 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20  {.        /* We 
13d10 63 61 6e 20 72 65 75 73 65 20 61 20 74 65 6d 70  can reuse a temp
13d20 6f 72 61 72 79 20 74 61 62 6c 65 20 67 65 6e 65  orary table gene
13d30 72 61 74 65 64 20 62 79 20 61 20 53 45 4c 45 43  rated by a SELEC
13d40 54 20 74 6f 20 6f 75 72 0a 20 20 20 20 20 20 20  T to our.       
13d50 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20 20 20 20   ** right..     
13d60 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73     */.        as
13d70 73 65 72 74 28 20 70 2d 3e 70 4c 69 6d 69 74 3d  sert( p->pLimit=
13d80 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 4e 6f  =0 );      /* No
13d90 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66  t allowed on lef
13da0 74 77 61 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a  tward elements *
13db0 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
13dc0 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20  ( p->pOffset==0 
13dd0 29 3b 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6c  );     /* Not al
13de0 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74 77 61 72  lowed on leftwar
13df0 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20  d elements */.  
13e00 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d        unionTab =
13e10 20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20   dest.iSDParm;. 
13e20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
13e30 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 6e      /* We will n
13e40 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 6f 75  eed to create ou
13e50 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72 79 20  r own temporary 
13e60 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68  table to hold th
13e70 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74  e.        ** int
13e80 65 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74  ermediate result
13e90 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
13ea0 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d        unionTab =
13eb0 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
13ec0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
13ed0 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20   p->pOrderBy==0 
13ee0 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64 72 20  );.        addr 
13ef0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
13f00 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
13f10 68 65 6d 65 72 61 6c 2c 20 75 6e 69 6f 6e 54 61  hemeral, unionTa
13f20 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61  b, 0);.        a
13f30 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70  ssert( p->addrOp
13f40 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20  enEphm[0] == -1 
13f50 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 64  );.        p->ad
13f60 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20  drOpenEphm[0] = 
13f70 61 64 64 72 3b 0a 20 20 20 20 20 20 20 20 66 69  addr;.        fi
13f80 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e  ndRightmost(p)->
13f90 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55  selFlags |= SF_U
13fa0 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20  sesEphemeral;.  
13fb0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
13fc0 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20  >pEList );.     
13fd0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64   }..      /* Cod
13fe0 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  e the SELECT sta
13ff0 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20 6c  tements to our l
14000 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  eft.      */.   
14010 20 20 20 61 73 73 65 72 74 28 20 21 70 50 72 69     assert( !pPri
14020 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 3b 0a  or->pOrderBy );.
14030 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
14040 65 63 74 44 65 73 74 49 6e 69 74 28 26 75 6e 69  ectDestInit(&uni
14050 6f 6e 64 65 73 74 2c 20 70 72 69 6f 72 4f 70 2c  ondest, priorOp,
14060 20 75 6e 69 6f 6e 54 61 62 29 3b 0a 20 20 20 20   unionTab);.    
14070 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
14080 67 65 72 28 69 53 75 62 31 2c 20 70 50 61 72 73  ger(iSub1, pPars
14090 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
140a0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
140b0 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
140c0 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 75 6e 69  se, pPrior, &uni
140d0 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20 20 69  ondest);.      i
140e0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
140f0 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
14100 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
14110 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74  .      /* Code t
14120 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43  he current SELEC
14130 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20  T statement.    
14140 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
14150 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20  ->op==TK_EXCEPT 
14160 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20  ){.        op = 
14170 53 52 54 5f 45 78 63 65 70 74 3b 0a 20 20 20 20  SRT_Except;.    
14180 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
14190 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d   assert( p->op==
141a0 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20  TK_UNION );.    
141b0 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 55 6e 69      op = SRT_Uni
141c0 6f 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  on;.      }.    
141d0 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
141e0 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20  .      pLimit = 
141f0 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20  p->pLimit;.     
14200 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
14210 20 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20        pOffset = 
14220 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20  p->pOffset;.    
14230 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30    p->pOffset = 0
14240 3b 0a 20 20 20 20 20 20 75 6e 69 6f 6e 64 65 73  ;.      uniondes
14250 74 2e 65 44 65 73 74 20 3d 20 6f 70 3b 0a 20 20  t.eDest = op;.  
14260 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
14270 74 65 67 65 72 28 69 53 75 62 32 2c 20 70 50 61  teger(iSub2, pPa
14280 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
14290 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Id);.      rc = 
142a0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
142b0 61 72 73 65 2c 20 70 2c 20 26 75 6e 69 6f 6e 64  arse, p, &uniond
142c0 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74  est);.      test
142d0 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
142e0 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20  _OK );.      /* 
142f0 51 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67  Query flattening
14300 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63   in sqlite3Selec
14310 74 28 29 20 6d 69 67 68 74 20 72 65 66 69 6c 6c  t() might refill
14320 20 70 2d 3e 70 4f 72 64 65 72 42 79 2e 0a 20 20   p->pOrderBy..  
14330 20 20 20 20 2a 2a 20 42 65 20 73 75 72 65 20 74      ** Be sure t
14340 6f 20 64 65 6c 65 74 65 20 70 2d 3e 70 4f 72 64  o delete p->pOrd
14350 65 72 42 79 2c 20 74 68 65 72 65 66 6f 72 65 2c  erBy, therefore,
14360 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 65 6d 6f   to avoid a memo
14370 72 79 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20 20 20  ry leak. */.    
14380 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
14390 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
143a0 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20  OrderBy);.      
143b0 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72  pDelete = p->pPr
143c0 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50  ior;.      p->pP
143d0 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
143e0 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79       p->pOrderBy
143f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
14400 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  p->op==TK_UNION 
14410 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 53  ){.        p->nS
14420 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74  electRow = sqlit
14430 65 33 4c 6f 67 45 73 74 41 64 64 28 70 2d 3e 6e  e3LogEstAdd(p->n
14440 53 65 6c 65 63 74 52 6f 77 2c 20 70 50 72 69 6f  SelectRow, pPrio
14450 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a  r->nSelectRow);.
14460 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
14470 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
14480 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a  db, p->pLimit);.
14490 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20        p->pLimit 
144a0 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  = pLimit;.      
144b0 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66  p->pOffset = pOf
144c0 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69  fset;.      p->i
144d0 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
144e0 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b   p->iOffset = 0;
144f0 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65  ..      /* Conve
14500 72 74 20 74 68 65 20 64 61 74 61 20 69 6e 20 74  rt the data in t
14510 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
14520 6c 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72  le into whatever
14530 20 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 69   form.      ** i
14540 74 20 69 73 20 74 68 61 74 20 77 65 20 63 75 72  t is that we cur
14550 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20  rently need..   
14560 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65     */.      asse
14570 72 74 28 20 75 6e 69 6f 6e 54 61 62 3d 3d 64 65  rt( unionTab==de
14580 73 74 2e 69 53 44 50 61 72 6d 20 7c 7c 20 64 65  st.iSDParm || de
14590 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f 72 4f  st.eDest!=priorO
145a0 70 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64  p );.      if( d
145b0 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f 72  est.eDest!=prior
145c0 4f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  Op ){.        in
145d0 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c  t iCont, iBreak,
145e0 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20   iStart;.       
145f0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
14600 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  st );.        if
14610 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52  ( dest.eDest==SR
14620 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20  T_Output ){.    
14630 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46        Select *pF
14640 69 72 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  irst = p;.      
14650 20 20 20 20 77 68 69 6c 65 28 20 70 46 69 72 73      while( pFirs
14660 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72  t->pPrior ) pFir
14670 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72  st = pFirst->pPr
14680 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 67  ior;.          g
14690 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
146a0 65 73 28 70 50 61 72 73 65 2c 20 70 46 69 72 73  es(pParse, pFirs
146b0 74 2d 3e 70 53 72 63 2c 20 70 46 69 72 73 74 2d  t->pSrc, pFirst-
146c0 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  >pEList);.      
146d0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 42 72 65    }.        iBre
146e0 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ak = sqlite3Vdbe
146f0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
14700 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71        iCont = sq
14710 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
14720 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 63  el(v);.        c
14730 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
14740 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20  ters(pParse, p, 
14750 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20  iBreak);.       
14760 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14770 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
14780 20 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72 65 61   unionTab, iBrea
14790 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  k); VdbeCoverage
147a0 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69 53 74  (v);.        iSt
147b0 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  art = sqlite3Vdb
147c0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
147d0 0a 20 20 20 20 20 20 20 20 73 65 6c 65 63 74 49  .        selectI
147e0 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
147f0 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 75   p, p->pEList, u
14800 6e 69 6f 6e 54 61 62 2c 0a 20 20 20 20 20 20 20  nionTab,.       
14810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14820 20 30 2c 20 30 2c 20 26 64 65 73 74 2c 20 69 43   0, 0, &dest, iC
14830 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  ont, iBreak);.  
14840 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
14850 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
14860 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20   iCont);.       
14870 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14880 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75  p2(v, OP_Next, u
14890 6e 69 6f 6e 54 61 62 2c 20 69 53 74 61 72 74 29  nionTab, iStart)
148a0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
148b0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
148c0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
148d0 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20  el(v, iBreak);. 
148e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
148f0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
14900 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  lose, unionTab, 
14910 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
14920 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
14930 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65     default: asse
14940 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e  rt( p->op==TK_IN
14950 54 45 52 53 45 43 54 20 29 3b 20 7b 0a 20 20 20  TERSECT ); {.   
14960 20 20 20 69 6e 74 20 74 61 62 31 2c 20 74 61 62     int tab1, tab
14970 32 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  2;.      int iCo
14980 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61  nt, iBreak, iSta
14990 72 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  rt;.      Expr *
149a0 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74  pLimit, *pOffset
149b0 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  ;.      int addr
149c0 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44 65  ;.      SelectDe
149d0 73 74 20 69 6e 74 65 72 73 65 63 74 64 65 73 74  st intersectdest
149e0 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a  ;.      int r1;.
149f0 0a 20 20 20 20 20 20 2f 2a 20 49 4e 54 45 52 53  .      /* INTERS
14a00 45 43 54 20 69 73 20 64 69 66 66 65 72 65 6e 74  ECT is different
14a10 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 73   from the others
14a20 20 73 69 6e 63 65 20 69 74 20 72 65 71 75 69 72   since it requir
14a30 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 20  es.      ** two 
14a40 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
14a50 2e 20 20 48 65 6e 63 65 20 69 74 20 68 61 73 20  .  Hence it has 
14a60 69 74 73 20 6f 77 6e 20 63 61 73 65 2e 20 20 42  its own case.  B
14a70 65 67 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62 79  egin.      ** by
14a80 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20   allocating the 
14a90 74 61 62 6c 65 73 20 77 65 20 77 69 6c 6c 20 6e  tables we will n
14aa0 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  eed..      */.  
14ab0 20 20 20 20 74 61 62 31 20 3d 20 70 50 61 72 73      tab1 = pPars
14ac0 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
14ad0 20 74 61 62 32 20 3d 20 70 50 61 72 73 65 2d 3e   tab2 = pParse->
14ae0 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61 73  nTab++;.      as
14af0 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42  sert( p->pOrderB
14b00 79 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20 61  y==0 );..      a
14b10 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
14b20 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
14b30 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61 62  enEphemeral, tab
14b40 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73  1, 0);.      ass
14b50 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e  ert( p->addrOpen
14b60 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b  Ephm[0] == -1 );
14b70 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70  .      p->addrOp
14b80 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72  enEphm[0] = addr
14b90 3b 0a 20 20 20 20 20 20 66 69 6e 64 52 69 67 68  ;.      findRigh
14ba0 74 6d 6f 73 74 28 70 29 2d 3e 73 65 6c 46 6c 61  tmost(p)->selFla
14bb0 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68  gs |= SF_UsesEph
14bc0 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20 61 73  emeral;.      as
14bd0 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
14be0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64  );..      /* Cod
14bf0 65 20 74 68 65 20 53 45 4c 45 43 54 73 20 74 6f  e the SELECTs to
14c00 20 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f 20 74   our left into t
14c10 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22  emporary table "
14c20 74 61 62 31 22 2e 0a 20 20 20 20 20 20 2a 2f 0a  tab1"..      */.
14c30 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
14c40 65 63 74 44 65 73 74 49 6e 69 74 28 26 69 6e 74  ectDestInit(&int
14c50 65 72 73 65 63 74 64 65 73 74 2c 20 53 52 54 5f  ersectdest, SRT_
14c60 55 6e 69 6f 6e 2c 20 74 61 62 31 29 3b 0a 20 20  Union, tab1);.  
14c70 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
14c80 74 65 67 65 72 28 69 53 75 62 31 2c 20 70 50 61  teger(iSub1, pPa
14c90 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
14ca0 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Id);.      rc = 
14cb0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
14cc0 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 69  arse, pPrior, &i
14cd0 6e 74 65 72 73 65 63 74 64 65 73 74 29 3b 0a 20  ntersectdest);. 
14ce0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
14cf0 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74         goto mult
14d00 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
14d10 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
14d20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e 74  Code the current
14d30 20 53 45 4c 45 43 54 20 69 6e 74 6f 20 74 65 6d   SELECT into tem
14d40 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74 61  porary table "ta
14d50 62 32 22 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  b2".      */.   
14d60 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
14d70 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
14d80 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
14d90 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20   tab2, 0);.     
14da0 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72   assert( p->addr
14db0 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d 20 2d  OpenEphm[1] == -
14dc0 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64  1 );.      p->ad
14dd0 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20  drOpenEphm[1] = 
14de0 61 64 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  addr;.      p->p
14df0 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  Prior = 0;.     
14e00 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69   pLimit = p->pLi
14e10 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c  mit;.      p->pL
14e20 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  imit = 0;.      
14e30 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66  pOffset = p->pOf
14e40 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70  fset;.      p->p
14e50 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  Offset = 0;.    
14e60 20 20 69 6e 74 65 72 73 65 63 74 64 65 73 74 2e    intersectdest.
14e70 69 53 44 50 61 72 6d 20 3d 20 74 61 62 32 3b 0a  iSDParm = tab2;.
14e80 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74        explainSet
14e90 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20 70  Integer(iSub2, p
14ea0 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
14eb0 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20  ctId);.      rc 
14ec0 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
14ed0 70 50 61 72 73 65 2c 20 70 2c 20 26 69 6e 74 65  pParse, p, &inte
14ee0 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20 20 20  rsectdest);.    
14ef0 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
14f00 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
14f10 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e     pDelete = p->
14f20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d  pPrior;.      p-
14f30 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
14f40 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e  ;.      if( p->n
14f50 53 65 6c 65 63 74 52 6f 77 3e 70 50 72 69 6f 72  SelectRow>pPrior
14f60 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 20 70  ->nSelectRow ) p
14f70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70  ->nSelectRow = p
14f80 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f  Prior->nSelectRo
14f90 77 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  w;.      sqlite3
14fa0 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
14fb0 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  ->pLimit);.     
14fc0 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69   p->pLimit = pLi
14fd0 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f  mit;.      p->pO
14fe0 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b  ffset = pOffset;
14ff0 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ..      /* Gener
15000 61 74 65 20 63 6f 64 65 20 74 6f 20 74 61 6b 65  ate code to take
15010 20 74 68 65 20 69 6e 74 65 72 73 65 63 74 69 6f   the intersectio
15020 6e 20 6f 66 20 74 68 65 20 74 77 6f 20 74 65 6d  n of the two tem
15030 70 6f 72 61 72 79 0a 20 20 20 20 20 20 2a 2a 20  porary.      ** 
15040 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 2a 2f  tables..      */
15050 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
15060 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20  ->pEList );.    
15070 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74    if( dest.eDest
15080 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a  ==SRT_Output ){.
15090 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a          Select *
150a0 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 20 20  pFirst = p;.    
150b0 20 20 20 20 77 68 69 6c 65 28 20 70 46 69 72 73      while( pFirs
150c0 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72  t->pPrior ) pFir
150d0 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72  st = pFirst->pPr
150e0 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 67 65 6e  ior;.        gen
150f0 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
15100 28 70 50 61 72 73 65 2c 20 70 46 69 72 73 74 2d  (pParse, pFirst-
15110 3e 70 53 72 63 2c 20 70 46 69 72 73 74 2d 3e 70  >pSrc, pFirst->p
15120 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a  EList);.      }.
15130 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73        iBreak = s
15140 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
15150 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 43  bel(v);.      iC
15160 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ont = sqlite3Vdb
15170 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
15180 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69       computeLimi
15190 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73  tRegisters(pPars
151a0 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20  e, p, iBreak);. 
151b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
151c0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77  AddOp2(v, OP_Rew
151d0 69 6e 64 2c 20 74 61 62 31 2c 20 69 42 72 65 61  ind, tab1, iBrea
151e0 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  k); VdbeCoverage
151f0 28 76 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  (v);.      r1 = 
15200 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
15210 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
15220 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65   iStart = sqlite
15230 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
15240 50 5f 52 6f 77 4b 65 79 2c 20 74 61 62 31 2c 20  P_RowKey, tab1, 
15250 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r1);.      sqlit
15260 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
15270 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20  v, OP_NotFound, 
15280 74 61 62 32 2c 20 69 43 6f 6e 74 2c 20 72 31 2c  tab2, iCont, r1,
15290 20 30 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67   0); VdbeCoverag
152a0 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  e(v);.      sqli
152b0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
152c0 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
152d0 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72       selectInner
152e0 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
152f0 70 2d 3e 70 45 4c 69 73 74 2c 20 74 61 62 31 2c  p->pEList, tab1,
15300 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15310 20 20 20 20 20 20 20 30 2c 20 30 2c 20 26 64 65         0, 0, &de
15320 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61  st, iCont, iBrea
15330 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  k);.      sqlite
15340 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
15350 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20  l(v, iCont);.   
15360 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15370 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
15380 20 74 61 62 31 2c 20 69 53 74 61 72 74 29 3b 20   tab1, iStart); 
15390 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
153a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
153b0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
153c0 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
153d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
153e0 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p2(v, OP_Close, 
153f0 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20  tab2, 0);.      
15400 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15410 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74  2(v, OP_Close, t
15420 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  ab1, 0);.      b
15430 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
15440 0a 20 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73  .  explainCompos
15450 69 74 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 6f  ite(pParse, p->o
15460 70 2c 20 69 53 75 62 31 2c 20 69 53 75 62 32 2c  p, iSub1, iSub2,
15470 20 70 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 3b   p->op!=TK_ALL);
15480 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63  ..  /* Compute c
15490 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
154a0 65 73 20 75 73 65 64 20 62 79 20 0a 20 20 2a 2a  es used by .  **
154b0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
154c0 73 20 6e 65 65 64 65 64 20 74 6f 20 69 6d 70 6c  s needed to impl
154d0 65 6d 65 6e 74 20 74 68 65 20 63 6f 6d 70 6f 75  ement the compou
154e0 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2a 20  nd select..  ** 
154f0 41 74 74 61 63 68 20 74 68 65 20 4b 65 79 49 6e  Attach the KeyIn
15500 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  fo structure to 
15510 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20 74 61  all temporary ta
15520 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  bles..  **.  ** 
15530 54 68 69 73 20 73 65 63 74 69 6f 6e 20 69 73 20  This section is 
15540 72 75 6e 20 62 79 20 74 68 65 20 72 69 67 68 74  run by the right
15550 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61  -most SELECT sta
15560 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20 20 2a  tement only..  *
15570 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
15580 6e 74 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  nts to the left 
15590 61 6c 77 61 79 73 20 73 6b 69 70 20 74 68 69 73  always skip this
155a0 20 70 61 72 74 2e 20 20 54 68 65 20 72 69 67 68   part.  The righ
155b0 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53 45 4c 45  t-most.  ** SELE
155c0 43 54 20 6d 69 67 68 74 20 61 6c 73 6f 20 73 6b  CT might also sk
155d0 69 70 20 74 68 69 73 20 70 61 72 74 20 69 66 20  ip this part if 
155e0 69 74 20 68 61 73 20 6e 6f 20 4f 52 44 45 52 20  it has no ORDER 
155f0 42 59 20 63 6c 61 75 73 65 20 61 6e 64 0a 20 20  BY clause and.  
15600 2a 2a 20 6e 6f 20 74 65 6d 70 20 74 61 62 6c 65  ** no temp table
15610 73 20 61 72 65 20 72 65 71 75 69 72 65 64 2e 0a  s are required..
15620 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65    */.  if( p->se
15630 6c 46 6c 61 67 73 20 26 20 53 46 5f 55 73 65 73  lFlags & SF_Uses
15640 45 70 68 65 6d 65 72 61 6c 20 29 7b 0a 20 20 20  Ephemeral ){.   
15650 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
15660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15670 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
15680 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70  /.    KeyInfo *p
15690 4b 65 79 49 6e 66 6f 3b 20 20 20 20 20 20 20 20  KeyInfo;        
156a0 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67      /* Collating
156b0 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68   sequence for th
156c0 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
156d0 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f      Select *pLoo
156e0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
156f0 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
15700 20 74 68 72 6f 75 67 68 20 53 45 4c 45 43 54 20   through SELECT 
15710 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20  statements */.  
15720 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 61 70 43 6f    CollSeq **apCo
15730 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
15740 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74  /* For looping t
15750 68 72 6f 75 67 68 20 70 4b 65 79 49 6e 66 6f 2d  hrough pKeyInfo-
15760 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20  >aColl[] */.    
15770 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20  int nCol;       
15780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15790 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
157a0 6e 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74  ns in result set
157b0 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28   */..    assert(
157c0 20 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 29 3b 0a   p->pNext==0 );.
157d0 20 20 20 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45      nCol = p->pE
157e0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
157f0 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69   pKeyInfo = sqli
15800 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28  te3KeyInfoAlloc(
15810 64 62 2c 20 6e 43 6f 6c 2c 20 31 29 3b 0a 20 20  db, nCol, 1);.  
15820 20 20 69 66 28 20 21 70 4b 65 79 49 6e 66 6f 20    if( !pKeyInfo 
15830 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
15840 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
15850 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  .      goto mult
15860 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
15870 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c    }.    for(i=0,
15880 20 61 70 43 6f 6c 6c 3d 70 4b 65 79 49 6e 66 6f   apColl=pKeyInfo
15890 2d 3e 61 43 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b  ->aColl; i<nCol;
158a0 20 69 2b 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 29 7b   i++, apColl++){
158b0 0a 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d  .      *apColl =
158c0 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c   multiSelectColl
158d0 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69  Seq(pParse, p, i
158e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  );.      if( 0==
158f0 2a 61 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20  *apColl ){.     
15900 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 64 62 2d     *apColl = db-
15910 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
15920 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66    }.    }..    f
15930 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f  or(pLoop=p; pLoo
15940 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e  p; pLoop=pLoop->
15950 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 66  pPrior){.      f
15960 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b  or(i=0; i<2; i++
15970 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61  ){.        int a
15980 64 64 72 20 3d 20 70 4c 6f 6f 70 2d 3e 61 64 64  ddr = pLoop->add
15990 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 3b 0a 20 20  rOpenEphm[i];.  
159a0 20 20 20 20 20 20 69 66 28 20 61 64 64 72 3c 30        if( addr<0
159b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
159c0 20 49 66 20 5b 30 5d 20 69 73 20 75 6e 75 73 65   If [0] is unuse
159d0 64 20 74 68 65 6e 20 5b 31 5d 20 69 73 20 61 6c  d then [1] is al
159e0 73 6f 20 75 6e 75 73 65 64 2e 20 20 53 6f 20 77  so unused.  So w
159f0 65 20 63 61 6e 0a 20 20 20 20 20 20 20 20 20 20  e can.          
15a00 2a 2a 20 61 6c 77 61 79 73 20 73 61 66 65 6c 79  ** always safely
15a10 20 61 62 6f 72 74 20 61 73 20 73 6f 6f 6e 20 61   abort as soon a
15a20 73 20 74 68 65 20 66 69 72 73 74 20 75 6e 75 73  s the first unus
15a30 65 64 20 73 6c 6f 74 20 69 73 20 66 6f 75 6e 64  ed slot is found
15a40 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73   */.          as
15a50 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61 64 64  sert( pLoop->add
15a60 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 3c 30 20 29  rOpenEphm[1]<0 )
15a70 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
15a80 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
15a90 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15aa0 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64 72  ChangeP2(v, addr
15ab0 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  , nCol);.       
15ac0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
15ad0 67 65 50 34 28 76 2c 20 61 64 64 72 2c 20 28 63  geP4(v, addr, (c
15ae0 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49  har*)sqlite3KeyI
15af0 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f 29  nfoRef(pKeyInfo)
15b00 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
15b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 34                P4
15b20 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20  _KEYINFO);.     
15b30 20 20 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70     pLoop->addrOp
15b40 65 6e 45 70 68 6d 5b 69 5d 20 3d 20 2d 31 3b 0a  enEphm[i] = -1;.
15b50 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
15b60 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f    sqlite3KeyInfo
15b70 55 6e 72 65 66 28 70 4b 65 79 49 6e 66 6f 29 3b  Unref(pKeyInfo);
15b80 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65 6c 65  .  }..multi_sele
15b90 63 74 5f 65 6e 64 3a 0a 20 20 70 44 65 73 74 2d  ct_end:.  pDest-
15ba0 3e 69 53 64 73 74 20 3d 20 64 65 73 74 2e 69 53  >iSdst = dest.iS
15bb0 64 73 74 3b 0a 20 20 70 44 65 73 74 2d 3e 6e 53  dst;.  pDest->nS
15bc0 64 73 74 20 3d 20 64 65 73 74 2e 6e 53 64 73 74  dst = dest.nSdst
15bd0 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
15be0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65 6c  tDelete(db, pDel
15bf0 65 74 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ete);.  return r
15c00 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
15c10 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
15c20 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f  UND_SELECT */../
15c30 2a 0a 2a 2a 20 45 72 72 6f 72 20 6d 65 73 73 61  *.** Error messa
15c40 67 65 20 66 6f 72 20 77 68 65 6e 20 74 77 6f 20  ge for when two 
15c50 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73 20 6f 66  or more terms of
15c60 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65   a compound sele
15c70 63 74 20 68 61 76 65 20 64 69 66 66 65 72 65 6e  ct have differen
15c80 74 0a 2a 2a 20 73 69 7a 65 20 72 65 73 75 6c 74  t.** size result
15c90 20 73 65 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73   sets..*/.void s
15ca0 71 6c 69 74 65 33 53 65 6c 65 63 74 57 72 6f 6e  qlite3SelectWron
15cb0 67 4e 75 6d 54 65 72 6d 73 45 72 72 6f 72 28 50  gNumTermsError(P
15cc0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
15cd0 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 66 28 20  lect *p){.  if( 
15ce0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
15cf0 5f 56 61 6c 75 65 73 20 29 7b 0a 20 20 20 20 73  _Values ){.    s
15d00 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
15d10 50 61 72 73 65 2c 20 22 61 6c 6c 20 56 41 4c 55  Parse, "all VALU
15d20 45 53 20 6d 75 73 74 20 68 61 76 65 20 74 68 65  ES must have the
15d30 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20   same number of 
15d40 74 65 72 6d 73 22 29 3b 0a 20 20 7d 65 6c 73 65  terms");.  }else
15d50 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
15d60 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 53  orMsg(pParse, "S
15d70 45 4c 45 43 54 73 20 74 6f 20 74 68 65 20 6c 65  ELECTs to the le
15d80 66 74 20 61 6e 64 20 72 69 67 68 74 20 6f 66 20  ft and right of 
15d90 25 73 22 0a 20 20 20 20 20 20 22 20 64 6f 20 6e  %s".      " do n
15da0 6f 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  ot have the same
15db0 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   number of resul
15dc0 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c 65  t columns", sele
15dd0 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29  ctOpName(p->op))
15de0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
15df0 6f 64 65 20 61 6e 20 6f 75 74 70 75 74 20 73 75  ode an output su
15e00 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 20 63  broutine for a c
15e10 6f 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65  oroutine impleme
15e20 6e 74 61 74 69 6f 6e 20 6f 66 20 61 0a 2a 2a 20  ntation of a.** 
15e30 53 45 4c 45 43 54 20 73 74 61 74 6d 65 6e 74 2e  SELECT statment.
15e40 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61 20  .**.** The data 
15e50 74 6f 20 62 65 20 6f 75 74 70 75 74 20 69 73 20  to be output is 
15e60 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 70 49 6e  contained in pIn
15e70 2d 3e 69 53 64 73 74 2e 20 20 54 68 65 72 65 20  ->iSdst.  There 
15e80 61 72 65 0a 2a 2a 20 70 49 6e 2d 3e 6e 53 64 73  are.** pIn->nSds
15e90 74 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20  t columns to be 
15ea0 6f 75 74 70 75 74 2e 20 20 70 44 65 73 74 20 69  output.  pDest i
15eb0 73 20 77 68 65 72 65 20 74 68 65 20 6f 75 74 70  s where the outp
15ec0 75 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  ut should.** be 
15ed0 73 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 72 65 67 52  sent..**.** regR
15ee0 65 74 75 72 6e 20 69 73 20 74 68 65 20 6e 75 6d  eturn is the num
15ef0 62 65 72 20 6f 66 20 74 68 65 20 72 65 67 69 73  ber of the regis
15f00 74 65 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  ter holding the 
15f10 73 75 62 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65  subroutine.** re
15f20 74 75 72 6e 20 61 64 64 72 65 73 73 2e 0a 2a 2a  turn address..**
15f30 0a 2a 2a 20 49 66 20 72 65 67 50 72 65 76 3e 30  .** If regPrev>0
15f40 20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20   then it is the 
15f50 66 69 72 73 74 20 72 65 67 69 73 74 65 72 20 69  first register i
15f60 6e 20 61 20 76 65 63 74 6f 72 20 74 68 61 74 0a  n a vector that.
15f70 2a 2a 20 72 65 63 6f 72 64 73 20 74 68 65 20 70  ** records the p
15f80 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74 2e 20  revious output. 
15f90 20 6d 65 6d 5b 72 65 67 50 72 65 76 5d 20 69 73   mem[regPrev] is
15fa0 20 61 20 66 6c 61 67 20 74 68 61 74 20 69 73 20   a flag that is 
15fb0 66 61 6c 73 65 0a 2a 2a 20 69 66 20 74 68 65 72  false.** if ther
15fc0 65 20 68 61 73 20 62 65 65 6e 20 6e 6f 20 70 72  e has been no pr
15fd0 65 76 69 6f 75 73 20 6f 75 74 70 75 74 2e 20 20  evious output.  
15fe0 49 66 20 72 65 67 50 72 65 76 3e 30 20 74 68 65  If regPrev>0 the
15ff0 6e 20 63 6f 64 65 20 69 73 0a 2a 2a 20 67 65 6e  n code is.** gen
16000 65 72 61 74 65 64 20 74 6f 20 73 75 70 70 72 65  erated to suppre
16010 73 73 20 64 75 70 6c 69 63 61 74 65 73 2e 20 20  ss duplicates.  
16020 70 4b 65 79 49 6e 66 6f 20 69 73 20 75 73 65 64  pKeyInfo is used
16030 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67 0a 2a   for comparing.*
16040 2a 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  * keys..**.** If
16050 20 74 68 65 20 4c 49 4d 49 54 20 66 6f 75 6e 64   the LIMIT found
16060 20 69 6e 20 70 2d 3e 69 4c 69 6d 69 74 20 69 73   in p->iLimit is
16070 20 72 65 61 63 68 65 64 2c 20 6a 75 6d 70 20 69   reached, jump i
16080 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 0a 2a 2a  mmediately to.**
16090 20 69 42 72 65 61 6b 2e 0a 2a 2f 0a 73 74 61 74   iBreak..*/.stat
160a0 69 63 20 69 6e 74 20 67 65 6e 65 72 61 74 65 4f  ic int generateO
160b0 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28  utputSubroutine(
160c0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
160d0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
160e0 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
160f0 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
16100 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
16110 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
16120 6e 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  nt */.  SelectDe
16130 73 74 20 2a 70 49 6e 2c 20 20 20 20 20 20 20 20  st *pIn,        
16140 2f 2a 20 43 6f 72 6f 75 74 69 6e 65 20 73 75 70  /* Coroutine sup
16150 70 6c 79 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20  plying data */. 
16160 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
16170 73 74 2c 20 20 20 20 20 20 2f 2a 20 57 68 65 72  st,      /* Wher
16180 65 20 74 6f 20 73 65 6e 64 20 74 68 65 20 64 61  e to send the da
16190 74 61 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52  ta */.  int regR
161a0 65 74 75 72 6e 2c 20 20 20 20 20 20 20 20 20 20  eturn,          
161b0 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20 61 64  /* The return ad
161c0 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 2a  dress register *
161d0 2f 0a 20 20 69 6e 74 20 72 65 67 50 72 65 76 2c  /.  int regPrev,
161e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
161f0 72 65 76 69 6f 75 73 20 72 65 73 75 6c 74 20 72  revious result r
16200 65 67 69 73 74 65 72 2e 20 20 4e 6f 20 75 6e 69  egister.  No uni
16210 71 75 65 6e 65 73 73 20 69 66 20 30 20 2a 2f 0a  queness if 0 */.
16220 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
16230 6e 66 6f 2c 20 20 20 20 20 20 2f 2a 20 46 6f 72  nfo,      /* For
16240 20 63 6f 6d 70 61 72 69 6e 67 20 77 69 74 68 20   comparing with 
16250 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20 2a  previous entry *
16260 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20  /.  int iBreak  
16270 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
16280 75 6d 70 20 68 65 72 65 20 69 66 20 77 65 20 68  ump here if we h
16290 69 74 20 74 68 65 20 4c 49 4d 49 54 20 2a 2f 0a  it the LIMIT */.
162a0 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
162b0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
162c0 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 3b 0a 20  int iContinue;. 
162d0 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20 61 64   int addr;..  ad
162e0 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
162f0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
16300 20 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71    iContinue = sq
16310 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
16320 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 53 75 70  el(v);..  /* Sup
16330 70 72 65 73 73 20 64 75 70 6c 69 63 61 74 65 73  press duplicates
16340 20 66 6f 72 20 55 4e 49 4f 4e 2c 20 45 58 43 45   for UNION, EXCE
16350 50 54 2c 20 61 6e 64 20 49 4e 54 45 52 53 45 43  PT, and INTERSEC
16360 54 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65  T .  */.  if( re
16370 67 50 72 65 76 20 29 7b 0a 20 20 20 20 69 6e 74  gPrev ){.    int
16380 20 61 64 64 72 31 2c 20 61 64 64 72 32 3b 0a 20   addr1, addr2;. 
16390 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74     addr1 = sqlit
163a0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
163b0 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67 50 72 65  OP_IfNot, regPre
163c0 76 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  v); VdbeCoverage
163d0 28 76 29 3b 0a 20 20 20 20 61 64 64 72 32 20 3d  (v);.    addr2 =
163e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
163f0 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65  p4(v, OP_Compare
16400 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 72 65  , pIn->iSdst, re
16410 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53  gPrev+1, pIn->nS
16420 64 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  dst,.           
16430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16440 20 20 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65     (char*)sqlite
16450 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79  3KeyInfoRef(pKey
16460 49 6e 66 6f 29 2c 20 50 34 5f 4b 45 59 49 4e 46  Info), P4_KEYINF
16470 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  O);.    sqlite3V
16480 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
16490 4a 75 6d 70 2c 20 61 64 64 72 32 2b 32 2c 20 69  Jump, addr2+2, i
164a0 43 6f 6e 74 69 6e 75 65 2c 20 61 64 64 72 32 2b  Continue, addr2+
164b0 32 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  2); VdbeCoverage
164c0 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
164d0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
164e0 61 64 64 72 31 29 3b 0a 20 20 20 20 73 71 6c 69  addr1);.    sqli
164f0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
16500 20 4f 50 5f 43 6f 70 79 2c 20 70 49 6e 2d 3e 69   OP_Copy, pIn->i
16510 53 64 73 74 2c 20 72 65 67 50 72 65 76 2b 31 2c  Sdst, regPrev+1,
16520 20 70 49 6e 2d 3e 6e 53 64 73 74 2d 31 29 3b 0a   pIn->nSdst-1);.
16530 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16540 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
16550 67 65 72 2c 20 31 2c 20 72 65 67 50 72 65 76 29  ger, 1, regPrev)
16560 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72  ;.  }.  if( pPar
16570 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
16580 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b  iled ) return 0;
16590 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20  ..  /* Suppress 
165a0 74 68 65 20 66 69 72 73 74 20 4f 46 46 53 45 54  the first OFFSET
165b0 20 65 6e 74 72 69 65 73 20 69 66 20 74 68 65 72   entries if ther
165c0 65 20 69 73 20 61 6e 20 4f 46 46 53 45 54 20 63  e is an OFFSET c
165d0 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 63 6f 64  lause.  */.  cod
165e0 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f  eOffset(v, p->iO
165f0 66 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65  ffset, iContinue
16600 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 44  );..  assert( pD
16610 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f  est->eDest!=SRT_
16620 45 78 69 73 74 73 20 29 3b 0a 20 20 61 73 73 65  Exists );.  asse
16630 72 74 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74  rt( pDest->eDest
16640 21 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20  !=SRT_Table );. 
16650 20 73 77 69 74 63 68 28 20 70 44 65 73 74 2d 3e   switch( pDest->
16660 65 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20  eDest ){.    /* 
16670 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  Store the result
16680 20 61 73 20 64 61 74 61 20 75 73 69 6e 67 20 61   as data using a
16690 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20 20   unique key..   
166a0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
166b0 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20  _EphemTab: {.   
166c0 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69     int r1 = sqli
166d0 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
166e0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 6e 74  arse);.      int
166f0 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r2 = sqlite3Get
16700 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
16710 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
16720 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
16730 61 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e  akeRecord, pIn->
16740 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73  iSdst, pIn->nSds
16750 74 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  t, r1);.      sq
16760 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
16770 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20  v, OP_NewRowid, 
16780 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20  pDest->iSDParm, 
16790 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r2);.      sqlit
167a0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
167b0 4f 50 5f 49 6e 73 65 72 74 2c 20 70 44 65 73 74  OP_Insert, pDest
167c0 2d 3e 69 53 44 50 61 72 6d 2c 20 72 31 2c 20 72  ->iSDParm, r1, r
167d0 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
167e0 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
167f0 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b   OPFLAG_APPEND);
16800 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
16810 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
16820 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20  rse, r2);.      
16830 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
16840 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
16850 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
16860 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53      }..#ifndef S
16870 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
16880 45 52 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65  ERY.    /* If we
16890 20 61 72 65 20 63 72 65 61 74 69 6e 67 20 61 20   are creating a 
168a0 73 65 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72  set for an "expr
168b0 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29   IN (SELECT ...)
168c0 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20  " construct,.   
168d0 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73   ** then there s
168e0 68 6f 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c  hould be a singl
168f0 65 20 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74  e item on the st
16900 61 63 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73  ack.  Write this
16910 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74  .    ** item int
16920 6f 20 74 68 65 20 73 65 74 20 74 61 62 6c 65 20  o the set table 
16930 77 69 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e  with bogus data.
16940 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
16950 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20   SRT_Set: {.    
16960 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 20 20    int r1;.      
16970 61 73 73 65 72 74 28 20 70 49 6e 2d 3e 6e 53 64  assert( pIn->nSd
16980 73 74 3d 3d 31 20 7c 7c 20 70 50 61 72 73 65 2d  st==1 || pParse-
16990 3e 6e 45 72 72 3e 30 20 29 3b 0a 20 20 20 20 20  >nErr>0 );.     
169a0 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 20   pDest->affSdst 
169b0 3d 20 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69  = .         sqli
169c0 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
169d0 74 79 28 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  ty(p->pEList->a[
169e0 30 5d 2e 70 45 78 70 72 2c 20 70 44 65 73 74 2d  0].pExpr, pDest-
169f0 3e 61 66 66 53 64 73 74 29 3b 0a 20 20 20 20 20  >affSdst);.     
16a00 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
16a10 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
16a20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
16a30 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d  beAddOp4(v, OP_M
16a40 61 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e  akeRecord, pIn->
16a50 69 53 64 73 74 2c 20 31 2c 20 72 31 2c 20 26 70  iSdst, 1, r1, &p
16a60 44 65 73 74 2d 3e 61 66 66 53 64 73 74 2c 31 29  Dest->affSdst,1)
16a70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
16a80 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
16a90 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70  Change(pParse, p
16aa0 49 6e 2d 3e 69 53 64 73 74 2c 20 31 29 3b 0a 20  In->iSdst, 1);. 
16ab0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
16ac0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
16ad0 49 6e 73 65 72 74 2c 20 70 44 65 73 74 2d 3e 69  Insert, pDest->i
16ae0 53 44 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20  SDParm, r1);.   
16af0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
16b00 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
16b10 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61   r1);.      brea
16b20 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
16b30 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73 63   If this is a sc
16b40 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68 61 74  alar select that
16b50 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65   is part of an e
16b60 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a  xpression, then.
16b70 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65      ** store the
16b80 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20   results in the 
16b90 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f  appropriate memo
16ba0 72 79 20 63 65 6c 6c 20 61 6e 64 20 62 72 65 61  ry cell and brea
16bb0 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20  k out.    ** of 
16bc0 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20  the scan loop.. 
16bd0 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
16be0 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20  RT_Mem: {.      
16bf0 61 73 73 65 72 74 28 20 70 49 6e 2d 3e 6e 53 64  assert( pIn->nSd
16c00 73 74 3d 3d 31 20 7c 7c 20 70 50 61 72 73 65 2d  st==1 || pParse-
16c10 3e 6e 45 72 72 3e 30 20 29 3b 20 20 74 65 73 74  >nErr>0 );  test
16c20 63 61 73 65 28 20 70 49 6e 2d 3e 6e 53 64 73 74  case( pIn->nSdst
16c30 21 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  !=1 );.      sql
16c40 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65  ite3ExprCodeMove
16c50 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53  (pParse, pIn->iS
16c60 64 73 74 2c 20 70 44 65 73 74 2d 3e 69 53 44 50  dst, pDest->iSDP
16c70 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f  arm, 1);.      /
16c80 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75  * The LIMIT clau
16c90 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74  se will jump out
16ca0 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72   of the loop for
16cb0 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65   us */.      bre
16cc0 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
16cd0 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49   /* #ifndef SQLI
16ce0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
16cf0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20   */..    /* The 
16d00 72 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72  results are stor
16d10 65 64 20 69 6e 20 61 20 73 65 71 75 65 6e 63 65  ed in a sequence
16d20 20 6f 66 20 72 65 67 69 73 74 65 72 73 0a 20 20   of registers.  
16d30 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74    ** starting at
16d40 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2e 20 20   pDest->iSdst.  
16d50 54 68 65 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74  Then the co-rout
16d60 69 6e 65 20 79 69 65 6c 64 73 2e 0a 20 20 20 20  ine yields..    
16d70 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
16d80 43 6f 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20  Coroutine: {.   
16d90 20 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69 53     if( pDest->iS
16da0 64 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  dst==0 ){.      
16db0 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d    pDest->iSdst =
16dc0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
16dd0 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e  ange(pParse, pIn
16de0 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20  ->nSdst);.      
16df0 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d    pDest->nSdst =
16e00 20 70 49 6e 2d 3e 6e 53 64 73 74 3b 0a 20 20 20   pIn->nSdst;.   
16e10 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
16e20 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70  e3ExprCodeMove(p
16e30 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73  Parse, pIn->iSds
16e40 74 2c 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2c  t, pDest->iSdst,
16e50 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20   pIn->nSdst);.  
16e60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16e70 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
16e80 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  d, pDest->iSDPar
16e90 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  m);.      break;
16ea0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
16eb0 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 61 62  f none of the ab
16ec0 6f 76 65 2c 20 74 68 65 6e 20 74 68 65 20 72 65  ove, then the re
16ed0 73 75 6c 74 20 64 65 73 74 69 6e 61 74 69 6f 6e  sult destination
16ee0 20 6d 75 73 74 20 62 65 0a 20 20 20 20 2a 2a 20   must be.    ** 
16ef0 53 52 54 5f 4f 75 74 70 75 74 2e 20 20 54 68 69  SRT_Output.  Thi
16f00 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76  s routine is nev
16f10 65 72 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61  er called with a
16f20 6e 79 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20  ny other.    ** 
16f30 64 65 73 74 69 6e 61 74 69 6f 6e 20 6f 74 68 65  destination othe
16f40 72 20 74 68 61 6e 20 74 68 65 20 6f 6e 65 73 20  r than the ones 
16f50 68 61 6e 64 6c 65 64 20 61 62 6f 76 65 20 6f 72  handled above or
16f60 20 53 52 54 5f 4f 75 74 70 75 74 2e 0a 20 20 20   SRT_Output..   
16f70 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 20 53   **.    ** For S
16f80 52 54 5f 4f 75 74 70 75 74 2c 20 72 65 73 75 6c  RT_Output, resul
16f90 74 73 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e  ts are stored in
16fa0 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72   a sequence of r
16fb0 65 67 69 73 74 65 72 73 2e 20 20 0a 20 20 20 20  egisters.  .    
16fc0 2a 2a 20 54 68 65 6e 20 74 68 65 20 4f 50 5f 52  ** Then the OP_R
16fd0 65 73 75 6c 74 52 6f 77 20 6f 70 63 6f 64 65 20  esultRow opcode 
16fe0 69 73 20 75 73 65 64 20 74 6f 20 63 61 75 73 65  is used to cause
16ff0 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20   sqlite3_step() 
17000 74 6f 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e  to.    ** return
17010 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 6f 66   the next row of
17020 20 72 65 73 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a   result..    */.
17030 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
17040 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44 65       assert( pDe
17050 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f  st->eDest==SRT_O
17060 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20 73  utput );.      s
17070 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
17080 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  (v, OP_ResultRow
17090 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49  , pIn->iSdst, pI
170a0 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20  n->nSdst);.     
170b0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
170c0 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
170d0 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64  pParse, pIn->iSd
170e0 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b  st, pIn->nSdst);
170f0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
17100 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75    }.  }..  /* Ju
17110 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  mp to the end of
17120 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65   the loop if the
17130 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68 65   LIMIT is reache
17140 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  d..  */.  if( p-
17150 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73  >iLimit ){.    s
17160 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
17170 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a  (v, OP_DecrJumpZ
17180 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20  ero, p->iLimit, 
17190 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76  iBreak); VdbeCov
171a0 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20  erage(v);.  }.. 
171b0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65   /* Generate the
171c0 20 73 75 62 72 6f 75 74 69 6e 65 20 72 65 74 75   subroutine retu
171d0 72 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  rn.  */.  sqlite
171e0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
171f0 6c 28 76 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b  l(v, iContinue);
17200 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
17210 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
17220 6e 2c 20 72 65 67 52 65 74 75 72 6e 29 3b 0a 0a  n, regReturn);..
17230 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d    return addr;.}
17240 0a 0a 2f 2a 0a 2a 2a 20 41 6c 74 65 72 6e 61 74  ../*.** Alternat
17250 69 76 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  ive compound sel
17260 65 63 74 20 63 6f 64 65 20 67 65 6e 65 72 61 74  ect code generat
17270 6f 72 20 66 6f 72 20 63 61 73 65 73 20 77 68 65  or for cases whe
17280 6e 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 61 6e  n there.** is an
17290 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
172a0 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73 73 75 6d  ..**.** We assum
172b0 65 20 61 20 71 75 65 72 79 20 6f 66 20 74 68 65  e a query of the
172c0 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 3a   following form:
172d0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 3c 73 65 6c  .**.**      <sel
172e0 65 63 74 41 3e 20 20 3c 6f 70 65 72 61 74 6f 72  ectA>  <operator
172f0 3e 20 20 3c 73 65 6c 65 63 74 42 3e 20 20 4f 52  >  <selectB>  OR
17300 44 45 52 20 42 59 20 3c 6f 72 64 65 72 62 79 6c  DER BY <orderbyl
17310 69 73 74 3e 0a 2a 2a 0a 2a 2a 20 3c 6f 70 65 72  ist>.**.** <oper
17320 61 74 6f 72 3e 20 69 73 20 6f 6e 65 20 6f 66 20  ator> is one of 
17330 55 4e 49 4f 4e 20 41 4c 4c 2c 20 55 4e 49 4f 4e  UNION ALL, UNION
17340 2c 20 45 58 43 45 50 54 2c 20 6f 72 20 49 4e 54  , EXCEPT, or INT
17350 45 52 53 45 43 54 2e 20 20 54 68 65 20 69 64 65  ERSECT.  The ide
17360 61 0a 2a 2a 20 69 73 20 74 6f 20 63 6f 64 65 20  a.** is to code 
17370 62 6f 74 68 20 3c 73 65 6c 65 63 74 41 3e 20 61  both <selectA> a
17380 6e 64 20 3c 73 65 6c 65 63 74 42 3e 20 77 69 74  nd <selectB> wit
17390 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  h the ORDER BY c
173a0 6c 61 75 73 65 20 61 73 0a 2a 2a 20 63 6f 2d 72  lause as.** co-r
173b0 6f 75 74 69 6e 65 73 2e 20 20 54 68 65 6e 20 72  outines.  Then r
173c0 75 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e  un the co-routin
173d0 65 73 20 69 6e 20 70 61 72 61 6c 6c 65 6c 20 61  es in parallel a
173e0 6e 64 20 6d 65 72 67 65 20 74 68 65 20 72 65 73  nd merge the res
173f0 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 74 68 65  ults.** into the
17400 20 6f 75 74 70 75 74 2e 20 20 49 6e 20 61 64 64   output.  In add
17410 69 74 69 6f 6e 20 74 6f 20 74 68 65 20 74 77 6f  ition to the two
17420 20 63 6f 72 6f 75 74 69 6e 65 73 20 28 63 61 6c   coroutines (cal
17430 6c 65 64 20 73 65 6c 65 63 74 41 20 61 6e 64 0a  led selectA and.
17440 2a 2a 20 73 65 6c 65 63 74 42 29 20 74 68 65 72  ** selectB) ther
17450 65 20 61 72 65 20 37 20 73 75 62 72 6f 75 74 69  e are 7 subrouti
17460 6e 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75  nes:.**.**    ou
17470 74 41 3a 20 20 20 20 4d 6f 76 65 20 74 68 65 20  tA:    Move the 
17480 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20 73 65  output of the se
17490 6c 65 63 74 41 20 63 6f 72 6f 75 74 69 6e 65 20  lectA coroutine 
174a0 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a  into the output.
174b0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 6f  **             o
174c0 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71  f the compound q
174d0 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 6f  uery..**.**    o
174e0 75 74 42 3a 20 20 20 20 4d 6f 76 65 20 74 68 65  utB:    Move the
174f0 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20 73   output of the s
17500 65 6c 65 63 74 42 20 63 6f 72 6f 75 74 69 6e 65  electB coroutine
17510 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74   into the output
17520 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
17530 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  of the compound 
17540 71 75 65 72 79 2e 20 20 28 4f 6e 6c 79 20 67 65  query.  (Only ge
17550 6e 65 72 61 74 65 64 20 66 6f 72 20 55 4e 49 4f  nerated for UNIO
17560 4e 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20  N and.**        
17570 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 2e 20       UNION ALL. 
17580 20 45 58 43 45 50 54 20 61 6e 64 20 49 4e 53 45   EXCEPT and INSE
17590 52 54 53 45 43 54 20 6e 65 76 65 72 20 6f 75 74  RTSECT never out
175a0 70 75 74 20 61 20 72 6f 77 20 74 68 61 74 0a 2a  put a row that.*
175b0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70  *             ap
175c0 70 65 61 72 73 20 6f 6e 6c 79 20 69 6e 20 42 2e  pears only in B.
175d0 29 0a 2a 2a 0a 2a 2a 20 20 20 20 41 6c 74 42 3a  ).**.**    AltB:
175e0 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20      Called when 
175f0 74 68 65 72 65 20 69 73 20 64 61 74 61 20 66 72  there is data fr
17600 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e  om both coroutin
17610 65 73 20 61 6e 64 20 41 3c 42 2e 0a 2a 2a 0a 2a  es and A<B..**.*
17620 2a 20 20 20 20 41 65 71 42 3a 20 20 20 20 43 61  *    AeqB:    Ca
17630 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20  lled when there 
17640 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74  is data from bot
17650 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64  h coroutines and
17660 20 41 3d 3d 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   A==B..**.**    
17670 41 67 74 42 3a 20 20 20 20 43 61 6c 6c 65 64 20  AgtB:    Called 
17680 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 64 61  when there is da
17690 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72  ta from both cor
176a0 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3e 42 2e  outines and A>B.
176b0 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20  .**.**    EofA: 
176c0 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 64     Called when d
176d0 61 74 61 20 69 73 20 65 78 68 61 75 73 74 65 64  ata is exhausted
176e0 20 66 72 6f 6d 20 73 65 6c 65 63 74 41 2e 0a 2a   from selectA..*
176f0 2a 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20 20 20  *.**    EofB:   
17700 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 64 61 74   Called when dat
17710 61 20 69 73 20 65 78 68 61 75 73 74 65 64 20 66  a is exhausted f
17720 72 6f 6d 20 73 65 6c 65 63 74 42 2e 0a 2a 2a 0a  rom selectB..**.
17730 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74  ** The implement
17740 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 61 74  ation of the lat
17750 74 65 72 20 66 69 76 65 20 73 75 62 72 6f 75 74  ter five subrout
17760 69 6e 65 73 20 64 65 70 65 6e 64 20 6f 6e 20 77  ines depend on w
17770 68 69 63 68 20 0a 2a 2a 20 3c 6f 70 65 72 61 74  hich .** <operat
17780 6f 72 3e 20 69 73 20 75 73 65 64 3a 0a 2a 2a 0a  or> is used:.**.
17790 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  **.**           
177a0 20 20 55 4e 49 4f 4e 20 41 4c 4c 20 20 20 20 20    UNION ALL     
177b0 20 20 20 20 55 4e 49 4f 4e 20 20 20 20 20 20 20      UNION       
177c0 20 20 20 20 20 45 58 43 45 50 54 20 20 20 20 20       EXCEPT     
177d0 20 20 20 20 20 49 4e 54 45 52 53 45 43 54 0a 2a       INTERSECT.*
177e0 2a 20 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d  *          -----
177f0 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d  --------  ------
17800 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d  -----------  ---
17810 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d  -----------  ---
17820 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
17830 2a 20 20 20 41 6c 74 42 3a 20 20 20 6f 75 74 41  *   AltB:   outA
17840 2c 20 6e 65 78 74 41 20 20 20 20 20 20 6f 75 74  , nextA      out
17850 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 6f  A, nextA       o
17860 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
17870 20 20 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20     nextA.**.**  
17880 20 41 65 71 42 3a 20 20 20 6f 75 74 41 2c 20 6e   AeqB:   outA, n
17890 65 78 74 41 20 20 20 20 20 20 20 20 20 6e 65 78  extA         nex
178a0 74 41 20 20 20 20 20 20 20 20 20 20 20 20 20 6e  tA             n
178b0 65 78 74 41 20 20 20 20 20 20 20 20 20 6f 75 74  extA         out
178c0 41 2c 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20  A, nextA.**.**  
178d0 20 41 67 74 42 3a 20 20 20 6f 75 74 42 2c 20 6e   AgtB:   outB, n
178e0 65 78 74 42 20 20 20 20 20 20 6f 75 74 42 2c 20  extB      outB, 
178f0 6e 65 78 74 42 20 20 20 20 20 20 20 20 20 20 6e  nextB          n
17900 65 78 74 42 20 20 20 20 20 20 20 20 20 20 20 20  extB            
17910 6e 65 78 74 42 0a 2a 2a 0a 2a 2a 20 20 20 45 6f  nextB.**.**   Eo
17920 66 41 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78 74  fA:   outB, next
17930 42 20 20 20 20 20 20 6f 75 74 42 2c 20 6e 65 78  B      outB, nex
17940 74 42 20 20 20 20 20 20 20 20 20 20 68 61 6c 74  tB          halt
17950 20 20 20 20 20 20 20 20 20 20 20 20 20 68 61 6c               hal
17960 74 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 42 3a 20  t.**.**   EofB: 
17970 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
17980 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
17990 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41       outA, nextA
179a0 20 20 20 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a           halt.**
179b0 0a 2a 2a 20 49 6e 20 74 68 65 20 41 6c 74 42 2c  .** In the AltB,
179c0 20 41 65 71 42 2c 20 61 6e 64 20 41 67 74 42 20   AeqB, and AgtB 
179d0 73 75 62 72 6f 75 74 69 6e 65 73 2c 20 61 6e 20  subroutines, an 
179e0 45 4f 46 20 6f 6e 20 41 20 66 6f 6c 6c 6f 77 69  EOF on A followi
179f0 6e 67 20 6e 65 78 74 41 0a 2a 2a 20 63 61 75 73  ng nextA.** caus
17a00 65 73 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20  es an immediate 
17a10 6a 75 6d 70 20 74 6f 20 45 6f 66 41 20 61 6e 64  jump to EofA and
17a20 20 61 6e 20 45 4f 46 20 6f 6e 20 42 20 66 6f 6c   an EOF on B fol
17a30 6c 6f 77 69 6e 67 20 6e 65 78 74 42 20 63 61 75  lowing nextB cau
17a40 73 65 73 0a 2a 2a 20 61 6e 20 69 6d 6d 65 64 69  ses.** an immedi
17a50 61 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66 42  ate jump to EofB
17a60 2e 20 20 57 69 74 68 69 6e 20 45 6f 66 41 20 61  .  Within EofA a
17a70 6e 64 20 45 6f 66 42 2c 20 61 6e 64 20 45 4f 46  nd EofB, and EOF
17a80 20 6f 6e 20 65 6e 74 72 79 20 6f 72 0a 2a 2a 20   on entry or.** 
17a90 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 58 20  following nextX 
17aa0 63 61 75 73 65 73 20 61 20 6a 75 6d 70 20 74 6f  causes a jump to
17ab0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
17ac0 73 65 6c 65 63 74 20 70 72 6f 63 65 73 73 69 6e  select processin
17ad0 67 2e 0a 2a 2a 0a 2a 2a 20 44 75 70 6c 69 63 61  g..**.** Duplica
17ae0 74 65 20 72 65 6d 6f 76 61 6c 20 69 6e 20 74 68  te removal in th
17af0 65 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c  e UNION, EXCEPT,
17b00 20 61 6e 64 20 49 4e 54 45 52 53 45 43 54 20 63   and INTERSECT c
17b10 61 73 65 73 20 69 73 20 68 61 6e 64 6c 65 64 0a  ases is handled.
17b20 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 6f 75  ** within the ou
17b30 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 2e  tput subroutine.
17b40 20 20 54 68 65 20 72 65 67 50 72 65 76 20 72 65    The regPrev re
17b50 67 69 73 74 65 72 20 73 65 74 20 68 6f 6c 64 73  gister set holds
17b60 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79 0a   the previously.
17b70 2a 2a 20 6f 75 74 70 75 74 20 76 61 6c 75 65 2e  ** output value.
17b80 20 20 41 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69    A comparison i
17b90 73 20 6d 61 64 65 20 61 67 61 69 6e 73 74 20 74  s made against t
17ba0 68 69 73 20 76 61 6c 75 65 20 61 6e 64 20 74 68  his value and th
17bb0 65 20 6f 75 74 70 75 74 0a 2a 2a 20 69 73 20 73  e output.** is s
17bc0 6b 69 70 70 65 64 20 69 66 20 74 68 65 20 6e 65  kipped if the ne
17bd0 78 74 20 72 65 73 75 6c 74 73 20 77 6f 75 6c 64  xt results would
17be0 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20   be the same as 
17bf0 74 68 65 20 70 72 65 76 69 6f 75 73 2e 0a 2a 2a  the previous..**
17c00 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e  .** The implemen
17c10 74 61 74 69 6f 6e 20 70 6c 61 6e 20 69 73 20 74  tation plan is t
17c20 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
17c30 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20 61  two coroutines a
17c40 6e 64 20 73 65 76 65 6e 0a 2a 2a 20 73 75 62 72  nd seven.** subr
17c50 6f 75 74 69 6e 65 73 20 66 69 72 73 74 2c 20 74  outines first, t
17c60 68 65 6e 20 70 75 74 20 74 68 65 20 63 6f 6e 74  hen put the cont
17c70 72 6f 6c 20 6c 6f 67 69 63 20 61 74 20 74 68 65  rol logic at the
17c80 20 62 6f 74 74 6f 6d 2e 20 20 4c 69 6b 65 20 74   bottom.  Like t
17c90 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
17ca0 20 20 20 20 67 6f 74 6f 20 49 6e 69 74 0a 2a 2a      goto Init.**
17cb0 20 20 20 20 20 63 6f 41 3a 20 63 6f 72 6f 75 74       coA: corout
17cc0 69 6e 65 20 66 6f 72 20 6c 65 66 74 20 71 75 65  ine for left que
17cd0 72 79 20 28 41 29 0a 2a 2a 20 20 20 20 20 63 6f  ry (A).**     co
17ce0 42 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72  B: coroutine for
17cf0 20 72 69 67 68 74 20 71 75 65 72 79 20 28 42 29   right query (B)
17d00 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20 6f 75 74  .**    outA: out
17d10 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 41  put one row of A
17d20 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20 6f 75 74  .**    outB: out
17d30 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 42  put one row of B
17d40 20 28 55 4e 49 4f 4e 20 61 6e 64 20 55 4e 49 4f   (UNION and UNIO
17d50 4e 20 41 4c 4c 20 6f 6e 6c 79 29 0a 2a 2a 20 20  N ALL only).**  
17d60 20 20 45 6f 66 41 3a 20 2e 2e 2e 0a 2a 2a 20 20    EofA: ....**  
17d70 20 20 45 6f 66 42 3a 20 2e 2e 2e 0a 2a 2a 20 20    EofB: ....**  
17d80 20 20 41 6c 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20    AltB: ....**  
17d90 20 20 41 65 71 42 3a 20 2e 2e 2e 0a 2a 2a 20 20    AeqB: ....**  
17da0 20 20 41 67 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20    AgtB: ....**  
17db0 20 20 49 6e 69 74 3a 20 69 6e 69 74 69 61 6c 69    Init: initiali
17dc0 7a 65 20 63 6f 72 6f 75 74 69 6e 65 20 72 65 67  ze coroutine reg
17dd0 69 73 74 65 72 73 0a 2a 2a 20 20 20 20 20 20 20  isters.**       
17de0 20 20 20 79 69 65 6c 64 20 63 6f 41 0a 2a 2a 20     yield coA.** 
17df0 20 20 20 20 20 20 20 20 20 69 66 20 65 6f 66 28           if eof(
17e00 41 29 20 67 6f 74 6f 20 45 6f 66 41 0a 2a 2a 20  A) goto EofA.** 
17e10 20 20 20 20 20 20 20 20 20 79 69 65 6c 64 20 63           yield c
17e20 6f 42 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69  oB.**          i
17e30 66 20 65 6f 66 28 42 29 20 67 6f 74 6f 20 45 6f  f eof(B) goto Eo
17e40 66 42 0a 2a 2a 20 20 20 20 43 6d 70 72 3a 20 43  fB.**    Cmpr: C
17e50 6f 6d 70 61 72 65 20 41 2c 20 42 0a 2a 2a 20 20  ompare A, B.**  
17e60 20 20 20 20 20 20 20 20 4a 75 6d 70 20 41 6c 74          Jump Alt
17e70 42 2c 20 41 65 71 42 2c 20 41 67 74 42 0a 2a 2a  B, AeqB, AgtB.**
17e80 20 20 20 20 20 45 6e 64 3a 20 2e 2e 2e 0a 2a 2a       End: ....**
17e90 0a 2a 2a 20 57 65 20 63 61 6c 6c 20 41 6c 74 42  .** We call AltB
17ea0 2c 20 41 65 71 42 2c 20 41 67 74 42 2c 20 45 6f  , AeqB, AgtB, Eo
17eb0 66 41 2c 20 61 6e 64 20 45 6f 66 42 20 22 73 75  fA, and EofB "su
17ec0 62 72 6f 75 74 69 6e 65 73 22 20 62 75 74 20 74  broutines" but t
17ed0 68 65 79 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61  hey are not.** a
17ee0 63 74 75 61 6c 6c 79 20 63 61 6c 6c 65 64 20 75  ctually called u
17ef0 73 69 6e 67 20 47 6f 73 75 62 20 61 6e 64 20 74  sing Gosub and t
17f00 68 65 79 20 64 6f 20 6e 6f 74 20 52 65 74 75 72  hey do not Retur
17f10 6e 2e 20 20 45 6f 66 41 20 61 6e 64 20 45 6f 66  n.  EofA and Eof
17f20 42 20 6c 6f 6f 70 0a 2a 2a 20 75 6e 74 69 6c 20  B loop.** until 
17f30 61 6c 6c 20 64 61 74 61 20 69 73 20 65 78 68 61  all data is exha
17f40 75 73 74 65 64 20 74 68 65 6e 20 6a 75 6d 70 20  usted then jump 
17f50 74 6f 20 74 68 65 20 22 65 6e 64 22 20 6c 61 62  to the "end" lab
17f60 65 2e 20 20 41 6c 74 42 2c 20 41 65 71 42 2c 0a  e.  AltB, AeqB,.
17f70 2a 2a 20 61 6e 64 20 41 67 74 42 20 6a 75 6d 70  ** and AgtB jump
17f80 20 74 6f 20 65 69 74 68 65 72 20 4c 32 20 6f 72   to either L2 or
17f90 20 74 6f 20 6f 6e 65 20 6f 66 20 45 6f 66 41 20   to one of EofA 
17fa0 6f 72 20 45 6f 66 42 2e 0a 2a 2f 0a 23 69 66 6e  or EofB..*/.#ifn
17fb0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
17fc0 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
17fd0 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69  static int multi
17fe0 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 0a 20  SelectOrderBy(. 
17ff0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
18000 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
18010 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
18020 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
18030 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
18040 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54  t-most of SELECT
18050 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  s to be coded */
18060 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
18070 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74  Dest     /* What
18080 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72   to do with quer
18090 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a  y results */.){.
180a0 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
180b0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
180c0 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 53 65  counters */.  Se
180d0 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20  lect *pPrior;   
180e0 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53      /* Another S
180f0 45 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c  ELECT immediatel
18100 79 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f  y to our left */
18110 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
18120 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
18130 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69  rate code to thi
18140 73 20 56 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65  s VDBE */.  Sele
18150 63 74 44 65 73 74 20 64 65 73 74 41 3b 20 20 20  ctDest destA;   
18160 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e    /* Destination
18170 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20 41   for coroutine A
18180 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
18190 20 64 65 73 74 42 3b 20 20 20 20 20 2f 2a 20 44   destB;     /* D
181a0 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63  estination for c
181b0 6f 72 6f 75 74 69 6e 65 20 42 20 2a 2f 0a 20 20  oroutine B */.  
181c0 69 6e 74 20 72 65 67 41 64 64 72 41 3b 20 20 20  int regAddrA;   
181d0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
181e0 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65   register for se
181f0 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65  lect-A coroutine
18200 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 64 64   */.  int regAdd
18210 72 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  rB;         /* A
18220 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
18230 66 6f 72 20 73 65 6c 65 63 74 2d 42 20 63 6f 72  for select-B cor
18240 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
18250 61 64 64 72 53 65 6c 65 63 74 41 3b 20 20 20 20  addrSelectA;    
18260 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
18270 74 68 65 20 73 65 6c 65 63 74 2d 41 20 63 6f 72  the select-A cor
18280 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
18290 61 64 64 72 53 65 6c 65 63 74 42 3b 20 20 20 20  addrSelectB;    
182a0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
182b0 74 68 65 20 73 65 6c 65 63 74 2d 42 20 63 6f 72  the select-B cor
182c0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
182d0 72 65 67 4f 75 74 41 3b 20 20 20 20 20 20 20 20  regOutA;        
182e0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67    /* Address reg
182f0 69 73 74 65 72 20 66 6f 72 20 74 68 65 20 6f 75  ister for the ou
18300 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74 69 6e  tput-A subroutin
18310 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75  e */.  int regOu
18320 74 42 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  tB;          /* 
18330 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72  Address register
18340 20 66 6f 72 20 74 68 65 20 6f 75 74 70 75 74 2d   for the output-
18350 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  B subroutine */.
18360 20 20 69 6e 74 20 61 64 64 72 4f 75 74 41 3b 20    int addrOutA; 
18370 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
18380 73 73 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74  ss of the output
18390 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  -A subroutine */
183a0 0a 20 20 69 6e 74 20 61 64 64 72 4f 75 74 42 20  .  int addrOutB 
183b0 3d 20 30 3b 20 20 20 20 20 2f 2a 20 41 64 64 72  = 0;     /* Addr
183c0 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74 70 75  ess of the outpu
183d0 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  t-B subroutine *
183e0 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66 41  /.  int addrEofA
183f0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
18400 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65  ress of the sele
18410 63 74 2d 41 2d 65 78 68 61 75 73 74 65 64 20 73  ct-A-exhausted s
18420 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
18430 6e 74 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 3b  nt addrEofA_noB;
18440 20 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74       /* Alternat
18450 65 20 61 64 64 72 45 6f 66 41 20 69 66 20 42 20  e addrEofA if B 
18460 69 73 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  is uninitialized
18470 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f   */.  int addrEo
18480 66 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  fB;         /* A
18490 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65  ddress of the se
184a0 6c 65 63 74 2d 42 2d 65 78 68 61 75 73 74 65 64  lect-B-exhausted
184b0 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
184c0 20 69 6e 74 20 61 64 64 72 41 6c 74 42 3b 20 20   int addrAltB;  
184d0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
184e0 73 20 6f 66 20 74 68 65 20 41 3c 42 20 73 75 62  s of the A<B sub
184f0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
18500 20 61 64 64 72 41 65 71 42 3b 20 20 20 20 20 20   addrAeqB;      
18510 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
18520 20 74 68 65 20 41 3d 3d 42 20 73 75 62 72 6f 75   the A==B subrou
18530 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
18540 64 72 41 67 74 42 3b 20 20 20 20 20 20 20 20 20  drAgtB;         
18550 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
18560 65 20 41 3e 42 20 73 75 62 72 6f 75 74 69 6e 65  e A>B subroutine
18570 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d   */.  int regLim
18580 69 74 41 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c  itA;        /* L
18590 69 6d 69 74 20 72 65 67 69 73 74 65 72 20 66 6f  imit register fo
185a0 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20  r select-A */.  
185b0 69 6e 74 20 72 65 67 4c 69 6d 69 74 42 3b 20 20  int regLimitB;  
185c0 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72        /* Limit r
185d0 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65  egister for sele
185e0 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ct-A */.  int re
185f0 67 50 72 65 76 3b 20 20 20 20 20 20 20 20 20 20  gPrev;          
18600 2f 2a 20 41 20 72 61 6e 67 65 20 6f 66 20 72 65  /* A range of re
18610 67 69 73 74 65 72 73 20 74 6f 20 68 6f 6c 64 20  gisters to hold 
18620 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74 20  previous output 
18630 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 4c 69  */.  int savedLi
18640 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 61  mit;       /* Sa
18650 76 65 64 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e  ved value of p->
18660 69 4c 69 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20  iLimit */.  int 
18670 73 61 76 65 64 4f 66 66 73 65 74 3b 20 20 20 20  savedOffset;    
18680 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65    /* Saved value
18690 20 6f 66 20 70 2d 3e 69 4f 66 66 73 65 74 20 2a   of p->iOffset *
186a0 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 43 6d 70  /.  int labelCmp
186b0 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62  r;        /* Lab
186c0 65 6c 20 66 6f 72 20 74 68 65 20 73 74 61 72 74  el for the start
186d0 20 6f 66 20 74 68 65 20 6d 65 72 67 65 20 61 6c   of the merge al
186e0 67 6f 72 69 74 68 6d 20 2a 2f 0a 20 20 69 6e 74  gorithm */.  int
186f0 20 6c 61 62 65 6c 45 6e 64 3b 20 20 20 20 20 20   labelEnd;      
18700 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20     /* Label for 
18710 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f  the end of the o
18720 76 65 72 61 6c 6c 20 53 45 4c 45 43 54 20 73 74  verall SELECT st
18730 6d 74 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  mt */.  int addr
18740 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  1;            /*
18750 20 4a 75 6d 70 20 69 6e 73 74 72 75 63 74 69 6f   Jump instructio
18760 6e 73 20 74 68 61 74 20 67 65 74 20 72 65 74 61  ns that get reta
18770 72 67 65 74 74 65 64 20 2a 2f 0a 20 20 69 6e 74  rgetted */.  int
18780 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   op;            
18790 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f     /* One of TK_
187a0 41 4c 4c 2c 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54  ALL, TK_UNION, T
187b0 4b 5f 45 58 43 45 50 54 2c 20 54 4b 5f 49 4e 54  K_EXCEPT, TK_INT
187c0 45 52 53 45 43 54 20 2a 2f 0a 20 20 4b 65 79 49  ERSECT */.  KeyI
187d0 6e 66 6f 20 2a 70 4b 65 79 44 75 70 20 3d 20 30  nfo *pKeyDup = 0
187e0 3b 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20  ; /* Comparison 
187f0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
18800 64 75 70 6c 69 63 61 74 65 20 72 65 6d 6f 76 61  duplicate remova
18810 6c 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  l */.  KeyInfo *
18820 70 4b 65 79 4d 65 72 67 65 3b 20 20 20 2f 2a 20  pKeyMerge;   /* 
18830 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72  Comparison infor
18840 6d 61 74 69 6f 6e 20 66 6f 72 20 6d 65 72 67 69  mation for mergi
18850 6e 67 20 72 6f 77 73 20 2a 2f 0a 20 20 73 71 6c  ng rows */.  sql
18860 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
18870 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
18880 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45  onnection */.  E
18890 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
188a0 79 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45  y;   /* The ORDE
188b0 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
188c0 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 20 20   int nOrderBy;  
188d0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
188e0 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 74 68 65   of terms in the
188f0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
18900 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 50 65 72 6d   */.  int *aPerm
18910 75 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d  ute;        /* M
18920 61 70 70 69 6e 67 20 66 72 6f 6d 20 4f 52 44 45  apping from ORDE
18930 52 20 42 59 20 74 65 72 6d 73 20 74 6f 20 72 65  R BY terms to re
18940 73 75 6c 74 20 73 65 74 20 63 6f 6c 75 6d 6e 73  sult set columns
18950 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
18960 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
18970 20 20 69 6e 74 20 69 53 75 62 31 3b 20 20 20 20    int iSub1;    
18980 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69          /* EQP i
18990 64 20 6f 66 20 6c 65 66 74 2d 68 61 6e 64 20 71  d of left-hand q
189a0 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 53  uery */.  int iS
189b0 75 62 32 3b 20 20 20 20 20 20 20 20 20 20 20 20  ub2;            
189c0 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 72 69 67  /* EQP id of rig
189d0 68 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f  ht-hand query */
189e0 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
189f0 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 21 3d  t( p->pOrderBy!=
18a00 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
18a10 4b 65 79 44 75 70 3d 3d 30 20 29 3b 20 2f 2a 20  KeyDup==0 ); /* 
18a20 22 4d 61 6e 61 67 65 64 22 20 63 6f 64 65 20 6e  "Managed" code n
18a30 65 65 64 73 20 74 68 69 73 2e 20 20 54 69 63 6b  eeds this.  Tick
18a40 65 74 20 23 33 33 38 32 2e 20 2a 2f 0a 20 20 64  et #3382. */.  d
18a50 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
18a60 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56    v = pParse->pV
18a70 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76  dbe;.  assert( v
18a80 21 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20  !=0 );       /* 
18a90 41 6c 72 65 61 64 79 20 74 68 72 6f 77 6e 20 74  Already thrown t
18aa0 68 65 20 65 72 72 6f 72 20 69 66 20 56 44 42 45  he error if VDBE
18ab0 20 61 6c 6c 6f 63 20 66 61 69 6c 65 64 20 2a 2f   alloc failed */
18ac0 0a 20 20 6c 61 62 65 6c 45 6e 64 20 3d 20 73 71  .  labelEnd = sq
18ad0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
18ae0 65 6c 28 76 29 3b 0a 20 20 6c 61 62 65 6c 43 6d  el(v);.  labelCm
18af0 70 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  pr = sqlite3Vdbe
18b00 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 0a  MakeLabel(v);...
18b10 20 20 2f 2a 20 50 61 74 63 68 20 75 70 20 74 68    /* Patch up th
18b20 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
18b30 65 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 2d  e.  */.  op = p-
18b40 3e 6f 70 3b 20 20 0a 20 20 70 50 72 69 6f 72 20  >op;  .  pPrior 
18b50 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 61  = p->pPrior;.  a
18b60 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70  ssert( pPrior->p
18b70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20  OrderBy==0 );.  
18b80 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
18b90 72 64 65 72 42 79 3b 0a 20 20 61 73 73 65 72 74  rderBy;.  assert
18ba0 28 20 70 4f 72 64 65 72 42 79 20 29 3b 0a 20 20  ( pOrderBy );.  
18bb0 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  nOrderBy = pOrde
18bc0 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 2f  rBy->nExpr;..  /
18bd0 2a 20 46 6f 72 20 6f 70 65 72 61 74 6f 72 73 20  * For operators 
18be0 6f 74 68 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e  other than UNION
18bf0 20 41 4c 4c 20 77 65 20 68 61 76 65 20 74 6f 20   ALL we have to 
18c00 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 0a 20  make sure that. 
18c10 20 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59   ** the ORDER BY
18c20 20 63 6c 61 75 73 65 20 63 6f 76 65 72 73 20 65   clause covers e
18c30 76 65 72 79 20 74 65 72 6d 20 6f 66 20 74 68 65  very term of the
18c40 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 41 64   result set.  Ad
18c50 64 0a 20 20 2a 2a 20 74 65 72 6d 73 20 74 6f 20  d.  ** terms to 
18c60 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
18c70 75 73 65 20 61 73 20 6e 65 63 65 73 73 61 72 79  use as necessary
18c80 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 21  ..  */.  if( op!
18c90 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 66  =TK_ALL ){.    f
18ca0 6f 72 28 69 3d 31 3b 20 64 62 2d 3e 6d 61 6c 6c  or(i=1; db->mall
18cb0 6f 63 46 61 69 6c 65 64 3d 3d 30 20 26 26 20 69  ocFailed==0 && i
18cc0 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  <=p->pEList->nEx
18cd0 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
18ce0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
18cf0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
18d00 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65     for(j=0, pIte
18d10 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 6a  m=pOrderBy->a; j
18d20 3c 6e 4f 72 64 65 72 42 79 3b 20 6a 2b 2b 2c 20  <nOrderBy; j++, 
18d30 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
18d40 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
18d50 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  >u.x.iOrderByCol
18d60 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  >0 );.        if
18d70 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72  ( pItem->u.x.iOr
18d80 64 65 72 42 79 43 6f 6c 3d 3d 69 20 29 20 62 72  derByCol==i ) br
18d90 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
18da0 20 20 20 69 66 28 20 6a 3d 3d 6e 4f 72 64 65 72     if( j==nOrder
18db0 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78  By ){.        Ex
18dc0 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74  pr *pNew = sqlit
18dd0 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 4e  e3Expr(db, TK_IN
18de0 54 45 47 45 52 2c 20 30 29 3b 0a 20 20 20 20 20  TEGER, 0);.     
18df0 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29     if( pNew==0 )
18e00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
18e10 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OMEM_BKPT;.     
18e20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c     pNew->flags |
18e30 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20  = EP_IntValue;. 
18e40 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69         pNew->u.i
18e50 56 61 6c 75 65 20 3d 20 69 3b 0a 20 20 20 20 20  Value = i;.     
18e60 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 73 71     pOrderBy = sq
18e70 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
18e80 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4f 72 64  end(pParse, pOrd
18e90 65 72 42 79 2c 20 70 4e 65 77 29 3b 0a 20 20 20  erBy, pNew);.   
18ea0 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42       if( pOrderB
18eb0 79 20 29 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  y ) pOrderBy->a[
18ec0 6e 4f 72 64 65 72 42 79 2b 2b 5d 2e 75 2e 78 2e  nOrderBy++].u.x.
18ed0 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 28 75  iOrderByCol = (u
18ee0 31 36 29 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20  16)i;.      }.  
18ef0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f    }.  }..  /* Co
18f00 6d 70 75 74 65 20 74 68 65 20 63 6f 6d 70 61 72  mpute the compar
18f10 69 73 6f 6e 20 70 65 72 6d 75 74 61 74 69 6f 6e  ison permutation
18f20 20 61 6e 64 20 6b 65 79 69 6e 66 6f 20 74 68 61   and keyinfo tha
18f30 74 20 69 73 20 75 73 65 64 20 77 69 74 68 0a 20  t is used with. 
18f40 20 2a 2a 20 74 68 65 20 70 65 72 6d 75 74 61 74   ** the permutat
18f50 69 6f 6e 20 75 73 65 64 20 74 6f 20 64 65 74 65  ion used to dete
18f60 72 6d 69 6e 65 20 69 66 20 74 68 65 20 6e 65 78  rmine if the nex
18f70 74 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 72 65  t.  ** row of re
18f80 73 75 6c 74 73 20 63 6f 6d 65 73 20 66 72 6f 6d  sults comes from
18f90 20 73 65 6c 65 63 74 41 20 6f 72 20 73 65 6c 65   selectA or sele
18fa0 63 74 42 2e 20 20 41 6c 73 6f 20 61 64 64 20 65  ctB.  Also add e
18fb0 78 70 6c 69 63 69 74 0a 20 20 2a 2a 20 63 6f 6c  xplicit.  ** col
18fc0 6c 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 4f  lations to the O
18fd0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74  RDER BY clause t
18fe0 65 72 6d 73 20 73 6f 20 74 68 61 74 20 77 68 65  erms so that whe
18ff0 6e 20 74 68 65 20 73 75 62 71 75 65 72 69 65 73  n the subqueries
19000 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 72 69 67  .  ** to the rig
19010 68 74 20 61 6e 64 20 74 68 65 20 6c 65 66 74 20  ht and the left 
19020 61 72 65 20 65 76 61 6c 75 61 74 65 64 2c 20 74  are evaluated, t
19030 68 65 79 20 75 73 65 20 74 68 65 20 63 6f 72 72  hey use the corr
19040 65 63 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69  ect.  ** collati
19050 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 61 50 65 72 6d  on..  */.  aPerm
19060 75 74 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ute = sqlite3DbM
19070 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73  allocRawNN(db, s
19080 69 7a 65 6f 66 28 69 6e 74 29 2a 28 6e 4f 72 64  izeof(int)*(nOrd
19090 65 72 42 79 20 2b 20 31 29 29 3b 0a 20 20 69 66  erBy + 1));.  if
190a0 28 20 61 50 65 72 6d 75 74 65 20 29 7b 0a 20 20  ( aPermute ){.  
190b0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
190c0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
190d0 20 20 20 61 50 65 72 6d 75 74 65 5b 30 5d 20 3d     aPermute[0] =
190e0 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 66   nOrderBy;.    f
190f0 6f 72 28 69 3d 31 2c 20 70 49 74 65 6d 3d 70 4f  or(i=1, pItem=pO
19100 72 64 65 72 42 79 2d 3e 61 3b 20 69 3c 3d 6e 4f  rderBy->a; i<=nO
19110 72 64 65 72 42 79 3b 20 69 2b 2b 2c 20 70 49 74  rderBy; i++, pIt
19120 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73  em++){.      ass
19130 65 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e  ert( pItem->u.x.
19140 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20 29 3b  iOrderByCol>0 );
19150 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
19160 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72  Item->u.x.iOrder
19170 42 79 43 6f 6c 3c 3d 70 2d 3e 70 45 4c 69 73 74  ByCol<=p->pEList
19180 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20  ->nExpr );.     
19190 20 61 50 65 72 6d 75 74 65 5b 69 5d 20 3d 20 70   aPermute[i] = p
191a0 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72  Item->u.x.iOrder
191b0 42 79 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 7d  ByCol - 1;.    }
191c0 0a 20 20 20 20 70 4b 65 79 4d 65 72 67 65 20 3d  .    pKeyMerge =
191d0 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65   multiSelectOrde
191e0 72 42 79 4b 65 79 49 6e 66 6f 28 70 50 61 72 73  rByKeyInfo(pPars
191f0 65 2c 20 70 2c 20 31 29 3b 0a 20 20 7d 65 6c 73  e, p, 1);.  }els
19200 65 7b 0a 20 20 20 20 70 4b 65 79 4d 65 72 67 65  e{.    pKeyMerge
19210 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
19220 52 65 61 74 74 61 63 68 20 74 68 65 20 4f 52 44  Reattach the ORD
19230 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 6f 20  ER BY clause to 
19240 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a  the query..  */.
19250 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
19260 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 50 72 69  pOrderBy;.  pPri
19270 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73  or->pOrderBy = s
19280 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
19290 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4f  p(pParse->db, pO
192a0 72 64 65 72 42 79 2c 20 30 29 3b 0a 0a 20 20 2f  rderBy, 0);..  /
192b0 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 72 61 6e  * Allocate a ran
192c0 67 65 20 6f 66 20 74 65 6d 70 6f 72 61 72 79 20  ge of temporary 
192d0 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 74 68  registers and th
192e0 65 20 4b 65 79 49 6e 66 6f 20 6e 65 65 64 65 64  e KeyInfo needed
192f0 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6c 6f  .  ** for the lo
19300 67 69 63 20 74 68 61 74 20 72 65 6d 6f 76 65 73  gic that removes
19310 20 64 75 70 6c 69 63 61 74 65 20 72 65 73 75 6c   duplicate resul
19320 74 20 72 6f 77 73 20 77 68 65 6e 20 74 68 65 0a  t rows when the.
19330 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 20 69 73    ** operator is
19340 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20   UNION, EXCEPT, 
19350 6f 72 20 49 4e 54 45 52 53 45 43 54 20 28 62 75  or INTERSECT (bu
19360 74 20 6e 6f 74 20 55 4e 49 4f 4e 20 41 4c 4c 29  t not UNION ALL)
19370 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d  ..  */.  if( op=
19380 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72  =TK_ALL ){.    r
19390 65 67 50 72 65 76 20 3d 20 30 3b 0a 20 20 7d 65  egPrev = 0;.  }e
193a0 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 45 78  lse{.    int nEx
193b0 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  pr = p->pEList->
193c0 6e 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72  nExpr;.    asser
193d0 74 28 20 6e 4f 72 64 65 72 42 79 3e 3d 6e 45 78  t( nOrderBy>=nEx
193e0 70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  pr || db->malloc
193f0 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65  Failed );.    re
19400 67 50 72 65 76 20 3d 20 70 50 61 72 73 65 2d 3e  gPrev = pParse->
19410 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72  nMem+1;.    pPar
19420 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 45 78 70  se->nMem += nExp
19430 72 2b 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  r+1;.    sqlite3
19440 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
19450 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67  _Integer, 0, reg
19460 50 72 65 76 29 3b 0a 20 20 20 20 70 4b 65 79 44  Prev);.    pKeyD
19470 75 70 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  up = sqlite3KeyI
19480 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 45 78  nfoAlloc(db, nEx
19490 70 72 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20  pr, 1);.    if( 
194a0 70 4b 65 79 44 75 70 20 29 7b 0a 20 20 20 20 20  pKeyDup ){.     
194b0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
194c0 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62  KeyInfoIsWriteab
194d0 6c 65 28 70 4b 65 79 44 75 70 29 20 29 3b 0a 20  le(pKeyDup) );. 
194e0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
194f0 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
19500 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 61 43       pKeyDup->aC
19510 6f 6c 6c 5b 69 5d 20 3d 20 6d 75 6c 74 69 53 65  oll[i] = multiSe
19520 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72  lectCollSeq(pPar
19530 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20  se, p, i);.     
19540 20 20 20 70 4b 65 79 44 75 70 2d 3e 61 53 6f 72     pKeyDup->aSor
19550 74 4f 72 64 65 72 5b 69 5d 20 3d 20 30 3b 0a 20  tOrder[i] = 0;. 
19560 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
19570 0a 20 0a 20 20 2f 2a 20 53 65 70 61 72 61 74 65  . .  /* Separate
19580 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 74 68   the left and th
19590 65 20 72 69 67 68 74 20 71 75 65 72 79 20 66 72  e right query fr
195a0 6f 6d 20 6f 6e 65 20 61 6e 6f 74 68 65 72 0a 20  om one another. 
195b0 20 2a 2f 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20   */.  p->pPrior 
195c0 3d 20 30 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70  = 0;.  pPrior->p
195d0 4e 65 78 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69  Next = 0;.  sqli
195e0 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47  te3ResolveOrderG
195f0 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20 70  roupBy(pParse, p
19600 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22  , p->pOrderBy, "
19610 4f 52 44 45 52 22 29 3b 0a 20 20 69 66 28 20 70  ORDER");.  if( p
19620 50 72 69 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d 30  Prior->pPrior==0
19630 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52   ){.    sqlite3R
19640 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70  esolveOrderGroup
19650 42 79 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  By(pParse, pPrio
19660 72 2c 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65  r, pPrior->pOrde
19670 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20  rBy, "ORDER");. 
19680 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65   }..  /* Compute
19690 20 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73   the limit regis
196a0 74 65 72 73 20 2a 2f 0a 20 20 63 6f 6d 70 75 74  ters */.  comput
196b0 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
196c0 70 50 61 72 73 65 2c 20 70 2c 20 6c 61 62 65 6c  pParse, p, label
196d0 45 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69  End);.  if( p->i
196e0 4c 69 6d 69 74 20 26 26 20 6f 70 3d 3d 54 4b 5f  Limit && op==TK_
196f0 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 4c 69  ALL ){.    regLi
19700 6d 69 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d  mitA = ++pParse-
19710 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 4c 69  >nMem;.    regLi
19720 6d 69 74 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d  mitB = ++pParse-
19730 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74  >nMem;.    sqlit
19740 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
19750 4f 50 5f 43 6f 70 79 2c 20 70 2d 3e 69 4f 66 66  OP_Copy, p->iOff
19760 73 65 74 20 3f 20 70 2d 3e 69 4f 66 66 73 65 74  set ? p->iOffset
19770 2b 31 20 3a 20 70 2d 3e 69 4c 69 6d 69 74 2c 0a  +1 : p->iLimit,.
19780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
197a0 20 20 72 65 67 4c 69 6d 69 74 41 29 3b 0a 20 20    regLimitA);.  
197b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
197c0 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20  Op2(v, OP_Copy, 
197d0 72 65 67 4c 69 6d 69 74 41 2c 20 72 65 67 4c 69  regLimitA, regLi
197e0 6d 69 74 42 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  mitB);.  }else{.
197f0 20 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20      regLimitA = 
19800 72 65 67 4c 69 6d 69 74 42 20 3d 20 30 3b 0a 20  regLimitB = 0;. 
19810 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72   }.  sqlite3Expr
19820 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c  Delete(db, p->pL
19830 69 6d 69 74 29 3b 0a 20 20 70 2d 3e 70 4c 69 6d  imit);.  p->pLim
19840 69 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  it = 0;.  sqlite
19850 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
19860 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20 70  p->pOffset);.  p
19870 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a  ->pOffset = 0;..
19880 20 20 72 65 67 41 64 64 72 41 20 3d 20 2b 2b 70    regAddrA = ++p
19890 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72  Parse->nMem;.  r
198a0 65 67 41 64 64 72 42 20 3d 20 2b 2b 70 50 61 72  egAddrB = ++pPar
198b0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f  se->nMem;.  regO
198c0 75 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  utA = ++pParse->
198d0 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 42 20  nMem;.  regOutB 
198e0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
198f0 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
19900 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 41  tDestInit(&destA
19910 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c  , SRT_Coroutine,
19920 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71   regAddrA);.  sq
19930 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
19940 6e 69 74 28 26 64 65 73 74 42 2c 20 53 52 54 5f  nit(&destB, SRT_
19950 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64  Coroutine, regAd
19960 64 72 42 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  drB);..  /* Gene
19970 72 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e 65  rate a coroutine
19980 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65   to evaluate the
19990 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
199a0 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6c 65  t to the.  ** le
199b0 66 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75  ft of the compou
199c0 6e 64 20 6f 70 65 72 61 74 6f 72 20 2d 20 74 68  nd operator - th
199d0 65 20 22 41 22 20 73 65 6c 65 63 74 2e 0a 20 20  e "A" select..  
199e0 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65 63 74 41  */.  addrSelectA
199f0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
19a00 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 31  rrentAddr(v) + 1
19a10 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69  ;.  addr1 = sqli
19a20 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
19a30 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e   OP_InitCoroutin
19a40 65 2c 20 72 65 67 41 64 64 72 41 2c 20 30 2c 20  e, regAddrA, 0, 
19a50 61 64 64 72 53 65 6c 65 63 74 41 29 3b 0a 20 20  addrSelectA);.  
19a60 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
19a70 22 6c 65 66 74 20 53 45 4c 45 43 54 22 29 29 3b  "left SELECT"));
19a80 0a 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69  .  pPrior->iLimi
19a90 74 20 3d 20 72 65 67 4c 69 6d 69 74 41 3b 0a 20  t = regLimitA;. 
19aa0 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
19ab0 65 72 28 69 53 75 62 31 2c 20 70 50 61 72 73 65  er(iSub1, pParse
19ac0 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29  ->iNextSelectId)
19ad0 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
19ae0 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  t(pParse, pPrior
19af0 2c 20 26 64 65 73 74 41 29 3b 0a 20 20 73 71 6c  , &destA);.  sql
19b00 69 74 65 33 56 64 62 65 45 6e 64 43 6f 72 6f 75  ite3VdbeEndCorou
19b10 74 69 6e 65 28 76 2c 20 72 65 67 41 64 64 72 41  tine(v, regAddrA
19b20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
19b30 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
19b40 31 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  1);..  /* Genera
19b50 74 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 74  te a coroutine t
19b60 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 53  o evaluate the S
19b70 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
19b80 6f 6e 20 0a 20 20 2a 2a 20 74 68 65 20 72 69 67  on .  ** the rig
19b90 68 74 20 2d 20 74 68 65 20 22 42 22 20 73 65 6c  ht - the "B" sel
19ba0 65 63 74 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53  ect.  */.  addrS
19bb0 65 6c 65 63 74 42 20 3d 20 73 71 6c 69 74 65 33  electB = sqlite3
19bc0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
19bd0 76 29 20 2b 20 31 3b 0a 20 20 61 64 64 72 31 20  v) + 1;.  addr1 
19be0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
19bf0 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f  Op3(v, OP_InitCo
19c00 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72  routine, regAddr
19c10 42 2c 20 30 2c 20 61 64 64 72 53 65 6c 65 63 74  B, 0, addrSelect
19c20 42 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e  B);.  VdbeCommen
19c30 74 28 28 76 2c 20 22 72 69 67 68 74 20 53 45 4c  t((v, "right SEL
19c40 45 43 54 22 29 29 3b 0a 20 20 73 61 76 65 64 4c  ECT"));.  savedL
19c50 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74  imit = p->iLimit
19c60 3b 0a 20 20 73 61 76 65 64 4f 66 66 73 65 74 20  ;.  savedOffset 
19c70 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20  = p->iOffset;.  
19c80 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c  p->iLimit = regL
19c90 69 6d 69 74 42 3b 0a 20 20 70 2d 3e 69 4f 66 66  imitB;.  p->iOff
19ca0 73 65 74 20 3d 20 30 3b 20 20 0a 20 20 65 78 70  set = 0;  .  exp
19cb0 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69  lainSetInteger(i
19cc0 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e  Sub2, pParse->iN
19cd0 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
19ce0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
19cf0 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 42 29  arse, p, &destB)
19d00 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20  ;.  p->iLimit = 
19d10 73 61 76 65 64 4c 69 6d 69 74 3b 0a 20 20 70 2d  savedLimit;.  p-
19d20 3e 69 4f 66 66 73 65 74 20 3d 20 73 61 76 65 64  >iOffset = saved
19d30 4f 66 66 73 65 74 3b 0a 20 20 73 71 6c 69 74 65  Offset;.  sqlite
19d40 33 56 64 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e  3VdbeEndCoroutin
19d50 65 28 76 2c 20 72 65 67 41 64 64 72 42 29 3b 0a  e(v, regAddrB);.
19d60 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
19d70 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
19d80 20 6f 75 74 70 75 74 73 20 74 68 65 20 63 75 72   outputs the cur
19d90 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20  rent row of the 
19da0 41 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73  A.  ** select as
19db0 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74   the next output
19dc0 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70   row of the comp
19dd0 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a  ound select..  *
19de0 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  /.  VdbeNoopComm
19df0 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20  ent((v, "Output 
19e00 72 6f 75 74 69 6e 65 20 66 6f 72 20 41 22 29 29  routine for A"))
19e10 3b 0a 20 20 61 64 64 72 4f 75 74 41 20 3d 20 67  ;.  addrOutA = g
19e20 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75 62  enerateOutputSub
19e30 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65 2c 0a  routine(pParse,.
19e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e50 20 70 2c 20 26 64 65 73 74 41 2c 20 70 44 65 73   p, &destA, pDes
19e60 74 2c 20 72 65 67 4f 75 74 41 2c 0a 20 20 20 20  t, regOutA,.    
19e70 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67               reg
19e80 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c 20 6c  Prev, pKeyDup, l
19e90 61 62 65 6c 45 6e 64 29 3b 0a 20 20 0a 20 20 2f  abelEnd);.  .  /
19ea0 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
19eb0 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74  routine that out
19ec0 70 75 74 73 20 74 68 65 20 63 75 72 72 65 6e 74  puts the current
19ed0 20 72 6f 77 20 6f 66 20 74 68 65 20 42 0a 20 20   row of the B.  
19ee0 2a 2a 20 73 65 6c 65 63 74 20 61 73 20 74 68 65  ** select as the
19ef0 20 6e 65 78 74 20 6f 75 74 70 75 74 20 72 6f 77   next output row
19f00 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   of the compound
19f10 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20   select..  */.  
19f20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c  if( op==TK_ALL |
19f30 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29  | op==TK_UNION )
19f40 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f  {.    VdbeNoopCo
19f50 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75  mment((v, "Outpu
19f60 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 42 22  t routine for B"
19f70 29 29 3b 0a 20 20 20 20 61 64 64 72 4f 75 74 42  ));.    addrOutB
19f80 20 3d 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75   = generateOutpu
19f90 74 53 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72  tSubroutine(pPar
19fa0 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  se,.            
19fb0 20 20 20 20 20 70 2c 20 26 64 65 73 74 42 2c 20       p, &destB, 
19fc0 70 44 65 73 74 2c 20 72 65 67 4f 75 74 42 2c 0a  pDest, regOutB,.
19fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19fe0 20 72 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75   regPrev, pKeyDu
19ff0 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20  p, labelEnd);.  
1a000 7d 0a 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  }.  sqlite3KeyIn
1a010 66 6f 55 6e 72 65 66 28 70 4b 65 79 44 75 70 29  foUnref(pKeyDup)
1a020 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
1a030 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f   a subroutine to
1a040 20 72 75 6e 20 77 68 65 6e 20 74 68 65 20 72 65   run when the re
1a050 73 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65 63  sults from selec
1a060 74 20 41 0a 20 20 2a 2a 20 61 72 65 20 65 78 68  t A.  ** are exh
1a070 61 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20  austed and only 
1a080 64 61 74 61 20 69 6e 20 73 65 6c 65 63 74 20 42  data in select B
1a090 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20   remains..  */. 
1a0a0 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 45 58 43 45   if( op==TK_EXCE
1a0b0 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54  PT || op==TK_INT
1a0c0 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64  ERSECT ){.    ad
1a0d0 64 72 45 6f 66 41 5f 6e 6f 42 20 3d 20 61 64 64  drEofA_noB = add
1a0e0 72 45 6f 66 41 20 3d 20 6c 61 62 65 6c 45 6e 64  rEofA = labelEnd
1a0f0 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20  ;.  }else{  .   
1a100 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
1a110 28 28 76 2c 20 22 65 6f 66 2d 41 20 73 75 62 72  ((v, "eof-A subr
1a120 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61  outine"));.    a
1a130 64 64 72 45 6f 66 41 20 3d 20 73 71 6c 69 74 65  ddrEofA = sqlite
1a140 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1a150 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 42  P_Gosub, regOutB
1a160 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a 20 20 20  , addrOutB);.   
1a170 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 20 3d 20   addrEofA_noB = 
1a180 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a190 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  2(v, OP_Yield, r
1a1a0 65 67 41 64 64 72 42 2c 20 6c 61 62 65 6c 45 6e  egAddrB, labelEn
1a1b0 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
1a1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a1d0 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76           VdbeCov
1a1e0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71  erage(v);.    sq
1a1f0 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
1a200 20 61 64 64 72 45 6f 66 41 29 3b 0a 20 20 20 20   addrEofA);.    
1a210 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
1a220 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
1a230 28 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 2c 20  (p->nSelectRow, 
1a240 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52  pPrior->nSelectR
1a250 6f 77 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47  ow);.  }..  /* G
1a260 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
1a270 74 69 6e 65 20 74 6f 20 72 75 6e 20 77 68 65 6e  tine to run when
1a280 20 74 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f   the results fro
1a290 6d 20 73 65 6c 65 63 74 20 42 0a 20 20 2a 2a 20  m select B.  ** 
1a2a0 61 72 65 20 65 78 68 61 75 73 74 65 64 20 61 6e  are exhausted an
1a2b0 64 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20 73  d only data in s
1a2c0 65 6c 65 63 74 20 41 20 72 65 6d 61 69 6e 73 2e  elect A remains.
1a2d0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d  .  */.  if( op==
1a2e0 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a  TK_INTERSECT ){.
1a2f0 20 20 20 20 61 64 64 72 45 6f 66 42 20 3d 20 61      addrEofB = a
1a300 64 64 72 45 6f 66 41 3b 0a 20 20 20 20 69 66 28  ddrEofA;.    if(
1a310 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e   p->nSelectRow >
1a320 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74   pPrior->nSelect
1a330 52 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74  Row ) p->nSelect
1a340 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e 6e 53  Row = pPrior->nS
1a350 65 6c 65 63 74 52 6f 77 3b 0a 20 20 7d 65 6c 73  electRow;.  }els
1a360 65 7b 20 20 0a 20 20 20 20 56 64 62 65 4e 6f 6f  e{  .    VdbeNoo
1a370 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f  pComment((v, "eo
1a380 66 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29  f-B subroutine")
1a390 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20  );.    addrEofB 
1a3a0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
1a3b0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
1a3c0 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75   regOutA, addrOu
1a3d0 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  tA);.    sqlite3
1a3e0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1a3f0 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41  _Yield, regAddrA
1a400 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 20 56 64 62  , labelEnd); Vdb
1a410 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1a420 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
1a430 6f 28 76 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a  o(v, addrEofB);.
1a440 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
1a450 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c  te code to handl
1a460 65 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3c  e the case of A<
1a470 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f  B.  */.  VdbeNoo
1a480 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d  pComment((v, "A-
1a490 6c 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22  lt-B subroutine"
1a4a0 29 29 3b 0a 20 20 61 64 64 72 41 6c 74 42 20 3d  ));.  addrAltB =
1a4b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a4c0 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
1a4d0 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74  regOutA, addrOut
1a4e0 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  A);.  sqlite3Vdb
1a4f0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69  eAddOp2(v, OP_Yi
1a500 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20 61  eld, regAddrA, a
1a510 64 64 72 45 6f 66 41 29 3b 20 56 64 62 65 43 6f  ddrEofA); VdbeCo
1a520 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c  verage(v);.  sql
1a530 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
1a540 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f  labelCmpr);..  /
1a550 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1a560 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61  to handle the ca
1a570 73 65 20 6f 66 20 41 3d 3d 42 0a 20 20 2a 2f 0a  se of A==B.  */.
1a580 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c    if( op==TK_ALL
1a590 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42   ){.    addrAeqB
1a5a0 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 7d   = addrAltB;.  }
1a5b0 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  else if( op==TK_
1a5c0 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20  INTERSECT ){.   
1a5d0 20 61 64 64 72 41 65 71 42 20 3d 20 61 64 64 72   addrAeqB = addr
1a5e0 41 6c 74 42 3b 0a 20 20 20 20 61 64 64 72 41 6c  AltB;.    addrAl
1a5f0 74 42 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  tB++;.  }else{. 
1a600 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65     VdbeNoopComme
1a610 6e 74 28 28 76 2c 20 22 41 2d 65 71 2d 42 20 73  nt((v, "A-eq-B s
1a620 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20  ubroutine"));.  
1a630 20 20 61 64 64 72 41 65 71 42 20 3d 0a 20 20 20    addrAeqB =.   
1a640 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a650 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p2(v, OP_Yield, 
1a660 72 65 67 41 64 64 72 41 2c 20 61 64 64 72 45 6f  regAddrA, addrEo
1a670 66 41 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  fA); VdbeCoverag
1a680 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(v);.    sqlite
1a690 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 6c 61 62  3VdbeGoto(v, lab
1a6a0 65 6c 43 6d 70 72 29 3b 0a 20 20 7d 0a 0a 20 20  elCmpr);.  }..  
1a6b0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
1a6c0 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63   to handle the c
1a6d0 61 73 65 20 6f 66 20 41 3e 42 0a 20 20 2a 2f 0a  ase of A>B.  */.
1a6e0 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
1a6f0 74 28 28 76 2c 20 22 41 2d 67 74 2d 42 20 73 75  t((v, "A-gt-B su
1a700 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61  broutine"));.  a
1a710 64 64 72 41 67 74 42 20 3d 20 73 71 6c 69 74 65  ddrAgtB = sqlite
1a720 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
1a730 28 76 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54  (v);.  if( op==T
1a740 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  K_ALL || op==TK_
1a750 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 73 71 6c  UNION ){.    sql
1a760 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1a770 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
1a780 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a  utB, addrOutB);.
1a790 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
1a7a0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69  eAddOp2(v, OP_Yi
1a7b0 65 6c 64 2c 20 72 65 67 41 64 64 72 42 2c 20 61  eld, regAddrB, a
1a7c0 64 64 72 45 6f 66 42 29 3b 20 56 64 62 65 43 6f  ddrEofB); VdbeCo
1a7d0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c  verage(v);.  sql
1a7e0 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
1a7f0 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f  labelCmpr);..  /
1a800 2a 20 54 68 69 73 20 63 6f 64 65 20 72 75 6e 73  * This code runs
1a810 20 6f 6e 63 65 20 74 6f 20 69 6e 69 74 69 61 6c   once to initial
1a820 69 7a 65 20 65 76 65 72 79 74 68 69 6e 67 2e 0a  ize everything..
1a830 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
1a840 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
1a850 64 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  dr1);.  sqlite3V
1a860 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1a870 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c  Yield, regAddrA,
1a880 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 29 3b 20   addrEofA_noB); 
1a890 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1a8a0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
1a8b0 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp2(v, OP_Yield
1a8c0 2c 20 72 65 67 41 64 64 72 42 2c 20 61 64 64 72  , regAddrB, addr
1a8d0 45 6f 66 42 29 3b 20 56 64 62 65 43 6f 76 65 72  EofB); VdbeCover
1a8e0 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 49 6d  age(v);..  /* Im
1a8f0 70 6c 65 6d 65 6e 74 20 74 68 65 20 6d 61 69 6e  plement the main
1a900 20 6d 65 72 67 65 20 6c 6f 6f 70 0a 20 20 2a 2f   merge loop.  */
1a910 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
1a920 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61  solveLabel(v, la
1a930 62 65 6c 43 6d 70 72 29 3b 0a 20 20 73 71 6c 69  belCmpr);.  sqli
1a940 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1a950 20 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e 2c   OP_Permutation,
1a960 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 2a   0, 0, 0, (char*
1a970 29 61 50 65 72 6d 75 74 65 2c 20 50 34 5f 49 4e  )aPermute, P4_IN
1a980 54 41 52 52 41 59 29 3b 0a 20 20 73 71 6c 69 74  TARRAY);.  sqlit
1a990 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1a9a0 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 64 65 73 74  OP_Compare, dest
1a9b0 41 2e 69 53 64 73 74 2c 20 64 65 73 74 42 2e 69  A.iSdst, destB.i
1a9c0 53 64 73 74 2c 20 6e 4f 72 64 65 72 42 79 2c 0a  Sdst, nOrderBy,.
1a9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a9e0 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
1a9f0 70 4b 65 79 4d 65 72 67 65 2c 20 50 34 5f 4b 45  pKeyMerge, P4_KE
1aa00 59 49 4e 46 4f 29 3b 0a 20 20 73 71 6c 69 74 65  YINFO);.  sqlite
1aa10 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
1aa20 20 4f 50 46 4c 41 47 5f 50 45 52 4d 55 54 45 29   OPFLAG_PERMUTE)
1aa30 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
1aa40 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70  ddOp3(v, OP_Jump
1aa50 2c 20 61 64 64 72 41 6c 74 42 2c 20 61 64 64 72  , addrAltB, addr
1aa60 41 65 71 42 2c 20 61 64 64 72 41 67 74 42 29 3b  AeqB, addrAgtB);
1aa70 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1aa80 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20  ;..  /* Jump to 
1aa90 74 68 65 20 74 68 69 73 20 70 6f 69 6e 74 20 69  the this point i
1aaa0 6e 20 6f 72 64 65 72 20 74 6f 20 74 65 72 6d 69  n order to termi
1aab0 6e 61 74 65 20 74 68 65 20 71 75 65 72 79 2e 0a  nate the query..
1aac0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
1aad0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
1aae0 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 0a 20 20  , labelEnd);..  
1aaf0 2f 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65  /* Set the numbe
1ab00 72 20 6f 66 20 6f 75 74 70 75 74 20 63 6f 6c 75  r of output colu
1ab10 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  mns.  */.  if( p
1ab20 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
1ab30 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 53  _Output ){.    S
1ab40 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20  elect *pFirst = 
1ab50 70 50 72 69 6f 72 3b 0a 20 20 20 20 77 68 69 6c  pPrior;.    whil
1ab60 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f  e( pFirst->pPrio
1ab70 72 20 29 20 70 46 69 72 73 74 20 3d 20 70 46 69  r ) pFirst = pFi
1ab80 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  rst->pPrior;.   
1ab90 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
1aba0 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 46 69  ames(pParse, pFi
1abb0 72 73 74 2d 3e 70 53 72 63 2c 20 70 46 69 72 73  rst->pSrc, pFirs
1abc0 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a  t->pEList);.  }.
1abd0 0a 20 20 2f 2a 20 52 65 61 73 73 65 6d 62 6c 79  .  /* Reassembly
1abe0 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75   the compound qu
1abf0 65 72 79 20 73 6f 20 74 68 61 74 20 69 74 20 77  ery so that it w
1ac00 69 6c 6c 20 62 65 20 66 72 65 65 64 20 63 6f 72  ill be freed cor
1ac10 72 65 63 74 6c 79 0a 20 20 2a 2a 20 62 79 20 74  rectly.  ** by t
1ac20 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
1ac30 69 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ion */.  if( p->
1ac40 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 73 71  pPrior ){.    sq
1ac50 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
1ac60 65 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 29  e(db, p->pPrior)
1ac70 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 50 72 69 6f  ;.  }.  p->pPrio
1ac80 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 70 50  r = pPrior;.  pP
1ac90 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 3b  rior->pNext = p;
1aca0 0a 0a 20 20 2f 2a 2a 2a 20 54 42 44 3a 20 20 49  ..  /*** TBD:  I
1acb0 6e 73 65 72 74 20 73 75 62 72 6f 75 74 69 6e 65  nsert subroutine
1acc0 20 63 61 6c 6c 73 20 74 6f 20 63 6c 6f 73 65 20   calls to close 
1acd0 63 75 72 73 6f 72 73 20 6f 6e 20 69 6e 63 6f 6d  cursors on incom
1ace0 70 6c 65 74 65 0a 20 20 2a 2a 2a 2a 20 73 75 62  plete.  **** sub
1acf0 71 75 65 72 69 65 73 20 2a 2a 2a 2a 2f 0a 20 20  queries ****/.  
1ad00 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65  explainComposite
1ad10 28 70 50 61 72 73 65 2c 20 70 2d 3e 6f 70 2c 20  (pParse, p->op, 
1ad20 69 53 75 62 31 2c 20 69 53 75 62 32 2c 20 30 29  iSub1, iSub2, 0)
1ad30 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72 73  ;.  return pPars
1ad40 65 2d 3e 6e 45 72 72 21 3d 30 3b 0a 7d 0a 23 65  e->nErr!=0;.}.#e
1ad50 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e  ndif..#if !defin
1ad60 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
1ad70 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66  UBQUERY) || !def
1ad80 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1ad90 5f 56 49 45 57 29 0a 2f 2a 20 46 6f 72 77 61 72  _VIEW)./* Forwar
1ada0 64 20 44 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a  d Declarations *
1adb0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  /.static void su
1adc0 62 73 74 45 78 70 72 4c 69 73 74 28 73 71 6c 69  bstExprList(sqli
1add0 74 65 33 2a 2c 20 45 78 70 72 4c 69 73 74 2a 2c  te3*, ExprList*,
1ade0 20 69 6e 74 2c 20 45 78 70 72 4c 69 73 74 2a 29   int, ExprList*)
1adf0 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  ;.static void su
1ae00 62 73 74 53 65 6c 65 63 74 28 73 71 6c 69 74 65  bstSelect(sqlite
1ae10 33 2a 2c 20 53 65 6c 65 63 74 20 2a 2c 20 69 6e  3*, Select *, in
1ae20 74 2c 20 45 78 70 72 4c 69 73 74 2a 2c 20 69 6e  t, ExprList*, in
1ae30 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20  t);../*.** Scan 
1ae40 74 68 72 6f 75 67 68 20 74 68 65 20 65 78 70 72  through the expr
1ae50 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52  ession pExpr.  R
1ae60 65 70 6c 61 63 65 20 65 76 65 72 79 20 72 65 66  eplace every ref
1ae70 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61 20 63  erence to.** a c
1ae80 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e  olumn in table n
1ae90 75 6d 62 65 72 20 69 54 61 62 6c 65 20 77 69 74  umber iTable wit
1aea0 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  h a copy of the 
1aeb0 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e  iColumn-th.** en
1aec0 74 72 79 20 69 6e 20 70 45 4c 69 73 74 2e 20 20  try in pEList.  
1aed0 28 42 75 74 20 6c 65 61 76 65 20 72 65 66 65 72  (But leave refer
1aee0 65 6e 63 65 73 20 74 6f 20 74 68 65 20 52 4f 57  ences to the ROW
1aef0 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e  ID column .** un
1af00 63 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20  changed.).**.** 
1af10 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
1af20 70 61 72 74 20 6f 66 20 74 68 65 20 66 6c 61 74  part of the flat
1af30 74 65 6e 69 6e 67 20 70 72 6f 63 65 64 75 72 65  tening procedure
1af40 2e 20 20 41 20 73 75 62 71 75 65 72 79 0a 2a 2a  .  A subquery.**
1af50 20 77 68 6f 73 65 20 72 65 73 75 6c 74 20 73 65   whose result se
1af60 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20  t is defined by 
1af70 70 45 4c 69 73 74 20 61 70 70 65 61 72 73 20 61  pEList appears a
1af80 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a  s entry in the.*
1af90 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  * FROM clause of
1afa0 20 61 20 53 45 4c 45 43 54 20 73 75 63 68 20 74   a SELECT such t
1afb0 68 61 74 20 74 68 65 20 56 44 42 45 20 63 75 72  hat the VDBE cur
1afc0 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20  sor assigned to 
1afd0 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61  that.** FORM cla
1afe0 75 73 65 20 65 6e 74 72 79 20 69 73 20 69 54 61  use entry is iTa
1aff0 62 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ble.  This routi
1b000 6e 65 20 6d 61 6b 65 20 74 68 65 20 6e 65 63 65  ne make the nece
1b010 73 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e 67 65  ssary .** change
1b020 73 20 74 6f 20 70 45 78 70 72 20 73 6f 20 74 68  s to pExpr so th
1b030 61 74 20 69 74 20 72 65 66 65 72 73 20 64 69 72  at it refers dir
1b040 65 63 74 6c 79 20 74 6f 20 74 68 65 20 73 6f 75  ectly to the sou
1b050 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f 66 20  rce table.** of 
1b060 74 68 65 20 73 75 62 71 75 65 72 79 20 72 61 74  the subquery rat
1b070 68 65 72 20 74 68 65 20 72 65 73 75 6c 74 20 73  her the result s
1b080 65 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  et of the subque
1b090 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78  ry..*/.static Ex
1b0a0 70 72 20 2a 73 75 62 73 74 45 78 70 72 28 0a 20  pr *substExpr(. 
1b0b0 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
1b0c0 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d       /* Report m
1b0d0 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 74 6f 20  alloc errors to 
1b0e0 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  this connection 
1b0f0 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
1b100 2c 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72  ,        /* Expr
1b110 20 69 6e 20 77 68 69 63 68 20 73 75 62 73 74 69   in which substi
1b120 74 75 74 69 6f 6e 20 6f 63 63 75 72 73 20 2a 2f  tution occurs */
1b130 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
1b140 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
1b150 74 6f 20 62 65 20 73 75 62 73 74 69 74 75 74 65  to be substitute
1b160 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  d */.  ExprList 
1b170 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 53 75  *pEList    /* Su
1b180 62 73 74 69 74 75 74 65 20 65 78 70 72 65 73 73  bstitute express
1b190 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  ions */.){.  if(
1b1a0 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
1b1b0 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70  rn 0;.  if( pExp
1b1c0 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
1b1d0 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   && pExpr->iTabl
1b1e0 65 3d 3d 69 54 61 62 6c 65 20 29 7b 0a 20 20 20  e==iTable ){.   
1b1f0 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c   if( pExpr->iCol
1b200 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 70  umn<0 ){.      p
1b210 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55  Expr->op = TK_NU
1b220 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  LL;.    }else{. 
1b230 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b       Expr *pNew;
1b240 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1b250 45 4c 69 73 74 21 3d 30 20 26 26 20 70 45 78 70  EList!=0 && pExp
1b260 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 45 4c 69 73  r->iColumn<pELis
1b270 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20  t->nExpr );.    
1b280 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1b290 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70 45 78  >pLeft==0 && pEx
1b2a0 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b  pr->pRight==0 );
1b2b0 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71  .      pNew = sq
1b2c0 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
1b2d0 20 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70 72   pEList->a[pExpr
1b2e0 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72  ->iColumn].pExpr
1b2f0 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
1b300 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
1b310 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
1b320 70 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a 20 20  pExpr = pNew;.  
1b330 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1b340 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20   pExpr->pLeft = 
1b350 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 45  substExpr(db, pE
1b360 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62  xpr->pLeft, iTab
1b370 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  le, pEList);.   
1b380 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d   pExpr->pRight =
1b390 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70   substExpr(db, p
1b3a0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 69 54  Expr->pRight, iT
1b3b0 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
1b3c0 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
1b3d0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1b3e0 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
1b3f0 20 20 20 20 20 73 75 62 73 74 53 65 6c 65 63 74       substSelect
1b400 28 64 62 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53  (db, pExpr->x.pS
1b410 65 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c 20 70  elect, iTable, p
1b420 45 4c 69 73 74 2c 20 31 29 3b 0a 20 20 20 20 7d  EList, 1);.    }
1b430 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 75 62 73  else{.      subs
1b440 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 45  tExprList(db, pE
1b450 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 54  xpr->x.pList, iT
1b460 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
1b470 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1b480 6e 20 70 45 78 70 72 3b 0a 7d 0a 73 74 61 74 69  n pExpr;.}.stati
1b490 63 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72  c void substExpr
1b4a0 4c 69 73 74 28 0a 20 20 73 71 6c 69 74 65 33 20  List(.  sqlite3 
1b4b0 2a 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  *db,         /* 
1b4c0 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72  Report malloc er
1b4d0 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 45  rors here */.  E
1b4e0 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
1b4f0 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 73      /* List to s
1b500 63 61 6e 20 61 6e 64 20 69 6e 20 77 68 69 63 68  can and in which
1b510 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74   to make substit
1b520 75 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54  utes */.  int iT
1b530 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f  able,          /
1b540 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 73 75  * Table to be su
1b550 62 73 74 69 74 75 74 65 64 20 2a 2f 0a 20 20 45  bstituted */.  E
1b560 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
1b570 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74      /* Substitut
1b580 65 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20  e values */.){. 
1b590 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c   int i;.  if( pL
1b5a0 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ist==0 ) return;
1b5b0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
1b5c0 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
1b5d0 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69  {.    pList->a[i
1b5e0 5d 2e 70 45 78 70 72 20 3d 20 73 75 62 73 74 45  ].pExpr = substE
1b5f0 78 70 72 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61  xpr(db, pList->a
1b600 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c  [i].pExpr, iTabl
1b610 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a  e, pEList);.  }.
1b620 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  }.static void su
1b630 62 73 74 53 65 6c 65 63 74 28 0a 20 20 73 71 6c  bstSelect(.  sql
1b640 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
1b650 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c    /* Report mall
1b660 6f 63 20 65 72 72 6f 72 73 20 68 65 72 65 20 2a  oc errors here *
1b670 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
1b680 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45           /* SELE
1b690 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  CT statement in 
1b6a0 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75  which to make su
1b6b0 62 73 74 69 74 75 74 69 6f 6e 73 20 2a 2f 0a 20  bstitutions */. 
1b6c0 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
1b6d0 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74        /* Table t
1b6e0 6f 20 62 65 20 72 65 70 6c 61 63 65 64 20 2a 2f  o be replaced */
1b6f0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
1b700 69 73 74 2c 20 20 20 20 2f 2a 20 53 75 62 73 74  ist,    /* Subst
1b710 69 74 75 74 65 20 76 61 6c 75 65 73 20 2a 2f 0a  itute values */.
1b720 20 20 69 6e 74 20 64 6f 50 72 69 6f 72 20 20 20    int doPrior   
1b730 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 73 75 62         /* Do sub
1b740 73 74 69 74 75 74 65 73 20 6f 6e 20 70 2d 3e 70  stitutes on p->p
1b750 50 72 69 6f 72 20 74 6f 6f 20 2a 2f 0a 29 7b 0a  Prior too */.){.
1b760 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b    SrcList *pSrc;
1b770 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
1b780 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
1b790 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 70   int i;.  if( !p
1b7a0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 6f 7b   ) return;.  do{
1b7b0 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69  .    substExprLi
1b7c0 73 74 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74  st(db, p->pEList
1b7d0 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
1b7e0 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72  );.    substExpr
1b7f0 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 47 72 6f  List(db, p->pGro
1b800 75 70 42 79 2c 20 69 54 61 62 6c 65 2c 20 70 45  upBy, iTable, pE
1b810 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74  List);.    subst
1b820 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e  ExprList(db, p->
1b830 70 4f 72 64 65 72 42 79 2c 20 69 54 61 62 6c 65  pOrderBy, iTable
1b840 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70  , pEList);.    p
1b850 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 75 62 73  ->pHaving = subs
1b860 74 45 78 70 72 28 64 62 2c 20 70 2d 3e 70 48 61  tExpr(db, p->pHa
1b870 76 69 6e 67 2c 20 69 54 61 62 6c 65 2c 20 70 45  ving, iTable, pE
1b880 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 57  List);.    p->pW
1b890 68 65 72 65 20 3d 20 73 75 62 73 74 45 78 70 72  here = substExpr
1b8a0 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20  (db, p->pWhere, 
1b8b0 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
1b8c0 0a 20 20 20 20 70 53 72 63 20 3d 20 70 2d 3e 70  .    pSrc = p->p
1b8d0 53 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Src;.    assert(
1b8e0 20 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 20 20   pSrc!=0 );.    
1b8f0 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63  for(i=pSrc->nSrc
1b900 2c 20 70 49 74 65 6d 3d 70 53 72 63 2d 3e 61 3b  , pItem=pSrc->a;
1b910 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d   i>0; i--, pItem
1b920 2b 2b 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74  ++){.      subst
1b930 53 65 6c 65 63 74 28 64 62 2c 20 70 49 74 65 6d  Select(db, pItem
1b940 2d 3e 70 53 65 6c 65 63 74 2c 20 69 54 61 62 6c  ->pSelect, iTabl
1b950 65 2c 20 70 45 4c 69 73 74 2c 20 31 29 3b 0a 20  e, pEList, 1);. 
1b960 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
1b970 66 67 2e 69 73 54 61 62 46 75 6e 63 20 29 7b 0a  fg.isTabFunc ){.
1b980 20 20 20 20 20 20 20 20 73 75 62 73 74 45 78 70          substExp
1b990 72 4c 69 73 74 28 64 62 2c 20 70 49 74 65 6d 2d  rList(db, pItem-
1b9a0 3e 75 31 2e 70 46 75 6e 63 41 72 67 2c 20 69 54  >u1.pFuncArg, iT
1b9b0 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
1b9c0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1b9d0 77 68 69 6c 65 28 20 64 6f 50 72 69 6f 72 20 26  while( doPrior &
1b9e0 26 20 28 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72  & (p = p->pPrior
1b9f0 29 21 3d 30 20 29 3b 0a 7d 0a 23 65 6e 64 69 66  )!=0 );.}.#endif
1ba00 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
1ba10 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
1ba20 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
1ba30 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
1ba40 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65   */..#if !define
1ba50 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
1ba60 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69  BQUERY) || !defi
1ba70 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
1ba80 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73  VIEW)./*.** This
1ba90 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74   routine attempt
1baa0 73 20 74 6f 20 66 6c 61 74 74 65 6e 20 73 75 62  s to flatten sub
1bab0 71 75 65 72 69 65 73 20 61 73 20 61 20 70 65 72  queries as a per
1bac0 66 6f 72 6d 61 6e 63 65 20 6f 70 74 69 6d 69 7a  formance optimiz
1bad0 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72  ation..** This r
1bae0 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31  outine returns 1
1baf0 20 69 66 20 69 74 20 6d 61 6b 65 73 20 63 68 61   if it makes cha
1bb00 6e 67 65 73 20 61 6e 64 20 30 20 69 66 20 6e 6f  nges and 0 if no
1bb10 20 66 6c 61 74 74 65 6e 69 6e 67 20 6f 63 63 75   flattening occu
1bb20 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64  rs..**.** To und
1bb30 65 72 73 74 61 6e 64 20 74 68 65 20 63 6f 6e 63  erstand the conc
1bb40 65 70 74 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e  ept of flattenin
1bb50 67 2c 20 63 6f 6e 73 69 64 65 72 20 74 68 65 20  g, consider the 
1bb60 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71 75 65  following.** que
1bb70 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  ry:.**.**     SE
1bb80 4c 45 43 54 20 61 20 46 52 4f 4d 20 28 53 45 4c  LECT a FROM (SEL
1bb90 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f  ECT x+y AS a FRO
1bba0 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30  M t1 WHERE z<100
1bbb0 29 20 57 48 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a  ) WHERE a>5.**.*
1bbc0 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 77 61  * The default wa
1bbd0 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69 6e  y of implementin
1bbe0 67 20 74 68 69 73 20 71 75 65 72 79 20 69 73 20  g this query is 
1bbf0 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 0a 2a  to execute the.*
1bc00 2a 20 73 75 62 71 75 65 72 79 20 66 69 72 73 74  * subquery first
1bc10 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72   and store the r
1bc20 65 73 75 6c 74 73 20 69 6e 20 61 20 74 65 6d 70  esults in a temp
1bc30 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 74 68 65  orary table, the
1bc40 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20 6f 75 74  n.** run the out
1bc50 65 72 20 71 75 65 72 79 20 6f 6e 20 74 68 61 74  er query on that
1bc60 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
1bc70 2e 20 20 54 68 69 73 20 72 65 71 75 69 72 65 73  .  This requires
1bc80 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65 73 20 6f   two.** passes o
1bc90 76 65 72 20 74 68 65 20 64 61 74 61 2e 20 20 46  ver the data.  F
1bca0 75 72 74 68 65 72 6d 6f 72 65 2c 20 62 65 63 61  urthermore, beca
1bcb0 75 73 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72  use the temporar
1bcc0 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61 73 20 6e  y table.** has n
1bcd0 6f 20 69 6e 64 69 63 65 73 2c 20 74 68 65 20 57  o indices, the W
1bce0 48 45 52 45 20 63 6c 61 75 73 65 20 6f 6e 20 74  HERE clause on t
1bcf0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 63  he outer query c
1bd00 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70 74 69  annot be.** opti
1bd10 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  mized..**.** Thi
1bd20 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70  s routine attemp
1bd30 74 73 20 74 6f 20 72 65 77 72 69 74 65 20 71 75  ts to rewrite qu
1bd40 65 72 69 65 73 20 73 75 63 68 20 61 73 20 74 68  eries such as th
1bd50 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20  e above into.** 
1bd60 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20 73 65  a single flat se
1bd70 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68 69 73 3a  lect, like this:
1bd80 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43  .**.**     SELEC
1bd90 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20  T x+y AS a FROM 
1bda0 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30 20 41  t1 WHERE z<100 A
1bdb0 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65  ND a>5.**.** The
1bdc0 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20   code generated 
1bdd0 66 6f 72 20 74 68 69 73 20 73 69 6d 70 6c 69 66  for this simplif
1bde0 69 63 61 74 69 6f 6e 20 67 69 76 65 73 20 74 68  ication gives th
1bdf0 65 20 73 61 6d 65 20 72 65 73 75 6c 74 0a 2a 2a  e same result.**
1be00 20 62 75 74 20 6f 6e 6c 79 20 68 61 73 20 74 6f   but only has to
1be10 20 73 63 61 6e 20 74 68 65 20 64 61 74 61 20 6f   scan the data o
1be20 6e 63 65 2e 20 20 41 6e 64 20 62 65 63 61 75 73  nce.  And becaus
1be30 65 20 69 6e 64 69 63 65 73 20 6d 69 67 68 74 20  e indices might 
1be40 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74 68 65  .** exist on the
1be50 20 74 61 62 6c 65 20 74 31 2c 20 61 20 63 6f 6d   table t1, a com
1be60 70 6c 65 74 65 20 73 63 61 6e 20 6f 66 20 74 68  plete scan of th
1be70 65 20 64 61 74 61 20 6d 69 67 68 74 20 62 65 0a  e data might be.
1be80 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a  ** avoided..**.*
1be90 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  * Flattening is 
1bea0 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20 69  only attempted i
1beb0 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c  f all of the fol
1bec0 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
1bed0 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 54 68  .**.**   (1)  Th
1bee0 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74  e subquery and t
1bef0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
1bf00 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 61  o not both use a
1bf10 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  ggregates..**.**
1bf20 20 20 20 28 32 29 20 20 54 68 65 20 73 75 62 71     (2)  The subq
1bf30 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61  uery is not an a
1bf40 67 67 72 65 67 61 74 65 20 6f 72 20 28 32 61 29  ggregate or (2a)
1bf50 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1bf60 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 0a 2a   is not a join.*
1bf70 2a 20 20 20 20 20 20 20 20 61 6e 64 20 28 32 62  *        and (2b
1bf80 29 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  ) the outer quer
1bf90 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 73  y does not use s
1bfa0 75 62 71 75 65 72 69 65 73 20 6f 74 68 65 72 20  ubqueries other 
1bfb0 74 68 61 6e 20 74 68 65 20 6f 6e 65 0a 2a 2a 20  than the one.** 
1bfc0 20 20 20 20 20 20 20 46 52 4f 4d 2d 63 6c 61 75         FROM-clau
1bfd0 73 65 20 73 75 62 71 75 65 72 79 20 74 68 61 74  se subquery that
1bfe0 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20   is a candidate 
1bff0 66 6f 72 20 66 6c 61 74 74 65 6e 69 6e 67 2e 20  for flattening. 
1c000 20 28 32 62 20 69 73 0a 2a 2a 20 20 20 20 20 20   (2b is.**      
1c010 20 20 64 75 65 20 74 6f 20 74 69 63 6b 65 74 20    due to ticket 
1c020 5b 32 66 37 31 37 30 64 37 33 62 66 39 61 62 66  [2f7170d73bf9abf
1c030 38 30 5d 20 66 72 6f 6d 20 32 30 31 35 2d 30 32  80] from 2015-02
1c040 2d 30 39 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 28 33  -09.).**.**   (3
1c050 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
1c060 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74  is not the right
1c070 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65   operand of a le
1c080 66 74 20 6f 75 74 65 72 20 6a 6f 69 6e 0a 2a 2a  ft outer join.**
1c090 20 20 20 20 20 20 20 20 28 4f 72 69 67 69 6e 61          (Origina
1c0a0 6c 6c 79 20 74 69 63 6b 65 74 20 23 33 30 36 2e  lly ticket #306.
1c0b0 20 20 53 74 72 65 6e 67 74 68 65 6e 65 64 20 62    Strengthened b
1c0c0 79 20 74 69 63 6b 65 74 20 23 33 33 30 30 29 0a  y ticket #3300).
1c0d0 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 20 54 68 65  **.**   (4)  The
1c0e0 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
1c0f0 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a   DISTINCT..**.**
1c100 20 20 28 2a 2a 29 20 20 41 74 20 6f 6e 65 20 70    (**)  At one p
1c110 6f 69 6e 74 20 72 65 73 74 72 69 63 74 69 6f 6e  oint restriction
1c120 73 20 28 34 29 20 61 6e 64 20 28 35 29 20 64 65  s (4) and (5) de
1c130 66 69 6e 65 64 20 61 20 73 75 62 73 65 74 20 6f  fined a subset o
1c140 66 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20 20 20  f DISTINCT.**   
1c150 20 20 20 20 20 73 75 62 2d 71 75 65 72 69 65 73       sub-queries
1c160 20 74 68 61 74 20 77 65 72 65 20 65 78 63 6c 75   that were exclu
1c170 64 65 64 20 66 72 6f 6d 20 74 68 69 73 20 6f 70  ded from this op
1c180 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 52 65 73 74  timization. Rest
1c190 72 69 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 20 20  riction .**     
1c1a0 20 20 20 28 34 29 20 68 61 73 20 73 69 6e 63 65     (4) has since
1c1b0 20 62 65 65 6e 20 65 78 70 61 6e 64 65 64 20 74   been expanded t
1c1c0 6f 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 44 49  o exclude all DI
1c1d0 53 54 49 4e 43 54 20 73 75 62 71 75 65 72 69 65  STINCT subquerie
1c1e0 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29 20 20  s..**.**   (6)  
1c1f0 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
1c200 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67  s not use aggreg
1c210 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65  ates or the oute
1c220 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a  r query is not.*
1c230 2a 20 20 20 20 20 20 20 20 44 49 53 54 49 4e 43  *        DISTINC
1c240 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29 20 20  T..**.**   (7)  
1c250 54 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73  The subquery has
1c260 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20   a FROM clause. 
1c270 20 54 4f 44 4f 3a 20 20 46 6f 72 20 73 75 62 71   TODO:  For subq
1c280 75 65 72 69 65 73 20 77 69 74 68 6f 75 74 0a 2a  ueries without.*
1c290 2a 20 20 20 20 20 20 20 20 41 20 46 52 4f 4d 20  *        A FROM 
1c2a0 63 6c 61 75 73 65 2c 20 63 6f 6e 73 69 64 65 72  clause, consider
1c2b0 20 61 64 64 69 6e 67 20 61 20 46 52 4f 4d 20 63   adding a FROM c
1c2c0 6c 6f 73 65 20 77 69 74 68 20 74 68 65 20 73 70  lose with the sp
1c2d0 65 63 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20  ecial.**        
1c2e0 74 61 62 6c 65 20 73 71 6c 69 74 65 5f 6f 6e 63  table sqlite_onc
1c2f0 65 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20  e that consists 
1c300 6f 66 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20  of a single row 
1c310 63 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20  containing a.** 
1c320 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 4e 55         single NU
1c330 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29 20  LL..**.**   (8) 
1c340 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
1c350 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54  es not use LIMIT
1c360 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
1c370 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69  ery is not a joi
1c380 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20 20  n..**.**   (9)  
1c390 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
1c3a0 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20  s not use LIMIT 
1c3b0 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
1c3c0 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a  ry does not use.
1c3d0 2a 2a 20 20 20 20 20 20 20 20 61 67 67 72 65 67  **        aggreg
1c3e0 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a  ates..**.**  (**
1c3f0 29 20 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  )  Restriction (
1c400 31 30 29 20 77 61 73 20 72 65 6d 6f 76 65 64 20  10) was removed 
1c410 66 72 6f 6d 20 74 68 65 20 63 6f 64 65 20 6f 6e  from the code on
1c420 20 32 30 30 35 2d 30 32 2d 30 35 20 62 75 74 20   2005-02-05 but 
1c430 77 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 63 63  we.**        acc
1c440 69 64 65 6e 74 6c 79 20 63 61 72 72 69 65 64 20  idently carried 
1c450 74 68 65 20 63 6f 6d 6d 65 6e 74 20 66 6f 72 77  the comment forw
1c460 61 72 64 20 75 6e 74 69 6c 20 32 30 31 34 2d 30  ard until 2014-0
1c470 39 2d 31 35 2e 20 20 4f 72 69 67 69 6e 61 6c 0a  9-15.  Original.
1c480 2a 2a 20 20 20 20 20 20 20 20 74 65 78 74 3a 20  **        text: 
1c490 22 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f  "The subquery do
1c4a0 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65  es not use aggre
1c4b0 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74  gates or the out
1c4c0 65 72 20 71 75 65 72 79 20 0a 2a 2a 20 20 20 20  er query .**    
1c4d0 20 20 20 20 64 6f 65 73 20 6e 6f 74 20 75 73 65      does not use
1c4e0 20 4c 49 4d 49 54 2e 22 0a 2a 2a 0a 2a 2a 20 20   LIMIT.".**.**  
1c4f0 28 31 31 29 20 20 54 68 65 20 73 75 62 71 75 65  (11)  The subque
1c500 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72  ry and the outer
1c510 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f   query do not bo
1c520 74 68 20 68 61 76 65 20 4f 52 44 45 52 20 42 59  th have ORDER BY
1c530 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20   clauses..**.** 
1c540 20 28 2a 2a 29 20 20 4e 6f 74 20 69 6d 70 6c 65   (**)  Not imple
1c550 6d 65 6e 74 65 64 2e 20 20 53 75 62 73 75 6d 65  mented.  Subsume
1c560 64 20 69 6e 74 6f 20 72 65 73 74 72 69 63 74 69  d into restricti
1c570 6f 6e 20 28 33 29 2e 20 20 57 61 73 20 70 72 65  on (3).  Was pre
1c580 76 69 6f 75 73 6c 79 0a 2a 2a 20 20 20 20 20 20  viously.**      
1c590 20 20 61 20 73 65 70 61 72 61 74 65 20 72 65 73    a separate res
1c5a0 74 72 69 63 74 69 6f 6e 20 64 65 72 69 76 69 6e  triction derivin
1c5b0 67 20 66 72 6f 6d 20 74 69 63 6b 65 74 20 23 33  g from ticket #3
1c5c0 35 30 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 33 29 20  50..**.**  (13) 
1c5d0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e   The subquery an
1c5e0 64 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  d outer query do
1c5f0 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 4c 49   not both use LI
1c600 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 34 29  MIT..**.**  (14)
1c610 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
1c620 6f 65 73 20 6e 6f 74 20 75 73 65 20 4f 46 46 53  oes not use OFFS
1c630 45 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 35 29 20  ET..**.**  (15) 
1c640 20 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   The outer query
1c650 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20   is not part of 
1c660 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  a compound selec
1c670 74 20 6f 72 20 74 68 65 0a 2a 2a 20 20 20 20 20  t or the.**     
1c680 20 20 20 73 75 62 71 75 65 72 79 20 64 6f 65 73     subquery does
1c690 20 6e 6f 74 20 68 61 76 65 20 61 20 4c 49 4d 49   not have a LIMI
1c6a0 54 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 20 20 20  T clause..**    
1c6b0 20 20 20 20 28 53 65 65 20 74 69 63 6b 65 74 20      (See ticket 
1c6c0 23 32 33 33 39 20 61 6e 64 20 74 69 63 6b 65 74  #2339 and ticket
1c6d0 20 5b 30 32 61 38 65 38 31 64 34 34 5d 29 2e 0a   [02a8e81d44])..
1c6e0 2a 2a 0a 2a 2a 20 20 28 31 36 29 20 20 54 68 65  **.**  (16)  The
1c6f0 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
1c700 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65  not an aggregate
1c710 20 6f 72 20 74 68 65 20 73 75 62 71 75 65 72 79   or the subquery
1c720 20 64 6f 65 73 0a 2a 2a 20 20 20 20 20 20 20 20   does.**        
1c730 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45  not contain ORDE
1c740 52 20 42 59 2e 20 20 28 54 69 63 6b 65 74 20 23  R BY.  (Ticket #
1c750 32 39 34 32 29 20 20 54 68 69 73 20 75 73 65 64  2942)  This used
1c760 20 74 6f 20 6e 6f 74 20 6d 61 74 74 65 72 0a 2a   to not matter.*
1c770 2a 20 20 20 20 20 20 20 20 75 6e 74 69 6c 20 77  *        until w
1c780 65 20 69 6e 74 72 6f 64 75 63 65 64 20 74 68 65  e introduced the
1c790 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 29 20   group_concat() 
1c7a0 66 75 6e 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a  function.  .**.*
1c7b0 2a 20 20 28 31 37 29 20 20 54 68 65 20 73 75 62  *  (17)  The sub
1c7c0 2d 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20  -query is not a 
1c7d0 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c  compound select,
1c7e0 20 6f 72 20 69 74 20 69 73 20 61 20 55 4e 49 4f   or it is a UNIO
1c7f0 4e 20 41 4c 4c 20 0a 2a 2a 20 20 20 20 20 20 20  N ALL .**       
1c800 20 63 6f 6d 70 6f 75 6e 64 20 63 6c 61 75 73 65   compound clause
1c810 20 6d 61 64 65 20 75 70 20 65 6e 74 69 72 65 6c   made up entirel
1c820 79 20 6f 66 20 6e 6f 6e 2d 61 67 67 72 65 67 61  y of non-aggrega
1c830 74 65 20 71 75 65 72 69 65 73 2c 20 61 6e 64 20  te queries, and 
1c840 0a 2a 2a 20 20 20 20 20 20 20 20 74 68 65 20 70  .**        the p
1c850 61 72 65 6e 74 20 71 75 65 72 79 3a 0a 2a 2a 0a  arent query:.**.
1c860 2a 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69 73  **          * is
1c870 20 6e 6f 74 20 69 74 73 65 6c 66 20 70 61 72 74   not itself part
1c880 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73   of a compound s
1c890 65 6c 65 63 74 2c 0a 2a 2a 20 20 20 20 20 20 20  elect,.**       
1c8a0 20 20 20 2a 20 69 73 20 6e 6f 74 20 61 6e 20 61     * is not an a
1c8b0 67 67 72 65 67 61 74 65 20 6f 72 20 44 49 53 54  ggregate or DIST
1c8c0 49 4e 43 54 20 71 75 65 72 79 2c 20 61 6e 64 0a  INCT query, and.
1c8d0 2a 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69 73  **          * is
1c8e0 20 6e 6f 74 20 61 20 6a 6f 69 6e 0a 2a 2a 0a 2a   not a join.**.*
1c8f0 2a 20 20 20 20 20 20 20 20 54 68 65 20 70 61 72  *        The par
1c900 65 6e 74 20 61 6e 64 20 73 75 62 2d 71 75 65 72  ent and sub-quer
1c910 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 57 48  y may contain WH
1c920 45 52 45 20 63 6c 61 75 73 65 73 2e 20 53 75 62  ERE clauses. Sub
1c930 6a 65 63 74 20 74 6f 0a 2a 2a 20 20 20 20 20 20  ject to.**      
1c940 20 20 72 75 6c 65 73 20 28 31 31 29 2c 20 28 31    rules (11), (1
1c950 33 29 20 61 6e 64 20 28 31 34 29 2c 20 74 68 65  3) and (14), the
1c960 79 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61  y may also conta
1c970 69 6e 20 4f 52 44 45 52 20 42 59 2c 0a 2a 2a 20  in ORDER BY,.** 
1c980 20 20 20 20 20 20 20 4c 49 4d 49 54 20 61 6e 64         LIMIT and
1c990 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e   OFFSET clauses.
1c9a0 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 63    The subquery c
1c9b0 61 6e 6e 6f 74 20 75 73 65 20 61 6e 79 20 63 6f  annot use any co
1c9c0 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20  mpound.**       
1c9d0 20 6f 70 65 72 61 74 6f 72 20 6f 74 68 65 72 20   operator other 
1c9e0 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 62  than UNION ALL b
1c9f0 65 63 61 75 73 65 20 61 6c 6c 20 74 68 65 20 6f  ecause all the o
1ca00 74 68 65 72 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a  ther compound.**
1ca10 20 20 20 20 20 20 20 20 6f 70 65 72 61 74 6f 72          operator
1ca20 73 20 68 61 76 65 20 61 6e 20 69 6d 70 6c 69 65  s have an implie
1ca30 64 20 44 49 53 54 49 4e 43 54 20 77 68 69 63 68  d DISTINCT which
1ca40 20 69 73 20 64 69 73 61 6c 6c 6f 77 65 64 20 62   is disallowed b
1ca50 79 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 73 74  y.**        rest
1ca60 72 69 63 74 69 6f 6e 20 28 34 29 2e 0a 2a 2a 0a  riction (4)..**.
1ca70 2a 2a 20 20 20 20 20 20 20 20 41 6c 73 6f 2c 20  **        Also, 
1ca80 65 61 63 68 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f  each component o
1ca90 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20  f the sub-query 
1caa0 6d 75 73 74 20 72 65 74 75 72 6e 20 74 68 65 20  must return the 
1cab0 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20  same number.**  
1cac0 20 20 20 20 20 20 6f 66 20 72 65 73 75 6c 74 20        of result 
1cad0 63 6f 6c 75 6d 6e 73 2e 20 54 68 69 73 20 69 73  columns. This is
1cae0 20 61 63 74 75 61 6c 6c 79 20 61 20 72 65 71 75   actually a requ
1caf0 69 72 65 6d 65 6e 74 20 66 6f 72 20 61 6e 79 20  irement for any 
1cb00 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20  compound.**     
1cb10 20 20 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d     SELECT statem
1cb20 65 6e 74 2c 20 62 75 74 20 61 6c 6c 20 74 68 65  ent, but all the
1cb30 20 63 6f 64 65 20 68 65 72 65 20 64 6f 65 73 20   code here does 
1cb40 69 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  is make sure tha
1cb50 74 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73  t no.**        s
1cb60 75 63 68 20 28 69 6c 6c 65 67 61 6c 29 20 73 75  uch (illegal) su
1cb70 62 2d 71 75 65 72 79 20 69 73 20 66 6c 61 74 74  b-query is flatt
1cb80 65 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72  ened. The caller
1cb90 20 77 69 6c 6c 20 64 65 74 65 63 74 20 74 68 65   will detect the
1cba0 0a 2a 2a 20 20 20 20 20 20 20 20 73 79 6e 74 61  .**        synta
1cbb0 78 20 65 72 72 6f 72 20 61 6e 64 20 72 65 74 75  x error and retu
1cbc0 72 6e 20 61 20 64 65 74 61 69 6c 65 64 20 6d 65  rn a detailed me
1cbd0 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  ssage..**.**  (1
1cbe0 38 29 20 20 49 66 20 74 68 65 20 73 75 62 2d 71  8)  If the sub-q
1cbf0 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75  uery is a compou
1cc00 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20  nd select, then 
1cc10 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65  all terms of the
1cc20 0a 2a 2a 20 20 20 20 20 20 20 20 4f 52 44 45 52  .**        ORDER
1cc30 20 62 79 20 63 6c 61 75 73 65 20 6f 66 20 74 68   by clause of th
1cc40 65 20 70 61 72 65 6e 74 20 6d 75 73 74 20 62 65  e parent must be
1cc50 20 73 69 6d 70 6c 65 20 72 65 66 65 72 65 6e 63   simple referenc
1cc60 65 73 20 74 6f 20 0a 2a 2a 20 20 20 20 20 20 20  es to .**       
1cc70 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
1cc80 73 75 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a  sub-query..**.**
1cc90 20 20 28 31 39 29 20 20 54 68 65 20 73 75 62 71    (19)  The subq
1cca0 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
1ccb0 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f  e LIMIT or the o
1ccc0 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20  uter query does 
1ccd0 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 68 61  not.**        ha
1cce0 76 65 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  ve a WHERE claus
1ccf0 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 30 29 20 20  e..**.**  (20)  
1cd00 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  If the sub-query
1cd10 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73   is a compound s
1cd20 65 6c 65 63 74 2c 20 74 68 65 6e 20 69 74 20 6d  elect, then it m
1cd30 75 73 74 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20  ust not use.**  
1cd40 20 20 20 20 20 20 61 6e 20 4f 52 44 45 52 20 42        an ORDER B
1cd50 59 20 63 6c 61 75 73 65 2e 20 20 54 69 63 6b 65  Y clause.  Ticke
1cd60 74 20 23 33 37 37 33 2e 20 20 57 65 20 63 6f 75  t #3773.  We cou
1cd70 6c 64 20 72 65 6c 61 78 20 74 68 69 73 20 63 6f  ld relax this co
1cd80 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 20 20 20 20  nstraint.**     
1cd90 20 20 20 73 6f 6d 65 77 68 61 74 20 62 79 20 73     somewhat by s
1cda0 61 79 69 6e 67 20 74 68 61 74 20 74 68 65 20 74  aying that the t
1cdb0 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45  erms of the ORDE
1cdc0 52 20 42 59 20 63 6c 61 75 73 65 20 6d 75 73 74  R BY clause must
1cdd0 0a 2a 2a 20 20 20 20 20 20 20 20 61 70 70 65 61  .**        appea
1cde0 72 20 61 73 20 75 6e 6d 6f 64 69 66 69 65 64 20  r as unmodified 
1cdf0 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 69  result columns i
1ce00 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
1ce10 79 2e 20 20 42 75 74 20 77 65 0a 2a 2a 20 20 20  y.  But we.**   
1ce20 20 20 20 20 20 68 61 76 65 20 6f 74 68 65 72 20       have other 
1ce30 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 69 6e  optimizations in
1ce40 20 6d 69 6e 64 20 74 6f 20 64 65 61 6c 20 77 69   mind to deal wi
1ce50 74 68 20 74 68 61 74 20 63 61 73 65 2e 0a 2a 2a  th that case..**
1ce60 0a 2a 2a 20 20 28 32 31 29 20 20 54 68 65 20 73  .**  (21)  The s
1ce70 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
1ce80 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68   use LIMIT or th
1ce90 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
1cea0 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 44   not.**        D
1ceb0 49 53 54 49 4e 43 54 2e 20 20 28 53 65 65 20 74  ISTINCT.  (See t
1cec0 69 63 6b 65 74 20 5b 37 35 32 65 31 36 34 36 66  icket [752e1646f
1ced0 63 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 32 29  c])..**.**  (22)
1cee0 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
1cef0 73 20 6e 6f 74 20 61 20 72 65 63 75 72 73 69 76  s not a recursiv
1cf00 65 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 20 28 32  e CTE..**.**  (2
1cf10 33 29 20 20 54 68 65 20 70 61 72 65 6e 74 20 69  3)  The parent i
1cf20 73 20 6e 6f 74 20 61 20 72 65 63 75 72 73 69 76  s not a recursiv
1cf30 65 20 43 54 45 2c 20 6f 72 20 74 68 65 20 73 75  e CTE, or the su
1cf40 62 2d 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  b-query is not a
1cf50 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f 6d 70 6f  .**        compo
1cf60 75 6e 64 20 71 75 65 72 79 2e 20 54 68 69 73 20  und query. This 
1cf70 72 65 73 74 72 69 63 74 69 6f 6e 20 69 73 20 62  restriction is b
1cf80 65 63 61 75 73 65 20 74 72 61 6e 73 66 6f 72 6d  ecause transform
1cf90 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ing the.**      
1cfa0 20 20 70 61 72 65 6e 74 20 74 6f 20 61 20 63 6f    parent to a co
1cfb0 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 63 6f 6e  mpound query con
1cfc0 66 75 73 65 73 20 74 68 65 20 63 6f 64 65 20 74  fuses the code t
1cfd0 68 61 74 20 68 61 6e 64 6c 65 73 0a 2a 2a 20 20  hat handles.**  
1cfe0 20 20 20 20 20 20 72 65 63 75 72 73 69 76 65 20        recursive 
1cff0 71 75 65 72 69 65 73 20 69 6e 20 6d 75 6c 74 69  queries in multi
1d000 53 65 6c 65 63 74 28 29 2e 0a 2a 2a 0a 2a 2a 20  Select()..**.** 
1d010 20 28 32 34 29 20 20 54 68 65 20 73 75 62 71 75   (24)  The subqu
1d020 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67  ery is not an ag
1d030 67 72 65 67 61 74 65 20 74 68 61 74 20 75 73 65  gregate that use
1d040 73 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 6d  s the built-in m
1d050 69 6e 28 29 20 6f 72 20 0a 2a 2a 20 20 20 20 20  in() or .**     
1d060 20 20 20 6f 72 20 6d 61 78 28 29 20 66 75 6e 63     or max() func
1d070 74 69 6f 6e 73 2e 20 20 28 57 69 74 68 6f 75 74  tions.  (Without
1d080 20 74 68 69 73 20 72 65 73 74 72 69 63 74 69 6f   this restrictio
1d090 6e 2c 20 61 20 71 75 65 72 79 20 6c 69 6b 65 3a  n, a query like:
1d0a0 0a 2a 2a 20 20 20 20 20 20 20 20 22 53 45 4c 45  .**        "SELE
1d0b0 43 54 20 78 20 46 52 4f 4d 20 28 53 45 4c 45 43  CT x FROM (SELEC
1d0c0 54 20 6d 61 78 28 79 29 2c 20 78 20 46 52 4f 4d  T max(y), x FROM
1d0d0 20 74 31 29 22 20 77 6f 75 6c 64 20 6e 6f 74 20   t1)" would not 
1d0e0 6e 65 63 65 73 73 61 72 69 6c 79 0a 2a 2a 20 20  necessarily.**  
1d0f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 68 65        return the
1d100 20 76 61 6c 75 65 20 58 20 66 6f 72 20 77 68 69   value X for whi
1d110 63 68 20 59 20 77 61 73 20 6d 61 78 69 6d 61 6c  ch Y was maximal
1d120 2e 29 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  .).**.**.** In t
1d130 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65  his routine, the
1d140 20 22 70 22 20 70 61 72 61 6d 65 74 65 72 20 69   "p" parameter i
1d150 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
1d160 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a  he outer query..
1d170 2a 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20  ** The subquery 
1d180 69 73 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46  is p->pSrc->a[iF
1d190 72 6f 6d 5d 2e 20 20 69 73 41 67 67 20 69 73 20  rom].  isAgg is 
1d1a0 74 72 75 65 20 69 66 20 74 68 65 20 6f 75 74 65  true if the oute
1d1b0 72 20 71 75 65 72 79 0a 2a 2a 20 75 73 65 73 20  r query.** uses 
1d1c0 61 67 67 72 65 67 61 74 65 73 20 61 6e 64 20 73  aggregates and s
1d1d0 75 62 71 75 65 72 79 49 73 41 67 67 20 69 73 20  ubqueryIsAgg is 
1d1e0 74 72 75 65 20 69 66 20 74 68 65 20 73 75 62 71  true if the subq
1d1f0 75 65 72 79 20 75 73 65 73 20 61 67 67 72 65 67  uery uses aggreg
1d200 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66  ates..**.** If f
1d210 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74  lattening is not
1d220 20 61 74 74 65 6d 70 74 65 64 2c 20 74 68 69 73   attempted, this
1d230 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
1d240 2d 6f 70 20 61 6e 64 20 72 65 74 75 72 6e 73 20  -op and returns 
1d250 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e  0..** If flatten
1d260 69 6e 67 20 69 73 20 61 74 74 65 6d 70 74 65 64  ing is attempted
1d270 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
1d280 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41  turns 1..**.** A
1d290 6c 6c 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  ll of the expres
1d2a0 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75  sion analysis mu
1d2b0 73 74 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68  st occur on both
1d2c0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1d2d0 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62 71   and.** the subq
1d2e0 75 65 72 79 20 62 65 66 6f 72 65 20 74 68 69 73  uery before this
1d2f0 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a   routine runs..*
1d300 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 61  /.static int fla
1d310 74 74 65 6e 53 75 62 71 75 65 72 79 28 0a 20 20  ttenSubquery(.  
1d320 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
1d330 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
1d340 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
1d350 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
1d360 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20    /* The parent 
1d370 6f 72 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20  or outer SELECT 
1d380 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  statement */.  i
1d390 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20  nt iFrom,       
1d3a0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20      /* Index in 
1d3b0 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20  p->pSrc->a[] of 
1d3c0 74 68 65 20 69 6e 6e 65 72 20 73 75 62 71 75 65  the inner subque
1d3d0 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67  ry */.  int isAg
1d3e0 67 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  g,           /* 
1d3f0 54 72 75 65 20 69 66 20 6f 75 74 65 72 20 53 45  True if outer SE
1d400 4c 45 43 54 20 75 73 65 73 20 61 67 67 72 65 67  LECT uses aggreg
1d410 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f  ate functions */
1d420 0a 20 20 69 6e 74 20 73 75 62 71 75 65 72 79 49  .  int subqueryI
1d430 73 41 67 67 20 20 20 20 2f 2a 20 54 72 75 65 20  sAgg    /* True 
1d440 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  if the subquery 
1d450 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66  uses aggregate f
1d460 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20  unctions */.){. 
1d470 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 61   const char *zSa
1d480 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d  vedAuthContext =
1d490 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f   pParse->zAuthCo
1d4a0 6e 74 65 78 74 3b 0a 20 20 53 65 6c 65 63 74 20  ntext;.  Select 
1d4b0 2a 70 50 61 72 65 6e 74 3b 20 20 20 20 2f 2a 20  *pParent;    /* 
1d4c0 43 75 72 72 65 6e 74 20 55 4e 49 4f 4e 20 41 4c  Current UNION AL
1d4d0 4c 20 74 65 72 6d 20 6f 66 20 74 68 65 20 6f 74  L term of the ot
1d4e0 68 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 53  her query */.  S
1d4f0 65 6c 65 63 74 20 2a 70 53 75 62 3b 20 20 20 20  elect *pSub;    
1d500 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e 65 72 20     /* The inner 
1d510 71 75 65 72 79 20 6f 72 20 22 73 75 62 71 75 65  query or "subque
1d520 72 79 22 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ry" */.  Select 
1d530 2a 70 53 75 62 31 3b 20 20 20 20 20 20 2f 2a 20  *pSub1;      /* 
1d540 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 72  Pointer to the r
1d550 69 67 68 74 6d 6f 73 74 20 73 65 6c 65 63 74 20  ightmost select 
1d560 69 6e 20 73 75 62 2d 71 75 65 72 79 20 2a 2f 0a  in sub-query */.
1d570 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b    SrcList *pSrc;
1d580 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f        /* The FRO
1d590 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
1d5a0 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20  outer query */. 
1d5b0 20 53 72 63 4c 69 73 74 20 2a 70 53 75 62 53 72   SrcList *pSubSr
1d5c0 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d  c;   /* The FROM
1d5d0 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73   clause of the s
1d5e0 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 45 78 70  ubquery */.  Exp
1d5f0 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20  rList *pList;   
1d600 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73   /* The result s
1d610 65 74 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  et of the outer 
1d620 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69  query */.  int i
1d630 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20 2f  Parent;        /
1d640 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75  * VDBE cursor nu
1d650 6d 62 65 72 20 6f 66 20 74 68 65 20 70 53 75 62  mber of the pSub
1d660 20 72 65 73 75 6c 74 20 73 65 74 20 74 65 6d 70   result set temp
1d670 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
1d680 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
1d690 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
1d6a0 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72  */.  Expr *pWher
1d6b0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1d6c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
1d6d0 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73  RE clause */.  s
1d6e0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1d6f0 65 6d 20 2a 70 53 75 62 69 74 65 6d 3b 20 20 20  em *pSubitem;   
1d700 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20  /* The subquery 
1d710 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
1d720 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
1d730 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
1d740 65 20 69 66 20 66 6c 61 74 74 65 6e 69 6e 67 20  e if flattening 
1d750 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 20 52  is permitted.  R
1d760 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74 2e 0a  eturn 0 if not..
1d770 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
1d780 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
1d790 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b   p->pPrior==0 );
1d7a0 20 20 2f 2a 20 55 6e 61 62 6c 65 20 74 6f 20 66    /* Unable to f
1d7b0 6c 61 74 74 65 6e 20 63 6f 6d 70 6f 75 6e 64 20  latten compound 
1d7c0 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 69 66 28  queries */.  if(
1d7d0 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73   OptimizationDis
1d7e0 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45  abled(db, SQLITE
1d7f0 5f 51 75 65 72 79 46 6c 61 74 74 65 6e 65 72 29  _QueryFlattener)
1d800 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
1d810 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  Src = p->pSrc;. 
1d820 20 61 73 73 65 72 74 28 20 70 53 72 63 20 26 26   assert( pSrc &&
1d830 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20 69 46 72   iFrom>=0 && iFr
1d840 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b  om<pSrc->nSrc );
1d850 0a 20 20 70 53 75 62 69 74 65 6d 20 3d 20 26 70  .  pSubitem = &p
1d860 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b 0a 20  Src->a[iFrom];. 
1d870 20 69 50 61 72 65 6e 74 20 3d 20 70 53 75 62 69   iParent = pSubi
1d880 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
1d890 70 53 75 62 20 3d 20 70 53 75 62 69 74 65 6d 2d  pSub = pSubitem-
1d8a0 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61 73 73 65  >pSelect;.  asse
1d8b0 72 74 28 20 70 53 75 62 21 3d 30 20 29 3b 0a 20  rt( pSub!=0 );. 
1d8c0 20 69 66 28 20 73 75 62 71 75 65 72 79 49 73 41   if( subqueryIsA
1d8d0 67 67 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73  gg ){.    if( is
1d8e0 41 67 67 20 29 20 72 65 74 75 72 6e 20 30 3b 20  Agg ) return 0; 
1d8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d910 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
1d920 29 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  )   */.    if( p
1d930 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 20 72 65  Src->nSrc>1 ) re
1d940 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
1d950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d960 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1d970 32 61 29 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  2a)  */.    if( 
1d980 28 70 2d 3e 70 57 68 65 72 65 20 26 26 20 45 78  (p->pWhere && Ex
1d990 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2d  prHasProperty(p-
1d9a0 3e 70 57 68 65 72 65 2c 45 50 5f 53 75 62 71 75  >pWhere,EP_Subqu
1d9b0 65 72 79 29 29 0a 20 20 20 20 20 7c 7c 20 28 73  ery)).     || (s
1d9c0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 46 6c  qlite3ExprListFl
1d9d0 61 67 73 28 70 2d 3e 70 45 4c 69 73 74 29 20 26  ags(p->pEList) &
1d9e0 20 45 50 5f 53 75 62 71 75 65 72 79 29 21 3d 30   EP_Subquery)!=0
1d9f0 0a 20 20 20 20 20 7c 7c 20 28 73 71 6c 69 74 65  .     || (sqlite
1da00 33 45 78 70 72 4c 69 73 74 46 6c 61 67 73 28 70  3ExprListFlags(p
1da10 2d 3e 70 4f 72 64 65 72 42 79 29 20 26 20 45 50  ->pOrderBy) & EP
1da20 5f 53 75 62 71 75 65 72 79 29 21 3d 30 0a 20 20  _Subquery)!=0.  
1da30 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72    ){.      retur
1da40 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
1da50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1da70 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32 62   Restriction (2b
1da80 29 20 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a  )  */.    }.  }.
1da90 20 20 20 20 0a 20 20 70 53 75 62 53 72 63 20 3d      .  pSubSrc =
1daa0 20 70 53 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61   pSub->pSrc;.  a
1dab0 73 73 65 72 74 28 20 70 53 75 62 53 72 63 20 29  ssert( pSubSrc )
1dac0 3b 0a 20 20 2f 2a 20 50 72 69 6f 72 20 74 6f 20  ;.  /* Prior to 
1dad0 76 65 72 73 69 6f 6e 20 33 2e 31 2e 32 2c 20 77  version 3.1.2, w
1dae0 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46  hen LIMIT and OF
1daf0 46 53 45 54 20 68 61 64 20 74 6f 20 62 65 20 73  FSET had to be s
1db00 69 6d 70 6c 65 20 63 6f 6e 73 74 61 6e 74 73 2c  imple constants,
1db10 0a 20 20 2a 2a 20 6e 6f 74 20 61 72 62 69 74 72  .  ** not arbitr
1db20 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e 73 2c  ary expressions,
1db30 20 77 65 20 61 6c 6c 6f 77 65 64 20 73 6f 6d 65   we allowed some
1db40 20 63 6f 6d 62 69 6e 69 6e 67 20 6f 66 20 4c 49   combining of LI
1db50 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20  MIT and OFFSET. 
1db60 20 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65 79   ** because they
1db70 20 63 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74   could be comput
1db80 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ed at compile-ti
1db90 6d 65 2e 20 20 42 75 74 20 77 68 65 6e 20 4c 49  me.  But when LI
1dba0 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20  MIT and OFFSET. 
1dbb0 20 2a 2a 20 62 65 63 61 6d 65 20 61 72 62 69 74   ** became arbit
1dbc0 72 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e 73  rary expressions
1dbd0 2c 20 77 65 20 77 65 72 65 20 66 6f 72 63 65 64  , we were forced
1dbe0 20 74 6f 20 61 64 64 20 72 65 73 74 72 69 63 74   to add restrict
1dbf0 69 6f 6e 73 20 28 31 33 29 0a 20 20 2a 2a 20 61  ions (13).  ** a
1dc00 6e 64 20 28 31 34 29 2e 20 2a 2f 0a 20 20 69 66  nd (14). */.  if
1dc10 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26  ( pSub->pLimit &
1dc20 26 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65  & p->pLimit ) re
1dc30 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
1dc40 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1dc50 69 6f 6e 20 28 31 33 29 20 2a 2f 0a 20 20 69 66  ion (13) */.  if
1dc60 28 20 70 53 75 62 2d 3e 70 4f 66 66 73 65 74 20  ( pSub->pOffset 
1dc70 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
1dc80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc90 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1dca0 69 6f 6e 20 28 31 34 29 20 2a 2f 0a 20 20 69 66  ion (14) */.  if
1dcb0 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
1dcc0 20 53 46 5f 43 6f 6d 70 6f 75 6e 64 29 21 3d 30   SF_Compound)!=0
1dcd0 20 26 26 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74   && pSub->pLimit
1dce0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
1dcf0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1dd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1dd20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 35 29  Restriction (15)
1dd30 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 53   */.  }.  if( pS
1dd40 75 62 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 29  ubSrc->nSrc==0 )
1dd50 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1dd60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd70 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1dd80 28 37 29 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  (7)  */.  if( pS
1dd90 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ub->selFlags & S
1dda0 46 5f 44 69 73 74 69 6e 63 74 20 29 20 72 65 74  F_Distinct ) ret
1ddb0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
1ddc0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1ddd0 28 35 29 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  (5)  */.  if( pS
1dde0 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28 70  ub->pLimit && (p
1ddf0 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69  Src->nSrc>1 || i
1de00 73 41 67 67 29 20 29 7b 0a 20 20 20 20 20 72 65  sAgg) ){.     re
1de10 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
1de20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 73 20  /* Restrictions 
1de30 28 38 29 28 39 29 20 2a 2f 0a 20 20 7d 0a 20 20  (8)(9) */.  }.  
1de40 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  if( (p->selFlags
1de50 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21   & SF_Distinct)!
1de60 3d 30 20 26 26 20 73 75 62 71 75 65 72 79 49 73  =0 && subqueryIs
1de70 41 67 67 20 29 7b 0a 20 20 20 20 20 72 65 74 75  Agg ){.     retu
1de80 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a  rn 0;         /*
1de90 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 36 29   Restriction (6)
1dea0 20 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70    */.  }.  if( p
1deb0 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20 70 53  ->pOrderBy && pS
1dec0 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  ub->pOrderBy ){.
1ded0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
1dee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1def0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df00 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
1df10 72 69 63 74 69 6f 6e 20 28 31 31 29 20 2a 2f 0a  riction (11) */.
1df20 20 20 7d 0a 20 20 69 66 28 20 69 73 41 67 67 20    }.  if( isAgg 
1df30 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42  && pSub->pOrderB
1df40 79 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  y ) return 0;   
1df50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1df60 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 36 29  Restriction (16)
1df70 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
1df80 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 57 68  pLimit && p->pWh
1df90 65 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ere ) return 0; 
1dfa0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1dfb0 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 39 29  Restriction (19)
1dfc0 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
1dfd0 70 4c 69 6d 69 74 20 26 26 20 28 70 2d 3e 73 65  pLimit && (p->se
1dfe0 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74  lFlags & SF_Dist
1dff0 69 6e 63 74 29 21 3d 30 20 29 7b 0a 20 20 20 20  inct)!=0 ){.    
1e000 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1e010 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1e020 6e 20 28 32 31 29 20 2a 2f 0a 20 20 7d 0a 20 20  n (21) */.  }.  
1e030 74 65 73 74 63 61 73 65 28 20 70 53 75 62 2d 3e  testcase( pSub->
1e040 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65  selFlags & SF_Re
1e050 63 75 72 73 69 76 65 20 29 3b 0a 20 20 74 65 73  cursive );.  tes
1e060 74 63 61 73 65 28 20 70 53 75 62 2d 3e 73 65 6c  tcase( pSub->sel
1e070 46 6c 61 67 73 20 26 20 53 46 5f 4d 69 6e 4d 61  Flags & SF_MinMa
1e080 78 41 67 67 20 29 3b 0a 20 20 69 66 28 20 70 53  xAgg );.  if( pS
1e090 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  ub->selFlags & (
1e0a0 53 46 5f 52 65 63 75 72 73 69 76 65 7c 53 46 5f  SF_Recursive|SF_
1e0b0 4d 69 6e 4d 61 78 41 67 67 29 20 29 7b 0a 20 20  MinMaxAgg) ){.  
1e0c0 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 52    return 0; /* R
1e0d0 65 73 74 72 69 63 74 69 6f 6e 73 20 28 32 32 29  estrictions (22)
1e0e0 20 61 6e 64 20 28 32 34 29 20 2a 2f 0a 20 20 7d   and (24) */.  }
1e0f0 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c  .  if( (p->selFl
1e100 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69  ags & SF_Recursi
1e110 76 65 29 20 26 26 20 70 53 75 62 2d 3e 70 50 72  ve) && pSub->pPr
1e120 69 6f 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ior ){.    retur
1e130 6e 20 30 3b 20 2f 2a 20 52 65 73 74 72 69 63 74  n 0; /* Restrict
1e140 69 6f 6e 20 28 32 33 29 20 2a 2f 0a 20 20 7d 0a  ion (23) */.  }.
1e150 0a 20 20 2f 2a 20 4f 42 53 4f 4c 45 54 45 20 43  .  /* OBSOLETE C
1e160 4f 4d 4d 45 4e 54 20 31 3a 0a 20 20 2a 2a 20 52  OMMENT 1:.  ** R
1e170 65 73 74 72 69 63 74 69 6f 6e 20 33 3a 20 20 49  estriction 3:  I
1e180 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
1e190 73 20 61 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73  s a join, make s
1e1a0 75 72 65 20 74 68 65 20 73 75 62 71 75 65 72 79  ure the subquery
1e1b0 20 69 73 20 0a 20 20 2a 2a 20 6e 6f 74 20 75 73   is .  ** not us
1e1c0 65 64 20 61 73 20 74 68 65 20 72 69 67 68 74 20  ed as the right 
1e1d0 6f 70 65 72 61 6e 64 20 6f 66 20 61 6e 20 6f 75  operand of an ou
1e1e0 74 65 72 20 6a 6f 69 6e 2e 20 20 45 78 61 6d 70  ter join.  Examp
1e1f0 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69 73 0a  les of why this.
1e200 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6c 6c 6f    ** is not allo
1e210 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  wed:.  **.  **  
1e220 20 20 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f         t1 LEFT O
1e230 55 54 45 52 20 4a 4f 49 4e 20 28 74 32 20 4a 4f  UTER JOIN (t2 JO
1e240 49 4e 20 74 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a  IN t3).  **.  **
1e250 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74   If we flatten t
1e260 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75  he above, we wou
1e270 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a  ld get.  **.  **
1e280 20 20 20 20 20 20 20 20 20 28 74 31 20 4c 45 46           (t1 LEF
1e290 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29  T OUTER JOIN t2)
1e2a0 20 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a 20 20   JOIN t3.  **.  
1e2b0 2a 2a 20 77 68 69 63 68 20 69 73 20 6e 6f 74 20  ** which is not 
1e2c0 61 74 20 61 6c 6c 20 74 68 65 20 73 61 6d 65 20  at all the same 
1e2d0 74 68 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  thing..  **.  **
1e2e0 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e   OBSOLETE COMMEN
1e2f0 54 20 32 3a 0a 20 20 2a 2a 20 52 65 73 74 72 69  T 2:.  ** Restri
1e300 63 74 69 6f 6e 20 31 32 3a 20 20 49 66 20 74 68  ction 12:  If th
1e310 65 20 73 75 62 71 75 65 72 79 20 69 73 20 74 68  e subquery is th
1e320 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  e right operand 
1e330 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72 0a  of a left outer.
1e340 20 20 2a 2a 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20    ** join, make 
1e350 73 75 72 65 20 74 68 65 20 73 75 62 71 75 65 72  sure the subquer
1e360 79 20 68 61 73 20 6e 6f 20 57 48 45 52 45 20 63  y has no WHERE c
1e370 6c 61 75 73 65 2e 0a 20 20 2a 2a 20 41 6e 20 65  lause..  ** An e
1e380 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74  xamples of why t
1e390 68 69 73 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77  his is not allow
1e3a0 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ed:.  **.  **   
1e3b0 20 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55        t1 LEFT OU
1e3c0 54 45 52 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54  TER JOIN (SELECT
1e3d0 20 2a 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45   * FROM t2 WHERE
1e3e0 20 74 32 2e 78 3e 30 29 0a 20 20 2a 2a 0a 20 20   t2.x>0).  **.  
1e3f0 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e  ** If we flatten
1e400 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77   the above, we w
1e410 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20  ould get.  **.  
1e420 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31 20 4c  **         (t1 L
1e430 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74  EFT OUTER JOIN t
1e440 32 29 20 57 48 45 52 45 20 74 32 2e 78 3e 30 0a  2) WHERE t2.x>0.
1e450 20 20 2a 2a 0a 20 20 2a 2a 20 42 75 74 20 74 68    **.  ** But th
1e460 65 20 74 32 2e 78 3e 30 20 74 65 73 74 20 77 69  e t2.x>0 test wi
1e470 6c 6c 20 61 6c 77 61 79 73 20 66 61 69 6c 20 6f  ll always fail o
1e480 6e 20 61 20 4e 55 4c 4c 20 72 6f 77 20 6f 66 20  n a NULL row of 
1e490 74 32 2c 20 77 68 69 63 68 0a 20 20 2a 2a 20 65  t2, which.  ** e
1e4a0 66 66 65 63 74 69 76 65 6c 79 20 63 6f 6e 76 65  ffectively conve
1e4b0 72 74 73 20 74 68 65 20 4f 55 54 45 52 20 4a 4f  rts the OUTER JO
1e4c0 49 4e 20 69 6e 74 6f 20 61 6e 20 49 4e 4e 45 52  IN into an INNER
1e4d0 20 4a 4f 49 4e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   JOIN..  **.  **
1e4e0 20 54 48 49 53 20 4f 56 45 52 52 49 44 45 53 20   THIS OVERRIDES 
1e4f0 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54  OBSOLETE COMMENT
1e500 53 20 31 20 41 4e 44 20 32 20 41 42 4f 56 45 3a  S 1 AND 2 ABOVE:
1e510 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 33 33  .  ** Ticket #33
1e520 30 30 20 73 68 6f 77 73 20 74 68 61 74 20 66 6c  00 shows that fl
1e530 61 74 74 65 6e 69 6e 67 20 74 68 65 20 72 69 67  attening the rig
1e540 68 74 20 74 65 72 6d 20 6f 66 20 61 20 4c 45 46  ht term of a LEF
1e550 54 20 4a 4f 49 4e 0a 20 20 2a 2a 20 69 73 20 66  T JOIN.  ** is f
1e560 72 61 75 67 68 74 20 77 69 74 68 20 64 61 6e 67  raught with dang
1e570 65 72 2e 20 20 42 65 73 74 20 74 6f 20 61 76 6f  er.  Best to avo
1e580 69 64 20 74 68 65 20 77 68 6f 6c 65 20 74 68 69  id the whole thi
1e590 6e 67 2e 20 20 49 66 20 74 68 65 0a 20 20 2a 2a  ng.  If the.  **
1e5a0 20 73 75 62 71 75 65 72 79 20 69 73 20 74 68 65   subquery is the
1e5b0 20 72 69 67 68 74 20 74 65 72 6d 20 6f 66 20 61   right term of a
1e5c0 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e   LEFT JOIN, then
1e5d0 20 64 6f 20 6e 6f 74 20 66 6c 61 74 74 65 6e 2e   do not flatten.
1e5e0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 53 75  .  */.  if( (pSu
1e5f0 62 69 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79  bitem->fg.jointy
1e600 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d  pe & JT_OUTER)!=
1e610 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
1e620 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73  0;.  }..  /* Res
1e630 74 72 69 63 74 69 6f 6e 20 31 37 3a 20 49 66 20  triction 17: If 
1e640 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73  the sub-query is
1e650 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   a compound SELE
1e660 43 54 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74  CT, then it must
1e670 0a 20 20 2a 2a 20 75 73 65 20 6f 6e 6c 79 20 74  .  ** use only t
1e680 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65  he UNION ALL ope
1e690 72 61 74 6f 72 2e 20 41 6e 64 20 6e 6f 6e 65 20  rator. And none 
1e6a0 6f 66 20 74 68 65 20 73 69 6d 70 6c 65 20 73 65  of the simple se
1e6b0 6c 65 63 74 20 71 75 65 72 69 65 73 0a 20 20 2a  lect queries.  *
1e6c0 2a 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74  * that make up t
1e6d0 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  he compound SELE
1e6e0 43 54 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74  CT are allowed t
1e6f0 6f 20 62 65 20 61 67 67 72 65 67 61 74 65 20 6f  o be aggregate o
1e700 72 20 64 69 73 74 69 6e 63 74 0a 20 20 2a 2a 20  r distinct.  ** 
1e710 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20  queries..  */.  
1e720 69 66 28 20 70 53 75 62 2d 3e 70 50 72 69 6f 72  if( pSub->pPrior
1e730 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53 75 62   ){.    if( pSub
1e740 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
1e750 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f      return 0;  /
1e760 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 32 30  * Restriction 20
1e770 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   */.    }.    if
1e780 28 20 69 73 41 67 67 20 7c 7c 20 28 70 2d 3e 73  ( isAgg || (p->s
1e790 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
1e7a0 74 69 6e 63 74 29 21 3d 30 20 7c 7c 20 70 53 72  tinct)!=0 || pSr
1e7b0 63 2d 3e 6e 53 72 63 21 3d 31 20 29 7b 0a 20 20  c->nSrc!=1 ){.  
1e7c0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1e7d0 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 53 75 62    }.    for(pSub
1e7e0 31 3d 70 53 75 62 3b 20 70 53 75 62 31 3b 20 70  1=pSub; pSub1; p
1e7f0 53 75 62 31 3d 70 53 75 62 31 2d 3e 70 50 72 69  Sub1=pSub1->pPri
1e800 6f 72 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  or){.      testc
1e810 61 73 65 28 20 28 70 53 75 62 31 2d 3e 73 65 6c  ase( (pSub1->sel
1e820 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
1e830 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
1e840 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74  e))==SF_Distinct
1e850 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1e860 73 65 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46  se( (pSub1->selF
1e870 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
1e880 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
1e890 29 29 3d 3d 53 46 5f 41 67 67 72 65 67 61 74 65  ))==SF_Aggregate
1e8a0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1e8b0 28 20 70 53 75 62 2d 3e 70 53 72 63 21 3d 30 20  ( pSub->pSrc!=0 
1e8c0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1e8d0 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e   pSub->pEList->n
1e8e0 45 78 70 72 3d 3d 70 53 75 62 31 2d 3e 70 45 4c  Expr==pSub1->pEL
1e8f0 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20  ist->nExpr );.  
1e900 20 20 20 20 69 66 28 20 28 70 53 75 62 31 2d 3e      if( (pSub1->
1e910 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
1e920 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
1e930 67 61 74 65 29 29 21 3d 30 0a 20 20 20 20 20 20  gate))!=0.      
1e940 20 7c 7c 20 28 70 53 75 62 31 2d 3e 70 50 72 69   || (pSub1->pPri
1e950 6f 72 20 26 26 20 70 53 75 62 31 2d 3e 6f 70 21  or && pSub1->op!
1e960 3d 54 4b 5f 41 4c 4c 29 20 0a 20 20 20 20 20 20  =TK_ALL) .      
1e970 20 7c 7c 20 70 53 75 62 31 2d 3e 70 53 72 63 2d   || pSub1->pSrc-
1e980 3e 6e 53 72 63 3c 31 0a 20 20 20 20 20 20 29 7b  >nSrc<1.      ){
1e990 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1e9a0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
1e9b0 20 74 65 73 74 63 61 73 65 28 20 70 53 75 62 31   testcase( pSub1
1e9c0 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29  ->pSrc->nSrc>1 )
1e9d0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1e9e0 52 65 73 74 72 69 63 74 69 6f 6e 20 31 38 2e 20  Restriction 18. 
1e9f0 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4f  */.    if( p->pO
1ea00 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
1ea10 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 66 6f  int ii;.      fo
1ea20 72 28 69 69 3d 30 3b 20 69 69 3c 70 2d 3e 70 4f  r(ii=0; ii<p->pO
1ea30 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
1ea40 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
1ea50 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61  ( p->pOrderBy->a
1ea60 5b 69 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42  [ii].u.x.iOrderB
1ea70 79 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  yCol==0 ) return
1ea80 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
1ea90 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 2a 2a 2a 2a 20  }.  }..  /***** 
1eaa0 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73  If we reach this
1eab0 20 70 6f 69 6e 74 2c 20 66 6c 61 74 74 65 6e 69   point, flatteni
1eac0 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e  ng is permitted.
1ead0 20 2a 2a 2a 2a 2a 2f 0a 20 20 53 45 4c 45 43 54   *****/.  SELECT
1eae0 54 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70  TRACE(1,pParse,p
1eaf0 2c 28 22 66 6c 61 74 74 65 6e 20 25 73 2e 25 70  ,("flatten %s.%p
1eb00 20 66 72 6f 6d 20 74 65 72 6d 20 25 64 5c 6e 22   from term %d\n"
1eb10 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1eb20 20 20 20 20 20 70 53 75 62 2d 3e 7a 53 65 6c 4e       pSub->zSelN
1eb30 61 6d 65 2c 20 70 53 75 62 2c 20 69 46 72 6f 6d  ame, pSub, iFrom
1eb40 29 29 3b 0a 0a 20 20 2f 2a 20 41 75 74 68 6f 72  ));..  /* Author
1eb50 69 7a 65 20 74 68 65 20 73 75 62 71 75 65 72 79  ize the subquery
1eb60 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41   */.  pParse->zA
1eb70 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 53 75  uthContext = pSu
1eb80 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  bitem->zName;.  
1eb90 54 45 53 54 4f 4e 4c 59 28 69 20 3d 29 20 73 71  TESTONLY(i =) sq
1eba0 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
1ebb0 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45  Parse, SQLITE_SE
1ebc0 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  LECT, 0, 0, 0);.
1ebd0 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 53    testcase( i==S
1ebe0 51 4c 49 54 45 5f 44 45 4e 59 20 29 3b 0a 20 20  QLITE_DENY );.  
1ebf0 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e  pParse->zAuthCon
1ec00 74 65 78 74 20 3d 20 7a 53 61 76 65 64 41 75 74  text = zSavedAut
1ec10 68 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 2f 2a 20  hContext;..  /* 
1ec20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  If the sub-query
1ec30 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53   is a compound S
1ec40 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
1ec50 20 74 68 65 6e 20 28 62 79 20 72 65 73 74 72 69   then (by restri
1ec60 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 31 37 20 61  ctions.  ** 17 a
1ec70 6e 64 20 31 38 20 61 62 6f 76 65 29 20 69 74 20  nd 18 above) it 
1ec80 6d 75 73 74 20 62 65 20 61 20 55 4e 49 4f 4e 20  must be a UNION 
1ec90 41 4c 4c 20 61 6e 64 20 74 68 65 20 70 61 72 65  ALL and the pare
1eca0 6e 74 20 71 75 65 72 79 20 6d 75 73 74 20 0a 20  nt query must . 
1ecb0 20 2a 2a 20 62 65 20 6f 66 20 74 68 65 20 66 6f   ** be of the fo
1ecc0 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  rm:.  **.  **   
1ecd0 20 20 53 45 4c 45 43 54 20 3c 65 78 70 72 2d 6c    SELECT <expr-l
1ece0 69 73 74 3e 20 46 52 4f 4d 20 28 3c 73 75 62 2d  ist> FROM (<sub-
1ecf0 71 75 65 72 79 3e 29 20 3c 77 68 65 72 65 2d 63  query>) <where-c
1ed00 6c 61 75 73 65 3e 20 0a 20 20 2a 2a 0a 20 20 2a  lause> .  **.  *
1ed10 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e  * followed by an
1ed20 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d 49  y ORDER BY, LIMI
1ed30 54 20 61 6e 64 2f 6f 72 20 4f 46 46 53 45 54 20  T and/or OFFSET 
1ed40 63 6c 61 75 73 65 73 2e 20 54 68 69 73 20 62 6c  clauses. This bl
1ed50 6f 63 6b 0a 20 20 2a 2a 20 63 72 65 61 74 65 73  ock.  ** creates
1ed60 20 4e 2d 31 20 63 6f 70 69 65 73 20 6f 66 20 74   N-1 copies of t
1ed70 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 20  he parent query 
1ed80 77 69 74 68 6f 75 74 20 61 6e 79 20 4f 52 44 45  without any ORDE
1ed90 52 20 42 59 2c 20 4c 49 4d 49 54 20 6f 72 20 0a  R BY, LIMIT or .
1eda0 20 20 2a 2a 20 4f 46 46 53 45 54 20 63 6c 61 75    ** OFFSET clau
1edb0 73 65 73 20 61 6e 64 20 6a 6f 69 6e 73 20 74 68  ses and joins th
1edc0 65 6d 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 68  em to the left-h
1edd0 61 6e 64 2d 73 69 64 65 20 6f 66 20 74 68 65 20  and-side of the 
1ede0 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 75 73  original.  ** us
1edf0 69 6e 67 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70  ing UNION ALL op
1ee00 65 72 61 74 6f 72 73 2e 20 49 6e 20 74 68 69 73  erators. In this
1ee10 20 63 61 73 65 20 4e 20 69 73 20 74 68 65 20 6e   case N is the n
1ee20 75 6d 62 65 72 20 6f 66 20 73 69 6d 70 6c 65 0a  umber of simple.
1ee30 20 20 2a 2a 20 73 65 6c 65 63 74 20 73 74 61 74    ** select stat
1ee40 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 63 6f  ements in the co
1ee50 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65 72 79  mpound sub-query
1ee60 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d  ..  **.  ** Exam
1ee70 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ple:.  **.  **  
1ee80 20 20 20 53 45 4c 45 43 54 20 61 2b 31 20 46 52     SELECT a+1 FR
1ee90 4f 4d 20 28 0a 20 20 2a 2a 20 20 20 20 20 20 20  OM (.  **       
1eea0 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74   SELECT x FROM t
1eeb0 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 55  ab.  **        U
1eec0 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20  NION ALL.  **   
1eed0 20 20 20 20 20 53 45 4c 45 43 54 20 79 20 46 52       SELECT y FR
1eee0 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20 20 20  OM tab.  **     
1eef0 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a     UNION ALL.  *
1ef00 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  *        SELECT 
1ef10 61 62 73 28 7a 2a 32 29 20 46 52 4f 4d 20 74 61  abs(z*2) FROM ta
1ef20 62 32 0a 20 20 2a 2a 20 20 20 20 20 29 20 57 48  b2.  **     ) WH
1ef30 45 52 45 20 61 21 3d 35 20 4f 52 44 45 52 20 42  ERE a!=5 ORDER B
1ef40 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 72  Y 1.  **.  ** Tr
1ef50 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a  ansformed into:.
1ef60 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45    **.  **     SE
1ef70 4c 45 43 54 20 78 2b 31 20 46 52 4f 4d 20 74 61  LECT x+1 FROM ta
1ef80 62 20 57 48 45 52 45 20 78 2b 31 21 3d 35 0a 20  b WHERE x+1!=5. 
1ef90 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c   **     UNION AL
1efa0 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  L.  **     SELEC
1efb0 54 20 79 2b 31 20 46 52 4f 4d 20 74 61 62 20 57  T y+1 FROM tab W
1efc0 48 45 52 45 20 79 2b 31 21 3d 35 0a 20 20 2a 2a  HERE y+1!=5.  **
1efd0 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20       UNION ALL. 
1efe0 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61   **     SELECT a
1eff0 62 73 28 7a 2a 32 29 2b 31 20 46 52 4f 4d 20 74  bs(z*2)+1 FROM t
1f000 61 62 32 20 57 48 45 52 45 20 61 62 73 28 7a 2a  ab2 WHERE abs(z*
1f010 32 29 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20  2)+1!=5.  **    
1f020 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20 2a 2a   ORDER BY 1.  **
1f030 0a 20 20 2a 2a 20 57 65 20 63 61 6c 6c 20 74 68  .  ** We call th
1f040 69 73 20 74 68 65 20 22 63 6f 6d 70 6f 75 6e 64  is the "compound
1f050 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74 74 65  -subquery flatte
1f060 6e 69 6e 67 22 2e 0a 20 20 2a 2f 0a 20 20 66 6f  ning"..  */.  fo
1f070 72 28 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72  r(pSub=pSub->pPr
1f080 69 6f 72 3b 20 70 53 75 62 3b 20 70 53 75 62 3d  ior; pSub; pSub=
1f090 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20  pSub->pPrior){. 
1f0a0 20 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b     Select *pNew;
1f0b0 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
1f0c0 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
1f0d0 64 65 72 42 79 3b 0a 20 20 20 20 45 78 70 72 20  derBy;.    Expr 
1f0e0 2a 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69  *pLimit = p->pLi
1f0f0 6d 69 74 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  mit;.    Expr *p
1f100 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66  Offset = p->pOff
1f110 73 65 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20  set;.    Select 
1f120 2a 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72  *pPrior = p->pPr
1f130 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64  ior;.    p->pOrd
1f140 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d  erBy = 0;.    p-
1f150 3e 70 53 72 63 20 3d 20 30 3b 0a 20 20 20 20 70  >pSrc = 0;.    p
1f160 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
1f170 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b    p->pLimit = 0;
1f180 0a 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20  .    p->pOffset 
1f190 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  = 0;.    pNew = 
1f1a0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
1f1b0 28 64 62 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20  (db, p, 0);.    
1f1c0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 53 65 74  sqlite3SelectSet
1f1d0 4e 61 6d 65 28 70 4e 65 77 2c 20 70 53 75 62 2d  Name(pNew, pSub-
1f1e0 3e 7a 53 65 6c 4e 61 6d 65 29 3b 0a 20 20 20 20  >zSelName);.    
1f1f0 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66  p->pOffset = pOf
1f200 66 73 65 74 3b 0a 20 20 20 20 70 2d 3e 70 4c 69  fset;.    p->pLi
1f210 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
1f220 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
1f230 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 70 2d  pOrderBy;.    p-
1f240 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20  >pSrc = pSrc;.  
1f250 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 41 4c 4c    p->op = TK_ALL
1f260 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d  ;.    if( pNew==
1f270 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 50  0 ){.      p->pP
1f280 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
1f290 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1f2a0 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 70  pNew->pPrior = p
1f2b0 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 69 66 28  Prior;.      if(
1f2c0 20 70 50 72 69 6f 72 20 29 20 70 50 72 69 6f 72   pPrior ) pPrior
1f2d0 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a  ->pNext = pNew;.
1f2e0 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4e 65 78        pNew->pNex
1f2f0 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 2d 3e  t = p;.      p->
1f300 70 50 72 69 6f 72 20 3d 20 70 4e 65 77 3b 0a 20  pPrior = pNew;. 
1f310 20 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45       SELECTTRACE
1f320 28 32 2c 70 50 61 72 73 65 2c 70 2c 0a 20 20 20  (2,pParse,p,.   
1f330 20 20 20 20 20 20 28 22 63 6f 6d 70 6f 75 6e 64        ("compound
1f340 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74 74 65  -subquery flatte
1f350 6e 65 72 20 63 72 65 61 74 65 73 20 25 73 2e 25  ner creates %s.%
1f360 70 20 61 73 20 70 65 65 72 5c 6e 22 2c 0a 20 20  p as peer\n",.  
1f370 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 7a 53 65         pNew->zSe
1f380 6c 4e 61 6d 65 2c 20 70 4e 65 77 29 29 3b 0a 20  lName, pNew));. 
1f390 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d     }.    if( db-
1f3a0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
1f3b0 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20  return 1;.  }.. 
1f3c0 20 2f 2a 20 42 65 67 69 6e 20 66 6c 61 74 74 65   /* Begin flatte
1f3d0 6e 69 6e 67 20 74 68 65 20 69 46 72 6f 6d 2d 74  ning the iFrom-t
1f3e0 68 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46  h entry of the F
1f3f0 52 4f 4d 20 63 6c 61 75 73 65 20 0a 20 20 2a 2a  ROM clause .  **
1f400 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   in the outer qu
1f410 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 53 75 62  ery..  */.  pSub
1f420 20 3d 20 70 53 75 62 31 20 3d 20 70 53 75 62 69   = pSub1 = pSubi
1f430 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 0a 20  tem->pSelect;.. 
1f440 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 74   /* Delete the t
1f450 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 73  ransient table s
1f460 74 72 75 63 74 75 72 65 20 61 73 73 6f 63 69 61  tructure associa
1f470 74 65 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a  ted with the.  *
1f480 2a 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2f 0a  * subquery.  */.
1f490 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1f4a0 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44  db, pSubitem->zD
1f4b0 61 74 61 62 61 73 65 29 3b 0a 20 20 73 71 6c 69  atabase);.  sqli
1f4c0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53  te3DbFree(db, pS
1f4d0 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a  ubitem->zName);.
1f4e0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1f4f0 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41  db, pSubitem->zA
1f500 6c 69 61 73 29 3b 0a 20 20 70 53 75 62 69 74 65  lias);.  pSubite
1f510 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 30  m->zDatabase = 0
1f520 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e  ;.  pSubitem->zN
1f530 61 6d 65 20 3d 20 30 3b 0a 20 20 70 53 75 62 69  ame = 0;.  pSubi
1f540 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 30 3b  tem->zAlias = 0;
1f550 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65  .  pSubitem->pSe
1f560 6c 65 63 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  lect = 0;..  /* 
1f570 44 65 66 65 72 20 64 65 6c 65 74 69 6e 67 20 74  Defer deleting t
1f580 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20  he Table object 
1f590 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1f5a0 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72  the.  ** subquer
1f5b0 79 20 75 6e 74 69 6c 20 63 6f 64 65 20 67 65 6e  y until code gen
1f5c0 65 72 61 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20  eration is.  ** 
1f5d0 63 6f 6d 70 6c 65 74 65 2c 20 73 69 6e 63 65 20  complete, since 
1f5e0 74 68 65 72 65 20 6d 61 79 20 73 74 69 6c 6c 20  there may still 
1f5f0 65 78 69 73 74 20 45 78 70 72 2e 70 54 61 62 20  exist Expr.pTab 
1f600 65 6e 74 72 69 65 73 20 74 68 61 74 0a 20 20 2a  entries that.  *
1f610 2a 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 73  * refer to the s
1f620 75 62 71 75 65 72 79 20 65 76 65 6e 20 61 66 74  ubquery even aft
1f630 65 72 20 66 6c 61 74 74 65 6e 69 6e 67 2e 20 20  er flattening.  
1f640 54 69 63 6b 65 74 20 23 33 33 34 36 2e 0a 20 20  Ticket #3346..  
1f650 2a 2a 0a 20 20 2a 2a 20 70 53 75 62 69 74 65 6d  **.  ** pSubitem
1f660 2d 3e 70 54 61 62 20 69 73 20 61 6c 77 61 79 73  ->pTab is always
1f670 20 6e 6f 6e 2d 4e 55 4c 4c 20 62 79 20 74 65 73   non-NULL by tes
1f680 74 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 61  t restrictions a
1f690 6e 64 20 74 65 73 74 73 20 61 62 6f 76 65 2e 0a  nd tests above..
1f6a0 20 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41 59    */.  if( ALWAY
1f6b0 53 28 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62  S(pSubitem->pTab
1f6c0 21 3d 30 29 20 29 7b 0a 20 20 20 20 54 61 62 6c  !=0) ){.    Tabl
1f6d0 65 20 2a 70 54 61 62 54 6f 44 65 6c 20 3d 20 70  e *pTabToDel = p
1f6e0 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  Subitem->pTab;. 
1f6f0 20 20 20 69 66 28 20 70 54 61 62 54 6f 44 65 6c     if( pTabToDel
1f700 2d 3e 6e 52 65 66 3d 3d 31 20 29 7b 0a 20 20 20  ->nRef==1 ){.   
1f710 20 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65     Parse *pTople
1f720 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72  vel = sqlite3Par
1f730 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73  seToplevel(pPars
1f740 65 29 3b 0a 20 20 20 20 20 20 70 54 61 62 54 6f  e);.      pTabTo
1f750 44 65 6c 2d 3e 70 4e 65 78 74 5a 6f 6d 62 69 65  Del->pNextZombie
1f760 20 3d 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a   = pToplevel->pZ
1f770 6f 6d 62 69 65 54 61 62 3b 0a 20 20 20 20 20 20  ombieTab;.      
1f780 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62  pToplevel->pZomb
1f790 69 65 54 61 62 20 3d 20 70 54 61 62 54 6f 44 65  ieTab = pTabToDe
1f7a0 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  l;.    }else{.  
1f7b0 20 20 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e      pTabToDel->n
1f7c0 52 65 66 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20  Ref--;.    }.   
1f7d0 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 20   pSubitem->pTab 
1f7e0 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  = 0;.  }..  /* T
1f7f0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f  he following loo
1f800 70 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20  p runs once for 
1f810 65 61 63 68 20 74 65 72 6d 20 69 6e 20 61 20 63  each term in a c
1f820 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79  ompound-subquery
1f830 0a 20 20 2a 2a 20 66 6c 61 74 74 65 6e 69 6e 67  .  ** flattening
1f840 20 28 61 73 20 64 65 73 63 72 69 62 65 64 20 61   (as described a
1f850 62 6f 76 65 29 2e 20 20 49 66 20 77 65 20 61 72  bove).  If we ar
1f860 65 20 64 6f 69 6e 67 20 61 20 64 69 66 66 65 72  e doing a differ
1f870 65 6e 74 20 6b 69 6e 64 0a 20 20 2a 2a 20 6f 66  ent kind.  ** of
1f880 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d 20 61 20   flattening - a 
1f890 66 6c 61 74 74 65 6e 69 6e 67 20 6f 74 68 65 72  flattening other
1f8a0 20 74 68 61 6e 20 61 20 63 6f 6d 70 6f 75 6e 64   than a compound
1f8b0 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74 74 65  -subquery flatte
1f8c0 6e 69 6e 67 20 2d 0a 20 20 2a 2a 20 74 68 65 6e  ning -.  ** then
1f8d0 20 74 68 69 73 20 6c 6f 6f 70 20 6f 6e 6c 79 20   this loop only 
1f8e0 72 75 6e 73 20 6f 6e 63 65 2e 0a 20 20 2a 2a 0a  runs once..  **.
1f8f0 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 6d    ** This loop m
1f900 6f 76 65 73 20 61 6c 6c 20 6f 66 20 74 68 65 20  oves all of the 
1f910 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 73 20 6f 66  FROM elements of
1f920 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 6e   the subquery in
1f930 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20  to the.  ** the 
1f940 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
1f950 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20  he outer query. 
1f960 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 74 68   Before doing th
1f970 69 73 2c 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a  is, remember.  *
1f980 2a 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d  * the cursor num
1f990 62 65 72 20 66 6f 72 20 74 68 65 20 6f 72 69 67  ber for the orig
1f9a0 69 6e 61 6c 20 6f 75 74 65 72 20 71 75 65 72 79  inal outer query
1f9b0 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 20 69 6e   FROM element in
1f9c0 0a 20 20 2a 2a 20 69 50 61 72 65 6e 74 2e 20 20  .  ** iParent.  
1f9d0 54 68 65 20 69 50 61 72 65 6e 74 20 63 75 72 73  The iParent curs
1f9e0 6f 72 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  or will never be
1f9f0 20 75 73 65 64 2e 20 20 53 75 62 73 65 71 75 65   used.  Subseque
1fa00 6e 74 20 63 6f 64 65 0a 20 20 2a 2a 20 77 69 6c  nt code.  ** wil
1fa10 6c 20 73 63 61 6e 20 65 78 70 72 65 73 73 69 6f  l scan expressio
1fa20 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 69  ns looking for i
1fa30 50 61 72 65 6e 74 20 72 65 66 65 72 65 6e 63 65  Parent reference
1fa40 73 20 61 6e 64 20 72 65 70 6c 61 63 65 0a 20 20  s and replace.  
1fa50 2a 2a 20 74 68 6f 73 65 20 72 65 66 65 72 65 6e  ** those referen
1fa60 63 65 73 20 77 69 74 68 20 65 78 70 72 65 73 73  ces with express
1fa70 69 6f 6e 73 20 74 68 61 74 20 72 65 73 6f 6c 76  ions that resolv
1fa80 65 20 74 6f 20 74 68 65 20 73 75 62 71 75 65 72  e to the subquer
1fa90 79 20 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d  y FROM.  ** elem
1faa0 65 6e 74 73 20 77 65 20 61 72 65 20 6e 6f 77 20  ents we are now 
1fab0 63 6f 70 79 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f  copying in..  */
1fac0 0a 20 20 66 6f 72 28 70 50 61 72 65 6e 74 3d 70  .  for(pParent=p
1fad0 3b 20 70 50 61 72 65 6e 74 3b 20 70 50 61 72 65  ; pParent; pPare
1fae0 6e 74 3d 70 50 61 72 65 6e 74 2d 3e 70 50 72 69  nt=pParent->pPri
1faf0 6f 72 2c 20 70 53 75 62 3d 70 53 75 62 2d 3e 70  or, pSub=pSub->p
1fb00 50 72 69 6f 72 29 7b 0a 20 20 20 20 69 6e 74 20  Prior){.    int 
1fb10 6e 53 75 62 53 72 63 3b 0a 20 20 20 20 75 38 20  nSubSrc;.    u8 
1fb20 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20  jointype = 0;.  
1fb30 20 20 70 53 75 62 53 72 63 20 3d 20 70 53 75 62    pSubSrc = pSub
1fb40 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a 20 46  ->pSrc;     /* F
1fb50 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 73 75  ROM clause of su
1fb60 62 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 6e 53  bquery */.    nS
1fb70 75 62 53 72 63 20 3d 20 70 53 75 62 53 72 63 2d  ubSrc = pSubSrc-
1fb80 3e 6e 53 72 63 3b 20 20 2f 2a 20 4e 75 6d 62 65  >nSrc;  /* Numbe
1fb90 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 73 75  r of terms in su
1fba0 62 71 75 65 72 79 20 46 52 4f 4d 20 63 6c 61 75  bquery FROM clau
1fbb0 73 65 20 2a 2f 0a 20 20 20 20 70 53 72 63 20 3d  se */.    pSrc =
1fbc0 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 3b 20   pParent->pSrc; 
1fbd0 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75      /* FROM clau
1fbe0 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  se of the outer 
1fbf0 71 75 65 72 79 20 2a 2f 0a 0a 20 20 20 20 69 66  query */..    if
1fc00 28 20 70 53 72 63 20 29 7b 0a 20 20 20 20 20 20  ( pSrc ){.      
1fc10 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 3d  assert( pParent=
1fc20 3d 70 20 29 3b 20 20 2f 2a 20 46 69 72 73 74 20  =p );  /* First 
1fc30 74 69 6d 65 20 74 68 72 6f 75 67 68 20 74 68 65  time through the
1fc40 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 6a   loop */.      j
1fc50 6f 69 6e 74 79 70 65 20 3d 20 70 53 75 62 69 74  ointype = pSubit
1fc60 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 3b  em->fg.jointype;
1fc70 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1fc80 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
1fc90 74 21 3d 70 20 29 3b 20 20 2f 2a 20 32 6e 64 20  t!=p );  /* 2nd 
1fca0 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20 74  and subsequent t
1fcb0 69 6d 65 73 20 74 68 72 6f 75 67 68 20 74 68 65  imes through the
1fcc0 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 70   loop */.      p
1fcd0 53 72 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70  Src = pParent->p
1fce0 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63  Src = sqlite3Src
1fcf0 4c 69 73 74 41 70 70 65 6e 64 28 64 62 2c 20 30  ListAppend(db, 0
1fd00 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  , 0, 0);.      i
1fd10 66 28 20 70 53 72 63 3d 3d 30 20 29 7b 0a 20 20  f( pSrc==0 ){.  
1fd20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62        assert( db
1fd30 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1fd40 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
1fd50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1fd60 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75      /* The subqu
1fd70 65 72 79 20 75 73 65 73 20 61 20 73 69 6e 67 6c  ery uses a singl
1fd80 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 20 46 52  e slot of the FR
1fd90 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
1fda0 20 6f 75 74 65 72 0a 20 20 20 20 2a 2a 20 71 75   outer.    ** qu
1fdb0 65 72 79 2e 20 20 49 66 20 74 68 65 20 73 75 62  ery.  If the sub
1fdc0 71 75 65 72 79 20 68 61 73 20 6d 6f 72 65 20 74  query has more t
1fdd0 68 61 6e 20 6f 6e 65 20 65 6c 65 6d 65 6e 74 20  han one element 
1fde0 69 6e 20 69 74 73 20 46 52 4f 4d 20 63 6c 61 75  in its FROM clau
1fdf0 73 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  se,.    ** then 
1fe00 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74 65 72  expand the outer
1fe10 20 71 75 65 72 79 20 74 6f 20 6d 61 6b 65 20 73   query to make s
1fe20 70 61 63 65 20 66 6f 72 20 69 74 20 74 6f 20 68  pace for it to h
1fe30 6f 6c 64 20 61 6c 6c 20 65 6c 65 6d 65 6e 74 73  old all elements
1fe40 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73  .    ** of the s
1fe50 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a 0a  ubquery..    **.
1fe60 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a      ** Example:.
1fe70 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
1fe80 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
1fe90 61 62 41 2c 20 28 53 45 4c 45 43 54 20 2a 20 46  abA, (SELECT * F
1fea0 52 4f 4d 20 73 75 62 31 2c 20 73 75 62 32 29 2c  ROM sub1, sub2),
1feb0 20 74 61 62 42 3b 0a 20 20 20 20 2a 2a 0a 20 20   tabB;.    **.  
1fec0 20 20 2a 2a 20 54 68 65 20 6f 75 74 65 72 20 71    ** The outer q
1fed0 75 65 72 79 20 68 61 73 20 33 20 73 6c 6f 74 73  uery has 3 slots
1fee0 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 63 6c 61   in its FROM cla
1fef0 75 73 65 2e 20 20 4f 6e 65 20 73 6c 6f 74 20 6f  use.  One slot o
1ff00 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74  f the.    ** out
1ff10 65 72 20 71 75 65 72 79 20 28 74 68 65 20 6d 69  er query (the mi
1ff20 64 64 6c 65 20 73 6c 6f 74 29 20 69 73 20 75 73  ddle slot) is us
1ff30 65 64 20 62 79 20 74 68 65 20 73 75 62 71 75 65  ed by the subque
1ff40 72 79 2e 20 20 54 68 65 20 6e 65 78 74 0a 20 20  ry.  The next.  
1ff50 20 20 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20 63 6f    ** block of co
1ff60 64 65 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 74  de will expand t
1ff70 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 46  he outer query F
1ff80 52 4f 4d 20 63 6c 61 75 73 65 20 74 6f 20 34 20  ROM clause to 4 
1ff90 73 6c 6f 74 73 2e 0a 20 20 20 20 2a 2a 20 54 68  slots..    ** Th
1ffa0 65 20 6d 69 64 64 6c 65 20 73 6c 6f 74 20 69 73  e middle slot is
1ffb0 20 65 78 70 61 6e 64 65 64 20 74 6f 20 74 77 6f   expanded to two
1ffc0 20 73 6c 6f 74 73 20 69 6e 20 6f 72 64 65 72 20   slots in order 
1ffd0 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 0a 20 20  to make space.  
1ffe0 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 74 77 6f    ** for the two
1fff0 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65   elements in the
20000 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
20010 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20  the subquery..  
20020 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 53 75    */.    if( nSu
20030 62 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20  bSrc>1 ){.      
20040 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20  pParent->pSrc = 
20050 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72  pSrc = sqlite3Sr
20060 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64 62 2c  cListEnlarge(db,
20070 20 70 53 72 63 2c 20 6e 53 75 62 53 72 63 2d 31   pSrc, nSubSrc-1
20080 2c 69 46 72 6f 6d 2b 31 29 3b 0a 20 20 20 20 20  ,iFrom+1);.     
20090 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
200a0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20  ailed ){.       
200b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
200c0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 72      }..    /* Tr
200d0 61 6e 73 66 65 72 20 74 68 65 20 46 52 4f 4d 20  ansfer the FROM 
200e0 63 6c 61 75 73 65 20 74 65 72 6d 73 20 66 72 6f  clause terms fro
200f0 6d 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  m the subquery i
20100 6e 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f  nto the.    ** o
20110 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 20 20  uter query..    
20120 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
20130 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b  i<nSubSrc; i++){
20140 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 49 64  .      sqlite3Id
20150 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
20160 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 2e  Src->a[i+iFrom].
20170 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 20 20 61  pUsing);.      a
20180 73 73 65 72 74 28 20 70 53 72 63 2d 3e 61 5b 69  ssert( pSrc->a[i
20190 2b 69 46 72 6f 6d 5d 2e 66 67 2e 69 73 54 61 62  +iFrom].fg.isTab
201a0 46 75 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Func==0 );.     
201b0 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d   pSrc->a[i+iFrom
201c0 5d 20 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b 69  ] = pSubSrc->a[i
201d0 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ];.      memset(
201e0 26 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2c 20  &pSubSrc->a[i], 
201f0 30 2c 20 73 69 7a 65 6f 66 28 70 53 75 62 53 72  0, sizeof(pSubSr
20200 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20 20 20 20 7d  c->a[i]));.    }
20210 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 46 72  .    pSrc->a[iFr
20220 6f 6d 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 20  om].fg.jointype 
20230 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 0a 20  = jointype;.  . 
20240 20 20 20 2f 2a 20 4e 6f 77 20 62 65 67 69 6e 20     /* Now begin 
20250 73 75 62 73 74 69 74 75 74 69 6e 67 20 73 75 62  substituting sub
20260 71 75 65 72 79 20 72 65 73 75 6c 74 20 73 65 74  query result set
20270 20 65 78 70 72 65 73 73 69 6f 6e 73 20 66 6f 72   expressions for
20280 20 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e   .    ** referen
20290 63 65 73 20 74 6f 20 74 68 65 20 69 50 61 72 65  ces to the iPare
202a0 6e 74 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20  nt in the outer 
202b0 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a 20 0a 20  query..    ** . 
202c0 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20     ** Example:. 
202d0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53     **.    **   S
202e0 45 4c 45 43 54 20 61 2b 35 2c 20 62 2a 31 30 20  ELECT a+5, b*10 
202f0 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2a 33  FROM (SELECT x*3
20300 20 41 53 20 61 2c 20 79 2b 31 30 20 41 53 20 62   AS a, y+10 AS b
20310 20 46 52 4f 4d 20 74 31 29 20 57 48 45 52 45 20   FROM t1) WHERE 
20320 61 3e 62 3b 0a 20 20 20 20 2a 2a 20 20 20 5c 20  a>b;.    **   \ 
20330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20340 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f      \___________
20350 5f 5f 20 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f  __ subquery ____
20360 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20  ______/         
20370 20 2f 0a 20 20 20 20 2a 2a 20 20 20 20 5c 5f 5f   /.    **    \__
20380 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
20390 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65 72 79 20  ___ outer query 
203a0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
203b0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a  ______________/.
203c0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 65      **.    ** We
203d0 20 6c 6f 6f 6b 20 61 74 20 65 76 65 72 79 20 65   look at every e
203e0 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65  xpression in the
203f0 20 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64   outer query and
20400 20 65 76 65 72 79 20 70 6c 61 63 65 20 77 65 20   every place we 
20410 73 65 65 0a 20 20 20 20 2a 2a 20 22 61 22 20 77  see.    ** "a" w
20420 65 20 73 75 62 73 74 69 74 75 74 65 20 22 78 2a  e substitute "x*
20430 33 22 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61  3" and every pla
20440 63 65 20 77 65 20 73 65 65 20 22 62 22 20 77 65  ce we see "b" we
20450 20 73 75 62 73 74 69 74 75 74 65 20 22 79 2b 31   substitute "y+1
20460 30 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  0"..    */.    p
20470 4c 69 73 74 20 3d 20 70 50 61 72 65 6e 74 2d 3e  List = pParent->
20480 70 45 4c 69 73 74 3b 0a 20 20 20 20 66 6f 72 28  pEList;.    for(
20490 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
204a0 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
204b0 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d   if( pList->a[i]
204c0 2e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  .zName==0 ){.   
204d0 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
204e0 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
204f0 75 70 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b  up(db, pList->a[
20500 69 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20  i].zSpan);.     
20510 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74     sqlite3Dequot
20520 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  e(zName);.      
20530 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e    pList->a[i].zN
20540 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20  ame = zName;.   
20550 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
20560 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42  f( pSub->pOrderB
20570 79 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 74  y ){.      /* At
20580 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 61 6e 79   this point, any
20590 20 6e 6f 6e 2d 7a 65 72 6f 20 69 4f 72 64 65 72   non-zero iOrder
205a0 42 79 43 6f 6c 20 76 61 6c 75 65 73 20 69 6e 64  ByCol values ind
205b0 69 63 61 74 65 20 74 68 61 74 20 74 68 65 0a 20  icate that the. 
205c0 20 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59       ** ORDER BY
205d0 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69   column expressi
205e0 6f 6e 20 69 73 20 69 64 65 6e 74 69 63 61 6c 20  on is identical 
205f0 74 6f 20 74 68 65 20 69 4f 72 64 65 72 42 79 43  to the iOrderByC
20600 6f 6c 27 74 68 0a 20 20 20 20 20 20 2a 2a 20 65  ol'th.      ** e
20610 78 70 72 65 73 73 69 6f 6e 20 72 65 74 75 72 6e  xpression return
20620 65 64 20 62 79 20 53 45 4c 45 43 54 20 73 74 61  ed by SELECT sta
20630 74 65 6d 65 6e 74 20 70 53 75 62 2e 20 53 69 6e  tement pSub. Sin
20640 63 65 20 74 68 65 73 65 20 76 61 6c 75 65 73 0a  ce these values.
20650 20 20 20 20 20 20 2a 2a 20 64 6f 20 6e 6f 74 20        ** do not 
20660 6e 65 63 65 73 73 61 72 69 6c 79 20 63 6f 72 72  necessarily corr
20670 65 73 70 6f 6e 64 20 74 6f 20 63 6f 6c 75 6d 6e  espond to column
20680 73 20 69 6e 20 53 45 4c 45 43 54 20 73 74 61 74  s in SELECT stat
20690 65 6d 65 6e 74 20 70 50 61 72 65 6e 74 2c 0a 20  ement pParent,. 
206a0 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 74 68 65       ** zero the
206b0 6d 20 62 65 66 6f 72 65 20 74 72 61 6e 73 66 65  m before transfe
206c0 72 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42  ring the ORDER B
206d0 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 20 20  Y clause..      
206e0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74 20  **.      ** Not 
206f0 64 6f 69 6e 67 20 74 68 69 73 20 6d 61 79 20 63  doing this may c
20700 61 75 73 65 20 61 6e 20 65 72 72 6f 72 20 69 66  ause an error if
20710 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 63 61   a subsequent ca
20720 6c 6c 20 74 6f 20 74 68 69 73 0a 20 20 20 20 20  ll to this.     
20730 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 74 74   ** function att
20740 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e  empts to flatten
20750 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d   a compound sub-
20760 71 75 65 72 79 20 69 6e 74 6f 20 70 50 61 72 65  query into pPare
20770 6e 74 0a 20 20 20 20 20 20 2a 2a 20 28 74 68 65  nt.      ** (the
20780 20 6f 6e 6c 79 20 77 61 79 20 74 68 69 73 20 63   only way this c
20790 61 6e 20 68 61 70 70 65 6e 20 69 73 20 69 66 20  an happen is if 
207a0 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62  the compound sub
207b0 2d 71 75 65 72 79 20 69 73 0a 20 20 20 20 20 20  -query is.      
207c0 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 70 61 72  ** currently par
207d0 74 20 6f 66 20 70 53 75 62 2d 3e 70 53 72 63 29  t of pSub->pSrc)
207e0 2e 20 53 65 65 20 74 69 63 6b 65 74 20 5b 64 31  . See ticket [d1
207f0 31 61 36 65 39 30 38 66 5d 2e 20 20 2a 2f 0a 20  1a6e908f].  */. 
20800 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
20810 4f 72 64 65 72 42 79 20 3d 20 70 53 75 62 2d 3e  OrderBy = pSub->
20820 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20  pOrderBy;.      
20830 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65  for(i=0; i<pOrde
20840 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  rBy->nExpr; i++)
20850 7b 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65 72  {.        pOrder
20860 42 79 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72  By->a[i].u.x.iOr
20870 64 65 72 42 79 43 6f 6c 20 3d 20 30 3b 0a 20 20  derByCol = 0;.  
20880 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
20890 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72  rt( pParent->pOr
208a0 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20  derBy==0 );.    
208b0 20 20 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e    assert( pSub->
208c0 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 20 20 20  pPrior==0 );.   
208d0 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64     pParent->pOrd
208e0 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
208f0 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70 4f 72  .      pSub->pOr
20900 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 7d  derBy = 0;.    }
20910 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 73 71  .    pWhere = sq
20920 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
20930 20 70 53 75 62 2d 3e 70 57 68 65 72 65 2c 20 30   pSub->pWhere, 0
20940 29 3b 0a 20 20 20 20 69 66 28 20 73 75 62 71 75  );.    if( subqu
20950 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20  eryIsAgg ){.    
20960 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
20970 74 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29 3b  t->pHaving==0 );
20980 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
20990 70 48 61 76 69 6e 67 20 3d 20 70 50 61 72 65 6e  pHaving = pParen
209a0 74 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 20  t->pWhere;.     
209b0 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65   pParent->pWhere
209c0 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 20 20 20   = pWhere;.     
209d0 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e   pParent->pHavin
209e0 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  g = sqlite3ExprA
209f0 6e 64 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e  nd(db, pParent->
20a00 70 48 61 76 69 6e 67 2c 20 0a 20 20 20 20 20 20  pHaving, .      
20a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
20a30 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
20a40 53 75 62 2d 3e 70 48 61 76 69 6e 67 2c 20 30 29  Sub->pHaving, 0)
20a50 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
20a60 20 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70   pParent->pGroup
20a70 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  By==0 );.      p
20a80 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70 42 79  Parent->pGroupBy
20a90 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
20aa0 73 74 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e  stDup(db, pSub->
20ab0 70 47 72 6f 75 70 42 79 2c 20 30 29 3b 0a 20 20  pGroupBy, 0);.  
20ac0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
20ad0 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d  Parent->pWhere =
20ae0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
20af0 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57 68  db, pParent->pWh
20b00 65 72 65 2c 20 70 57 68 65 72 65 29 3b 0a 20 20  ere, pWhere);.  
20b10 20 20 7d 0a 20 20 20 20 73 75 62 73 74 53 65 6c    }.    substSel
20b20 65 63 74 28 64 62 2c 20 70 50 61 72 65 6e 74 2c  ect(db, pParent,
20b30 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e   iParent, pSub->
20b40 70 45 4c 69 73 74 2c 20 30 29 3b 0a 20 20 0a 20  pEList, 0);.  . 
20b50 20 20 20 2f 2a 20 54 68 65 20 66 6c 61 74 74 65     /* The flatte
20b60 6e 65 64 20 71 75 65 72 79 20 69 73 20 64 69 73  ned query is dis
20b70 74 69 6e 63 74 20 69 66 20 65 69 74 68 65 72 20  tinct if either 
20b80 74 68 65 20 69 6e 6e 65 72 20 6f 72 20 74 68 65  the inner or the
20b90 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75  .    ** outer qu
20ba0 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74 2e  ery is distinct.
20bb0 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61   .    */.    pPa
20bc0 72 65 6e 74 2d 3e 73 65 6c 46 6c 61 67 73 20 7c  rent->selFlags |
20bd0 3d 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73  = pSub->selFlags
20be0 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a   & SF_Distinct;.
20bf0 20 20 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a    .    /*.    **
20c00 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d   SELECT ... FROM
20c10 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 4c 49 4d   (SELECT ... LIM
20c20 49 54 20 61 20 4f 46 46 53 45 54 20 62 29 20 4c  IT a OFFSET b) L
20c30 49 4d 49 54 20 78 20 4f 46 46 53 45 54 20 79 3b  IMIT x OFFSET y;
20c40 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f  .    **.    ** O
20c50 6e 65 20 69 73 20 74 65 6d 70 74 65 64 20 74 6f  ne is tempted to
20c60 20 74 72 79 20 74 6f 20 61 64 64 20 61 20 61 6e   try to add a an
20c70 64 20 62 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74  d b to combine t
20c80 68 65 20 6c 69 6d 69 74 73 2e 20 20 42 75 74 20  he limits.  But 
20c90 74 68 69 73 0a 20 20 20 20 2a 2a 20 64 6f 65 73  this.    ** does
20ca0 20 6e 6f 74 20 77 6f 72 6b 20 69 66 20 65 69 74   not work if eit
20cb0 68 65 72 20 6c 69 6d 69 74 20 69 73 20 6e 65 67  her limit is neg
20cc0 61 74 69 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  ative..    */.  
20cd0 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d    if( pSub->pLim
20ce0 69 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  it ){.      pPar
20cf0 65 6e 74 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 53  ent->pLimit = pS
20d00 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20  ub->pLimit;.    
20d10 20 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 3d    pSub->pLimit =
20d20 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   0;.    }.  }.. 
20d30 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c 20 64 65   /* Finially, de
20d40 6c 65 74 65 20 77 68 61 74 20 69 73 20 6c 65 66  lete what is lef
20d50 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  t of the subquer
20d60 79 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a  y and return.  *
20d70 2a 20 73 75 63 63 65 73 73 2e 0a 20 20 2a 2f 0a  * success..  */.
20d80 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
20d90 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62 31 29  elete(db, pSub1)
20da0 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  ;..#if SELECTTRA
20db0 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28  CE_ENABLED.  if(
20dc0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72   sqlite3SelectTr
20dd0 61 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20  ace & 0x100 ){. 
20de0 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30     SELECTTRACE(0
20df0 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22  x100,pParse,p,("
20e00 41 66 74 65 72 20 66 6c 61 74 74 65 6e 69 6e 67  After flattening
20e10 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c 69  :\n"));.    sqli
20e20 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63  te3TreeViewSelec
20e30 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a  t(0, p, 0);.  }.
20e40 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e  #endif..  return
20e50 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   1;.}.#endif /* 
20e60 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
20e70 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
20e80 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
20e90 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a  E_OMIT_VIEW) */.
20ea0 0a 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  ...#if !defined(
20eb0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
20ec0 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
20ed0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
20ee0 45 57 29 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 63  EW)./*.** Make c
20ef0 6f 70 69 65 73 20 6f 66 20 72 65 6c 65 76 61 6e  opies of relevan
20f00 74 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  t WHERE clause t
20f10 65 72 6d 73 20 6f 66 20 74 68 65 20 6f 75 74 65  erms of the oute
20f20 72 20 71 75 65 72 79 20 69 6e 74 6f 0a 2a 2a 20  r query into.** 
20f30 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
20f40 20 6f 66 20 73 75 62 71 75 65 72 79 2e 20 20 45   of subquery.  E
20f50 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  xample:.**.**   
20f60 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28   SELECT * FROM (
20f70 53 45 4c 45 43 54 20 61 20 41 53 20 78 2c 20 63  SELECT a AS x, c
20f80 2d 64 20 41 53 20 79 20 46 52 4f 4d 20 74 31 29  -d AS y FROM t1)
20f90 20 57 48 45 52 45 20 78 3d 35 20 41 4e 44 20 79   WHERE x=5 AND y
20fa0 3d 31 30 3b 0a 2a 2a 0a 2a 2a 20 54 72 61 6e 73  =10;.**.** Trans
20fb0 66 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a 2a 2a 0a  formed into:.**.
20fc0 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  **    SELECT * F
20fd0 52 4f 4d 20 28 53 45 4c 45 43 54 20 61 20 41 53  ROM (SELECT a AS
20fe0 20 78 2c 20 63 2d 64 20 41 53 20 79 20 46 52 4f   x, c-d AS y FRO
20ff0 4d 20 74 31 20 57 48 45 52 45 20 61 3d 35 20 41  M t1 WHERE a=5 A
21000 4e 44 20 63 2d 64 3d 31 30 29 0a 2a 2a 20 20 20  ND c-d=10).**   
21010 20 20 57 48 45 52 45 20 78 3d 35 20 41 4e 44 20    WHERE x=5 AND 
21020 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20  y=10;.**.** The 
21030 68 6f 70 65 20 69 73 20 74 68 61 74 20 74 68 65  hope is that the
21040 20 74 65 72 6d 73 20 61 64 64 65 64 20 74 6f 20   terms added to 
21050 74 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20  the inner query 
21060 77 69 6c 6c 20 6d 61 6b 65 20 69 74 20 6d 6f 72  will make it mor
21070 65 0a 2a 2a 20 65 66 66 69 63 69 65 6e 74 2e 0a  e.** efficient..
21080 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74  **.** Do not att
21090 65 6d 70 74 20 74 68 69 73 20 6f 70 74 69 6d 69  empt this optimi
210a0 7a 61 74 69 6f 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a  zation if:.**.**
210b0 20 20 20 28 31 29 20 54 68 65 20 69 6e 6e 65 72     (1) The inner
210c0 20 71 75 65 72 79 20 69 73 20 61 6e 20 61 67 67   query is an agg
210d0 72 65 67 61 74 65 2e 20 20 28 49 6e 20 74 68 61  regate.  (In tha
210e0 74 20 63 61 73 65 2c 20 77 65 27 64 20 72 65 61  t case, we'd rea
210f0 6c 6c 79 20 77 61 6e 74 0a 2a 2a 20 20 20 20 20  lly want.**     
21100 20 20 74 6f 20 63 6f 70 79 20 74 68 65 20 6f 75    to copy the ou
21110 74 65 72 20 57 48 45 52 45 2d 63 6c 61 75 73 65  ter WHERE-clause
21120 20 74 65 72 6d 73 20 6f 6e 74 6f 20 74 68 65 20   terms onto the 
21130 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20 6f 66  HAVING clause of
21140 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 69 6e   the.**       in
21150 6e 65 72 20 71 75 65 72 79 2e 20 20 42 75 74 20  ner query.  But 
21160 74 68 65 79 20 70 72 6f 62 61 62 6c 79 20 77 6f  they probably wo
21170 6e 27 74 20 68 65 6c 70 20 74 68 65 72 65 20 73  n't help there s
21180 6f 20 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 2e  o do not bother.
21190 29 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 54 68  ).**.**   (2) Th
211a0 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 69 73  e inner query is
211b0 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20 70   the recursive p
211c0 61 72 74 20 6f 66 20 61 20 63 6f 6d 6d 6f 6e 20  art of a common 
211d0 74 61 62 6c 65 20 65 78 70 72 65 73 73 69 6f 6e  table expression
211e0 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 54 68  ..**.**   (3) Th
211f0 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 68 61  e inner query ha
21200 73 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  s a LIMIT clause
21210 20 28 73 69 6e 63 65 20 74 68 65 20 63 68 61 6e   (since the chan
21220 67 65 73 20 74 6f 20 74 68 65 20 57 48 45 52 45  ges to the WHERE
21230 0a 2a 2a 20 20 20 20 20 20 20 63 6c 6f 73 65 20  .**       close 
21240 77 6f 75 6c 64 20 63 68 61 6e 67 65 20 74 68 65  would change the
21250 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20   meaning of the 
21260 4c 49 4d 49 54 29 2e 0a 2a 2a 0a 2a 2a 20 20 20  LIMIT)..**.**   
21270 28 34 29 20 54 68 65 20 69 6e 6e 65 72 20 71 75  (4) The inner qu
21280 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74  ery is the right
21290 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 4c 45   operand of a LE
212a0 46 54 20 4a 4f 49 4e 2e 20 20 28 54 68 65 20 63  FT JOIN.  (The c
212b0 61 6c 6c 65 72 0a 2a 2a 20 20 20 20 20 20 20 65  aller.**       e
212c0 6e 66 6f 72 63 65 73 20 74 68 69 73 20 72 65 73  nforces this res
212d0 74 72 69 63 74 69 6f 6e 20 73 69 6e 63 65 20 74  triction since t
212e0 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
212f0 20 6e 6f 74 20 68 61 76 65 20 65 6e 6f 75 67 68   not have enough
21300 0a 2a 2a 20 20 20 20 20 20 20 69 6e 66 6f 72 6d  .**       inform
21310 61 74 69 6f 6e 20 74 6f 20 6b 6e 6f 77 2e 29 0a  ation to know.).
21320 2a 2a 0a 2a 2a 20 20 20 28 35 29 20 54 68 65 20  **.**   (5) The 
21330 57 48 45 52 45 20 63 6c 61 75 73 65 20 65 78 70  WHERE clause exp
21340 72 65 73 73 69 6f 6e 20 6f 72 69 67 69 6e 61 74  ression originat
21350 65 73 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20  es in the ON or 
21360 55 53 49 4e 47 20 63 6c 61 75 73 65 0a 2a 2a 20  USING clause.** 
21370 20 20 20 20 20 20 6f 66 20 61 20 4c 45 46 54 20        of a LEFT 
21380 4a 4f 49 4e 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  JOIN..**.** Retu
21390 72 6e 20 30 20 69 66 20 6e 6f 20 63 68 61 6e 67  rn 0 if no chang
213a0 65 73 20 61 72 65 20 6d 61 64 65 20 61 6e 64 20  es are made and 
213b0 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 6f 6e 65 20  non-zero if one 
213c0 6f 72 20 6d 6f 72 65 20 57 48 45 52 45 20 63 6c  or more WHERE cl
213d0 61 75 73 65 0a 2a 2a 20 74 65 72 6d 73 20 61 72  ause.** terms ar
213e0 65 20 64 75 70 6c 69 63 61 74 65 64 20 69 6e 74  e duplicated int
213f0 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a  o the subquery..
21400 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 75  */.static int pu
21410 73 68 44 6f 77 6e 57 68 65 72 65 54 65 72 6d 73  shDownWhereTerms
21420 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
21430 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
21440 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
21450 74 69 6f 6e 20 28 66 6f 72 20 6d 61 6c 6c 6f 63  tion (for malloc
21460 28 29 29 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ()) */.  Select 
21470 2a 70 53 75 62 71 2c 20 20 20 20 20 20 20 20 2f  *pSubq,        /
21480 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20 77  * The subquery w
21490 68 6f 73 65 20 57 48 45 52 45 20 63 6c 61 75 73  hose WHERE claus
214a0 65 20 69 73 20 74 6f 20 62 65 20 61 75 67 6d 65  e is to be augme
214b0 6e 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  nted */.  Expr *
214c0 70 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20  pWhere,         
214d0 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
214e0 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
214f0 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20   query */.  int 
21500 69 43 75 72 73 6f 72 20 20 20 20 20 20 20 20 20  iCursor         
21510 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
21520 65 72 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  er of the subque
21530 72 79 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20  ry */.){.  Expr 
21540 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 43 68  *pNew;.  int nCh
21550 6e 67 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 57  ng = 0;.  if( pW
21560 68 65 72 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  here==0 ) return
21570 20 30 3b 0a 20 20 69 66 28 20 28 70 53 75 62 71   0;.  if( (pSubq
21580 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
21590 5f 41 67 67 72 65 67 61 74 65 7c 53 46 5f 52 65  _Aggregate|SF_Re
215a0 63 75 72 73 69 76 65 29 29 21 3d 30 20 29 7b 0a  cursive))!=0 ){.
215b0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f       return 0; /
215c0 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 28  * restrictions (
215d0 31 29 20 61 6e 64 20 28 32 29 20 2a 2f 0a 20 20  1) and (2) */.  
215e0 7d 0a 20 20 69 66 28 20 70 53 75 62 71 2d 3e 70  }.  if( pSubq->p
215f0 4c 69 6d 69 74 21 3d 30 20 29 7b 0a 20 20 20 20  Limit!=0 ){.    
21600 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72 65   return 0; /* re
21610 73 74 72 69 63 74 69 6f 6e 20 28 33 29 20 2a 2f  striction (3) */
21620 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 57  .  }.  while( pW
21630 68 65 72 65 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44  here->op==TK_AND
21640 20 29 7b 0a 20 20 20 20 6e 43 68 6e 67 20 2b 3d   ){.    nChng +=
21650 20 70 75 73 68 44 6f 77 6e 57 68 65 72 65 54 65   pushDownWhereTe
21660 72 6d 73 28 64 62 2c 20 70 53 75 62 71 2c 20 70  rms(db, pSubq, p
21670 57 68 65 72 65 2d 3e 70 52 69 67 68 74 2c 20 69  Where->pRight, i
21680 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 70 57 68  Cursor);.    pWh
21690 65 72 65 20 3d 20 70 57 68 65 72 65 2d 3e 70 4c  ere = pWhere->pL
216a0 65 66 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 45  eft;.  }.  if( E
216b0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
216c0 57 68 65 72 65 2c 45 50 5f 46 72 6f 6d 4a 6f 69  Where,EP_FromJoi
216d0 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 20 2f  n) ) return 0; /
216e0 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 20 35 20  * restriction 5 
216f0 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
21700 45 78 70 72 49 73 54 61 62 6c 65 43 6f 6e 73 74  ExprIsTableConst
21710 61 6e 74 28 70 57 68 65 72 65 2c 20 69 43 75 72  ant(pWhere, iCur
21720 73 6f 72 29 20 29 7b 0a 20 20 20 20 6e 43 68 6e  sor) ){.    nChn
21730 67 2b 2b 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  g++;.    while( 
21740 70 53 75 62 71 20 29 7b 0a 20 20 20 20 20 20 70  pSubq ){.      p
21750 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
21760 72 44 75 70 28 64 62 2c 20 70 57 68 65 72 65 2c  rDup(db, pWhere,
21770 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20   0);.      pNew 
21780 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20  = substExpr(db, 
21790 70 4e 65 77 2c 20 69 43 75 72 73 6f 72 2c 20 70  pNew, iCursor, p
217a0 53 75 62 71 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  Subq->pEList);. 
217b0 20 20 20 20 20 70 53 75 62 71 2d 3e 70 57 68 65       pSubq->pWhe
217c0 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  re = sqlite3Expr
217d0 41 6e 64 28 64 62 2c 20 70 53 75 62 71 2d 3e 70  And(db, pSubq->p
217e0 57 68 65 72 65 2c 20 70 4e 65 77 29 3b 0a 20 20  Where, pNew);.  
217f0 20 20 20 20 70 53 75 62 71 20 3d 20 70 53 75 62      pSubq = pSub
21800 71 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 7d  q->pPrior;.    }
21810 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 43  .  }.  return nC
21820 68 6e 67 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  hng;.}.#endif /*
21830 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
21840 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
21850 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
21860 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f  TE_OMIT_VIEW) */
21870 0a 0a 2f 2a 0a 2a 2a 20 42 61 73 65 64 20 6f 6e  ../*.** Based on
21880 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
21890 20 74 68 65 20 41 67 67 49 6e 66 6f 20 73 74 72   the AggInfo str
218a0 75 63 74 75 72 65 20 69 6e 64 69 63 61 74 65 64  ucture indicated
218b0 20 62 79 20 74 68 65 20 66 69 72 73 74 0a 2a 2a   by the first.**
218c0 20 61 72 67 75 6d 65 6e 74 2c 20 74 68 69 73 20   argument, this 
218d0 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20  function checks 
218e0 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  if the following
218f0 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a   are true:.**.**
21900 20 20 20 20 2a 20 74 68 65 20 71 75 65 72 79 20      * the query 
21910 63 6f 6e 74 61 69 6e 73 20 6a 75 73 74 20 61 20  contains just a 
21920 73 69 6e 67 6c 65 20 61 67 67 72 65 67 61 74 65  single aggregate
21930 20 66 75 6e 63 74 69 6f 6e 2c 0a 2a 2a 20 20 20   function,.**   
21940 20 2a 20 74 68 65 20 61 67 67 72 65 67 61 74 65   * the aggregate
21950 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 65 69 74   function is eit
21960 68 65 72 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  her min() or max
21970 28 29 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 2a 20  (), and.**    * 
21980 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  the argument to 
21990 74 68 65 20 61 67 67 72 65 67 61 74 65 20 66 75  the aggregate fu
219a0 6e 63 74 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75  nction is a colu
219b0 6d 6e 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20  mn value..**.** 
219c0 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 62  If all of the ab
219d0 6f 76 65 20 61 72 65 20 74 72 75 65 2c 20 74 68  ove are true, th
219e0 65 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59  en WHERE_ORDERBY
219f0 5f 4d 49 4e 20 6f 72 20 57 48 45 52 45 5f 4f 52  _MIN or WHERE_OR
21a00 44 45 52 42 59 5f 4d 41 58 0a 2a 2a 20 69 73 20  DERBY_MAX.** is 
21a10 72 65 74 75 72 6e 65 64 20 61 73 20 61 70 70 72  returned as appr
21a20 6f 70 72 69 61 74 65 2e 20 41 6c 73 6f 2c 20 2a  opriate. Also, *
21a30 70 70 4d 69 6e 4d 61 78 20 69 73 20 73 65 74 20  ppMinMax is set 
21a40 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
21a50 0a 2a 2a 20 6c 69 73 74 20 6f 66 20 61 72 67 75  .** list of argu
21a60 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20  ments passed to 
21a70 74 68 65 20 61 67 67 72 65 67 61 74 65 20 62 65  the aggregate be
21a80 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
21a90 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65  **.** Or, if the
21aa0 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76   conditions abov
21ab0 65 20 61 72 65 20 6e 6f 74 20 6d 65 74 2c 20 2a  e are not met, *
21ac0 70 70 4d 69 6e 4d 61 78 20 69 73 20 73 65 74 20  ppMinMax is set 
21ad0 74 6f 20 30 20 61 6e 64 0a 2a 2a 20 57 48 45 52  to 0 and.** WHER
21ae0 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c  E_ORDERBY_NORMAL
21af0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
21b00 0a 73 74 61 74 69 63 20 75 38 20 6d 69 6e 4d 61  .static u8 minMa
21b10 78 51 75 65 72 79 28 41 67 67 49 6e 66 6f 20 2a  xQuery(AggInfo *
21b20 70 41 67 67 49 6e 66 6f 2c 20 45 78 70 72 4c 69  pAggInfo, ExprLi
21b30 73 74 20 2a 2a 70 70 4d 69 6e 4d 61 78 29 7b 0a  st **ppMinMax){.
21b40 20 20 69 6e 74 20 65 52 65 74 20 3d 20 57 48 45    int eRet = WHE
21b50 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41  RE_ORDERBY_NORMA
21b60 4c 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  L;          /* R
21b70 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a  eturn value */..
21b80 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 30 3b    *ppMinMax = 0;
21b90 0a 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d  .  if( pAggInfo-
21ba0 3e 6e 46 75 6e 63 3d 3d 31 20 29 7b 0a 20 20 20  >nFunc==1 ){.   
21bb0 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
21bc0 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30  AggInfo->aFunc[0
21bd0 5d 2e 70 45 78 70 72 3b 20 2f 2a 20 41 67 67 72  ].pExpr; /* Aggr
21be0 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 2a  egate function *
21bf0 2f 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  /.    ExprList *
21c00 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  pEList = pExpr->
21c10 78 2e 70 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a  x.pList;      /*
21c20 20 41 72 67 75 6d 65 6e 74 73 20 74 6f 20 61 67   Arguments to ag
21c30 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20  g function */.. 
21c40 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
21c50 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e  ->op==TK_AGG_FUN
21c60 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 69 66 28  CTION );.    if(
21c70 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73   pEList && pELis
21c80 74 2d 3e 6e 45 78 70 72 3d 3d 31 20 26 26 20 70  t->nExpr==1 && p
21c90 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
21ca0 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f  r->op==TK_AGG_CO
21cb0 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 63 6f  LUMN ){.      co
21cc0 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 20  nst char *zFunc 
21cd0 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  = pExpr->u.zToke
21ce0 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  n;.      if( sql
21cf0 69 74 65 33 53 74 72 49 43 6d 70 28 7a 46 75 6e  ite3StrICmp(zFun
21d00 63 2c 20 22 6d 69 6e 22 29 3d 3d 30 20 29 7b 0a  c, "min")==0 ){.
21d10 20 20 20 20 20 20 20 20 65 52 65 74 20 3d 20 57          eRet = W
21d20 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e  HERE_ORDERBY_MIN
21d30 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 4d 69 6e  ;.        *ppMin
21d40 4d 61 78 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20  Max = pEList;.  
21d50 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71      }else if( sq
21d60 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 46 75  lite3StrICmp(zFu
21d70 6e 63 2c 20 22 6d 61 78 22 29 3d 3d 30 20 29 7b  nc, "max")==0 ){
21d80 0a 20 20 20 20 20 20 20 20 65 52 65 74 20 3d 20  .        eRet = 
21d90 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41  WHERE_ORDERBY_MA
21da0 58 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 4d 69  X;.        *ppMi
21db0 6e 4d 61 78 20 3d 20 70 45 4c 69 73 74 3b 0a 20  nMax = pEList;. 
21dc0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
21dd0 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 70 4d  ..  assert( *ppM
21de0 69 6e 4d 61 78 3d 3d 30 20 7c 7c 20 28 2a 70 70  inMax==0 || (*pp
21df0 4d 69 6e 4d 61 78 29 2d 3e 6e 45 78 70 72 3d 3d  MinMax)->nExpr==
21e00 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 65 52  1 );.  return eR
21e10 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  et;.}../*.** The
21e20 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
21e30 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
21e40 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
21e50 73 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 71  s an aggregate q
21e60 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 65 63  uery..** The sec
21e70 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
21e80 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 61  the associated a
21e90 67 67 72 65 67 61 74 65 2d 69 6e 66 6f 20 6f 62  ggregate-info ob
21ea0 6a 65 63 74 2e 20 54 68 69 73 20 0a 2a 2a 20 66  ject. This .** f
21eb0 75 6e 63 74 69 6f 6e 20 74 65 73 74 73 20 69 66  unction tests if
21ec0 20 74 68 65 20 53 45 4c 45 43 54 20 69 73 20 6f   the SELECT is o
21ed0 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  f the form:.**.*
21ee0 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74  *   SELECT count
21ef0 28 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 2a  (*) FROM <tbl>.*
21f00 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61 62 6c 65  *.** where table
21f10 20 69 73 20 61 20 64 61 74 61 62 61 73 65 20 74   is a database t
21f20 61 62 6c 65 2c 20 6e 6f 74 20 61 20 73 75 62 2d  able, not a sub-
21f30 73 65 6c 65 63 74 20 6f 72 20 76 69 65 77 2e 20  select or view. 
21f40 49 66 20 74 68 65 20 71 75 65 72 79 0a 2a 2a 20  If the query.** 
21f50 64 6f 65 73 20 6d 61 74 63 68 20 74 68 69 73 20  does match this 
21f60 70 61 74 74 65 72 6e 2c 20 74 68 65 6e 20 61 20  pattern, then a 
21f70 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 54  pointer to the T
21f80 61 62 6c 65 20 6f 62 6a 65 63 74 20 72 65 70 72  able object repr
21f90 65 73 65 6e 74 69 6e 67 0a 2a 2a 20 3c 74 62 6c  esenting.** <tbl
21fa0 3e 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  > is returned. O
21fb0 74 68 65 72 77 69 73 65 2c 20 30 20 69 73 20 72  therwise, 0 is r
21fc0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
21fd0 69 63 20 54 61 62 6c 65 20 2a 69 73 53 69 6d 70  ic Table *isSimp
21fe0 6c 65 43 6f 75 6e 74 28 53 65 6c 65 63 74 20 2a  leCount(Select *
21ff0 70 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67  p, AggInfo *pAgg
22000 49 6e 66 6f 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Info){.  Table *
22010 70 54 61 62 3b 0a 20 20 45 78 70 72 20 2a 70 45  pTab;.  Expr *pE
22020 78 70 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  xpr;..  assert( 
22030 21 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 3b 0a  !p->pGroupBy );.
22040 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65  .  if( p->pWhere
22050 20 7c 7c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e   || p->pEList->n
22060 45 78 70 72 21 3d 31 20 0a 20 20 20 7c 7c 20 70  Expr!=1 .   || p
22070 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20  ->pSrc->nSrc!=1 
22080 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d  || p->pSrc->a[0]
22090 2e 70 53 65 6c 65 63 74 0a 20 20 29 7b 0a 20 20  .pSelect.  ){.  
220a0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
220b0 20 20 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63    pTab = p->pSrc
220c0 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 70  ->a[0].pTab;.  p
220d0 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74  Expr = p->pEList
220e0 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
220f0 61 73 73 65 72 74 28 20 70 54 61 62 20 26 26 20  assert( pTab && 
22100 21 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 26  !pTab->pSelect &
22110 26 20 70 45 78 70 72 20 29 3b 0a 0a 20 20 69 66  & pExpr );..  if
22120 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
22130 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
22140 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
22150 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29  K_AGG_FUNCTION )
22160 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
22170 20 4e 45 56 45 52 28 70 41 67 67 49 6e 66 6f 2d   NEVER(pAggInfo-
22180 3e 6e 46 75 6e 63 3d 3d 30 29 20 29 20 72 65 74  >nFunc==0) ) ret
22190 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 41  urn 0;.  if( (pA
221a0 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d  ggInfo->aFunc[0]
221b0 2e 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67  .pFunc->funcFlag
221c0 73 26 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f  s&SQLITE_FUNC_CO
221d0 55 4e 54 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  UNT)==0 ) return
221e0 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d   0;.  if( pExpr-
221f0 3e 66 6c 61 67 73 26 45 50 5f 44 69 73 74 69 6e  >flags&EP_Distin
22200 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  ct ) return 0;..
22210 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d    return pTab;.}
22220 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73  ../*.** If the s
22230 6f 75 72 63 65 2d 6c 69 73 74 20 69 74 65 6d 20  ource-list item 
22240 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67  passed as an arg
22250 75 6d 65 6e 74 20 77 61 73 20 61 75 67 6d 65 6e  ument was augmen
22260 74 65 64 20 77 69 74 68 20 61 6e 0a 2a 2a 20 49  ted with an.** I
22270 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
22280 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 20 6c 6f  , then try to lo
22290 63 61 74 65 20 74 68 65 20 73 70 65 63 69 66 69  cate the specifi
222a0 65 64 20 69 6e 64 65 78 2e 20 49 66 20 74 68 65  ed index. If the
222b0 72 65 0a 2a 2a 20 77 61 73 20 73 75 63 68 20 61  re.** was such a
222c0 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65 20   clause and the 
222d0 6e 61 6d 65 64 20 69 6e 64 65 78 20 63 61 6e 6e  named index cann
222e0 6f 74 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74  ot be found, ret
222f0 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45  urn .** SQLITE_E
22300 52 52 4f 52 20 61 6e 64 20 6c 65 61 76 65 20 61  RROR and leave a
22310 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73  n error in pPars
22320 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 70 6f  e. Otherwise, po
22330 70 75 6c 61 74 65 20 0a 2a 2a 20 70 46 72 6f 6d  pulate .** pFrom
22340 2d 3e 70 49 6e 64 65 78 20 61 6e 64 20 72 65 74  ->pIndex and ret
22350 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  urn SQLITE_OK..*
22360 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 64  /.int sqlite3Ind
22370 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28 50 61 72  exedByLookup(Par
22380 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72 75  se *pParse, stru
22390 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
223a0 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70  *pFrom){.  if( p
223b0 46 72 6f 6d 2d 3e 70 54 61 62 20 26 26 20 70 46  From->pTab && pF
223c0 72 6f 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65  rom->fg.isIndexe
223d0 64 42 79 20 29 7b 0a 20 20 20 20 54 61 62 6c 65  dBy ){.    Table
223e0 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e   *pTab = pFrom->
223f0 70 54 61 62 3b 0a 20 20 20 20 63 68 61 72 20 2a  pTab;.    char *
22400 7a 49 6e 64 65 78 65 64 42 79 20 3d 20 70 46 72  zIndexedBy = pFr
22410 6f 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42  om->u1.zIndexedB
22420 79 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  y;.    Index *pI
22430 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78  dx;.    for(pIdx
22440 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 0a  =pTab->pIndex; .
22450 20 20 20 20 20 20 20 20 70 49 64 78 20 26 26 20          pIdx && 
22460 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
22470 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 49 6e 64  Idx->zName, zInd
22480 65 78 65 64 42 79 29 3b 20 0a 20 20 20 20 20 20  exedBy); .      
22490 20 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65    pIdx=pIdx->pNe
224a0 78 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  xt.    );.    if
224b0 28 20 21 70 49 64 78 20 29 7b 0a 20 20 20 20 20  ( !pIdx ){.     
224c0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
224d0 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63  (pParse, "no suc
224e0 68 20 69 6e 64 65 78 3a 20 25 73 22 2c 20 7a 49  h index: %s", zI
224f0 6e 64 65 78 65 64 42 79 2c 20 30 29 3b 0a 20 20  ndexedBy, 0);.  
22500 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63      pParse->chec
22510 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20  kSchema = 1;.   
22520 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
22530 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
22540 20 20 70 46 72 6f 6d 2d 3e 70 49 42 49 6e 64 65    pFrom->pIBInde
22550 78 20 3d 20 70 49 64 78 3b 0a 20 20 7d 0a 20 20  x = pIdx;.  }.  
22560 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
22570 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 44 65 74 65 63 74  ;.}./*.** Detect
22580 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
22590 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74   statements that
225a0 20 75 73 65 20 61 6e 20 4f 52 44 45 52 20 42 59   use an ORDER BY
225b0 20 63 6c 61 75 73 65 20 77 69 74 68 20 0a 2a 2a   clause with .**
225c0 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20   an alternative 
225d0 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
225e0 63 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c  ce..**.**    SEL
225f0 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20  ECT ... FROM t1 
22600 45 58 43 45 50 54 20 53 45 4c 45 43 54 20 2e 2e  EXCEPT SELECT ..
22610 2e 20 46 52 4f 4d 20 74 32 20 4f 52 44 45 52 20  . FROM t2 ORDER 
22620 42 59 20 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e  BY .. COLLATE ..
22630 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72  ..**.** These ar
22640 65 20 72 65 77 72 69 74 74 65 6e 20 61 73 20 61  e rewritten as a
22650 20 73 75 62 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a   subquery:.**.**
22660 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
22670 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52  M (SELECT ... FR
22680 4f 4d 20 74 31 20 45 58 43 45 50 54 20 53 45 4c  OM t1 EXCEPT SEL
22690 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 32 29  ECT ... FROM t2)
226a0 0a 2a 2a 20 20 20 20 20 4f 52 44 45 52 20 42 59  .**     ORDER BY
226b0 20 2e 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e   ... COLLATE ...
226c0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 74 72 61 6e  .**.** This tran
226d0 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65  sformation is ne
226e0 63 65 73 73 61 72 79 20 62 65 63 61 75 73 65 20  cessary because 
226f0 74 68 65 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  the multiSelectO
22700 72 64 65 72 42 79 28 29 20 72 6f 75 74 69 6e 65  rderBy() routine
22710 0a 2a 2a 20 61 62 6f 76 65 20 74 68 61 74 20 67  .** above that g
22720 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64  enerates the cod
22730 65 20 66 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64  e for a compound
22740 20 53 45 4c 45 43 54 20 77 69 74 68 20 61 6e 20   SELECT with an 
22750 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a  ORDER BY clause.
22760 2a 2a 20 75 73 65 73 20 61 20 6d 65 72 67 65 20  ** uses a merge 
22770 61 6c 67 6f 72 69 74 68 6d 20 74 68 61 74 20 72  algorithm that r
22780 65 71 75 69 72 65 73 20 74 68 65 20 73 61 6d 65  equires the same
22790 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
227a0 6e 63 65 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 65  nce on the.** re
227b0 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 61 73 20  sult columns as 
227c0 6f 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  on the ORDER BY 
227d0 63 6c 61 75 73 65 2e 20 20 53 65 65 20 74 69 63  clause.  See tic
227e0 6b 65 74 0a 2a 2a 20 68 74 74 70 3a 2f 2f 77 77  ket.** http://ww
227f0 77 2e 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72 63  w.sqlite.org/src
22800 2f 69 6e 66 6f 2f 36 37 30 39 35 37 34 64 32 61  /info/6709574d2a
22810 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 74 72 61 6e  .**.** This tran
22820 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6f 6e  sformation is on
22830 6c 79 20 6e 65 65 64 65 64 20 66 6f 72 20 45 58  ly needed for EX
22840 43 45 50 54 2c 20 49 4e 54 45 52 53 45 43 54 2c  CEPT, INTERSECT,
22850 20 61 6e 64 20 55 4e 49 4f 4e 2e 0a 2a 2a 20 54   and UNION..** T
22860 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65  he UNION ALL ope
22870 72 61 74 6f 72 20 77 6f 72 6b 73 20 66 69 6e 65  rator works fine
22880 20 77 69 74 68 20 6d 75 6c 74 69 53 65 6c 65 63   with multiSelec
22890 74 4f 72 64 65 72 42 79 28 29 20 65 76 65 6e 20  tOrderBy() even 
228a0 77 68 65 6e 0a 2a 2a 20 74 68 65 72 65 20 61 72  when.** there ar
228b0 65 20 43 4f 4c 4c 41 54 45 20 74 65 72 6d 73 20  e COLLATE terms 
228c0 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 2e  in the ORDER BY.
228d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
228e0 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65  onvertCompoundSe
228f0 6c 65 63 74 54 6f 53 75 62 71 75 65 72 79 28 57  lectToSubquery(W
22900 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
22910 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e  Select *p){.  in
22920 74 20 69 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70  t i;.  Select *p
22930 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70  New;.  Select *p
22940 58 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  X;.  sqlite3 *db
22950 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  ;.  struct ExprL
22960 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 53  ist_item *a;.  S
22970 72 63 4c 69 73 74 20 2a 70 4e 65 77 53 72 63 3b  rcList *pNewSrc;
22980 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
22990 3b 0a 20 20 54 6f 6b 65 6e 20 64 75 6d 6d 79 3b  ;.  Token dummy;
229a0 0a 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  ..  if( p->pPrio
229b0 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52  r==0 ) return WR
229c0 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 66  C_Continue;.  if
229d0 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
229e0 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f   ) return WRC_Co
229f0 6e 74 69 6e 75 65 3b 0a 20 20 66 6f 72 28 70 58  ntinue;.  for(pX
22a00 3d 70 3b 20 70 58 20 26 26 20 28 70 58 2d 3e 6f  =p; pX && (pX->o
22a10 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 58 2d  p==TK_ALL || pX-
22a20 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 29 3b  >op==TK_SELECT);
22a30 20 70 58 3d 70 58 2d 3e 70 50 72 69 6f 72 29 7b   pX=pX->pPrior){
22a40 7d 0a 20 20 69 66 28 20 70 58 3d 3d 30 20 29 20  }.  if( pX==0 ) 
22a50 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
22a60 6e 75 65 3b 0a 20 20 61 20 3d 20 70 2d 3e 70 4f  nue;.  a = p->pO
22a70 72 64 65 72 42 79 2d 3e 61 3b 0a 20 20 66 6f 72  rderBy->a;.  for
22a80 28 69 3d 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  (i=p->pOrderBy->
22a90 6e 45 78 70 72 2d 31 3b 20 69 3e 3d 30 3b 20 69  nExpr-1; i>=0; i
22aa0 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20 61 5b 69  --){.    if( a[i
22ab0 5d 2e 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26  ].pExpr->flags &
22ac0 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 20 62 72   EP_Collate ) br
22ad0 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  eak;.  }.  if( i
22ae0 3c 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  <0 ) return WRC_
22af0 43 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 2f 2a 20  Continue;..  /* 
22b00 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73  If we reach this
22b10 20 70 6f 69 6e 74 2c 20 74 68 61 74 20 6d 65 61   point, that mea
22b20 6e 73 20 74 68 65 20 74 72 61 6e 73 66 6f 72 6d  ns the transform
22b30 61 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65  ation is require
22b40 64 2e 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20  d. */..  pParse 
22b50 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73  = pWalker->pPars
22b60 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  e;.  db = pParse
22b70 2d 3e 64 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73  ->db;.  pNew = s
22b80 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
22b90 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  ro(db, sizeof(*p
22ba0 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  New) );.  if( pN
22bb0 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57  ew==0 ) return W
22bc0 52 43 5f 41 62 6f 72 74 3b 0a 20 20 6d 65 6d 73  RC_Abort;.  mems
22bd0 65 74 28 26 64 75 6d 6d 79 2c 20 30 2c 20 73 69  et(&dummy, 0, si
22be0 7a 65 6f 66 28 64 75 6d 6d 79 29 29 3b 0a 20 20  zeof(dummy));.  
22bf0 70 4e 65 77 53 72 63 20 3d 20 73 71 6c 69 74 65  pNewSrc = sqlite
22c00 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 46 72  3SrcListAppendFr
22c10 6f 6d 54 65 72 6d 28 70 50 61 72 73 65 2c 30 2c  omTerm(pParse,0,
22c20 30 2c 30 2c 26 64 75 6d 6d 79 2c 70 4e 65 77 2c  0,0,&dummy,pNew,
22c30 30 2c 30 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  0,0);.  if( pNew
22c40 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Src==0 ) return 
22c50 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 2a 70 4e  WRC_Abort;.  *pN
22c60 65 77 20 3d 20 2a 70 3b 0a 20 20 70 2d 3e 70 53  ew = *p;.  p->pS
22c70 72 63 20 3d 20 70 4e 65 77 53 72 63 3b 0a 20 20  rc = pNewSrc;.  
22c80 70 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69  p->pEList = sqli
22c90 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
22ca0 64 28 70 50 61 72 73 65 2c 20 30 2c 20 73 71 6c  d(pParse, 0, sql
22cb0 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f  ite3Expr(db, TK_
22cc0 41 53 54 45 52 49 53 4b 2c 20 30 29 29 3b 0a 20  ASTERISK, 0));. 
22cd0 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45   p->op = TK_SELE
22ce0 43 54 3b 0a 20 20 70 2d 3e 70 57 68 65 72 65 20  CT;.  p->pWhere 
22cf0 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72  = 0;.  pNew->pGr
22d00 6f 75 70 42 79 20 3d 20 30 3b 0a 20 20 70 4e 65  oupBy = 0;.  pNe
22d10 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 30 3b 0a  w->pHaving = 0;.
22d20 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79    pNew->pOrderBy
22d30 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 50 72 69 6f   = 0;.  p->pPrio
22d40 72 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 4e 65 78  r = 0;.  p->pNex
22d50 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 57 69 74  t = 0;.  p->pWit
22d60 68 20 3d 20 30 3b 0a 20 20 70 2d 3e 73 65 6c 46  h = 0;.  p->selF
22d70 6c 61 67 73 20 26 3d 20 7e 53 46 5f 43 6f 6d 70  lags &= ~SF_Comp
22d80 6f 75 6e 64 3b 0a 20 20 61 73 73 65 72 74 28 20  ound;.  assert( 
22d90 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
22da0 46 5f 43 6f 6e 76 65 72 74 65 64 29 3d 3d 30 20  F_Converted)==0 
22db0 29 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73  );.  p->selFlags
22dc0 20 7c 3d 20 53 46 5f 43 6f 6e 76 65 72 74 65 64   |= SF_Converted
22dd0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77  ;.  assert( pNew
22de0 2d 3e 70 50 72 69 6f 72 21 3d 30 20 29 3b 0a 20  ->pPrior!=0 );. 
22df0 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 2d 3e 70   pNew->pPrior->p
22e00 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 70  Next = pNew;.  p
22e10 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b  New->pLimit = 0;
22e20 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74  .  pNew->pOffset
22e30 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 57   = 0;.  return W
22e40 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a  RC_Continue;.}..
22e50 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73  /*.** Check to s
22e60 65 65 20 69 66 20 74 68 65 20 46 52 4f 4d 20 63  ee if the FROM c
22e70 6c 61 75 73 65 20 74 65 72 6d 20 70 46 72 6f 6d  lause term pFrom
22e80 20 68 61 73 20 74 61 62 6c 65 2d 76 61 6c 75 65   has table-value
22e90 64 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 72  d function.** ar
22ea0 67 75 6d 65 6e 74 73 2e 20 20 49 66 20 69 74 20  guments.  If it 
22eb0 64 6f 65 73 2c 20 6c 65 61 76 65 20 61 6e 20 65  does, leave an e
22ec0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
22ed0 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72  pParse and retur
22ee0 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 73  n.** non-zero, s
22ef0 69 6e 63 65 20 70 46 72 6f 6d 20 69 73 20 6e 6f  ince pFrom is no
22f00 74 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20  t allowed to be 
22f10 61 20 74 61 62 6c 65 2d 76 61 6c 75 65 64 20 66  a table-valued f
22f20 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
22f30 69 63 20 69 6e 74 20 63 61 6e 6e 6f 74 42 65 46  ic int cannotBeF
22f40 75 6e 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  unction(Parse *p
22f50 50 61 72 73 65 2c 20 73 74 72 75 63 74 20 53 72  Parse, struct Sr
22f60 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f  cList_item *pFro
22f70 6d 29 7b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d  m){.  if( pFrom-
22f80 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 20 29 7b  >fg.isTabFunc ){
22f90 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
22fa0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 27 25  rMsg(pParse, "'%
22fb0 73 27 20 69 73 20 6e 6f 74 20 61 20 66 75 6e 63  s' is not a func
22fc0 74 69 6f 6e 22 2c 20 70 46 72 6f 6d 2d 3e 7a 4e  tion", pFrom->zN
22fd0 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
22fe0 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
22ff0 20 30 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53   0;.}..#ifndef S
23000 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f  QLITE_OMIT_CTE./
23010 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 57  *.** Argument pW
23020 69 74 68 20 28 77 68 69 63 68 20 6d 61 79 20 62  ith (which may b
23030 65 20 4e 55 4c 4c 29 20 70 6f 69 6e 74 73 20 74  e NULL) points t
23040 6f 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  o a linked list 
23050 6f 66 20 6e 65 73 74 65 64 20 0a 2a 2a 20 57 49  of nested .** WI
23060 54 48 20 63 6f 6e 74 65 78 74 73 2c 20 66 72 6f  TH contexts, fro
23070 6d 20 69 6e 6e 65 72 20 74 6f 20 6f 75 74 65 72  m inner to outer
23080 6d 6f 73 74 2e 20 49 66 20 74 68 65 20 74 61 62  most. If the tab
23090 6c 65 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  le identified by
230a0 20 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65   .** FROM clause
230b0 20 65 6c 65 6d 65 6e 74 20 70 49 74 65 6d 20 69   element pItem i
230c0 73 20 72 65 61 6c 6c 79 20 61 20 63 6f 6d 6d 6f  s really a commo
230d0 6e 2d 74 61 62 6c 65 2d 65 78 70 72 65 73 73 69  n-table-expressi
230e0 6f 6e 20 28 43 54 45 29 20 0a 2a 2a 20 74 68 65  on (CTE) .** the
230f0 6e 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  n return a point
23100 65 72 20 74 6f 20 74 68 65 20 43 54 45 20 64 65  er to the CTE de
23110 66 69 6e 69 74 69 6f 6e 20 66 6f 72 20 74 68 61  finition for tha
23120 74 20 74 61 62 6c 65 2e 20 4f 74 68 65 72 77 69  t table. Otherwi
23130 73 65 0a 2a 2a 20 72 65 74 75 72 6e 20 4e 55 4c  se.** return NUL
23140 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6e 6f  L..**.** If a no
23150 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69 73 20  n-NULL value is 
23160 72 65 74 75 72 6e 65 64 2c 20 73 65 74 20 2a 70  returned, set *p
23170 70 43 6f 6e 74 65 78 74 20 74 6f 20 70 6f 69 6e  pContext to poin
23180 74 20 74 6f 20 74 68 65 20 57 69 74 68 0a 2a 2a  t to the With.**
23190 20 6f 62 6a 65 63 74 20 74 68 61 74 20 74 68 65   object that the
231a0 20 72 65 74 75 72 6e 65 64 20 43 54 45 20 62 65   returned CTE be
231b0 6c 6f 6e 67 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61  longs to..*/.sta
231c0 74 69 63 20 73 74 72 75 63 74 20 43 74 65 20 2a  tic struct Cte *
231d0 73 65 61 72 63 68 57 69 74 68 28 0a 20 20 57 69  searchWith(.  Wi
231e0 74 68 20 2a 70 57 69 74 68 2c 20 20 20 20 20 20  th *pWith,      
231f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23200 20 43 75 72 72 65 6e 74 20 69 6e 6e 65 72 6d 6f   Current innermo
23210 73 74 20 57 49 54 48 20 63 6c 61 75 73 65 20 2a  st WITH clause *
23220 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
23230 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20  st_item *pItem, 
23240 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75      /* FROM clau
23250 73 65 20 65 6c 65 6d 65 6e 74 20 74 6f 20 72 65  se element to re
23260 73 6f 6c 76 65 20 2a 2f 0a 20 20 57 69 74 68 20  solve */.  With 
23270 2a 2a 70 70 43 6f 6e 74 65 78 74 20 20 20 20 20  **ppContext     
23280 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
23290 54 3a 20 57 49 54 48 20 63 6c 61 75 73 65 20 72  T: WITH clause r
232a0 65 74 75 72 6e 20 76 61 6c 75 65 20 62 65 6c 6f  eturn value belo
232b0 6e 67 73 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 63  ngs to */.){.  c
232c0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
232d0 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a  ;.  if( pItem->z
232e0 44 61 74 61 62 61 73 65 3d 3d 30 20 26 26 20 28  Database==0 && (
232f0 7a 4e 61 6d 65 20 3d 20 70 49 74 65 6d 2d 3e 7a  zName = pItem->z
23300 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
23310 57 69 74 68 20 2a 70 3b 0a 20 20 20 20 66 6f 72  With *p;.    for
23320 28 70 3d 70 57 69 74 68 3b 20 70 3b 20 70 3d 70  (p=pWith; p; p=p
23330 2d 3e 70 4f 75 74 65 72 29 7b 0a 20 20 20 20 20  ->pOuter){.     
23340 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f   int i;.      fo
23350 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 74 65  r(i=0; i<p->nCte
23360 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
23370 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
23380 6d 70 28 7a 4e 61 6d 65 2c 20 70 2d 3e 61 5b 69  mp(zName, p->a[i
23390 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ].zName)==0 ){. 
233a0 20 20 20 20 20 20 20 20 20 2a 70 70 43 6f 6e 74           *ppCont
233b0 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  ext = p;.       
233c0 20 20 20 72 65 74 75 72 6e 20 26 70 2d 3e 61 5b     return &p->a[
233d0 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  i];.        }.  
233e0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
233f0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
23400 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72  * The code gener
23410 61 74 6f 72 20 6d 61 69 6e 74 61 69 6e 73 20 61  ator maintains a
23420 20 73 74 61 63 6b 20 6f 66 20 61 63 74 69 76 65   stack of active
23430 20 57 49 54 48 20 63 6c 61 75 73 65 73 0a 2a 2a   WITH clauses.**
23440 20 77 69 74 68 20 74 68 65 20 69 6e 6e 65 72 2d   with the inner-
23450 6d 6f 73 74 20 57 49 54 48 20 63 6c 61 75 73 65  most WITH clause
23460 20 62 65 69 6e 67 20 61 74 20 74 68 65 20 74 6f   being at the to
23470 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 0a  p of the stack..
23480 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
23490 6e 65 20 70 75 73 68 65 73 20 74 68 65 20 57 49  ne pushes the WI
234a0 54 48 20 63 6c 61 75 73 65 20 70 61 73 73 65 64  TH clause passed
234b0 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
234c0 72 67 75 6d 65 6e 74 0a 2a 2a 20 6f 6e 74 6f 20  rgument.** onto 
234d0 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73  the top of the s
234e0 74 61 63 6b 2e 20 49 66 20 61 72 67 75 6d 65 6e  tack. If argumen
234f0 74 20 62 46 72 65 65 20 69 73 20 74 72 75 65 2c  t bFree is true,
23500 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20 57 49   then this.** WI
23510 54 48 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6e  TH clause will n
23520 65 76 65 72 20 62 65 20 70 6f 70 70 65 64 20 66  ever be popped f
23530 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e 20 49  rom the stack. I
23540 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 0a 2a  n this case it.*
23550 2a 20 73 68 6f 75 6c 64 20 62 65 20 66 72 65 65  * should be free
23560 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65  d along with the
23570 20 50 61 72 73 65 20 6f 62 6a 65 63 74 2e 20 49   Parse object. I
23580 6e 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20 77  n other cases, w
23590 68 65 6e 0a 2a 2a 20 62 46 72 65 65 3d 3d 30 2c  hen.** bFree==0,
235a0 20 74 68 65 20 57 69 74 68 20 6f 62 6a 65 63 74   the With object
235b0 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 61   will be freed a
235c0 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 53 45  long with the SE
235d0 4c 45 43 54 20 0a 2a 2a 20 73 74 61 74 65 6d 65  LECT .** stateme
235e0 6e 74 20 77 69 74 68 20 77 68 69 63 68 20 69 74  nt with which it
235f0 20 69 73 20 61 73 73 6f 63 69 61 74 65 64 2e 0a   is associated..
23600 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57  */.void sqlite3W
23610 69 74 68 50 75 73 68 28 50 61 72 73 65 20 2a 70  ithPush(Parse *p
23620 50 61 72 73 65 2c 20 57 69 74 68 20 2a 70 57 69  Parse, With *pWi
23630 74 68 2c 20 75 38 20 62 46 72 65 65 29 7b 0a 20  th, u8 bFree){. 
23640 20 61 73 73 65 72 74 28 20 62 46 72 65 65 3d 3d   assert( bFree==
23650 30 20 7c 7c 20 28 70 50 61 72 73 65 2d 3e 70 57  0 || (pParse->pW
23660 69 74 68 3d 3d 30 20 26 26 20 70 50 61 72 73 65  ith==0 && pParse
23670 2d 3e 70 57 69 74 68 54 6f 46 72 65 65 3d 3d 30  ->pWithToFree==0
23680 29 20 29 3b 0a 20 20 69 66 28 20 70 57 69 74 68  ) );.  if( pWith
23690 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
236a0 70 50 61 72 73 65 2d 3e 70 57 69 74 68 21 3d 70  pParse->pWith!=p
236b0 57 69 74 68 20 29 3b 0a 20 20 20 20 70 57 69 74  With );.    pWit
236c0 68 2d 3e 70 4f 75 74 65 72 20 3d 20 70 50 61 72  h->pOuter = pPar
236d0 73 65 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20 70  se->pWith;.    p
236e0 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70  Parse->pWith = p
236f0 57 69 74 68 3b 0a 20 20 20 20 69 66 28 20 62 46  With;.    if( bF
23700 72 65 65 20 29 20 70 50 61 72 73 65 2d 3e 70 57  ree ) pParse->pW
23710 69 74 68 54 6f 46 72 65 65 20 3d 20 70 57 69 74  ithToFree = pWit
23720 68 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  h;.  }.}../*.** 
23730 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68  This function ch
23740 65 63 6b 73 20 69 66 20 61 72 67 75 6d 65 6e 74  ecks if argument
23750 20 70 46 72 6f 6d 20 72 65 66 65 72 73 20 74 6f   pFrom refers to
23760 20 61 20 43 54 45 20 64 65 63 6c 61 72 65 64 20   a CTE declared 
23770 62 79 20 0a 2a 2a 20 61 20 57 49 54 48 20 63 6c  by .** a WITH cl
23780 61 75 73 65 20 6f 6e 20 74 68 65 20 73 74 61 63  ause on the stac
23790 6b 20 63 75 72 72 65 6e 74 6c 79 20 6d 61 69 6e  k currently main
237a0 74 61 69 6e 65 64 20 62 79 20 74 68 65 20 70 61  tained by the pa
237b0 72 73 65 72 2e 20 41 6e 64 2c 0a 2a 2a 20 69 66  rser. And,.** if
237c0 20 63 75 72 72 65 6e 74 6c 79 20 70 72 6f 63 65   currently proce
237d0 73 73 69 6e 67 20 61 20 43 54 45 20 65 78 70 72  ssing a CTE expr
237e0 65 73 73 69 6f 6e 2c 20 69 66 20 69 74 20 69 73  ession, if it is
237f0 20 61 20 72 65 63 75 72 73 69 76 65 0a 2a 2a 20   a recursive.** 
23800 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
23810 20 63 75 72 72 65 6e 74 20 43 54 45 2e 0a 2a 2a   current CTE..**
23820 0a 2a 2a 20 49 66 20 70 46 72 6f 6d 20 66 61 6c  .** If pFrom fal
23830 6c 73 20 69 6e 74 6f 20 65 69 74 68 65 72 20 6f  ls into either o
23840 66 20 74 68 65 20 74 77 6f 20 63 61 74 65 67 6f  f the two catego
23850 72 69 65 73 20 61 62 6f 76 65 2c 20 70 46 72 6f  ries above, pFro
23860 6d 2d 3e 70 54 61 62 0a 2a 2a 20 61 6e 64 20 6f  m->pTab.** and o
23870 74 68 65 72 20 66 69 65 6c 64 73 20 61 72 65 20  ther fields are 
23880 70 6f 70 75 6c 61 74 65 64 20 61 63 63 6f 72 64  populated accord
23890 69 6e 67 6c 79 2e 20 54 68 65 20 63 61 6c 6c 65  ingly. The calle
238a0 72 20 73 68 6f 75 6c 64 20 63 68 65 63 6b 0a 2a  r should check.*
238b0 2a 20 28 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d  * (pFrom->pTab!=
238c0 30 29 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  0) to determine 
238d0 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61  whether or not a
238e0 20 73 75 63 63 65 73 73 66 75 6c 20 6d 61 74 63   successful matc
238f0 68 0a 2a 2a 20 77 61 73 20 66 6f 75 6e 64 2e 0a  h.** was found..
23900 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72  **.** Whether or
23910 20 6e 6f 74 20 61 20 6d 61 74 63 68 20 69 73 20   not a match is 
23920 66 6f 75 6e 64 2c 20 53 51 4c 49 54 45 5f 4f 4b  found, SQLITE_OK
23930 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
23940 6e 6f 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75  no error.** occu
23950 72 73 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  rs. If an error 
23960 64 6f 65 73 20 6f 63 63 75 72 2c 20 61 6e 20 65  does occur, an e
23970 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20  rror message is 
23980 73 74 6f 72 65 64 20 69 6e 20 74 68 65 0a 2a 2a  stored in the.**
23990 20 70 61 72 73 65 72 20 61 6e 64 20 73 6f 6d 65   parser and some
239a0 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65   error code othe
239b0 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b  r than SQLITE_OK
239c0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
239d0 61 74 69 63 20 69 6e 74 20 77 69 74 68 45 78 70  atic int withExp
239e0 61 6e 64 28 0a 20 20 57 61 6c 6b 65 72 20 2a 70  and(.  Walker *p
239f0 57 61 6c 6b 65 72 2c 20 0a 20 20 73 74 72 75 63  Walker, .  struc
23a00 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
23a10 70 46 72 6f 6d 0a 29 7b 0a 20 20 50 61 72 73 65  pFrom.){.  Parse
23a20 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b   *pParse = pWalk
23a30 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 73 71  er->pParse;.  sq
23a40 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
23a50 73 65 2d 3e 64 62 3b 0a 20 20 73 74 72 75 63 74  se->db;.  struct
23a60 20 43 74 65 20 2a 70 43 74 65 3b 20 20 20 20 20   Cte *pCte;     
23a70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 74            /* Mat
23a80 63 68 65 64 20 43 54 45 20 28 6f 72 20 4e 55 4c  ched CTE (or NUL
23a90 4c 20 69 66 20 6e 6f 20 6d 61 74 63 68 29 20 2a  L if no match) *
23aa0 2f 0a 20 20 57 69 74 68 20 2a 70 57 69 74 68 3b  /.  With *pWith;
23ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ac0 20 20 20 20 2f 2a 20 57 49 54 48 20 63 6c 61 75      /* WITH clau
23ad0 73 65 20 74 68 61 74 20 70 43 74 65 20 62 65 6c  se that pCte bel
23ae0 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20 20 61 73  ongs to */..  as
23af0 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61  sert( pFrom->pTa
23b00 62 3d 3d 30 20 29 3b 0a 0a 20 20 70 43 74 65 20  b==0 );..  pCte 
23b10 3d 20 73 65 61 72 63 68 57 69 74 68 28 70 50 61  = searchWith(pPa
23b20 72 73 65 2d 3e 70 57 69 74 68 2c 20 70 46 72 6f  rse->pWith, pFro
23b30 6d 2c 20 26 70 57 69 74 68 29 3b 0a 20 20 69 66  m, &pWith);.  if
23b40 28 20 70 43 74 65 20 29 7b 0a 20 20 20 20 54 61  ( pCte ){.    Ta
23b50 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 45  ble *pTab;.    E
23b60 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
23b70 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65  .    Select *pSe
23b80 6c 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  l;.    Select *p
23b90 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20 20 20  Left;           
23ba0 20 20 20 20 20 2f 2a 20 4c 65 66 74 2d 6d 6f 73       /* Left-mos
23bb0 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  t SELECT stateme
23bc0 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 4d  nt */.    int bM
23bd0 61 79 52 65 63 75 72 73 69 76 65 3b 20 20 20 20  ayRecursive;    
23be0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
23bf0 69 66 20 63 6f 6d 70 6f 75 6e 64 20 6a 6f 69 6e  if compound join
23c00 65 64 20 62 79 20 55 4e 49 4f 4e 20 5b 41 4c 4c  ed by UNION [ALL
23c10 5d 20 2a 2f 0a 20 20 20 20 57 69 74 68 20 2a 70  ] */.    With *p
23c20 53 61 76 65 64 57 69 74 68 3b 20 20 20 20 20 20  SavedWith;      
23c30 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61         /* Initia
23c40 6c 20 76 61 6c 75 65 20 6f 66 20 70 50 61 72 73  l value of pPars
23c50 65 2d 3e 70 57 69 74 68 20 2a 2f 0a 0a 20 20 20  e->pWith */..   
23c60 20 2f 2a 20 49 66 20 70 43 74 65 2d 3e 7a 43 74   /* If pCte->zCt
23c70 65 45 72 72 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c  eErr is non-NULL
23c80 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   at this point, 
23c90 74 68 65 6e 20 74 68 69 73 20 69 73 20 61 6e 20  then this is an 
23ca0 69 6c 6c 65 67 61 6c 0a 20 20 20 20 2a 2a 20 72  illegal.    ** r
23cb0 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e  ecursive referen
23cc0 63 65 20 74 6f 20 43 54 45 20 70 43 74 65 2e 20  ce to CTE pCte. 
23cd0 4c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69  Leave an error i
23ce0 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74  n pParse and ret
23cf0 75 72 6e 0a 20 20 20 20 2a 2a 20 65 61 72 6c 79  urn.    ** early
23d00 2e 20 49 66 20 70 43 74 65 2d 3e 7a 43 74 65 45  . If pCte->zCteE
23d10 72 72 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  rr is NULL, then
23d20 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72   this is not a r
23d30 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e  ecursive referen
23d40 63 65 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68  ce..    ** In th
23d50 69 73 20 63 61 73 65 2c 20 70 72 6f 63 65 65 64  is case, proceed
23d60 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43  .  */.    if( pC
23d70 74 65 2d 3e 7a 43 74 65 45 72 72 20 29 7b 0a 20  te->zCteErr ){. 
23d80 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
23d90 72 4d 73 67 28 70 50 61 72 73 65 2c 20 70 43 74  rMsg(pParse, pCt
23da0 65 2d 3e 7a 43 74 65 45 72 72 2c 20 70 43 74 65  e->zCteErr, pCte
23db0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
23dc0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
23dd0 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
23de0 66 28 20 63 61 6e 6e 6f 74 42 65 46 75 6e 63 74  f( cannotBeFunct
23df0 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 46 72 6f  ion(pParse, pFro
23e00 6d 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  m) ) return SQLI
23e10 54 45 5f 45 52 52 4f 52 3b 0a 0a 20 20 20 20 61  TE_ERROR;..    a
23e20 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54  ssert( pFrom->pT
23e30 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 70 46 72  ab==0 );.    pFr
23e40 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20  om->pTab = pTab 
23e50 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
23e60 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
23e70 28 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 69 66  (Table));.    if
23e80 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75  ( pTab==0 ) retu
23e90 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
23ea0 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31    pTab->nRef = 1
23eb0 3b 0a 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d  ;.    pTab->zNam
23ec0 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
23ed0 44 75 70 28 64 62 2c 20 70 43 74 65 2d 3e 7a 4e  Dup(db, pCte->zN
23ee0 61 6d 65 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e  ame);.    pTab->
23ef0 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20 20  iPKey = -1;.    
23f00 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74  pTab->nRowLogEst
23f10 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28 20   = 200; assert( 
23f20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45  200==sqlite3LogE
23f30 73 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a 20  st(1048576) );. 
23f40 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67     pTab->tabFlag
23f50 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65 72 61  s |= TF_Ephemera
23f60 6c 20 7c 20 54 46 5f 4e 6f 56 69 73 69 62 6c 65  l | TF_NoVisible
23f70 52 6f 77 69 64 3b 0a 20 20 20 20 70 46 72 6f 6d  Rowid;.    pFrom
23f80 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ->pSelect = sqli
23f90 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
23fa0 20 70 43 74 65 2d 3e 70 53 65 6c 65 63 74 2c 20   pCte->pSelect, 
23fb0 30 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  0);.    if( db->
23fc0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
23fd0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
23fe0 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73 73  EM_BKPT;.    ass
23ff0 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  ert( pFrom->pSel
24000 65 63 74 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  ect );..    /* C
24010 68 65 63 6b 20 69 66 20 74 68 69 73 20 69 73 20  heck if this is 
24020 61 20 72 65 63 75 72 73 69 76 65 20 43 54 45 2e  a recursive CTE.
24030 20 2a 2f 0a 20 20 20 20 70 53 65 6c 20 3d 20 70   */.    pSel = p
24040 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  From->pSelect;. 
24050 20 20 20 62 4d 61 79 52 65 63 75 72 73 69 76 65     bMayRecursive
24060 20 3d 20 28 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54   = ( pSel->op==T
24070 4b 5f 41 4c 4c 20 7c 7c 20 70 53 65 6c 2d 3e 6f  K_ALL || pSel->o
24080 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20  p==TK_UNION );. 
24090 20 20 20 69 66 28 20 62 4d 61 79 52 65 63 75 72     if( bMayRecur
240a0 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 69 6e  sive ){.      in
240b0 74 20 69 3b 0a 20 20 20 20 20 20 53 72 63 4c 69  t i;.      SrcLi
240c0 73 74 20 2a 70 53 72 63 20 3d 20 70 46 72 6f 6d  st *pSrc = pFrom
240d0 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b  ->pSelect->pSrc;
240e0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
240f0 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b  i<pSrc->nSrc; i+
24100 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75  +){.        stru
24110 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
24120 2a 70 49 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e  *pItem = &pSrc->
24130 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  a[i];.        if
24140 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  ( pItem->zDataba
24150 73 65 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20  se==0 .         
24160 26 26 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 21  && pItem->zName!
24170 3d 30 20 0a 20 20 20 20 20 20 20 20 20 26 26 20  =0 .         && 
24180 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d  0==sqlite3StrICm
24190 70 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20  p(pItem->zName, 
241a0 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 0a 20 20 20  pCte->zName).   
241b0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
241c0 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 20      pItem->pTab 
241d0 3d 20 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  = pTab;.        
241e0 20 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 52 65    pItem->fg.isRe
241f0 63 75 72 73 69 76 65 20 3d 20 31 3b 0a 20 20 20  cursive = 1;.   
24200 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65         pTab->nRe
24210 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70  f++;.          p
24220 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d  Sel->selFlags |=
24230 20 53 46 5f 52 65 63 75 72 73 69 76 65 3b 0a 20   SF_Recursive;. 
24240 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
24250 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f  .    }..    /* O
24260 6e 6c 79 20 6f 6e 65 20 72 65 63 75 72 73 69 76  nly one recursiv
24270 65 20 72 65 66 65 72 65 6e 63 65 20 69 73 20 70  e reference is p
24280 65 72 6d 69 74 74 65 64 2e 20 2a 2f 20 0a 20 20  ermitted. */ .  
24290 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 52 65 66    if( pTab->nRef
242a0 3e 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  >2 ){.      sqli
242b0 74 65 33 45 72 72 6f 72 4d 73 67 28 0a 20 20 20  te3ErrorMsg(.   
242c0 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 22         pParse, "
242d0 6d 75 6c 74 69 70 6c 65 20 72 65 66 65 72 65 6e  multiple referen
242e0 63 65 73 20 74 6f 20 72 65 63 75 72 73 69 76 65  ces to recursive
242f0 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 70 43 74   table: %s", pCt
24300 65 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29  e->zName.      )
24310 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
24320 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
24330 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
24340 54 61 62 2d 3e 6e 52 65 66 3d 3d 31 20 7c 7c 20  Tab->nRef==1 || 
24350 28 28 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73  ((pSel->selFlags
24360 26 53 46 5f 52 65 63 75 72 73 69 76 65 29 20 26  &SF_Recursive) &
24370 26 20 70 54 61 62 2d 3e 6e 52 65 66 3d 3d 32 20  & pTab->nRef==2 
24380 29 29 3b 0a 0a 20 20 20 20 70 43 74 65 2d 3e 7a  ));..    pCte->z
24390 43 74 65 45 72 72 20 3d 20 22 63 69 72 63 75 6c  CteErr = "circul
243a0 61 72 20 72 65 66 65 72 65 6e 63 65 3a 20 25 73  ar reference: %s
243b0 22 3b 0a 20 20 20 20 70 53 61 76 65 64 57 69 74  ";.    pSavedWit
243c0 68 20 3d 20 70 50 61 72 73 65 2d 3e 70 57 69 74  h = pParse->pWit
243d0 68 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70  h;.    pParse->p
243e0 57 69 74 68 20 3d 20 70 57 69 74 68 3b 0a 20 20  With = pWith;.  
243f0 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
24400 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 62 4d 61  ect(pWalker, bMa
24410 79 52 65 63 75 72 73 69 76 65 20 3f 20 70 53 65  yRecursive ? pSe
24420 6c 2d 3e 70 50 72 69 6f 72 20 3a 20 70 53 65 6c  l->pPrior : pSel
24430 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70  );.    pParse->p
24440 57 69 74 68 20 3d 20 70 57 69 74 68 3b 0a 0a 20  With = pWith;.. 
24450 20 20 20 66 6f 72 28 70 4c 65 66 74 3d 70 53 65     for(pLeft=pSe
24460 6c 3b 20 70 4c 65 66 74 2d 3e 70 50 72 69 6f 72  l; pLeft->pPrior
24470 3b 20 70 4c 65 66 74 3d 70 4c 65 66 74 2d 3e 70  ; pLeft=pLeft->p
24480 50 72 69 6f 72 29 3b 0a 20 20 20 20 70 45 4c 69  Prior);.    pELi
24490 73 74 20 3d 20 70 4c 65 66 74 2d 3e 70 45 4c 69  st = pLeft->pELi
244a0 73 74 3b 0a 20 20 20 20 69 66 28 20 70 43 74 65  st;.    if( pCte
244b0 2d 3e 70 43 6f 6c 73 20 29 7b 0a 20 20 20 20 20  ->pCols ){.     
244c0 20 69 66 28 20 70 45 4c 69 73 74 20 26 26 20 70   if( pEList && p
244d0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 43  EList->nExpr!=pC
244e0 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78 70 72  te->pCols->nExpr
244f0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
24500 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
24510 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 68 61  se, "table %s ha
24520 73 20 25 64 20 76 61 6c 75 65 73 20 66 6f 72 20  s %d values for 
24530 25 64 20 63 6f 6c 75 6d 6e 73 22 2c 0a 20 20 20  %d columns",.   
24540 20 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a           pCte->z
24550 4e 61 6d 65 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  Name, pEList->nE
24560 78 70 72 2c 20 70 43 74 65 2d 3e 70 43 6f 6c 73  xpr, pCte->pCols
24570 2d 3e 6e 45 78 70 72 0a 20 20 20 20 20 20 20 20  ->nExpr.        
24580 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  );.        pPars
24590 65 2d 3e 70 57 69 74 68 20 3d 20 70 53 61 76 65  e->pWith = pSave
245a0 64 57 69 74 68 3b 0a 20 20 20 20 20 20 20 20 72  dWith;.        r
245b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
245c0 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
245d0 20 20 70 45 4c 69 73 74 20 3d 20 70 43 74 65 2d    pEList = pCte-
245e0 3e 70 43 6f 6c 73 3b 0a 20 20 20 20 7d 0a 0a 20  >pCols;.    }.. 
245f0 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e     sqlite3Column
24600 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  sFromExprList(pP
24610 61 72 73 65 2c 20 70 45 4c 69 73 74 2c 20 26 70  arse, pEList, &p
24620 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62  Tab->nCol, &pTab
24630 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28  ->aCol);.    if(
24640 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 20 29   bMayRecursive )
24650 7b 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 6c  {.      if( pSel
24660 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
24670 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20  Recursive ){.   
24680 20 20 20 20 20 70 43 74 65 2d 3e 7a 43 74 65 45       pCte->zCteE
24690 72 72 20 3d 20 22 6d 75 6c 74 69 70 6c 65 20 72  rr = "multiple r
246a0 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e  ecursive referen
246b0 63 65 73 3a 20 25 73 22 3b 0a 20 20 20 20 20 20  ces: %s";.      
246c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
246d0 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20 22  Cte->zCteErr = "
246e0 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65  recursive refere
246f0 6e 63 65 20 69 6e 20 61 20 73 75 62 71 75 65 72  nce in a subquer
24700 79 3a 20 25 73 22 3b 0a 20 20 20 20 20 20 7d 0a  y: %s";.      }.
24710 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c        sqlite3Wal
24720 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c  kSelect(pWalker,
24730 20 70 53 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20   pSel);.    }.  
24740 20 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20    pCte->zCteErr 
24750 3d 20 30 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  = 0;.    pParse-
24760 3e 70 57 69 74 68 20 3d 20 70 53 61 76 65 64 57  >pWith = pSavedW
24770 69 74 68 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ith;.  }..  retu
24780 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
24790 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
247a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
247b0 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53 45 4c  /*.** If the SEL
247c0 45 43 54 20 70 61 73 73 65 64 20 61 73 20 74 68  ECT passed as th
247d0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
247e0 74 20 68 61 73 20 61 6e 20 61 73 73 6f 63 69 61  t has an associa
247f0 74 65 64 20 57 49 54 48 20 0a 2a 2a 20 63 6c 61  ted WITH .** cla
24800 75 73 65 2c 20 70 6f 70 20 69 74 20 66 72 6f 6d  use, pop it from
24810 20 74 68 65 20 73 74 61 63 6b 20 73 74 6f 72 65   the stack store
24820 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  d as part of the
24830 20 50 61 72 73 65 20 6f 62 6a 65 63 74 2e 0a 2a   Parse object..*
24840 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
24850 6f 6e 20 69 73 20 75 73 65 64 20 61 73 20 74 68  on is used as th
24860 65 20 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  e xSelectCallbac
24870 6b 32 28 29 20 63 61 6c 6c 62 61 63 6b 20 62 79  k2() callback by
24880 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63  .** sqlite3Selec
24890 74 45 78 70 61 6e 64 28 29 20 77 68 65 6e 20 77  tExpand() when w
248a0 61 6c 6b 69 6e 67 20 61 20 53 45 4c 45 43 54 20  alking a SELECT 
248b0 74 72 65 65 20 74 6f 20 72 65 73 6f 6c 76 65 20  tree to resolve 
248c0 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20 61  table.** names a
248d0 6e 64 20 6f 74 68 65 72 20 46 52 4f 4d 20 63 6c  nd other FROM cl
248e0 61 75 73 65 20 65 6c 65 6d 65 6e 74 73 2e 20 0a  ause elements. .
248f0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
24900 65 6c 65 63 74 50 6f 70 57 69 74 68 28 57 61 6c  electPopWith(Wal
24910 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
24920 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73  lect *p){.  Pars
24930 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c  e *pParse = pWal
24940 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 57  ker->pParse;.  W
24950 69 74 68 20 2a 70 57 69 74 68 20 3d 20 66 69 6e  ith *pWith = fin
24960 64 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e 70  dRightmost(p)->p
24970 57 69 74 68 3b 0a 20 20 69 66 28 20 70 57 69 74  With;.  if( pWit
24980 68 21 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  h!=0 ){.    asse
24990 72 74 28 20 70 50 61 72 73 65 2d 3e 70 57 69 74  rt( pParse->pWit
249a0 68 3d 3d 70 57 69 74 68 20 29 3b 0a 20 20 20 20  h==pWith );.    
249b0 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20  pParse->pWith = 
249c0 70 57 69 74 68 2d 3e 70 4f 75 74 65 72 3b 0a 20  pWith->pOuter;. 
249d0 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69   }.}.#else.#defi
249e0 6e 65 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68  ne selectPopWith
249f0 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   0.#endif../*.**
24a00 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
24a10 20 61 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61   a Walker callba
24a20 63 6b 20 66 6f 72 20 22 65 78 70 61 6e 64 69 6e  ck for "expandin
24a30 67 22 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  g" a SELECT stat
24a40 65 6d 65 6e 74 2e 0a 2a 2a 20 22 45 78 70 61 6e  ement..** "Expan
24a50 64 69 6e 67 22 20 6d 65 61 6e 73 20 74 6f 20 64  ding" means to d
24a60 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  o the following:
24a70 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 4d  .**.**    (1)  M
24a80 61 6b 65 20 73 75 72 65 20 56 44 42 45 20 63 75  ake sure VDBE cu
24a90 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76  rsor numbers hav
24aa0 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20  e been assigned 
24ab0 74 6f 20 65 76 65 72 79 0a 2a 2a 20 20 20 20 20  to every.**     
24ac0 20 20 20 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74      element of t
24ad0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a  he FROM clause..
24ae0 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 46 69  **.**    (2)  Fi
24af0 6c 6c 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69  ll in the pTabLi
24b00 73 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65  st->a[].pTab fie
24b10 6c 64 73 20 69 6e 20 74 68 65 20 53 72 63 4c 69  lds in the SrcLi
24b20 73 74 20 74 68 61 74 20 0a 2a 2a 20 20 20 20 20  st that .**     
24b30 20 20 20 20 64 65 66 69 6e 65 73 20 46 52 4f 4d      defines FROM
24b40 20 63 6c 61 75 73 65 2e 20 20 57 68 65 6e 20 76   clause.  When v
24b50 69 65 77 73 20 61 70 70 65 61 72 20 69 6e 20 74  iews appear in t
24b60 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a  he FROM clause,.
24b70 2a 2a 20 20 20 20 20 20 20 20 20 66 69 6c 6c 20  **         fill 
24b80 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53  pTabList->a[].pS
24b90 65 6c 65 63 74 20 77 69 74 68 20 61 20 63 6f 70  elect with a cop
24ba0 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  y of the SELECT 
24bb0 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20  statement.**    
24bc0 20 20 20 20 20 74 68 61 74 20 69 6d 70 6c 65 6d       that implem
24bd0 65 6e 74 73 20 74 68 65 20 76 69 65 77 2e 20 20  ents the view.  
24be0 41 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f  A copy is made o
24bf0 66 20 74 68 65 20 76 69 65 77 27 73 20 53 45 4c  f the view's SEL
24c00 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 73  ECT.**         s
24c10 74 61 74 65 6d 65 6e 74 20 73 6f 20 74 68 61 74  tatement so that
24c20 20 77 65 20 63 61 6e 20 66 72 65 65 6c 79 20 6d   we can freely m
24c30 6f 64 69 66 79 20 6f 72 20 64 65 6c 65 74 65 20  odify or delete 
24c40 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74 0a 2a  that statement.*
24c50 2a 20 20 20 20 20 20 20 20 20 77 69 74 68 6f 75  *         withou
24c60 74 20 77 6f 72 72 79 69 6e 67 20 61 62 6f 75 74  t worrying about
24c70 20 6d 65 73 73 69 6e 67 20 75 70 20 74 68 65 20   messing up the 
24c80 70 65 72 73 69 73 74 65 6e 74 20 72 65 70 72 65  persistent repre
24c90 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20 20 20  sentation.**    
24ca0 20 20 20 20 20 6f 66 20 74 68 65 20 76 69 65 77       of the view
24cb0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20  ..**.**    (3)  
24cc0 41 64 64 20 74 65 72 6d 73 20 74 6f 20 74 68 65  Add terms to the
24cd0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f   WHERE clause to
24ce0 20 61 63 63 6f 6d 6d 6f 64 61 74 65 20 74 68 65   accommodate the
24cf0 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64   NATURAL keyword
24d00 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e 20 6a  .**         on j
24d10 6f 69 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e 20  oins and the ON 
24d20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65  and USING clause
24d30 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a   of joins..**.**
24d40 20 20 20 20 28 34 29 20 20 53 63 61 6e 20 74 68      (4)  Scan th
24d50 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  e list of column
24d60 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  s in the result 
24d70 73 65 74 20 28 70 45 4c 69 73 74 29 20 6c 6f 6f  set (pEList) loo
24d80 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20  king.**         
24d90 66 6f 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66  for instances of
24da0 20 74 68 65 20 22 2a 22 20 6f 70 65 72 61 74 6f   the "*" operato
24db0 72 20 6f 72 20 74 68 65 20 54 41 42 4c 45 2e 2a  r or the TABLE.*
24dc0 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20 20   operator..**   
24dd0 20 20 20 20 20 20 49 66 20 66 6f 75 6e 64 2c 20        If found, 
24de0 65 78 70 61 6e 64 20 65 61 63 68 20 22 2a 22 20  expand each "*" 
24df0 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75  to be every colu
24e00 6d 6e 20 69 6e 20 65 76 65 72 79 20 74 61 62 6c  mn in every tabl
24e10 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 6e 64  e.**         and
24e20 20 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20 65   TABLE.* to be e
24e30 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 54  very column in T
24e40 41 42 4c 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74  ABLE..**.*/.stat
24e50 69 63 20 69 6e 74 20 73 65 6c 65 63 74 45 78 70  ic int selectExp
24e60 61 6e 64 65 72 28 57 61 6c 6b 65 72 20 2a 70 57  ander(Walker *pW
24e70 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70  alker, Select *p
24e80 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  ){.  Parse *pPar
24e90 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50  se = pWalker->pP
24ea0 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  arse;.  int i, j
24eb0 2c 20 6b 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a  , k;.  SrcList *
24ec0 70 54 61 62 4c 69 73 74 3b 0a 20 20 45 78 70 72  pTabList;.  Expr
24ed0 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20  List *pEList;.  
24ee0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
24ef0 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20 73 71  tem *pFrom;.  sq
24f00 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
24f10 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a  se->db;.  Expr *
24f20 70 45 2c 20 2a 70 52 69 67 68 74 2c 20 2a 70 45  pE, *pRight, *pE
24f30 78 70 72 3b 0a 20 20 75 31 36 20 73 65 6c 46 6c  xpr;.  u16 selFl
24f40 61 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61 67  ags = p->selFlag
24f50 73 3b 0a 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67  s;..  p->selFlag
24f60 73 20 7c 3d 20 53 46 5f 45 78 70 61 6e 64 65 64  s |= SF_Expanded
24f70 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
24f80 6f 63 46 61 69 6c 65 64 20 20 29 7b 0a 20 20 20  ocFailed  ){.   
24f90 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
24fa0 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4e 45 56  t;.  }.  if( NEV
24fb0 45 52 28 70 2d 3e 70 53 72 63 3d 3d 30 29 20 7c  ER(p->pSrc==0) |
24fc0 7c 20 28 73 65 6c 46 6c 61 67 73 20 26 20 53 46  | (selFlags & SF
24fd0 5f 45 78 70 61 6e 64 65 64 29 21 3d 30 20 29 7b  _Expanded)!=0 ){
24fe0 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
24ff0 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 70 54 61  Prune;.  }.  pTa
25000 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
25010 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  .  pEList = p->p
25020 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 57 61  EList;.  if( pWa
25030 6c 6b 65 72 2d 3e 78 53 65 6c 65 63 74 43 61 6c  lker->xSelectCal
25040 6c 62 61 63 6b 32 3d 3d 73 65 6c 65 63 74 50 6f  lback2==selectPo
25050 70 57 69 74 68 20 29 7b 0a 20 20 20 20 73 71 6c  pWith ){.    sql
25060 69 74 65 33 57 69 74 68 50 75 73 68 28 70 50 61  ite3WithPush(pPa
25070 72 73 65 2c 20 66 69 6e 64 52 69 67 68 74 6d 6f  rse, findRightmo
25080 73 74 28 70 29 2d 3e 70 57 69 74 68 2c 20 30 29  st(p)->pWith, 0)
25090 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
250a0 20 73 75 72 65 20 63 75 72 73 6f 72 20 6e 75 6d   sure cursor num
250b0 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20 61  bers have been a
250c0 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 65  ssigned to all e
250d0 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a 2a 20 74  ntries in.  ** t
250e0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
250f0 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  f the SELECT sta
25100 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 73  tement..  */.  s
25110 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73  qlite3SrcListAss
25120 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73  ignCursors(pPars
25130 65 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a 0a 20  e, pTabList);.. 
25140 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72   /* Look up ever
25150 79 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 69 6e  y table named in
25160 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
25170 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e 20   of the select. 
25180 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e 74 72   If.  ** an entr
25190 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  y of the FROM cl
251a0 61 75 73 65 20 69 73 20 61 20 73 75 62 71 75 65  ause is a subque
251b0 72 79 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20  ry instead of a 
251c0 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2c 0a 20  table or view,. 
251d0 20 2a 2a 20 74 68 65 6e 20 63 72 65 61 74 65 20   ** then create 
251e0 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c  a transient tabl
251f0 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 64  e structure to d
25200 65 73 63 72 69 62 65 20 74 68 65 20 73 75 62 71  escribe the subq
25210 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  uery..  */.  for
25220 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62  (i=0, pFrom=pTab
25230 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c  List->a; i<pTabL
25240 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
25250 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61  pFrom++){.    Ta
25260 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 61  ble *pTab;.    a
25270 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 66 67  ssert( pFrom->fg
25280 2e 69 73 52 65 63 75 72 73 69 76 65 3d 3d 30 20  .isRecursive==0 
25290 7c 7c 20 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d  || pFrom->pTab!=
252a0 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 46 72  0 );.    if( pFr
252b0 6f 6d 2d 3e 66 67 2e 69 73 52 65 63 75 72 73 69  om->fg.isRecursi
252c0 76 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ve ) continue;. 
252d0 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
252e0 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 23 69 66  ->pTab==0 );.#if
252f0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
25300 5f 43 54 45 0a 20 20 20 20 69 66 28 20 77 69 74  _CTE.    if( wit
25310 68 45 78 70 61 6e 64 28 70 57 61 6c 6b 65 72 2c  hExpand(pWalker,
25320 20 70 46 72 6f 6d 29 20 29 20 72 65 74 75 72 6e   pFrom) ) return
25330 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
25340 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20  if( pFrom->pTab 
25350 29 20 7b 7d 20 65 6c 73 65 0a 23 65 6e 64 69 66  ) {} else.#endif
25360 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  .    if( pFrom->
25370 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69 66 6e  zName==0 ){.#ifn
25380 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
25390 53 55 42 51 55 45 52 59 0a 20 20 20 20 20 20 53  SUBQUERY.      S
253a0 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70 46  elect *pSel = pF
253b0 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  rom->pSelect;.  
253c0 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65      /* A sub-que
253d0 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ry in the FROM c
253e0 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43  lause of a SELEC
253f0 54 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  T */.      asser
25400 74 28 20 70 53 65 6c 21 3d 30 20 29 3b 0a 20 20  t( pSel!=0 );.  
25410 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
25420 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20  m->pTab==0 );.  
25430 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
25440 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65  alkSelect(pWalke
25450 72 2c 20 70 53 65 6c 29 20 29 20 72 65 74 75 72  r, pSel) ) retur
25460 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
25470 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d     pFrom->pTab =
25480 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44   pTab = sqlite3D
25490 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
254a0 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a  sizeof(Table));.
254b0 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d        if( pTab==
254c0 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41  0 ) return WRC_A
254d0 62 6f 72 74 3b 0a 20 20 20 20 20 20 70 54 61 62  bort;.      pTab
254e0 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20  ->nRef = 1;.    
254f0 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20    pTab->zName = 
25500 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
25510 62 2c 20 22 73 71 6c 69 74 65 5f 73 71 5f 25 70  b, "sqlite_sq_%p
25520 22 2c 20 28 76 6f 69 64 2a 29 70 54 61 62 29 3b  ", (void*)pTab);
25530 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53  .      while( pS
25540 65 6c 2d 3e 70 50 72 69 6f 72 20 29 7b 20 70 53  el->pPrior ){ pS
25550 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f  el = pSel->pPrio
25560 72 3b 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74  r; }.      sqlit
25570 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70  e3ColumnsFromExp
25580 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53  rList(pParse, pS
25590 65 6c 2d 3e 70 45 4c 69 73 74 2c 26 70 54 61 62  el->pEList,&pTab
255a0 2d 3e 6e 43 6f 6c 2c 26 70 54 61 62 2d 3e 61 43  ->nCol,&pTab->aC
255b0 6f 6c 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d  ol);.      pTab-
255c0 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20  >iPKey = -1;.   
255d0 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67     pTab->nRowLog
255e0 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72  Est = 200; asser
255f0 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c  t( 200==sqlite3L
25600 6f 67 45 73 74 28 31 30 34 38 35 37 36 29 20 29  ogEst(1048576) )
25610 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74 61  ;.      pTab->ta
25620 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70 68  bFlags |= TF_Eph
25630 65 6d 65 72 61 6c 3b 0a 23 65 6e 64 69 66 0a 20  emeral;.#endif. 
25640 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
25650 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79 20 74  /* An ordinary t
25660 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d  able or view nam
25670 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  e in the FROM cl
25680 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 61 73  ause */.      as
25690 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61  sert( pFrom->pTa
256a0 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 46  b==0 );.      pF
256b0 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62  rom->pTab = pTab
256c0 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65   = sqlite3Locate
256d0 54 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65  TableItem(pParse
256e0 2c 20 30 2c 20 70 46 72 6f 6d 29 3b 0a 20 20 20  , 0, pFrom);.   
256f0 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29     if( pTab==0 )
25700 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
25710 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  t;.      if( pTa
25720 62 2d 3e 6e 52 65 66 3d 3d 30 78 66 66 66 66 20  b->nRef==0xffff 
25730 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
25740 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
25750 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 72 65 66  e, "too many ref
25760 65 72 65 6e 63 65 73 20 74 6f 20 5c 22 25 73 5c  erences to \"%s\
25770 22 3a 20 6d 61 78 20 36 35 35 33 35 22 2c 0a 20  ": max 65535",. 
25780 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e            pTab->
25790 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
257a0 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 30 3b  pFrom->pTab = 0;
257b0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
257c0 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
257d0 20 7d 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e   }.      pTab->n
257e0 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  Ref++;.      if(
257f0 20 21 49 73 56 69 72 74 75 61 6c 28 70 54 61 62   !IsVirtual(pTab
25800 29 20 26 26 20 63 61 6e 6e 6f 74 42 65 46 75 6e  ) && cannotBeFun
25810 63 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 46  ction(pParse, pF
25820 72 6f 6d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  rom) ){.        
25830 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
25840 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 21 64  ;.      }.#if !d
25850 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
25860 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66  IT_VIEW) || !def
25870 69 6e 65 64 20 28 53 51 4c 49 54 45 5f 4f 4d 49  ined (SQLITE_OMI
25880 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a  T_VIRTUALTABLE).
25890 20 20 20 20 20 20 69 66 28 20 49 73 56 69 72 74        if( IsVirt
258a0 75 61 6c 28 70 54 61 62 29 20 7c 7c 20 70 54 61  ual(pTab) || pTa
258b0 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
258c0 20 20 20 20 20 20 69 31 36 20 6e 43 6f 6c 3b 0a        i16 nCol;.
258d0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
258e0 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e  te3ViewGetColumn
258f0 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54  Names(pParse, pT
25900 61 62 29 20 29 20 72 65 74 75 72 6e 20 57 52 43  ab) ) return WRC
25910 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 20 20  _Abort;.        
25920 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
25930 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a 20 20 20  Select==0 );.   
25940 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c       pFrom->pSel
25950 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
25960 65 63 74 44 75 70 28 64 62 2c 20 70 54 61 62 2d  ectDup(db, pTab-
25970 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20  >pSelect, 0);.  
25980 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
25990 65 63 74 53 65 74 4e 61 6d 65 28 70 46 72 6f 6d  ectSetName(pFrom
259a0 2d 3e 70 53 65 6c 65 63 74 2c 20 70 54 61 62 2d  ->pSelect, pTab-
259b0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  >zName);.       
259c0 20 6e 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e 43   nCol = pTab->nC
259d0 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62  ol;.        pTab
259e0 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20  ->nCol = -1;.   
259f0 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b       sqlite3Walk
25a00 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20  Select(pWalker, 
25a10 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29 3b  pFrom->pSelect);
25a20 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e  .        pTab->n
25a30 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20  Col = nCol;.    
25a40 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
25a50 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 61 74 65 20  ..    /* Locate 
25a60 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 64 20  the index named 
25a70 62 79 20 74 68 65 20 49 4e 44 45 58 45 44 20 42  by the INDEXED B
25a80 59 20 63 6c 61 75 73 65 2c 20 69 66 20 61 6e 79  Y clause, if any
25a90 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c  . */.    if( sql
25aa0 69 74 65 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f  ite3IndexedByLoo
25ab0 6b 75 70 28 70 50 61 72 73 65 2c 20 70 46 72 6f  kup(pParse, pFro
25ac0 6d 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  m) ){.      retu
25ad0 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
25ae0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72    }.  }..  /* Pr
25af0 6f 63 65 73 73 20 4e 41 54 55 52 41 4c 20 6b 65  ocess NATURAL ke
25b00 79 77 6f 72 64 73 2c 20 61 6e 64 20 4f 4e 20 61  ywords, and ON a
25b10 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
25b20 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a   of joins..  */.
25b30 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
25b40 46 61 69 6c 65 64 20 7c 7c 20 73 71 6c 69 74 65  Failed || sqlite
25b50 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70 50 61 72  ProcessJoin(pPar
25b60 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 72 65  se, p) ){.    re
25b70 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
25b80 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 76    }..  /* For ev
25b90 65 72 79 20 22 2a 22 20 74 68 61 74 20 6f 63 63  ery "*" that occ
25ba0 75 72 73 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d  urs in the colum
25bb0 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72 74 20 74  n list, insert t
25bc0 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20 20 2a 2a  he names of.  **
25bd0 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   all columns in 
25be0 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20 41 6e 64  all tables.  And
25bf0 20 66 6f 72 20 65 76 65 72 79 20 54 41 42 4c 45   for every TABLE
25c00 2e 2a 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61  .* insert the na
25c10 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c 20  mes.  ** of all 
25c20 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41 42 4c 45  columns in TABLE
25c30 2e 20 20 54 68 65 20 70 61 72 73 65 72 20 69 6e  .  The parser in
25c40 73 65 72 74 65 64 20 61 20 73 70 65 63 69 61 6c  serted a special
25c50 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a   expression.  **
25c60 20 77 69 74 68 20 74 68 65 20 54 4b 5f 41 53 54   with the TK_AST
25c70 45 52 49 53 4b 20 6f 70 65 72 61 74 6f 72 20 66  ERISK operator f
25c80 6f 72 20 65 61 63 68 20 22 2a 22 20 74 68 61 74  or each "*" that
25c90 20 69 74 20 66 6f 75 6e 64 20 69 6e 20 74 68 65   it found in the
25ca0 20 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20 6c 69 73   column.  ** lis
25cb0 74 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  t.  The followin
25cc0 67 20 63 6f 64 65 20 6a 75 73 74 20 68 61 73 20  g code just has 
25cd0 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 54 4b  to locate the TK
25ce0 5f 41 53 54 45 52 49 53 4b 0a 20 20 2a 2a 20 65  _ASTERISK.  ** e
25cf0 78 70 72 65 73 73 69 6f 6e 73 20 61 6e 64 20 65  xpressions and e
25d00 78 70 61 6e 64 20 65 61 63 68 20 6f 6e 65 20 74  xpand each one t
25d10 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c  o the list of al
25d20 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 0a 20 20 2a  l columns in.  *
25d30 2a 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a 20 20  * all tables..  
25d40 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73  **.  ** The firs
25d50 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63 68 65 63  t loop just chec
25d60 6b 73 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ks to see if the
25d70 72 65 20 61 72 65 20 61 6e 79 20 22 2a 22 20 6f  re are any "*" o
25d80 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a 20 74 68  perators.  ** th
25d90 61 74 20 6e 65 65 64 20 65 78 70 61 6e 64 69 6e  at need expandin
25da0 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d  g..  */.  for(k=
25db0 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; k<pEList->nEx
25dc0 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 70 45  pr; k++){.    pE
25dd0 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e   = pEList->a[k].
25de0 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70  pExpr;.    if( p
25df0 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 53 54 45 52 49  E->op==TK_ASTERI
25e00 53 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  SK ) break;.    
25e10 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d  assert( pE->op!=
25e20 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52  TK_DOT || pE->pR
25e30 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20 20 61  ight!=0 );.    a
25e40 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54  ssert( pE->op!=T
25e50 4b 5f 44 4f 54 20 7c 7c 20 28 70 45 2d 3e 70 4c  K_DOT || (pE->pL
25e60 65 66 74 21 3d 30 20 26 26 20 70 45 2d 3e 70 4c  eft!=0 && pE->pL
25e70 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 29 20  eft->op==TK_ID) 
25e80 29 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f  );.    if( pE->o
25e90 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d  p==TK_DOT && pE-
25ea0 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f  >pRight->op==TK_
25eb0 41 53 54 45 52 49 53 4b 20 29 20 62 72 65 61 6b  ASTERISK ) break
25ec0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6b 3c 70 45  ;.  }.  if( k<pE
25ed0 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
25ee0 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20     /*.    ** If 
25ef0 77 65 20 67 65 74 20 68 65 72 65 20 69 74 20 6d  we get here it m
25f00 65 61 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20  eans the result 
25f10 73 65 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  set contains one
25f20 20 6f 72 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20   or more "*".   
25f30 20 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20 74 68   ** operators th
25f40 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78  at need to be ex
25f50 70 61 6e 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68  panded.  Loop th
25f60 72 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65  rough each expre
25f70 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20  ssion.    ** in 
25f80 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61  the result set a
25f90 6e 64 20 65 78 70 61 6e 64 20 74 68 65 6d 20 6f  nd expand them o
25fa0 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a  ne by one..    *
25fb0 2f 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  /.    struct Exp
25fc0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20  rList_item *a = 
25fd0 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45  pEList->a;.    E
25fe0 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20  xprList *pNew = 
25ff0 30 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73  0;.    int flags
26000 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66   = pParse->db->f
26010 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74 20 6c 6f  lags;.    int lo
26020 6e 67 4e 61 6d 65 73 20 3d 20 28 66 6c 61 67 73  ngNames = (flags
26030 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f   & SQLITE_FullCo
26040 6c 4e 61 6d 65 73 29 21 3d 30 0a 20 20 20 20 20  lNames)!=0.     
26050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26060 20 26 26 20 28 66 6c 61 67 73 20 26 20 53 51 4c   && (flags & SQL
26070 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65  ITE_ShortColName
26080 73 29 3d 3d 30 3b 0a 0a 20 20 20 20 66 6f 72 28  s)==0;..    for(
26090 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e  k=0; k<pEList->n
260a0 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  Expr; k++){.    
260b0 20 20 70 45 20 3d 20 61 5b 6b 5d 2e 70 45 78 70    pE = a[k].pExp
260c0 72 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74 20  r;.      pRight 
260d0 3d 20 70 45 2d 3e 70 52 69 67 68 74 3b 0a 20 20  = pE->pRight;.  
260e0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e      assert( pE->
260f0 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 52  op!=TK_DOT || pR
26100 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20 20 20  ight!=0 );.     
26110 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f   if( pE->op!=TK_
26120 41 53 54 45 52 49 53 4b 0a 20 20 20 20 20 20 20  ASTERISK.       
26130 26 26 20 28 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44  && (pE->op!=TK_D
26140 4f 54 20 7c 7c 20 70 52 69 67 68 74 2d 3e 6f 70  OT || pRight->op
26150 21 3d 54 4b 5f 41 53 54 45 52 49 53 4b 29 0a 20  !=TK_ASTERISK). 
26160 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
26170 2f 2a 20 54 68 69 73 20 70 61 72 74 69 63 75 6c  /* This particul
26180 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20 64 6f  ar expression do
26190 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
261a0 65 20 65 78 70 61 6e 64 65 64 2e 0a 20 20 20 20  e expanded..    
261b0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70      */.        p
261c0 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
261d0 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
261e0 73 65 2c 20 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70  se, pNew, a[k].p
261f0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69  Expr);.        i
26200 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20  f( pNew ){.     
26210 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65       pNew->a[pNe
26220 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d  w->nExpr-1].zNam
26230 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a  e = a[k].zName;.
26240 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
26250 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d  a[pNew->nExpr-1]
26260 2e 7a 53 70 61 6e 20 3d 20 61 5b 6b 5d 2e 7a 53  .zSpan = a[k].zS
26270 70 61 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 61  pan;.          a
26280 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20  [k].zName = 0;. 
26290 20 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 53           a[k].zS
262a0 70 61 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  pan = 0;.       
262b0 20 7d 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e   }.        a[k].
262c0 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20 20  pExpr = 0;.     
262d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
262e0 2f 2a 20 54 68 69 73 20 65 78 70 72 65 73 73 69  /* This expressi
262f0 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f 72 20 61  on is a "*" or a
26300 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20 6e   "TABLE.*" and n
26310 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 20  eeds to be.     
26320 20 20 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e 20     ** expanded. 
26330 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74  */.        int t
26340 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20 20  ableSeen = 0;   
26350 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 77     /* Set to 1 w
26360 68 65 6e 20 54 41 42 4c 45 20 6d 61 74 63 68 65  hen TABLE matche
26370 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61  s */.        cha
26380 72 20 2a 7a 54 4e 61 6d 65 20 3d 20 30 3b 20 20  r *zTName = 0;  
26390 20 20 20 20 20 2f 2a 20 74 65 78 74 20 6f 66 20       /* text of 
263a0 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a 2f  name of TABLE */
263b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45 2d  .        if( pE-
263c0 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20  >op==TK_DOT ){. 
263d0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
263e0 20 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20 29 3b   pE->pLeft!=0 );
263f0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
26400 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
26410 72 74 79 28 70 45 2d 3e 70 4c 65 66 74 2c 20 45  rty(pE->pLeft, E
26420 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
26430 20 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 20           zTName 
26440 3d 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 75 2e 7a  = pE->pLeft->u.z
26450 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 7d  Token;.        }
26460 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
26470 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74  , pFrom=pTabList
26480 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  ->a; i<pTabList-
26490 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f  >nSrc; i++, pFro
264a0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
264b0 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46  Table *pTab = pF
264c0 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  rom->pTab;.     
264d0 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75       Select *pSu
264e0 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  b = pFrom->pSele
264f0 63 74 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68  ct;.          ch
26500 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70  ar *zTabName = p
26510 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20  From->zAlias;.  
26520 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
26530 61 72 20 2a 7a 53 63 68 65 6d 61 4e 61 6d 65 20  ar *zSchemaName 
26540 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69  = 0;.          i
26550 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20  nt iDb;.        
26560 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d    if( zTabName==
26570 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
26580 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54 61 62   zTabName = pTab
26590 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ->zName;.       
265a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
265b0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
265c0 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  led ) break;.   
265d0 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62 3d         if( pSub=
265e0 3d 30 20 7c 7c 20 28 70 53 75 62 2d 3e 73 65 6c  =0 || (pSub->sel
265f0 46 6c 61 67 73 20 26 20 53 46 5f 4e 65 73 74 65  Flags & SF_Neste
26600 64 46 72 6f 6d 29 3d 3d 30 20 29 7b 0a 20 20 20  dFrom)==0 ){.   
26610 20 20 20 20 20 20 20 20 20 70 53 75 62 20 3d 20           pSub = 
26620 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  0;.            i
26630 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 73 71 6c  f( zTName && sql
26640 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 4e 61  ite3StrICmp(zTNa
26650 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 29 21 3d 30  me, zTabName)!=0
26660 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
26670 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
26680 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26690 20 20 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69        iDb = sqli
266a0 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
266b0 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  (db, pTab->pSche
266c0 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ma);.           
266d0 20 7a 53 63 68 65 6d 61 4e 61 6d 65 20 3d 20 69   zSchemaName = i
266e0 44 62 3e 3d 30 20 3f 20 64 62 2d 3e 61 44 62 5b  Db>=0 ? db->aDb[
266f0 69 44 62 5d 2e 7a 4e 61 6d 65 20 3a 20 22 2a 22  iDb].zName : "*"
26700 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
26710 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
26720 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a   j<pTab->nCol; j
26730 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
26740 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70   char *zName = p
26750 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  Tab->aCol[j].zNa
26760 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  me;.            
26770 63 68 61 72 20 2a 7a 43 6f 6c 6e 61 6d 65 3b 20  char *zColname; 
26780 20 2f 2a 20 54 68 65 20 63 6f 6d 70 75 74 65 64   /* The computed
26790 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a   column name */.
267a0 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72              char
267b0 20 2a 7a 54 6f 46 72 65 65 3b 20 20 20 2f 2a 20   *zToFree;   /* 
267c0 4d 61 6c 6c 6f 63 65 64 20 73 74 72 69 6e 67 20  Malloced string 
267d0 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65  that needs to be
267e0 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 20 20   freed */.      
267f0 20 20 20 20 20 20 54 6f 6b 65 6e 20 73 43 6f 6c        Token sCol
26800 6e 61 6d 65 3b 20 20 2f 2a 20 43 6f 6d 70 75 74  name;  /* Comput
26810 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 61  ed column name a
26820 73 20 61 20 74 6f 6b 65 6e 20 2a 2f 0a 0a 20 20  s a token */..  
26830 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
26840 28 20 7a 4e 61 6d 65 20 29 3b 0a 20 20 20 20 20  ( zName );.     
26850 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d         if( zTNam
26860 65 20 26 26 20 70 53 75 62 0a 20 20 20 20 20 20  e && pSub.      
26870 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
26880 33 4d 61 74 63 68 53 70 61 6e 4e 61 6d 65 28 70  3MatchSpanName(p
26890 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a  Sub->pEList->a[j
268a0 5d 2e 7a 53 70 61 6e 2c 20 30 2c 20 7a 54 4e 61  ].zSpan, 0, zTNa
268b0 6d 65 2c 20 30 29 3d 3d 30 0a 20 20 20 20 20 20  me, 0)==0.      
268c0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
268d0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
268e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a  .            }..
268f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
26900 66 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 6d 61  f a column is ma
26910 72 6b 65 64 20 61 73 20 27 68 69 64 64 65 6e 27  rked as 'hidden'
26920 2c 20 6f 6d 69 74 20 69 74 20 66 72 6f 6d 20 74  , omit it from t
26930 68 65 20 65 78 70 61 6e 64 65 64 0a 20 20 20 20  he expanded.    
26940 20 20 20 20 20 20 20 20 2a 2a 20 72 65 73 75 6c          ** resul
26950 74 2d 73 65 74 20 6c 69 73 74 20 75 6e 6c 65 73  t-set list unles
26960 73 20 74 68 65 20 53 45 4c 45 43 54 20 68 61 73  s the SELECT has
26970 20 74 68 65 20 53 46 5f 49 6e 63 6c 75 64 65 48   the SF_IncludeH
26980 69 64 64 65 6e 0a 20 20 20 20 20 20 20 20 20 20  idden.          
26990 20 20 2a 2a 20 62 69 74 20 73 65 74 2e 0a 20 20    ** bit set..  
269a0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
269b0 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 2d           if( (p-
269c0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 49  >selFlags & SF_I
269d0 6e 63 6c 75 64 65 48 69 64 64 65 6e 29 3d 3d 30  ncludeHidden)==0
269e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
269f0 20 49 73 48 69 64 64 65 6e 43 6f 6c 75 6d 6e 28   IsHiddenColumn(
26a00 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 29 20  &pTab->aCol[j]) 
26a10 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a  .            ){.
26a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
26a30 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
26a40 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
26a50 20 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 31 3b    tableSeen = 1;
26a60 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
26a70 28 20 69 3e 30 20 26 26 20 7a 54 4e 61 6d 65 3d  ( i>0 && zTName=
26a80 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
26a90 20 20 20 20 69 66 28 20 28 70 46 72 6f 6d 2d 3e      if( (pFrom->
26aa0 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  fg.jointype & JT
26ab0 5f 4e 41 54 55 52 41 4c 29 21 3d 30 0a 20 20 20  _NATURAL)!=0.   
26ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
26ad0 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e  tableAndColumnIn
26ae0 64 65 78 28 70 54 61 62 4c 69 73 74 2c 20 69 2c  dex(pTabList, i,
26af0 20 7a 4e 61 6d 65 2c 20 30 2c 20 30 29 0a 20 20   zName, 0, 0).  
26b00 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20              ){. 
26b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26b20 2a 20 49 6e 20 61 20 4e 41 54 55 52 41 4c 20 6a  * In a NATURAL j
26b30 6f 69 6e 2c 20 6f 6d 69 74 20 74 68 65 20 6a 6f  oin, omit the jo
26b40 69 6e 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20  in columns from 
26b50 74 68 65 20 0a 20 20 20 20 20 20 20 20 20 20 20  the .           
26b60 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 74 6f       ** table to
26b70 20 74 68 65 20 72 69 67 68 74 20 6f 66 20 74 68   the right of th
26b80 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 20 20 20 20  e join */.      
26b90 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
26ba0 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
26bb0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
26bc0 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 64 4c    if( sqlite3IdL
26bd0 69 73 74 49 6e 64 65 78 28 70 46 72 6f 6d 2d 3e  istIndex(pFrom->
26be0 70 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d  pUsing, zName)>=
26bf0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
26c00 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 6a 6f 69       /* In a joi
26c10 6e 20 77 69 74 68 20 61 20 55 53 49 4e 47 20 63  n with a USING c
26c20 6c 61 75 73 65 2c 20 6f 6d 69 74 20 63 6f 6c 75  lause, omit colu
26c30 6d 6e 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20  mns in the.     
26c40 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73             ** us
26c50 69 6e 67 20 63 6c 61 75 73 65 20 66 72 6f 6d 20  ing clause from 
26c60 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74 68 65  the table on the
26c70 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20   right. */.     
26c80 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
26c90 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
26ca0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
26cb0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70   }.            p
26cc0 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45  Right = sqlite3E
26cd0 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a  xpr(db, TK_ID, z
26ce0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
26cf0 20 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 7a 4e     zColname = zN
26d00 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ame;.           
26d10 20 7a 54 6f 46 72 65 65 20 3d 20 30 3b 0a 20 20   zToFree = 0;.  
26d20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f            if( lo
26d30 6e 67 4e 61 6d 65 73 20 7c 7c 20 70 54 61 62 4c  ngNames || pTabL
26d40 69 73 74 2d 3e 6e 53 72 63 3e 31 20 29 7b 0a 20  ist->nSrc>1 ){. 
26d50 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70               Exp
26d60 72 20 2a 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  r *pLeft;.      
26d70 20 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20          pLeft = 
26d80 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20  sqlite3Expr(db, 
26d90 54 4b 5f 49 44 2c 20 7a 54 61 62 4e 61 6d 65 29  TK_ID, zTabName)
26da0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
26db0 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50  pExpr = sqlite3P
26dc0 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
26dd0 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  DOT, pLeft, pRig
26de0 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ht, 0);.        
26df0 20 20 20 20 20 20 69 66 28 20 7a 53 63 68 65 6d        if( zSchem
26e00 61 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  aName ){.       
26e10 20 20 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d           pLeft =
26e20 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
26e30 20 54 4b 5f 49 44 2c 20 7a 53 63 68 65 6d 61 4e   TK_ID, zSchemaN
26e40 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
26e50 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71        pExpr = sq
26e60 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
26e70 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74  e, TK_DOT, pLeft
26e80 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  , pExpr, 0);.   
26e90 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
26ea0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c             if( l
26eb0 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20  ongNames ){.    
26ec0 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c              zCol
26ed0 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  name = sqlite3MP
26ee0 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73  rintf(db, "%s.%s
26ef0 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e 61  ", zTabName, zNa
26f00 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
26f10 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d 20 7a       zToFree = z
26f20 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20  Colname;.       
26f30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
26f40 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
26f50 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20            pExpr 
26f60 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  = pRight;.      
26f70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
26f80 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
26f90 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
26fa0 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 70  (pParse, pNew, p
26fb0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Expr);.         
26fc0 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 49     sqlite3TokenI
26fd0 6e 69 74 28 26 73 43 6f 6c 6e 61 6d 65 2c 20 7a  nit(&sColname, z
26fe0 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  Colname);.      
26ff0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
27000 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50 61  rListSetName(pPa
27010 72 73 65 2c 20 70 4e 65 77 2c 20 26 73 43 6f 6c  rse, pNew, &sCol
27020 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  name, 0);.      
27030 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 26        if( pNew &
27040 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  & (p->selFlags &
27050 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29 21   SF_NestedFrom)!
27060 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
27070 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
27080 69 73 74 5f 69 74 65 6d 20 2a 70 58 20 3d 20 26  ist_item *pX = &
27090 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45  pNew->a[pNew->nE
270a0 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20  xpr-1];.        
270b0 20 20 20 20 20 20 69 66 28 20 70 53 75 62 20 29        if( pSub )
270c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
270d0 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71    pX->zSpan = sq
270e0 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
270f0 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e  , pSub->pEList->
27100 61 5b 6a 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20  a[j].zSpan);.   
27110 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
27120 74 63 61 73 65 28 20 70 58 2d 3e 7a 53 70 61 6e  tcase( pX->zSpan
27130 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
27140 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
27150 20 20 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e              pX->
27160 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 4d  zSpan = sqlite3M
27170 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25  Printf(db, "%s.%
27180 73 2e 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20  s.%s",.         
27190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
271a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
271b0 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65 2c 20 7a    zSchemaName, z
271c0 54 61 62 4e 61 6d 65 2c 20 7a 43 6f 6c 6e 61 6d  TabName, zColnam
271d0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
271e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58      testcase( pX
271f0 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a 20 20  ->zSpan==0 );.  
27200 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
27210 20 20 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e              pX->
27220 62 53 70 61 6e 49 73 54 61 62 20 3d 20 31 3b 0a  bSpanIsTab = 1;.
27230 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
27240 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
27250 33 44 62 46 72 65 65 28 64 62 2c 20 7a 54 6f 46  3DbFree(db, zToF
27260 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ree);.          
27270 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
27280 20 20 20 20 69 66 28 20 21 74 61 62 6c 65 53 65      if( !tableSe
27290 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  en ){.          
272a0 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b 0a 20 20  if( zTName ){.  
272b0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
272c0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
272d0 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  , "no such table
272e0 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a  : %s", zTName);.
272f0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
27300 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
27310 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
27320 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c 65 73 20  rse, "no tables 
27330 73 70 65 63 69 66 69 65 64 22 29 3b 0a 20 20 20  specified");.   
27340 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27350 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
27360 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
27370 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
27380 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70  EList);.    p->p
27390 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20  EList = pNew;.  
273a0 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  }.#if SQLITE_MAX
273b0 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70 2d  _COLUMN.  if( p-
273c0 3e 70 45 4c 69 73 74 20 26 26 20 70 2d 3e 70 45  >pEList && p->pE
273d0 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e  List->nExpr>db->
273e0 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
273f0 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20  MIT_COLUMN] ){. 
27400 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
27410 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
27420 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  many columns in 
27430 72 65 73 75 6c 74 20 73 65 74 22 29 3b 0a 20 20  result set");.  
27440 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
27450 72 74 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  rt;.  }.#endif. 
27460 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
27470 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e  inue;.}../*.** N
27480 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20 66 6f 72  o-op routine for
27490 20 74 68 65 20 70 61 72 73 65 2d 74 72 65 65 20   the parse-tree 
274a0 77 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 68  walker..**.** Wh
274b0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
274c0 69 73 20 74 68 65 20 57 61 6c 6b 65 72 2e 78 45  is the Walker.xE
274d0 78 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e  xprCallback then
274e0 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
274f0 73 0a 2a 2a 20 61 72 65 20 77 61 6c 6b 65 64 20  s.** are walked 
27500 77 69 74 68 6f 75 74 20 61 6e 79 20 61 63 74 69  without any acti
27510 6f 6e 73 20 62 65 69 6e 67 20 74 61 6b 65 6e 20  ons being taken 
27520 61 74 20 65 61 63 68 20 6e 6f 64 65 2e 20 20 50  at each node.  P
27530 72 65 73 75 6d 61 62 6c 79 2c 0a 2a 2a 20 77 68  resumably,.** wh
27540 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
27550 69 73 20 75 73 65 64 20 66 6f 72 20 57 61 6c 6b  is used for Walk
27560 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b  er.xExprCallback
27570 20 74 68 65 6e 20 0a 2a 2a 20 57 61 6c 6b 65 72   then .** Walker
27580 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
27590 20 69 73 20 73 65 74 20 74 6f 20 64 6f 20 73 6f   is set to do so
275a0 6d 65 74 68 69 6e 67 20 75 73 65 66 75 6c 20 66  mething useful f
275b0 6f 72 20 65 76 65 72 79 20 0a 2a 2a 20 73 75 62  or every .** sub
275c0 71 75 65 72 79 20 69 6e 20 74 68 65 20 70 61 72  query in the par
275d0 73 65 72 20 74 72 65 65 2e 0a 2a 2f 0a 69 6e 74  ser tree..*/.int
275e0 20 73 71 6c 69 74 65 33 45 78 70 72 57 61 6c 6b   sqlite3ExprWalk
275f0 4e 6f 6f 70 28 57 61 6c 6b 65 72 20 2a 4e 6f 74  Noop(Walker *Not
27600 55 73 65 64 2c 20 45 78 70 72 20 2a 4e 6f 74 55  Used, Expr *NotU
27610 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f  sed2){.  UNUSED_
27620 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73  PARAMETER2(NotUs
27630 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20  ed, NotUsed2);. 
27640 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
27650 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  inue;.}../*.** T
27660 68 69 73 20 72 6f 75 74 69 6e 65 20 22 65 78 70  his routine "exp
27670 61 6e 64 73 22 20 61 20 53 45 4c 45 43 54 20 73  ands" a SELECT s
27680 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 61 6c 6c  tatement and all
27690 20 6f 66 20 69 74 73 20 73 75 62 71 75 65 72 69   of its subqueri
276a0 65 73 2e 0a 2a 2a 20 46 6f 72 20 61 64 64 69 74  es..** For addit
276b0 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
276c0 6e 20 6f 6e 20 77 68 61 74 20 69 74 20 6d 65 61  n on what it mea
276d0 6e 73 20 74 6f 20 22 65 78 70 61 6e 64 22 20 61  ns to "expand" a
276e0 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65   SELECT.** state
276f0 6d 65 6e 74 2c 20 73 65 65 20 74 68 65 20 63 6f  ment, see the co
27700 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 73 65 6c  mment on the sel
27710 65 63 74 45 78 70 61 6e 64 20 77 6f 72 6b 65 72  ectExpand worker
27720 20 63 61 6c 6c 62 61 63 6b 20 61 62 6f 76 65 2e   callback above.
27730 0a 2a 2a 0a 2a 2a 20 45 78 70 61 6e 64 69 6e 67  .**.** Expanding
27740 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
27750 65 6e 74 20 69 73 20 74 68 65 20 66 69 72 73 74  ent is the first
27760 20 73 74 65 70 20 69 6e 20 70 72 6f 63 65 73 73   step in process
27770 69 6e 67 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20  ing a.** SELECT 
27780 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20  statement.  The 
27790 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
277a0 20 6d 75 73 74 20 62 65 20 65 78 70 61 6e 64 65   must be expande
277b0 64 20 62 65 66 6f 72 65 0a 2a 2a 20 6e 61 6d 65  d before.** name
277c0 20 72 65 73 6f 6c 75 74 69 6f 6e 20 69 73 20 70   resolution is p
277d0 65 72 66 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a 2a 20  erformed..**.** 
277e0 49 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  If anything goes
277f0 20 77 72 6f 6e 67 2c 20 61 6e 20 65 72 72 6f 72   wrong, an error
27800 20 6d 65 73 73 61 67 65 20 69 73 20 77 72 69 74   message is writ
27810 74 65 6e 20 69 6e 74 6f 20 70 50 61 72 73 65 2e  ten into pParse.
27820 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  .** The calling 
27830 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20 64 65 74  function can det
27840 65 63 74 20 74 68 65 20 70 72 6f 62 6c 65 6d 20  ect the problem 
27850 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 70 50  by looking at pP
27860 61 72 73 65 2d 3e 6e 45 72 72 0a 2a 2a 20 61 6e  arse->nErr.** an
27870 64 2f 6f 72 20 70 50 61 72 73 65 2d 3e 64 62 2d  d/or pParse->db-
27880 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2e 0a 2a  >mallocFailed..*
27890 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
278a0 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e  lite3SelectExpan
278b0 64 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  d(Parse *pParse,
278c0 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
278d0 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  ){.  Walker w;. 
278e0 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73   memset(&w, 0, s
278f0 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78  izeof(w));.  w.x
27900 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 73  ExprCallback = s
27910 71 6c 69 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f  qlite3ExprWalkNo
27920 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d  op;.  w.pParse =
27930 20 70 50 61 72 73 65 3b 0a 20 20 69 66 28 20 70   pParse;.  if( p
27940 50 61 72 73 65 2d 3e 68 61 73 43 6f 6d 70 6f 75  Parse->hasCompou
27950 6e 64 20 29 7b 0a 20 20 20 20 77 2e 78 53 65 6c  nd ){.    w.xSel
27960 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 63 6f  ectCallback = co
27970 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65 6c  nvertCompoundSel
27980 65 63 74 54 6f 53 75 62 71 75 65 72 79 3b 0a 20  ectToSubquery;. 
27990 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65     sqlite3WalkSe
279a0 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74  lect(&w, pSelect
279b0 29 3b 0a 20 20 7d 0a 20 20 77 2e 78 53 65 6c 65  );.  }.  w.xSele
279c0 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c  ctCallback = sel
279d0 65 63 74 45 78 70 61 6e 64 65 72 3b 0a 20 20 69  ectExpander;.  i
279e0 66 28 20 28 70 53 65 6c 65 63 74 2d 3e 73 65 6c  f( (pSelect->sel
279f0 46 6c 61 67 73 20 26 20 53 46 5f 4d 75 6c 74 69  Flags & SF_Multi
27a00 56 61 6c 75 65 29 3d 3d 30 20 29 7b 0a 20 20 20  Value)==0 ){.   
27a10 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
27a20 63 6b 32 20 3d 20 73 65 6c 65 63 74 50 6f 70 57  ck2 = selectPopW
27a30 69 74 68 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ith;.  }.  sqlit
27a40 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c  e3WalkSelect(&w,
27a50 20 70 53 65 6c 65 63 74 29 3b 0a 7d 0a 0a 0a 23   pSelect);.}...#
27a60 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
27a70 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a  IT_SUBQUERY./*.*
27a80 2a 20 54 68 69 73 20 69 73 20 61 20 57 61 6c 6b  * This is a Walk
27a90 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61  er.xSelectCallba
27aa0 63 6b 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20  ck callback for 
27ab0 74 68 65 20 73 71 6c 69 74 65 33 53 65 6c 65 63  the sqlite3Selec
27ac0 74 54 79 70 65 49 6e 66 6f 28 29 0a 2a 2a 20 69  tTypeInfo().** i
27ad0 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20  nterface..**.** 
27ae0 46 6f 72 20 65 61 63 68 20 46 52 4f 4d 2d 63 6c  For each FROM-cl
27af0 61 75 73 65 20 73 75 62 71 75 65 72 79 2c 20 61  ause subquery, a
27b00 64 64 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 20  dd Column.zType 
27b10 61 6e 64 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c  and Column.zColl
27b20 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  .** information 
27b30 74 6f 20 74 68 65 20 54 61 62 6c 65 20 73 74 72  to the Table str
27b40 75 63 74 75 72 65 20 74 68 61 74 20 72 65 70 72  ucture that repr
27b50 65 73 65 6e 74 73 20 74 68 65 20 72 65 73 75 6c  esents the resul
27b60 74 20 73 65 74 0a 2a 2a 20 6f 66 20 74 68 61 74  t set.** of that
27b70 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a   subquery..**.**
27b80 20 54 68 65 20 54 61 62 6c 65 20 73 74 72 75 63   The Table struc
27b90 74 75 72 65 20 74 68 61 74 20 72 65 70 72 65 73  ture that repres
27ba0 65 6e 74 73 20 74 68 65 20 72 65 73 75 6c 74 20  ents the result 
27bb0 73 65 74 20 77 61 73 20 63 6f 6e 73 74 72 75 63  set was construc
27bc0 74 65 64 0a 2a 2a 20 62 79 20 73 65 6c 65 63 74  ted.** by select
27bd0 45 78 70 61 6e 64 65 72 28 29 20 62 75 74 20 74  Expander() but t
27be0 68 65 20 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c  he type and coll
27bf0 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f  ation informatio
27c00 6e 20 77 61 73 20 6f 6d 69 74 74 65 64 0a 2a 2a  n was omitted.**
27c10 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20 62   at that point b
27c20 65 63 61 75 73 65 20 69 64 65 6e 74 69 66 69 65  ecause identifie
27c30 72 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20 62  rs had not yet b
27c40 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 20 54  een resolved.  T
27c50 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69  his.** routine i
27c60 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 69  s called after i
27c70 64 65 6e 74 69 66 69 65 72 20 72 65 73 6f 6c 75  dentifier resolu
27c80 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
27c90 76 6f 69 64 20 73 65 6c 65 63 74 41 64 64 53 75  void selectAddSu
27ca0 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f 28 57  bqueryTypeInfo(W
27cb0 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
27cc0 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61  Select *p){.  Pa
27cd0 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 20 20 69  rse *pParse;.  i
27ce0 6e 74 20 69 3b 0a 20 20 53 72 63 4c 69 73 74 20  nt i;.  SrcList 
27cf0 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74 72  *pTabList;.  str
27d00 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
27d10 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20 61 73 73 65   *pFrom;..  asse
27d20 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  rt( p->selFlags 
27d30 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 20 29 3b  & SF_Resolved );
27d40 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73  .  assert( (p->s
27d50 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 48 61 73  elFlags & SF_Has
27d60 54 79 70 65 49 6e 66 6f 29 3d 3d 30 20 29 3b 0a  TypeInfo)==0 );.
27d70 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d    p->selFlags |=
27d80 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 3b   SF_HasTypeInfo;
27d90 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 61 6c  .  pParse = pWal
27da0 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 70  ker->pParse;.  p
27db0 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  TabList = p->pSr
27dc0 63 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46  c;.  for(i=0, pF
27dd0 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b  rom=pTabList->a;
27de0 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
27df0 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29  c; i++, pFrom++)
27e00 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
27e10 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b  b = pFrom->pTab;
27e20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61  .    assert( pTa
27e30 62 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  b!=0 );.    if( 
27e40 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20  (pTab->tabFlags 
27e50 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 21  & TF_Ephemeral)!
27e60 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  =0 ){.      /* A
27e70 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68   sub-query in th
27e80 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
27e90 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20   a SELECT */.   
27ea0 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 20     Select *pSel 
27eb0 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  = pFrom->pSelect
27ec0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 6c  ;.      if( pSel
27ed0 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c   ){.        whil
27ee0 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20  e( pSel->pPrior 
27ef0 29 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70  ) pSel = pSel->p
27f00 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 73  Prior;.        s
27f10 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79  electAddColumnTy
27f20 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70  peAndCollation(p
27f30 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 53 65  Parse, pTab, pSe
27f40 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  l);.      }.    
27f50 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  }.  }.}.#endif..
27f60 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
27f70 69 6e 65 20 61 64 64 73 20 64 61 74 61 74 79 70  ine adds datatyp
27f80 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20  e and collating 
27f90 73 65 71 75 65 6e 63 65 20 69 6e 66 6f 72 6d 61  sequence informa
27fa0 74 69 6f 6e 20 74 6f 0a 2a 2a 20 74 68 65 20 54  tion to.** the T
27fb0 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 73 20  able structures 
27fc0 6f 66 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75  of all FROM-clau
27fd0 73 65 20 73 75 62 71 75 65 72 69 65 73 20 69 6e  se subqueries in
27fe0 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61   a.** SELECT sta
27ff0 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 55 73  tement..**.** Us
28000 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  e this routine a
28010 66 74 65 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75  fter name resolu
28020 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
28030 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65  void sqlite3Sele
28040 63 74 41 64 64 54 79 70 65 49 6e 66 6f 28 50 61  ctAddTypeInfo(Pa
28050 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
28060 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 23  ect *pSelect){.#
28070 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
28080 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 57 61  IT_SUBQUERY.  Wa
28090 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74  lker w;.  memset
280a0 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77  (&w, 0, sizeof(w
280b0 29 29 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43  ));.  w.xSelectC
280c0 61 6c 6c 62 61 63 6b 32 20 3d 20 73 65 6c 65 63  allback2 = selec
280d0 74 41 64 64 53 75 62 71 75 65 72 79 54 79 70 65  tAddSubqueryType
280e0 49 6e 66 6f 3b 0a 20 20 77 2e 78 45 78 70 72 43  Info;.  w.xExprC
280f0 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65  allback = sqlite
28100 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20  3ExprWalkNoop;. 
28110 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72   w.pParse = pPar
28120 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c  se;.  sqlite3Wal
28130 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c  kSelect(&w, pSel
28140 65 63 74 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ect);.#endif.}..
28150 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
28160 69 6e 65 20 73 65 74 73 20 75 70 20 61 20 53 45  ine sets up a SE
28170 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 66  LECT statement f
28180 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20  or processing.  
28190 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  The.** following
281a0 20 69 73 20 61 63 63 6f 6d 70 6c 69 73 68 65 64   is accomplished
281b0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 20 56  :.**.**     *  V
281c0 44 42 45 20 43 75 72 73 6f 72 20 6e 75 6d 62 65  DBE Cursor numbe
281d0 72 73 20 61 72 65 20 61 73 73 69 67 6e 65 64 20  rs are assigned 
281e0 74 6f 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75  to all FROM-clau
281f0 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 20 20 20 20  se terms..**    
28200 20 2a 20 20 45 70 68 65 6d 65 72 61 6c 20 54 61   *  Ephemeral Ta
28210 62 6c 65 20 6f 62 6a 65 63 74 73 20 61 72 65 20  ble objects are 
28220 63 72 65 61 74 65 64 20 66 6f 72 20 61 6c 6c 20  created for all 
28230 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71  FROM-clause subq
28240 75 65 72 69 65 73 2e 0a 2a 2a 20 20 20 20 20 2a  ueries..**     *
28250 20 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63    ON and USING c
28260 6c 61 75 73 65 73 20 61 72 65 20 73 68 69 66 74  lauses are shift
28270 65 64 20 69 6e 74 6f 20 57 48 45 52 45 20 73 74  ed into WHERE st
28280 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 20 20 20 20  atements.**     
28290 2a 20 20 57 69 6c 64 63 61 72 64 73 20 22 2a 22  *  Wildcards "*"
282a0 20 61 6e 64 20 22 54 41 42 4c 45 2e 2a 22 20 69   and "TABLE.*" i
282b0 6e 20 72 65 73 75 6c 74 20 73 65 74 73 20 61 72  n result sets ar
282c0 65 20 65 78 70 61 6e 64 65 64 2e 0a 2a 2a 20 20  e expanded..**  
282d0 20 20 20 2a 20 20 49 64 65 6e 74 69 66 69 65 72     *  Identifier
282e0 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  s in expression 
282f0 61 72 65 20 6d 61 74 63 68 65 64 20 74 6f 20 74  are matched to t
28300 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ables..**.** Thi
28310 73 20 72 6f 75 74 69 6e 65 20 61 63 74 73 20 72  s routine acts r
28320 65 63 75 72 73 69 76 65 6c 79 20 6f 6e 20 61 6c  ecursively on al
28330 6c 20 73 75 62 71 75 65 72 69 65 73 20 77 69 74  l subqueries wit
28340 68 69 6e 20 74 68 65 20 53 45 4c 45 43 54 2e 0a  hin the SELECT..
28350 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
28360 65 6c 65 63 74 50 72 65 70 28 0a 20 20 50 61 72  electPrep(.  Par
28370 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
28380 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
28390 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
283a0 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
283b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
283c0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65  ECT statement be
283d0 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20  ing coded. */.  
283e0 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75  NameContext *pOu
283f0 74 65 72 4e 43 20 20 2f 2a 20 4e 61 6d 65 20 63  terNC  /* Name c
28400 6f 6e 74 65 78 74 20 66 6f 72 20 63 6f 6e 74 61  ontext for conta
28410 69 6e 65 72 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  iner */.){.  sql
28420 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20  ite3 *db;.  if( 
28430 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20 72 65  NEVER(p==0) ) re
28440 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70 50 61  turn;.  db = pPa
28450 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64  rse->db;.  if( d
28460 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
28470 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
28480 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
28490 5f 48 61 73 54 79 70 65 49 6e 66 6f 20 29 20 72  _HasTypeInfo ) r
284a0 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
284b0 53 65 6c 65 63 74 45 78 70 61 6e 64 28 70 50 61  SelectExpand(pPa
284c0 72 73 65 2c 20 70 29 3b 0a 20 20 69 66 28 20 70  rse, p);.  if( p
284d0 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64  Parse->nErr || d
284e0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
284f0 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69  ) return;.  sqli
28500 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 65 63 74  te3ResolveSelect
28510 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 2c  Names(pParse, p,
28520 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20 20 69 66   pOuterNC);.  if
28530 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
28540 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
28550 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  ed ) return;.  s
28560 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64 54  qlite3SelectAddT
28570 79 70 65 49 6e 66 6f 28 70 50 61 72 73 65 2c 20  ypeInfo(pParse, 
28580 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73  p);.}../*.** Res
28590 65 74 20 74 68 65 20 61 67 67 72 65 67 61 74 65  et the aggregate
285a0 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a   accumulator..**
285b0 0a 2a 2a 20 54 68 65 20 61 67 67 72 65 67 61 74  .** The aggregat
285c0 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 69 73  e accumulator is
285d0 20 61 20 73 65 74 20 6f 66 20 6d 65 6d 6f 72 79   a set of memory
285e0 20 63 65 6c 6c 73 20 74 68 61 74 20 68 6f 6c 64   cells that hold
285f0 0a 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65  .** intermediate
28600 20 72 65 73 75 6c 74 73 20 77 68 69 6c 65 20 63   results while c
28610 61 6c 63 75 6c 61 74 69 6e 67 20 61 6e 20 61 67  alculating an ag
28620 67 72 65 67 61 74 65 2e 20 20 54 68 69 73 0a 2a  gregate.  This.*
28630 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  * routine genera
28640 74 65 73 20 63 6f 64 65 20 74 68 61 74 20 73 74  tes code that st
28650 6f 72 65 73 20 4e 55 4c 4c 73 20 69 6e 20 61 6c  ores NULLs in al
28660 6c 20 6f 66 20 74 68 6f 73 65 20 6d 65 6d 6f 72  l of those memor
28670 79 0a 2a 2a 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73  y.** cells..*/.s
28680 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 65 74  tatic void reset
28690 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73  Accumulator(Pars
286a0 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e  e *pParse, AggIn
286b0 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20  fo *pAggInfo){. 
286c0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
286d0 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
286e0 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49  i;.  struct AggI
286f0 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 75 6e 63 3b  nfo_func *pFunc;
28700 0a 20 20 69 6e 74 20 6e 52 65 67 20 3d 20 70 41  .  int nReg = pA
28710 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 2b 20  ggInfo->nFunc + 
28720 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d  pAggInfo->nColum
28730 6e 3b 0a 20 20 69 66 28 20 6e 52 65 67 3d 3d 30  n;.  if( nReg==0
28740 20 29 20 72 65 74 75 72 6e 3b 0a 23 69 66 64 65   ) return;.#ifde
28750 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
28760 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20   /* Verify that 
28770 61 6c 6c 20 41 67 67 49 6e 66 6f 20 72 65 67 69  all AggInfo regi
28780 73 74 65 72 73 20 61 72 65 20 77 69 74 68 69 6e  sters are within
28790 20 74 68 65 20 72 61 6e 67 65 20 73 70 65 63 69   the range speci
287a0 66 69 65 64 20 62 79 0a 20 20 2a 2a 20 41 67 67  fied by.  ** Agg
287b0 49 6e 66 6f 2e 6d 6e 52 65 67 2e 2e 41 67 67 49  Info.mnReg..AggI
287c0 6e 66 6f 2e 6d 78 52 65 67 20 2a 2f 0a 20 20 61  nfo.mxReg */.  a
287d0 73 73 65 72 74 28 20 6e 52 65 67 3d 3d 70 41 67  ssert( nReg==pAg
287e0 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 2d 70 41 67  gInfo->mxReg-pAg
287f0 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2b 31 20 29  gInfo->mnReg+1 )
28800 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
28810 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e  AggInfo->nColumn
28820 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  ; i++){.    asse
28830 72 74 28 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43  rt( pAggInfo->aC
28840 6f 6c 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41 67 67  ol[i].iMem>=pAgg
28850 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20 20 20  Info->mnReg.    
28860 20 20 20 20 20 26 26 20 70 41 67 67 49 6e 66 6f       && pAggInfo
28870 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3c 3d  ->aCol[i].iMem<=
28880 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 20  pAggInfo->mxReg 
28890 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  );.  }.  for(i=0
288a0 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  ; i<pAggInfo->nF
288b0 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61  unc; i++){.    a
288c0 73 73 65 72 74 28 20 70 41 67 67 49 6e 66 6f 2d  ssert( pAggInfo-
288d0 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d 3e 3d  >aFunc[i].iMem>=
288e0 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a  pAggInfo->mnReg.
288f0 20 20 20 20 20 20 20 20 20 26 26 20 70 41 67 67           && pAgg
28900 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69  Info->aFunc[i].i
28910 4d 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d  Mem<=pAggInfo->m
28920 78 52 65 67 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  xReg );.  }.#end
28930 69 66 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  if.  sqlite3Vdbe
28940 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp3(v, OP_Nul
28950 6c 2c 20 30 2c 20 70 41 67 67 49 6e 66 6f 2d 3e  l, 0, pAggInfo->
28960 6d 6e 52 65 67 2c 20 70 41 67 67 49 6e 66 6f 2d  mnReg, pAggInfo-
28970 3e 6d 78 52 65 67 29 3b 0a 20 20 66 6f 72 28 70  >mxReg);.  for(p
28980 46 75 6e 63 3d 70 41 67 67 49 6e 66 6f 2d 3e 61  Func=pAggInfo->a
28990 46 75 6e 63 2c 20 69 3d 30 3b 20 69 3c 70 41 67  Func, i=0; i<pAg
289a0 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b  gInfo->nFunc; i+
289b0 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a 20 20 20  +, pFunc++){.   
289c0 20 69 66 28 20 70 46 75 6e 63 2d 3e 69 44 69 73   if( pFunc->iDis
289d0 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20  tinct>=0 ){.    
289e0 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 46 75    Expr *pE = pFu
289f0 6e 63 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  nc->pExpr;.     
28a00 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
28a10 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50  sProperty(pE, EP
28a20 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
28a30 20 20 20 20 20 69 66 28 20 70 45 2d 3e 78 2e 70       if( pE->x.p
28a40 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 78  List==0 || pE->x
28a50 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31  .pList->nExpr!=1
28a60 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
28a70 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
28a80 73 65 2c 20 22 44 49 53 54 49 4e 43 54 20 61 67  se, "DISTINCT ag
28a90 67 72 65 67 61 74 65 73 20 6d 75 73 74 20 68 61  gregates must ha
28aa0 76 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 22  ve exactly one "
28ab0 0a 20 20 20 20 20 20 20 20 20 20 20 22 61 72 67  .           "arg
28ac0 75 6d 65 6e 74 22 29 3b 0a 20 20 20 20 20 20 20  ument");.       
28ad0 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63   pFunc->iDistinc
28ae0 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65  t = -1;.      }e
28af0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 4b 65 79  lse{.        Key
28b00 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
28b10 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72   keyInfoFromExpr
28b20 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 45 2d  List(pParse, pE-
28b30 3e 78 2e 70 4c 69 73 74 2c 20 30 2c 20 30 29 3b  >x.pList, 0, 0);
28b40 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
28b50 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
28b60 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
28b70 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74  pFunc->iDistinct
28b80 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
28b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ba0 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66    (char*)pKeyInf
28bb0 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  o, P4_KEYINFO);.
28bc0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
28bd0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  }.}../*.** Invok
28be0 65 20 74 68 65 20 4f 50 5f 41 67 67 46 69 6e 61  e the OP_AggFina
28bf0 6c 69 7a 65 20 6f 70 63 6f 64 65 20 66 6f 72 20  lize opcode for 
28c00 65 76 65 72 79 20 61 67 67 72 65 67 61 74 65 20  every aggregate 
28c10 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74  function.** in t
28c20 68 65 20 41 67 67 49 6e 66 6f 20 73 74 72 75 63  he AggInfo struc
28c30 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
28c40 76 6f 69 64 20 66 69 6e 61 6c 69 7a 65 41 67 67  void finalizeAgg
28c50 46 75 6e 63 74 69 6f 6e 73 28 50 61 72 73 65 20  Functions(Parse 
28c60 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f  *pParse, AggInfo
28c70 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56   *pAggInfo){.  V
28c80 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
28c90 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
28ca0 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66  .  struct AggInf
28cb0 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 66 6f  o_func *pF;.  fo
28cc0 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e  r(i=0, pF=pAggIn
28cd0 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67  fo->aFunc; i<pAg
28ce0 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b  gInfo->nFunc; i+
28cf0 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 45 78  +, pF++){.    Ex
28d00 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
28d10 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69  pF->pExpr->x.pLi
28d20 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  st;.    assert( 
28d30 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
28d40 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78  (pF->pExpr, EP_x
28d50 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
28d60 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
28d70 70 34 28 76 2c 20 4f 50 5f 41 67 67 46 69 6e 61  p4(v, OP_AggFina
28d80 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 70 4c 69  l, pF->iMem, pLi
28d90 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70  st ? pList->nExp
28da0 72 20 3a 20 30 2c 20 30 2c 0a 20 20 20 20 20 20  r : 0, 0,.      
28db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28dc0 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63  (void*)pF->pFunc
28dd0 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20  , P4_FUNCDEF);. 
28de0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61   }.}../*.** Upda
28df0 74 65 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74  te the accumulat
28e00 6f 72 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  or memory cells 
28e10 66 6f 72 20 61 6e 20 61 67 67 72 65 67 61 74 65  for an aggregate
28e20 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65   based on.** the
28e30 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
28e40 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  position..*/.sta
28e50 74 69 63 20 76 6f 69 64 20 75 70 64 61 74 65 41  tic void updateA
28e60 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65  ccumulator(Parse
28e70 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66   *pParse, AggInf
28e80 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20  o *pAggInfo){.  
28e90 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
28ea0 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
28eb0 3b 0a 20 20 69 6e 74 20 72 65 67 48 69 74 20 3d  ;.  int regHit =
28ec0 20 30 3b 0a 20 20 69 6e 74 20 61 64 64 72 48 69   0;.  int addrHi
28ed0 74 54 65 73 74 20 3d 20 30 3b 0a 20 20 73 74 72  tTest = 0;.  str
28ee0 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63  uct AggInfo_func
28ef0 20 2a 70 46 3b 0a 20 20 73 74 72 75 63 74 20 41   *pF;.  struct A
28f00 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a  ggInfo_col *pC;.
28f10 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72  .  pAggInfo->dir
28f20 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 66  ectMode = 1;.  f
28f30 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49  or(i=0, pF=pAggI
28f40 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41  nfo->aFunc; i<pA
28f50 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
28f60 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 69  ++, pF++){.    i
28f70 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20 69 6e 74  nt nArg;.    int
28f80 20 61 64 64 72 4e 65 78 74 20 3d 20 30 3b 0a 20   addrNext = 0;. 
28f90 20 20 20 69 6e 74 20 72 65 67 41 67 67 3b 0a 20     int regAgg;. 
28fa0 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
28fb0 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e  st = pF->pExpr->
28fc0 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73 73  x.pList;.    ass
28fd0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
28fe0 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72 2c  perty(pF->pExpr,
28ff0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
29000 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 20  ;.    if( pList 
29010 29 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20  ){.      nArg = 
29020 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
29030 20 20 20 20 72 65 67 41 67 67 20 3d 20 73 71 6c      regAgg = sql
29040 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
29050 28 70 50 61 72 73 65 2c 20 6e 41 72 67 29 3b 0a  (pParse, nArg);.
29060 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
29070 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
29080 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 72 65 67  arse, pList, reg
29090 41 67 67 2c 20 30 2c 20 53 51 4c 49 54 45 5f 45  Agg, 0, SQLITE_E
290a0 43 45 4c 5f 44 55 50 29 3b 0a 20 20 20 20 7d 65  CEL_DUP);.    }e
290b0 6c 73 65 7b 0a 20 20 20 20 20 20 6e 41 72 67 20  lse{.      nArg 
290c0 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 67 41 67  = 0;.      regAg
290d0 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  g = 0;.    }.   
290e0 20 69 66 28 20 70 46 2d 3e 69 44 69 73 74 69 6e   if( pF->iDistin
290f0 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  ct>=0 ){.      a
29100 64 64 72 4e 65 78 74 20 3d 20 73 71 6c 69 74 65  ddrNext = sqlite
29110 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
29120 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
29130 65 28 20 6e 41 72 67 3d 3d 30 20 29 3b 20 20 2f  e( nArg==0 );  /
29140 2a 20 45 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f  * Error conditio
29150 6e 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63  n */.      testc
29160 61 73 65 28 20 6e 41 72 67 3e 31 20 29 3b 20 20  ase( nArg>1 );  
29170 20 2f 2a 20 41 6c 73 6f 20 61 6e 20 65 72 72 6f   /* Also an erro
29180 72 20 2a 2f 0a 20 20 20 20 20 20 63 6f 64 65 44  r */.      codeD
29190 69 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c 20  istinct(pParse, 
291a0 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 61  pF->iDistinct, a
291b0 64 64 72 4e 65 78 74 2c 20 31 2c 20 72 65 67 41  ddrNext, 1, regA
291c0 67 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  gg);.    }.    i
291d0 66 28 20 70 46 2d 3e 70 46 75 6e 63 2d 3e 66 75  f( pF->pFunc->fu
291e0 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
291f0 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29  _FUNC_NEEDCOLL )
29200 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
29210 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  *pColl = 0;.    
29220 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
29230 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
29240 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
29250 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21    assert( pList!
29260 3d 30 20 29 3b 20 20 2f 2a 20 70 4c 69 73 74 21  =0 );  /* pList!
29270 3d 30 20 69 66 20 70 46 2d 3e 70 46 75 6e 63 20  =0 if pF->pFunc 
29280 68 61 73 20 4e 45 45 44 43 4f 4c 4c 20 2a 2f 0a  has NEEDCOLL */.
29290 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70        for(j=0, p
292a0 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 21  Item=pList->a; !
292b0 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72 67 3b  pColl && j<nArg;
292c0 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   j++, pItem++){.
292d0 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
292e0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
292f0 65 71 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d  eq(pParse, pItem
29300 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->pExpr);.      
29310 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 43 6f  }.      if( !pCo
29320 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  ll ){.        pC
29330 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  oll = pParse->db
29340 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
29350 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
29360 65 67 48 69 74 3d 3d 30 20 26 26 20 70 41 67 67  egHit==0 && pAgg
29370 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74  Info->nAccumulat
29380 6f 72 20 29 20 72 65 67 48 69 74 20 3d 20 2b 2b  or ) regHit = ++
29390 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
293a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
293b0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c  ddOp4(v, OP_Coll
293c0 53 65 71 2c 20 72 65 67 48 69 74 2c 20 30 2c 20  Seq, regHit, 0, 
293d0 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c  0, (char *)pColl
293e0 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20  , P4_COLLSEQ);. 
293f0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
29400 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
29410 5f 41 67 67 53 74 65 70 30 2c 20 30 2c 20 72 65  _AggStep0, 0, re
29420 67 41 67 67 2c 20 70 46 2d 3e 69 4d 65 6d 2c 0a  gAgg, pF->iMem,.
29430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29440 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 46 2d        (void*)pF-
29450 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44  >pFunc, P4_FUNCD
29460 45 46 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  EF);.    sqlite3
29470 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
29480 28 75 38 29 6e 41 72 67 29 3b 0a 20 20 20 20 73  (u8)nArg);.    s
29490 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
294a0 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
294b0 61 72 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41  arse, regAgg, nA
294c0 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rg);.    sqlite3
294d0 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
294e0 28 70 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c  (pParse, regAgg,
294f0 20 6e 41 72 67 29 3b 0a 20 20 20 20 69 66 28 20   nArg);.    if( 
29500 61 64 64 72 4e 65 78 74 20 29 7b 0a 20 20 20 20  addrNext ){.    
29510 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
29520 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
29530 72 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 73 71  rNext);.      sq
29540 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
29550 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ear(pParse);.   
29560 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66   }.  }..  /* Bef
29570 6f 72 65 20 70 6f 70 75 6c 61 74 69 6e 67 20 74  ore populating t
29580 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72  he accumulator r
29590 65 67 69 73 74 65 72 73 2c 20 63 6c 65 61 72 20  egisters, clear 
295a0 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
295b0 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65  ..  ** Otherwise
295c0 2c 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20  , if any of the 
295d0 72 65 71 75 69 72 65 64 20 63 6f 6c 75 6d 6e 20  required column 
295e0 76 61 6c 75 65 73 20 61 72 65 20 61 6c 72 65 61  values are alrea
295f0 64 79 20 70 72 65 73 65 6e 74 20 0a 20 20 2a 2a  dy present .  **
29600 20 69 6e 20 72 65 67 69 73 74 65 72 73 2c 20 73   in registers, s
29610 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 29  qlite3ExprCode()
29620 20 6d 61 79 20 75 73 65 20 4f 50 5f 53 43 6f 70   may use OP_SCop
29630 79 20 74 6f 20 63 6f 70 79 20 74 68 65 20 76 61  y to copy the va
29640 6c 75 65 0a 20 20 2a 2a 20 74 6f 20 70 43 2d 3e  lue.  ** to pC->
29650 69 4d 65 6d 2e 20 42 75 74 20 62 79 20 74 68 65  iMem. But by the
29660 20 74 69 6d 65 20 74 68 65 20 76 61 6c 75 65 20   time the value 
29670 69 73 20 75 73 65 64 2c 20 74 68 65 20 6f 72 69  is used, the ori
29680 67 69 6e 61 6c 20 72 65 67 69 73 74 65 72 0a 20  ginal register. 
29690 20 2a 2a 20 6d 61 79 20 68 61 76 65 20 62 65 65   ** may have bee
296a0 6e 20 75 73 65 64 2c 20 69 6e 76 61 6c 69 64 61  n used, invalida
296b0 74 69 6e 67 20 74 68 65 20 75 6e 64 65 72 6c 79  ting the underly
296c0 69 6e 67 20 62 75 66 66 65 72 20 68 6f 6c 64 69  ing buffer holdi
296d0 6e 67 20 74 68 65 0a 20 20 2a 2a 20 74 65 78 74  ng the.  ** text
296e0 20 6f 72 20 62 6c 6f 62 20 76 61 6c 75 65 2e 20   or blob value. 
296f0 53 65 65 20 74 69 63 6b 65 74 20 5b 38 38 33 30  See ticket [8830
29700 33 34 64 63 62 35 5d 2e 0a 20 20 2a 2a 0a 20 20  34dcb5]..  **.  
29710 2a 2a 20 41 6e 6f 74 68 65 72 20 73 6f 6c 75 74  ** Another solut
29720 69 6f 6e 20 77 6f 75 6c 64 20 62 65 20 74 6f 20  ion would be to 
29730 63 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 53 43  change the OP_SC
29740 6f 70 79 20 75 73 65 64 20 74 6f 20 63 6f 70 79  opy used to copy
29750 20 63 61 63 68 65 64 0a 20 20 2a 2a 20 76 61 6c   cached.  ** val
29760 75 65 73 20 74 6f 20 61 6e 20 4f 50 5f 43 6f 70  ues to an OP_Cop
29770 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65  y..  */.  if( re
29780 67 48 69 74 20 29 7b 0a 20 20 20 20 61 64 64 72  gHit ){.    addr
29790 48 69 74 54 65 73 74 20 3d 20 73 71 6c 69 74 65  HitTest = sqlite
297a0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
297b0 50 5f 49 66 2c 20 72 65 67 48 69 74 29 3b 20 56  P_If, regHit); V
297c0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
297d0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
297e0 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
297f0 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  se);.  for(i=0, 
29800 70 43 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  pC=pAggInfo->aCo
29810 6c 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  l; i<pAggInfo->n
29820 41 63 63 75 6d 75 6c 61 74 6f 72 3b 20 69 2b 2b  Accumulator; i++
29830 2c 20 70 43 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  , pC++){.    sql
29840 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
29850 72 73 65 2c 20 70 43 2d 3e 70 45 78 70 72 2c 20  rse, pC->pExpr, 
29860 70 43 2d 3e 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20  pC->iMem);.  }. 
29870 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63   pAggInfo->direc
29880 74 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 73 71 6c  tMode = 0;.  sql
29890 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
298a0 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  ar(pParse);.  if
298b0 28 20 61 64 64 72 48 69 74 54 65 73 74 20 29 7b  ( addrHitTest ){
298c0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
298d0 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
298e0 48 69 74 54 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a  HitTest);.  }.}.
298f0 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e  ./*.** Add a sin
29900 67 6c 65 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69  gle OP_Explain i
29910 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 68  nstruction to th
29920 65 20 56 44 42 45 20 74 6f 20 65 78 70 6c 61 69  e VDBE to explai
29930 6e 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 63 6f  n a simple.** co
29940 75 6e 74 28 2a 29 20 71 75 65 72 79 20 28 22 53  unt(*) query ("S
29950 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
29960 52 4f 4d 20 70 54 61 62 22 29 2e 0a 2a 2f 0a 23  ROM pTab")..*/.#
29970 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
29980 49 54 5f 45 58 50 4c 41 49 4e 0a 73 74 61 74 69  IT_EXPLAIN.stati
29990 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 53 69  c void explainSi
299a0 6d 70 6c 65 43 6f 75 6e 74 28 0a 20 20 50 61 72  mpleCount(.  Par
299b0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
299c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
299d0 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f  Parse context */
299e0 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  .  Table *pTab, 
299f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a00 20 20 20 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e     /* Table bein
29a10 67 20 71 75 65 72 69 65 64 20 2a 2f 0a 20 20 49  g queried */.  I
29a20 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20  ndex *pIdx      
29a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29a40 2a 20 49 6e 64 65 78 20 75 73 65 64 20 74 6f 20  * Index used to 
29a50 6f 70 74 69 6d 69 7a 65 20 73 63 61 6e 2c 20 6f  optimize scan, o
29a60 72 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69  r NULL */.){.  i
29a70 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  f( pParse->expla
29a80 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 69 6e 74  in==2 ){.    int
29a90 20 62 43 6f 76 65 72 20 3d 20 28 70 49 64 78 21   bCover = (pIdx!
29aa0 3d 30 20 26 26 20 28 48 61 73 52 6f 77 69 64 28  =0 && (HasRowid(
29ab0 70 54 61 62 29 20 7c 7c 20 21 49 73 50 72 69 6d  pTab) || !IsPrim
29ac0 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78  aryKeyIndex(pIdx
29ad0 29 29 29 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  )));.    char *z
29ae0 45 71 70 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Eqp = sqlite3MPr
29af0 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c  intf(pParse->db,
29b00 20 22 53 43 41 4e 20 54 41 42 4c 45 20 25 73 25   "SCAN TABLE %s%
29b10 73 25 73 22 2c 0a 20 20 20 20 20 20 20 20 70 54  s%s",.        pT
29b20 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  ab->zName,.     
29b30 20 20 20 62 43 6f 76 65 72 20 3f 20 22 20 55 53     bCover ? " US
29b40 49 4e 47 20 43 4f 56 45 52 49 4e 47 20 49 4e 44  ING COVERING IND
29b50 45 58 20 22 20 3a 20 22 22 2c 0a 20 20 20 20 20  EX " : "",.     
29b60 20 20 20 62 43 6f 76 65 72 20 3f 20 70 49 64 78     bCover ? pIdx
29b70 2d 3e 7a 4e 61 6d 65 20 3a 20 22 22 0a 20 20 20  ->zName : "".   
29b80 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
29b90 64 62 65 41 64 64 4f 70 34 28 0a 20 20 20 20 20  dbeAddOp4(.     
29ba0 20 20 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65     pParse->pVdbe
29bb0 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50  , OP_Explain, pP
29bc0 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c  arse->iSelectId,
29bd0 20 30 2c 20 30 2c 20 7a 45 71 70 2c 20 50 34 5f   0, 0, zEqp, P4_
29be0 44 59 4e 41 4d 49 43 0a 20 20 20 20 29 3b 0a 20  DYNAMIC.    );. 
29bf0 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66   }.}.#else.# def
29c00 69 6e 65 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c  ine explainSimpl
29c10 65 43 6f 75 6e 74 28 61 2c 62 2c 63 29 0a 23 65  eCount(a,b,c).#e
29c20 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  ndif../*.** Gene
29c30 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68  rate code for th
29c40 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
29c50 6e 74 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20  nt given in the 
29c60 70 20 61 72 67 75 6d 65 6e 74 2e 20 20 0a 2a 2a  p argument.  .**
29c70 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20  .** The results 
29c80 61 72 65 20 72 65 74 75 72 6e 65 64 20 61 63 63  are returned acc
29c90 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 53 65  ording to the Se
29ca0 6c 65 63 74 44 65 73 74 20 73 74 72 75 63 74 75  lectDest structu
29cb0 72 65 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d 65  re..** See comme
29cc0 6e 74 73 20 69 6e 20 73 71 6c 69 74 65 49 6e 74  nts in sqliteInt
29cd0 2e 68 20 66 6f 72 20 66 75 72 74 68 65 72 20 69  .h for further i
29ce0 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a  nformation..**.*
29cf0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
29d00 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65  eturns the numbe
29d10 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66  r of errors.  If
29d20 20 61 6e 79 20 65 72 72 6f 72 73 20 61 72 65 0a   any errors are.
29d30 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20  ** encountered, 
29d40 74 68 65 6e 20 61 6e 20 61 70 70 72 6f 70 72 69  then an appropri
29d50 61 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  ate error messag
29d60 65 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a 2a 20  e is left in.** 
29d70 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e  pParse->zErrMsg.
29d80 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
29d90 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66 72 65  ine does NOT fre
29da0 65 20 74 68 65 20 53 65 6c 65 63 74 20 73 74 72  e the Select str
29db0 75 63 74 75 72 65 20 70 61 73 73 65 64 20 69 6e  ucture passed in
29dc0 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e  .  The.** callin
29dd0 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73  g function needs
29de0 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a   to do that..*/.
29df0 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63  int sqlite3Selec
29e00 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
29e10 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  se,         /* T
29e20 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
29e30 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
29e40 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
29e50 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
29e60 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65  ement being code
29e70 64 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  d. */.  SelectDe
29e80 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 20 2f  st *pDest      /
29e90 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
29ea0 68 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75  h the query resu
29eb0 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lts */.){.  int 
29ec0 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
29ed0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
29ee0 65 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e  ers */.  WhereIn
29ef0 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20  fo *pWInfo;     
29f00 2f 2a 20 52 65 74 75 72 6e 20 66 72 6f 6d 20 73  /* Return from s
29f10 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
29f20 28 29 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  () */.  Vdbe *v;
29f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29f40 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 6d 61  * The virtual ma
29f50 63 68 69 6e 65 20 75 6e 64 65 72 20 63 6f 6e 73  chine under cons
29f60 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  truction */.  in
29f70 74 20 69 73 41 67 67 3b 20 20 20 20 20 20 20 20  t isAgg;        
29f80 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
29f90 20 73 65 6c 65 63 74 20 6c 69 73 74 73 20 6c 69   select lists li
29fa0 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f  ke "count(*)" */
29fb0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
29fc0 69 73 74 20 3d 20 30 3b 20 20 2f 2a 20 4c 69 73  ist = 0;  /* Lis
29fd0 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  t of columns to 
29fe0 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20 53 72  extract. */.  Sr
29ff0 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b  cList *pTabList;
2a000 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
2a010 74 61 62 6c 65 73 20 74 6f 20 73 65 6c 65 63 74  tables to select
2a020 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20   from */.  Expr 
2a030 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20 20 20  *pWhere;        
2a040 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
2a050 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e  lause.  May be N
2a060 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ULL */.  ExprLis
2a070 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 20  t *pGroupBy;    
2a080 2f 2a 20 54 68 65 20 47 52 4f 55 50 20 42 59 20  /* The GROUP BY 
2a090 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20  clause.  May be 
2a0a0 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a  NULL */.  Expr *
2a0b0 70 48 61 76 69 6e 67 3b 20 20 20 20 20 20 20 20  pHaving;        
2a0c0 20 2f 2a 20 54 68 65 20 48 41 56 49 4e 47 20 63   /* The HAVING c
2a0d0 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e  lause.  May be N
2a0e0 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ULL */.  int rc 
2a0f0 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 1;            
2a100 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75  /* Value to retu
2a110 72 6e 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e  rn from this fun
2a120 63 74 69 6f 6e 20 2a 2f 0a 20 20 44 69 73 74 69  ction */.  Disti
2a130 6e 63 74 43 74 78 20 73 44 69 73 74 69 6e 63 74  nctCtx sDistinct
2a140 3b 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f 77  ; /* Info on how
2a150 20 74 6f 20 63 6f 64 65 20 74 68 65 20 44 49 53   to code the DIS
2a160 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 2a 2f  TINCT keyword */
2a170 0a 20 20 53 6f 72 74 43 74 78 20 73 53 6f 72 74  .  SortCtx sSort
2a180 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66  ;         /* Inf
2a190 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 63 6f 64 65  o on how to code
2a1a0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
2a1b0 61 75 73 65 20 2a 2f 0a 20 20 41 67 67 49 6e 66  ause */.  AggInf
2a1c0 6f 20 73 41 67 67 49 6e 66 6f 3b 20 20 20 20 20  o sAggInfo;     
2a1d0 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20   /* Information 
2a1e0 75 73 65 64 20 62 79 20 61 67 67 72 65 67 61 74  used by aggregat
2a1f0 65 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 69  e queries */.  i
2a200 6e 74 20 69 45 6e 64 3b 20 20 20 20 20 20 20 20  nt iEnd;        
2a210 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
2a220 20 6f 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74   of the end of t
2a230 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 73 71  he query */.  sq
2a240 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
2a250 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
2a260 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
2a270 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
2a280 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
2a290 20 20 69 6e 74 20 69 52 65 73 74 6f 72 65 53 65    int iRestoreSe
2a2a0 6c 65 63 74 49 64 20 3d 20 70 50 61 72 73 65 2d  lectId = pParse-
2a2b0 3e 69 53 65 6c 65 63 74 49 64 3b 0a 20 20 70 50  >iSelectId;.  pP
2a2c0 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 20  arse->iSelectId 
2a2d0 3d 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  = pParse->iNextS
2a2e0 65 6c 65 63 74 49 64 2b 2b 3b 0a 23 65 6e 64 69  electId++;.#endi
2a2f0 66 0a 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  f..  db = pParse
2a300 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30  ->db;.  if( p==0
2a310 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
2a320 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e  iled || pParse->
2a330 6e 45 72 72 20 29 7b 0a 20 20 20 20 72 65 74 75  nErr ){.    retu
2a340 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 1;.  }.  if( 
2a350 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
2a360 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
2a370 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29  SELECT, 0, 0, 0)
2a380 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d   ) return 1;.  m
2a390 65 6d 73 65 74 28 26 73 41 67 67 49 6e 66 6f 2c  emset(&sAggInfo,
2a3a0 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 67 67 49   0, sizeof(sAggI
2a3b0 6e 66 6f 29 29 3b 0a 23 69 66 20 53 45 4c 45 43  nfo));.#if SELEC
2a3c0 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  TTRACE_ENABLED. 
2a3d0 20 70 50 61 72 73 65 2d 3e 6e 53 65 6c 65 63 74   pParse->nSelect
2a3e0 49 6e 64 65 6e 74 2b 2b 3b 0a 20 20 53 45 4c 45  Indent++;.  SELE
2a3f0 43 54 54 52 41 43 45 28 31 2c 70 50 61 72 73 65  CTTRACE(1,pParse
2a400 2c 70 2c 20 28 22 62 65 67 69 6e 20 70 72 6f 63  ,p, ("begin proc
2a410 65 73 73 69 6e 67 3a 5c 6e 22 29 29 3b 0a 20 20  essing:\n"));.  
2a420 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
2a430 74 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29  tTrace & 0x100 )
2a440 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65  {.    sqlite3Tre
2a450 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70  eViewSelect(0, p
2a460 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  , 0);.  }.#endif
2a470 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ..  assert( p->p
2a480 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44  OrderBy==0 || pD
2a490 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f  est->eDest!=SRT_
2a4a0 44 69 73 74 46 69 66 6f 20 29 3b 0a 20 20 61 73  DistFifo );.  as
2a4b0 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42  sert( p->pOrderB
2a4c0 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65  y==0 || pDest->e
2a4d0 44 65 73 74 21 3d 53 52 54 5f 46 69 66 6f 20 29  Dest!=SRT_Fifo )
2a4e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
2a4f0 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44  OrderBy==0 || pD
2a500 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f  est->eDest!=SRT_
2a510 44 69 73 74 51 75 65 75 65 20 29 3b 0a 20 20 61  DistQueue );.  a
2a520 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
2a530 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e  By==0 || pDest->
2a540 65 44 65 73 74 21 3d 53 52 54 5f 51 75 65 75 65  eDest!=SRT_Queue
2a550 20 29 3b 0a 20 20 69 66 28 20 49 67 6e 6f 72 61   );.  if( Ignora
2a560 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73 74  bleOrderby(pDest
2a570 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
2a580 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
2a590 54 5f 45 78 69 73 74 73 20 7c 7c 20 70 44 65 73  T_Exists || pDes
2a5a0 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 55 6e  t->eDest==SRT_Un
2a5b0 69 6f 6e 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  ion || .        
2a5c0 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d     pDest->eDest=
2a5d0 3d 53 52 54 5f 45 78 63 65 70 74 20 7c 7c 20 70  =SRT_Except || p
2a5e0 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
2a5f0 5f 44 69 73 63 61 72 64 20 7c 7c 0a 20 20 20 20  _Discard ||.    
2a600 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44         pDest->eD
2a610 65 73 74 3d 3d 53 52 54 5f 51 75 65 75 65 20 20  est==SRT_Queue  
2a620 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  || pDest->eDest=
2a630 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20 7c 7c  =SRT_DistFifo ||
2a640 0a 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73  .           pDes
2a650 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69  t->eDest==SRT_Di
2a660 73 74 51 75 65 75 65 20 7c 7c 20 70 44 65 73 74  stQueue || pDest
2a670 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 46 69 66  ->eDest==SRT_Fif
2a680 6f 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 4f 52  o);.    /* If OR
2a690 44 45 52 20 42 59 20 6d 61 6b 65 73 20 6e 6f 20  DER BY makes no 
2a6a0 64 69 66 66 65 72 65 6e 63 65 20 69 6e 20 74 68  difference in th
2a6b0 65 20 6f 75 74 70 75 74 20 74 68 65 6e 20 6e 65  e output then ne
2a6c0 69 74 68 65 72 20 64 6f 65 73 0a 20 20 20 20 2a  ither does.    *
2a6d0 2a 20 44 49 53 54 49 4e 43 54 20 73 6f 20 69 74  * DISTINCT so it
2a6e0 20 63 61 6e 20 62 65 20 72 65 6d 6f 76 65 64 20   can be removed 
2a6f0 74 6f 6f 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69  too. */.    sqli
2a700 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
2a710 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  e(db, p->pOrderB
2a720 79 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65  y);.    p->pOrde
2a730 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  rBy = 0;.    p->
2a740 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f  selFlags &= ~SF_
2a750 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a 20 20  Distinct;.  }.  
2a760 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65  sqlite3SelectPre
2a770 70 28 70 50 61 72 73 65 2c 20 70 2c 20 30 29 3b  p(pParse, p, 0);
2a780 0a 20 20 6d 65 6d 73 65 74 28 26 73 53 6f 72 74  .  memset(&sSort
2a790 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 53 6f 72  , 0, sizeof(sSor
2a7a0 74 29 29 3b 0a 20 20 73 53 6f 72 74 2e 70 4f 72  t));.  sSort.pOr
2a7b0 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
2a7c0 72 42 79 3b 0a 20 20 70 54 61 62 4c 69 73 74 20  rBy;.  pTabList 
2a7d0 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 69 66 28  = p->pSrc;.  if(
2a7e0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
2a7f0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
2a800 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65  d ){.    goto se
2a810 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20  lect_end;.  }.  
2a820 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
2a830 74 21 3d 30 20 29 3b 0a 20 20 69 73 41 67 67 20  t!=0 );.  isAgg 
2a840 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  = (p->selFlags &
2a850 20 53 46 5f 41 67 67 72 65 67 61 74 65 29 21 3d   SF_Aggregate)!=
2a860 30 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  0;.#if SELECTTRA
2a870 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28  CE_ENABLED.  if(
2a880 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72   sqlite3SelectTr
2a890 61 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20  ace & 0x100 ){. 
2a8a0 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30     SELECTTRACE(0
2a8b0 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 20 28  x100,pParse,p, (
2a8c0 22 61 66 74 65 72 20 6e 61 6d 65 20 72 65 73 6f  "after name reso
2a8d0 6c 75 74 69 6f 6e 3a 5c 6e 22 29 29 3b 0a 20 20  lution:\n"));.  
2a8e0 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
2a8f0 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29  wSelect(0, p, 0)
2a900 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20  ;.  }.#endif... 
2a910 20 2f 2a 20 49 66 20 77 72 69 74 69 6e 67 20 74   /* If writing t
2a920 6f 20 6d 65 6d 6f 72 79 20 6f 72 20 67 65 6e 65  o memory or gene
2a930 72 61 74 69 6e 67 20 61 20 73 65 74 0a 20 20 2a  rating a set.  *
2a940 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  * only a single 
2a950 63 6f 6c 75 6d 6e 20 6d 61 79 20 62 65 20 6f 75  column may be ou
2a960 74 70 75 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64  tput..  */.#ifnd
2a970 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
2a980 55 42 51 55 45 52 59 0a 20 20 69 66 28 20 63 68  UBQUERY.  if( ch
2a990 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d  eckForMultiColum
2a9a0 6e 53 65 6c 65 63 74 45 72 72 6f 72 28 70 50 61  nSelectError(pPa
2a9b0 72 73 65 2c 20 70 44 65 73 74 2c 20 70 2d 3e 70  rse, pDest, p->p
2a9c0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b  EList->nExpr) ){
2a9d0 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74  .    goto select
2a9e0 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  _end;.  }.#endif
2a9f0 0a 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 6c  ..  /* Try to fl
2aa00 61 74 74 65 6e 20 73 75 62 71 75 65 72 69 65 73  atten subqueries
2aa10 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
2aa20 75 73 65 20 75 70 20 69 6e 74 6f 20 74 68 65 20  use up into the 
2aa30 6d 61 69 6e 20 71 75 65 72 79 0a 20 20 2a 2f 0a  main query.  */.
2aa40 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
2aa50 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
2aa60 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
2aa70 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
2aa80 0a 20 20 66 6f 72 28 69 3d 30 3b 20 21 70 2d 3e  .  for(i=0; !p->
2aa90 70 50 72 69 6f 72 20 26 26 20 69 3c 70 54 61 62  pPrior && i<pTab
2aaa0 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  List->nSrc; i++)
2aab0 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  {.    struct Src
2aac0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
2aad0 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b   = &pTabList->a[
2aae0 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a  i];.    Select *
2aaf0 70 53 75 62 20 3d 20 70 49 74 65 6d 2d 3e 70 53  pSub = pItem->pS
2ab00 65 6c 65 63 74 3b 0a 20 20 20 20 69 6e 74 20 69  elect;.    int i
2ab10 73 41 67 67 53 75 62 3b 0a 20 20 20 20 54 61 62  sAggSub;.    Tab
2ab20 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 74 65 6d  le *pTab = pItem
2ab30 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20  ->pTab;.    if( 
2ab40 70 53 75 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  pSub==0 ) contin
2ab50 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 43 61 74 63  ue;..    /* Catc
2ab60 68 20 6d 69 73 6d 61 74 63 68 20 69 6e 20 74 68  h mismatch in th
2ab70 65 20 64 65 63 6c 61 72 65 64 20 63 6f 6c 75 6d  e declared colum
2ab80 6e 73 20 6f 66 20 61 20 76 69 65 77 20 61 6e 64  ns of a view and
2ab90 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20   the number of. 
2aba0 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e     ** columns in
2abb0 20 74 68 65 20 53 45 4c 45 43 54 20 6f 6e 20 74   the SELECT on t
2abc0 68 65 20 52 48 53 20 2a 2f 0a 20 20 20 20 69 66  he RHS */.    if
2abd0 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 21 3d 70 53  ( pTab->nCol!=pS
2abe0 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ub->pEList->nExp
2abf0 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  r ){.      sqlit
2ac00 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
2ac10 65 2c 20 22 65 78 70 65 63 74 65 64 20 25 64 20  e, "expected %d 
2ac20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 27 25 73 27  columns for '%s'
2ac30 20 62 75 74 20 67 6f 74 20 25 64 22 2c 0a 20 20   but got %d",.  
2ac40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac50 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20      pTab->nCol, 
2ac60 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 70 53 75  pTab->zName, pSu
2ac70 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  b->pEList->nExpr
2ac80 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65  );.      goto se
2ac90 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
2aca0 0a 20 20 20 20 69 73 41 67 67 53 75 62 20 3d 20  .    isAggSub = 
2acb0 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20  (pSub->selFlags 
2acc0 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 29 21  & SF_Aggregate)!
2acd0 3d 30 3b 0a 20 20 20 20 69 66 28 20 66 6c 61 74  =0;.    if( flat
2ace0 74 65 6e 53 75 62 71 75 65 72 79 28 70 50 61 72  tenSubquery(pPar
2acf0 73 65 2c 20 70 2c 20 69 2c 20 69 73 41 67 67 2c  se, p, i, isAgg,
2ad00 20 69 73 41 67 67 53 75 62 29 20 29 7b 0a 20 20   isAggSub) ){.  
2ad10 20 20 20 20 2f 2a 20 54 68 69 73 20 73 75 62 71      /* This subq
2ad20 75 65 72 79 20 63 61 6e 20 62 65 20 61 62 73 6f  uery can be abso
2ad30 72 62 65 64 20 69 6e 74 6f 20 69 74 73 20 70 61  rbed into its pa
2ad40 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 69  rent. */.      i
2ad50 66 28 20 69 73 41 67 67 53 75 62 20 29 7b 0a 20  f( isAggSub ){. 
2ad60 20 20 20 20 20 20 20 69 73 41 67 67 20 3d 20 31         isAgg = 1
2ad70 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 65 6c  ;.        p->sel
2ad80 46 6c 61 67 73 20 7c 3d 20 53 46 5f 41 67 67 72  Flags |= SF_Aggr
2ad90 65 67 61 74 65 3b 0a 20 20 20 20 20 20 7d 0a 20  egate;.      }. 
2ada0 20 20 20 20 20 69 20 3d 20 2d 31 3b 0a 20 20 20       i = -1;.   
2adb0 20 7d 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20   }.    pTabList 
2adc0 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 69  = p->pSrc;.    i
2add0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
2ade0 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  led ) goto selec
2adf0 74 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 21  t_end;.    if( !
2ae00 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79  IgnorableOrderby
2ae10 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20 20  (pDest) ){.     
2ae20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20   sSort.pOrderBy 
2ae30 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  = p->pOrderBy;. 
2ae40 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
2ae50 0a 20 20 2f 2a 20 47 65 74 20 61 20 70 6f 69 6e  .  /* Get a poin
2ae60 74 65 72 20 74 68 65 20 56 44 42 45 20 75 6e 64  ter the VDBE und
2ae70 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2c  er construction,
2ae80 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65   allocating a ne
2ae90 77 20 56 44 42 45 20 69 66 20 6f 6e 65 0a 20 20  w VDBE if one.  
2aea0 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65  ** does not alre
2aeb0 61 64 79 20 65 78 69 73 74 20 2a 2f 0a 20 20 76  ady exist */.  v
2aec0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
2aed0 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
2aee0 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c   v==0 ) goto sel
2aef0 65 63 74 5f 65 6e 64 3b 0a 0a 23 69 66 6e 64 65  ect_end;..#ifnde
2af00 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
2af10 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20  MPOUND_SELECT.  
2af20 2f 2a 20 48 61 6e 64 6c 65 20 63 6f 6d 70 6f 75  /* Handle compou
2af30 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  nd SELECT statem
2af40 65 6e 74 73 20 75 73 69 6e 67 20 74 68 65 20 73  ents using the s
2af50 65 70 61 72 61 74 65 20 6d 75 6c 74 69 53 65 6c  eparate multiSel
2af60 65 63 74 28 29 0a 20 20 2a 2a 20 70 72 6f 63 65  ect().  ** proce
2af70 64 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  dure..  */.  if(
2af80 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20   p->pPrior ){.  
2af90 20 20 72 63 20 3d 20 6d 75 6c 74 69 53 65 6c 65    rc = multiSele
2afa0 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44  ct(pParse, p, pD
2afb0 65 73 74 29 3b 0a 20 20 20 20 65 78 70 6c 61 69  est);.    explai
2afc0 6e 53 65 74 49 6e 74 65 67 65 72 28 70 50 61 72  nSetInteger(pPar
2afd0 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 69  se->iSelectId, i
2afe0 52 65 73 74 6f 72 65 53 65 6c 65 63 74 49 64 29  RestoreSelectId)
2aff0 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  ;.#if SELECTTRAC
2b000 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 53 45  E_ENABLED.    SE
2b010 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50 61 72  LECTTRACE(1,pPar
2b020 73 65 2c 70 2c 28 22 65 6e 64 20 63 6f 6d 70 6f  se,p,("end compo
2b030 75 6e 64 2d 73 65 6c 65 63 74 20 70 72 6f 63 65  und-select proce
2b040 73 73 69 6e 67 5c 6e 22 29 29 3b 0a 20 20 20 20  ssing\n"));.    
2b050 70 50 61 72 73 65 2d 3e 6e 53 65 6c 65 63 74 49  pParse->nSelectI
2b060 6e 64 65 6e 74 2d 2d 3b 0a 23 65 6e 64 69 66 0a  ndent--;.#endif.
2b070 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2b080 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
2b090 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
2b0a0 72 20 61 6c 6c 20 73 75 62 2d 71 75 65 72 69 65  r all sub-querie
2b0b0 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
2b0c0 61 75 73 65 0a 20 20 2a 2f 0a 23 69 66 20 21 64  ause.  */.#if !d
2b0d0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
2b0e0 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
2b0f0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
2b100 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 66 6f 72  OMIT_VIEW).  for
2b110 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74  (i=0; i<pTabList
2b120 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
2b130 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
2b140 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
2b150 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a  pTabList->a[i];.
2b160 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 64      SelectDest d
2b170 65 73 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20  est;.    Select 
2b180 2a 70 53 75 62 20 3d 20 70 49 74 65 6d 2d 3e 70  *pSub = pItem->p
2b190 53 65 6c 65 63 74 3b 0a 20 20 20 20 69 66 28 20  Select;.    if( 
2b1a0 70 53 75 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  pSub==0 ) contin
2b1b0 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 53 6f 6d 65  ue;..    /* Some
2b1c0 74 69 6d 65 73 20 74 68 65 20 63 6f 64 65 20 66  times the code f
2b1d0 6f 72 20 61 20 73 75 62 71 75 65 72 79 20 77 69  or a subquery wi
2b1e0 6c 6c 20 62 65 20 67 65 6e 65 72 61 74 65 64 20  ll be generated 
2b1f0 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20 2a 2a  more than.    **
2b200 20 6f 6e 63 65 2c 20 69 66 20 74 68 65 20 73 75   once, if the su
2b210 62 71 75 65 72 79 20 69 73 20 70 61 72 74 20 6f  bquery is part o
2b220 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
2b230 73 65 20 69 6e 20 61 20 4c 45 46 54 20 4a 4f 49  se in a LEFT JOI
2b240 4e 2c 0a 20 20 20 20 2a 2a 20 66 6f 72 20 65 78  N,.    ** for ex
2b250 61 6d 70 6c 65 2e 20 20 49 6e 20 74 68 61 74 20  ample.  In that 
2b260 63 61 73 65 2c 20 64 6f 20 6e 6f 74 20 72 65 67  case, do not reg
2b270 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64 65  enerate the code
2b280 20 74 6f 20 6d 61 6e 69 66 65 73 74 0a 20 20 20   to manifest.   
2b290 20 2a 2a 20 61 20 76 69 65 77 20 6f 72 20 74 68   ** a view or th
2b2a0 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74 6f 20  e co-routine to 
2b2b0 69 6d 70 6c 65 6d 65 6e 74 20 61 20 76 69 65 77  implement a view
2b2c0 2e 20 20 54 68 65 20 66 69 72 73 74 20 69 6e 73  .  The first ins
2b2d0 74 61 6e 63 65 0a 20 20 20 20 2a 2a 20 69 73 20  tance.    ** is 
2b2e0 73 75 66 66 69 63 69 65 6e 74 2c 20 74 68 6f 75  sufficient, thou
2b2f0 67 68 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  gh the subroutin
2b300 65 20 74 6f 20 6d 61 6e 69 66 65 73 74 20 74 68  e to manifest th
2b310 65 20 76 69 65 77 20 64 6f 65 73 20 6e 65 65 64  e view does need
2b320 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e  .    ** to be in
2b330 76 6f 6b 65 64 20 61 67 61 69 6e 2e 20 2a 2f 0a  voked again. */.
2b340 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 61      if( pItem->a
2b350 64 64 72 46 69 6c 6c 53 75 62 20 29 7b 0a 20 20  ddrFillSub ){.  
2b360 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66      if( pItem->f
2b370 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 3d 3d  g.viaCoroutine==
2b380 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
2b390 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2b3a0 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 49 74 65  , OP_Gosub, pIte
2b3b0 6d 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 49  m->regReturn, pI
2b3c0 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
2b3d0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2b3e0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
2b3f0 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65  ..    /* Increme
2b400 6e 74 20 50 61 72 73 65 2e 6e 48 65 69 67 68 74  nt Parse.nHeight
2b410 20 62 79 20 74 68 65 20 68 65 69 67 68 74 20 6f   by the height o
2b420 66 20 74 68 65 20 6c 61 72 67 65 73 74 20 65 78  f the largest ex
2b430 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20  pression.    ** 
2b440 74 72 65 65 20 72 65 66 65 72 72 65 64 20 74 6f  tree referred to
2b450 20 62 79 20 74 68 69 73 2c 20 74 68 65 20 70 61   by this, the pa
2b460 72 65 6e 74 20 73 65 6c 65 63 74 2e 20 54 68 65  rent select. The
2b470 20 63 68 69 6c 64 20 73 65 6c 65 63 74 0a 20 20   child select.  
2b480 20 20 2a 2a 20 6d 61 79 20 63 6f 6e 74 61 69 6e    ** may contain
2b490 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
2b4a0 73 20 6f 66 20 61 74 20 6d 6f 73 74 0a 20 20 20  s of at most.   
2b4b0 20 2a 2a 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f   ** (SQLITE_MAX_
2b4c0 45 58 50 52 5f 44 45 50 54 48 2d 50 61 72 73 65  EXPR_DEPTH-Parse
2b4d0 2e 6e 48 65 69 67 68 74 29 20 68 65 69 67 68 74  .nHeight) height
2b4e0 2e 20 54 68 69 73 20 69 73 20 61 20 62 69 74 0a  . This is a bit.
2b4f0 20 20 20 20 2a 2a 20 6d 6f 72 65 20 63 6f 6e 73      ** more cons
2b500 65 72 76 61 74 69 76 65 20 74 68 61 6e 20 6e 65  ervative than ne
2b510 63 65 73 73 61 72 79 2c 20 62 75 74 20 6d 75 63  cessary, but muc
2b520 68 20 65 61 73 69 65 72 20 74 68 61 6e 20 65 6e  h easier than en
2b530 66 6f 72 63 69 6e 67 0a 20 20 20 20 2a 2a 20 61  forcing.    ** a
2b540 6e 20 65 78 61 63 74 20 6c 69 6d 69 74 2e 0a 20  n exact limit.. 
2b550 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 73 65     */.    pParse
2b560 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20 73 71 6c  ->nHeight += sql
2b570 69 74 65 33 53 65 6c 65 63 74 45 78 70 72 48 65  ite3SelectExprHe
2b580 69 67 68 74 28 70 29 3b 0a 0a 20 20 20 20 2f 2a  ight(p);..    /*
2b590 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20   Make copies of 
2b5a0 63 6f 6e 73 74 61 6e 74 20 57 48 45 52 45 2d 63  constant WHERE-c
2b5b0 6c 61 75 73 65 20 74 65 72 6d 73 20 69 6e 20 74  lause terms in t
2b5c0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
2b5d0 6f 77 6e 0a 20 20 20 20 2a 2a 20 69 6e 73 69 64  own.    ** insid
2b5e0 65 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 20  e the subquery. 
2b5f0 20 54 68 69 73 20 63 61 6e 20 68 65 6c 70 20 74   This can help t
2b600 68 65 20 73 75 62 71 75 65 72 79 20 74 6f 20 72  he subquery to r
2b610 75 6e 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e  un more efficien
2b620 74 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  tly..    */.    
2b630 69 66 28 20 28 70 49 74 65 6d 2d 3e 66 67 2e 6a  if( (pItem->fg.j
2b640 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54  ointype & JT_OUT
2b650 45 52 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70  ER)==0.     && p
2b660 75 73 68 44 6f 77 6e 57 68 65 72 65 54 65 72 6d  ushDownWhereTerm
2b670 73 28 64 62 2c 20 70 53 75 62 2c 20 70 2d 3e 70  s(db, pSub, p->p
2b680 57 68 65 72 65 2c 20 70 49 74 65 6d 2d 3e 69 43  Where, pItem->iC
2b690 75 72 73 6f 72 29 0a 20 20 20 20 29 7b 0a 23 69  ursor).    ){.#i
2b6a0 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e  f SELECTTRACE_EN
2b6b0 41 42 4c 45 44 0a 20 20 20 20 20 20 69 66 28 20  ABLED.      if( 
2b6c0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61  sqlite3SelectTra
2b6d0 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20 20  ce & 0x100 ){.  
2b6e0 20 20 20 20 20 20 53 45 4c 45 43 54 54 52 41 43        SELECTTRAC
2b6f0 45 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70  E(0x100,pParse,p
2b700 2c 28 22 41 66 74 65 72 20 57 48 45 52 45 2d 63  ,("After WHERE-c
2b710 6c 61 75 73 65 20 70 75 73 68 2d 64 6f 77 6e 3a  lause push-down:
2b720 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20 73  \n"));.        s
2b730 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65  qlite3TreeViewSe
2b740 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20  lect(0, p, 0);. 
2b750 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
2b760 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65    }..    /* Gene
2b770 72 61 74 65 20 63 6f 64 65 20 74 6f 20 69 6d 70  rate code to imp
2b780 6c 65 6d 65 6e 74 20 74 68 65 20 73 75 62 71 75  lement the subqu
2b790 65 72 79 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ery.    **.    *
2b7a0 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69  * The subquery i
2b7b0 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73  s implemented as
2b7c0 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 69 66   a co-routine if
2b7d0 20 61 6c 6c 20 6f 66 20 74 68 65 73 65 20 61 72   all of these ar
2b7e0 65 20 74 72 75 65 3a 0a 20 20 20 20 2a 2a 20 20  e true:.    **  
2b7f0 20 28 31 29 20 20 54 68 65 20 73 75 62 71 75 65   (1)  The subque
2b800 72 79 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  ry is guaranteed
2b810 20 74 6f 20 62 65 20 74 68 65 20 6f 75 74 65 72   to be the outer
2b820 20 6c 6f 6f 70 20 28 73 6f 20 74 68 61 74 20 69   loop (so that i
2b830 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  t.    **        
2b840 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
2b850 20 62 65 20 63 6f 6d 70 75 74 65 64 20 6d 6f 72   be computed mor
2b860 65 20 74 68 61 6e 20 6f 6e 63 65 29 0a 20 20 20  e than once).   
2b870 20 2a 2a 20 20 20 28 32 29 20 20 54 68 65 20 41   **   (2)  The A
2b880 4c 4c 20 6b 65 79 77 6f 72 64 20 61 66 74 65 72  LL keyword after
2b890 20 53 45 4c 45 43 54 20 69 73 20 6f 6d 69 74 74   SELECT is omitt
2b8a0 65 64 2e 20 20 28 41 70 70 6c 69 63 61 74 69 6f  ed.  (Applicatio
2b8b0 6e 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 20 20  ns are.    **   
2b8c0 20 20 20 20 20 61 6c 6c 6f 77 65 64 20 74 6f 20       allowed to 
2b8d0 73 61 79 20 22 53 45 4c 45 43 54 20 41 4c 4c 22  say "SELECT ALL"
2b8e0 20 69 6e 73 74 65 61 64 20 6f 66 20 6a 75 73 74   instead of just
2b8f0 20 22 53 45 4c 45 43 54 22 20 74 6f 20 64 69 73   "SELECT" to dis
2b900 61 62 6c 65 0a 20 20 20 20 2a 2a 20 20 20 20 20  able.    **     
2b910 20 20 20 74 68 65 20 75 73 65 20 6f 66 20 63 6f     the use of co
2b920 2d 72 6f 75 74 69 6e 65 73 2e 29 0a 20 20 20 20  -routines.).    
2b930 2a 2a 20 20 20 28 33 29 20 20 43 6f 2d 72 6f 75  **   (3)  Co-rou
2b940 74 69 6e 65 73 20 61 72 65 20 6e 6f 74 20 64 69  tines are not di
2b950 73 61 62 6c 65 64 20 75 73 69 6e 67 20 73 71 6c  sabled using sql
2b960 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
2b970 6c 28 29 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  l().    **      
2b980 20 20 77 69 74 68 20 53 51 4c 49 54 45 5f 54 45    with SQLITE_TE
2b990 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54  STCTRL_OPTIMIZAT
2b9a0 49 4f 4e 53 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  IONS..    **.   
2b9b0 20 2a 2a 20 54 4f 44 4f 3a 20 41 72 65 20 74 68   ** TODO: Are th
2b9c0 65 72 65 20 6f 74 68 65 72 20 72 65 61 73 6f 6e  ere other reason
2b9d0 73 20 62 65 73 69 64 65 20 28 31 29 20 74 6f 20  s beside (1) to 
2b9e0 75 73 65 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65  use a co-routine
2b9f0 0a 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e  .    ** implemen
2ba00 74 61 74 69 6f 6e 3f 0a 20 20 20 20 2a 2f 0a 20  tation?.    */. 
2ba10 20 20 20 69 66 28 20 69 3d 3d 30 0a 20 20 20 20     if( i==0.    
2ba20 20 26 26 20 28 70 54 61 62 4c 69 73 74 2d 3e 6e   && (pTabList->n
2ba30 53 72 63 3d 3d 31 0a 20 20 20 20 20 20 20 20 20  Src==1.         
2ba40 20 20 20 7c 7c 20 28 70 54 61 62 4c 69 73 74 2d     || (pTabList-
2ba50 3e 61 5b 31 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70  >a[1].fg.jointyp
2ba60 65 26 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52  e&(JT_LEFT|JT_CR
2ba70 4f 53 53 29 29 21 3d 30 29 20 20 2f 2a 20 28 31  OSS))!=0)  /* (1
2ba80 29 20 2a 2f 0a 20 20 20 20 20 26 26 20 28 70 2d  ) */.     && (p-
2ba90 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41  >selFlags & SF_A
2baa0 6c 6c 29 3d 3d 30 20 20 20 20 20 20 20 20 20 20  ll)==0          
2bab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bac0 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32 29 20           /* (2) 
2bad0 2a 2f 0a 20 20 20 20 20 26 26 20 4f 70 74 69 6d  */.     && Optim
2bae0 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64  izationEnabled(d
2baf0 62 2c 20 53 51 4c 49 54 45 5f 53 75 62 71 43 6f  b, SQLITE_SubqCo
2bb00 72 6f 75 74 69 6e 65 29 20 20 20 20 20 20 20 20  routine)        
2bb10 20 20 20 20 20 20 20 2f 2a 20 28 33 29 20 2a 2f         /* (3) */
2bb20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
2bb30 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 63 6f 2d   Implement a co-
2bb40 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c  routine that wil
2bb50 6c 20 72 65 74 75 72 6e 20 61 20 73 69 6e 67 6c  l return a singl
2bb60 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73  e row of the res
2bb70 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 74  ult.      ** set
2bb80 20 6f 6e 20 65 61 63 68 20 69 6e 76 6f 63 61 74   on each invocat
2bb90 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
2bba0 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70 20      int addrTop 
2bbb0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
2bbc0 72 65 6e 74 41 64 64 72 28 76 29 2b 31 3b 0a 20  rentAddr(v)+1;. 
2bbd0 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 67 52       pItem->regR
2bbe0 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65  eturn = ++pParse
2bbf0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71  ->nMem;.      sq
2bc00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
2bc10 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74  v, OP_InitCorout
2bc20 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52  ine, pItem->regR
2bc30 65 74 75 72 6e 2c 20 30 2c 20 61 64 64 72 54 6f  eturn, 0, addrTo
2bc40 70 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  p);.      VdbeCo
2bc50 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20  mment((v, "%s", 
2bc60 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61  pItem->pTab->zNa
2bc70 6d 65 29 29 3b 0a 20 20 20 20 20 20 70 49 74 65  me));.      pIte
2bc80 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d  m->addrFillSub =
2bc90 20 61 64 64 72 54 6f 70 3b 0a 20 20 20 20 20 20   addrTop;.      
2bca0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
2bcb0 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54  tInit(&dest, SRT
2bcc0 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 70 49 74 65  _Coroutine, pIte
2bcd0 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20  m->regReturn);. 
2bce0 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49       explainSetI
2bcf0 6e 74 65 67 65 72 28 70 49 74 65 6d 2d 3e 69 53  nteger(pItem->iS
2bd00 65 6c 65 63 74 49 64 2c 20 28 75 38 29 70 50 61  electId, (u8)pPa
2bd10 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
2bd20 49 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Id);.      sqlit
2bd30 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
2bd40 20 70 53 75 62 2c 20 26 64 65 73 74 29 3b 0a 20   pSub, &dest);. 
2bd50 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62       pItem->pTab
2bd60 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 70  ->nRowLogEst = p
2bd70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b  Sub->nSelectRow;
2bd80 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67  .      pItem->fg
2bd90 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 3d 20  .viaCoroutine = 
2bda0 31 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  1;.      pItem->
2bdb0 72 65 67 52 65 73 75 6c 74 20 3d 20 64 65 73 74  regResult = dest
2bdc0 2e 69 53 64 73 74 3b 0a 20 20 20 20 20 20 73 71  .iSdst;.      sq
2bdd0 6c 69 74 65 33 56 64 62 65 45 6e 64 43 6f 72 6f  lite3VdbeEndCoro
2bde0 75 74 69 6e 65 28 76 2c 20 70 49 74 65 6d 2d 3e  utine(v, pItem->
2bdf0 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20  regReturn);.    
2be00 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
2be10 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70  pHere(v, addrTop
2be20 2d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  -1);.      sqlit
2be30 65 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61  e3ClearTempRegCa
2be40 63 68 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  che(pParse);.   
2be50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
2be60 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
2be70 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c  outine that will
2be80 20 66 69 6c 6c 20 61 6e 20 65 70 68 65 6d 65 72   fill an ephemer
2be90 61 6c 20 74 61 62 6c 65 20 77 69 74 68 0a 20 20  al table with.  
2bea0 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e 74 65      ** the conte
2beb0 6e 74 20 6f 66 20 74 68 69 73 20 73 75 62 71 75  nt of this subqu
2bec0 65 72 79 2e 20 20 70 49 74 65 6d 2d 3e 61 64 64  ery.  pItem->add
2bed0 72 46 69 6c 6c 53 75 62 20 77 69 6c 6c 20 70 6f  rFillSub will po
2bee0 69 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  int.      ** to 
2bef0 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
2bf00 68 65 20 67 65 6e 65 72 61 74 65 64 20 73 75 62  he generated sub
2bf10 72 6f 75 74 69 6e 65 2e 20 20 70 49 74 65 6d 2d  routine.  pItem-
2bf20 3e 72 65 67 52 65 74 75 72 6e 0a 20 20 20 20 20  >regReturn.     
2bf30 20 2a 2a 20 69 73 20 61 20 72 65 67 69 73 74 65   ** is a registe
2bf40 72 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 68  r allocated to h
2bf50 6f 6c 64 20 74 68 65 20 73 75 62 72 6f 75 74 69  old the subrouti
2bf60 6e 65 20 72 65 74 75 72 6e 20 61 64 64 72 65 73  ne return addres
2bf70 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  s.      */.     
2bf80 20 69 6e 74 20 74 6f 70 41 64 64 72 3b 0a 20 20   int topAddr;.  
2bf90 20 20 20 20 69 6e 74 20 6f 6e 63 65 41 64 64 72      int onceAddr
2bfa0 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 0;.      int 
2bfb0 72 65 74 41 64 64 72 3b 0a 20 20 20 20 20 20 61  retAddr;.      a
2bfc0 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 61 64  ssert( pItem->ad
2bfd0 64 72 46 69 6c 6c 53 75 62 3d 3d 30 20 29 3b 0a  drFillSub==0 );.
2bfe0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 67        pItem->reg
2bff0 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73  Return = ++pPars
2c000 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 74  e->nMem;.      t
2c010 6f 70 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33  opAddr = sqlite3
2c020 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2c030 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 49 74  _Integer, 0, pIt
2c040 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a  em->regReturn);.
2c050 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 61 64 64        pItem->add
2c060 72 46 69 6c 6c 53 75 62 20 3d 20 74 6f 70 41 64  rFillSub = topAd
2c070 64 72 2b 31 3b 0a 20 20 20 20 20 20 69 66 28 20  dr+1;.      if( 
2c080 70 49 74 65 6d 2d 3e 66 67 2e 69 73 43 6f 72 72  pItem->fg.isCorr
2c090 65 6c 61 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20  elated==0 ){.   
2c0a0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73       /* If the s
2c0b0 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 63  ubquery is not c
2c0c0 6f 72 72 65 6c 61 74 65 64 20 61 6e 64 20 69 66  orrelated and if
2c0d0 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 73 69   we are not insi
2c0e0 64 65 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a  de of.        **
2c0f0 20 61 20 74 72 69 67 67 65 72 2c 20 74 68 65 6e   a trigger, then
2c100 20 77 65 20 6f 6e 6c 79 20 6e 65 65 64 20 74 6f   we only need to
2c110 20 63 6f 6d 70 75 74 65 20 74 68 65 20 76 61 6c   compute the val
2c120 75 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ue of the subque
2c130 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e  ry.        ** on
2c140 63 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 6f  ce. */.        o
2c150 6e 63 65 41 64 64 72 20 3d 20 73 71 6c 69 74 65  nceAddr = sqlite
2c160 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65  3CodeOnce(pParse
2c170 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
2c180 76 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  v);.        Vdbe
2c190 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6d 61 74  Comment((v, "mat
2c1a0 65 72 69 61 6c 69 7a 65 20 5c 22 25 73 5c 22 22  erialize \"%s\""
2c1b0 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a  , pItem->pTab->z
2c1c0 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 7d 65  Name));.      }e
2c1d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 56 64 62  lse{.        Vdb
2c1e0 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
2c1f0 20 22 6d 61 74 65 72 69 61 6c 69 7a 65 20 5c 22   "materialize \"
2c200 25 73 5c 22 22 2c 20 70 49 74 65 6d 2d 3e 70 54  %s\"", pItem->pT
2c210 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  ab->zName));.   
2c220 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
2c230 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
2c240 28 26 64 65 73 74 2c 20 53 52 54 5f 45 70 68 65  (&dest, SRT_Ephe
2c250 6d 54 61 62 2c 20 70 49 74 65 6d 2d 3e 69 43 75  mTab, pItem->iCu
2c260 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 65 78 70  rsor);.      exp
2c270 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 70  lainSetInteger(p
2c280 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49 64 2c  Item->iSelectId,
2c290 20 28 75 38 29 70 50 61 72 73 65 2d 3e 69 4e 65   (u8)pParse->iNe
2c2a0 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  xtSelectId);.   
2c2b0 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
2c2c0 28 70 50 61 72 73 65 2c 20 70 53 75 62 2c 20 26  (pParse, pSub, &
2c2d0 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70 49 74  dest);.      pIt
2c2e0 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f  em->pTab->nRowLo
2c2f0 67 45 73 74 20 3d 20 70 53 75 62 2d 3e 6e 53 65  gEst = pSub->nSe
2c300 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 69  lectRow;.      i
2c310 66 28 20 6f 6e 63 65 41 64 64 72 20 29 20 73 71  f( onceAddr ) sq
2c320 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
2c330 65 28 76 2c 20 6f 6e 63 65 41 64 64 72 29 3b 0a  e(v, onceAddr);.
2c340 20 20 20 20 20 20 72 65 74 41 64 64 72 20 3d 20        retAddr = 
2c350 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2c360 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
2c370 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
2c380 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
2c390 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 25 73  ment((v, "end %s
2c3a0 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  ", pItem->pTab->
2c3b0 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 73  zName));.      s
2c3c0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
2c3d0 50 31 28 76 2c 20 74 6f 70 41 64 64 72 2c 20 72  P1(v, topAddr, r
2c3e0 65 74 41 64 64 72 29 3b 0a 20 20 20 20 20 20 73  etAddr);.      s
2c3f0 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d 70 52  qlite3ClearTempR
2c400 65 67 43 61 63 68 65 28 70 50 61 72 73 65 29 3b  egCache(pParse);
2c410 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64  .    }.    if( d
2c420 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2c430 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
2c440 64 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  d;.    pParse->n
2c450 48 65 69 67 68 74 20 2d 3d 20 73 71 6c 69 74 65  Height -= sqlite
2c460 33 53 65 6c 65 63 74 45 78 70 72 48 65 69 67 68  3SelectExprHeigh
2c470 74 28 70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  t(p);.  }.#endif
2c480 0a 0a 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 65  ..  /* Various e
2c490 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 53  lements of the S
2c4a0 45 4c 45 43 54 20 63 6f 70 69 65 64 20 69 6e 74  ELECT copied int
2c4b0 6f 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65  o local variable
2c4c0 73 20 66 6f 72 0a 20 20 2a 2a 20 63 6f 6e 76 65  s for.  ** conve
2c4d0 6e 69 65 6e 63 65 20 2a 2f 0a 20 20 70 45 4c 69  nience */.  pELi
2c4e0 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
2c4f0 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57    pWhere = p->pW
2c500 68 65 72 65 3b 0a 20 20 70 47 72 6f 75 70 42 79  here;.  pGroupBy
2c510 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a   = p->pGroupBy;.
2c520 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70    pHaving = p->p
2c530 48 61 76 69 6e 67 3b 0a 20 20 73 44 69 73 74 69  Having;.  sDisti
2c540 6e 63 74 2e 69 73 54 6e 63 74 20 3d 20 28 70 2d  nct.isTnct = (p-
2c550 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
2c560 69 73 74 69 6e 63 74 29 21 3d 30 3b 0a 0a 23 69  istinct)!=0;..#i
2c570 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e  f SELECTTRACE_EN
2c580 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69  ABLED.  if( sqli
2c590 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26  te3SelectTrace &
2c5a0 20 30 78 34 30 30 20 29 7b 0a 20 20 20 20 53 45   0x400 ){.    SE
2c5b0 4c 45 43 54 54 52 41 43 45 28 30 78 34 30 30 2c  LECTTRACE(0x400,
2c5c0 70 50 61 72 73 65 2c 70 2c 28 22 41 66 74 65 72  pParse,p,("After
2c5d0 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65   all FROM-clause
2c5e0 20 61 6e 61 6c 79 73 69 73 3a 5c 6e 22 29 29 3b   analysis:\n"));
2c5f0 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65  .    sqlite3Tree
2c600 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c  ViewSelect(0, p,
2c610 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
2c620 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 71 75 65  .  /* If the que
2c630 72 79 20 69 73 20 44 49 53 54 49 4e 43 54 20 77  ry is DISTINCT w
2c640 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20  ith an ORDER BY 
2c650 62 75 74 20 69 73 20 6e 6f 74 20 61 6e 20 61 67  but is not an ag
2c660 67 72 65 67 61 74 65 2c 20 61 6e 64 20 0a 20 20  gregate, and .  
2c670 2a 2a 20 69 66 20 74 68 65 20 73 65 6c 65 63 74  ** if the select
2c680 2d 6c 69 73 74 20 69 73 20 74 68 65 20 73 61 6d  -list is the sam
2c690 65 20 61 73 20 74 68 65 20 4f 52 44 45 52 20 42  e as the ORDER B
2c6a0 59 20 6c 69 73 74 2c 20 74 68 65 6e 20 74 68 69  Y list, then thi
2c6b0 73 20 71 75 65 72 79 0a 20 20 2a 2a 20 63 61 6e  s query.  ** can
2c6c0 20 62 65 20 72 65 77 72 69 74 74 65 6e 20 61 73   be rewritten as
2c6d0 20 61 20 47 52 4f 55 50 20 42 59 2e 20 49 6e 20   a GROUP BY. In 
2c6e0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 69  other words, thi
2c6f0 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  s:.  **.  **    
2c700 20 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54   SELECT DISTINCT
2c710 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20 4f 52   xyz FROM ... OR
2c720 44 45 52 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a  DER BY xyz.  **.
2c730 20 20 2a 2a 20 69 73 20 74 72 61 6e 73 66 6f 72    ** is transfor
2c740 6d 65 64 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a  med to:.  **.  *
2c750 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 79 7a  *     SELECT xyz
2c760 20 46 52 4f 4d 20 2e 2e 2e 20 47 52 4f 55 50 20   FROM ... GROUP 
2c770 42 59 20 78 79 7a 20 4f 52 44 45 52 20 42 59 20  BY xyz ORDER BY 
2c780 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  xyz.  **.  ** Th
2c790 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69 73  e second form is
2c7a0 20 70 72 65 66 65 72 72 65 64 20 61 73 20 61 20   preferred as a 
2c7b0 73 69 6e 67 6c 65 20 69 6e 64 65 78 20 28 6f 72  single index (or
2c7c0 20 74 65 6d 70 2d 74 61 62 6c 65 29 20 6d 61 79   temp-table) may
2c7d0 20 62 65 20 0a 20 20 2a 2a 20 75 73 65 64 20 66   be .  ** used f
2c7e0 6f 72 20 62 6f 74 68 20 74 68 65 20 4f 52 44 45  or both the ORDE
2c7f0 52 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43  R BY and DISTINC
2c800 54 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 41 73  T processing. As
2c810 20 6f 72 69 67 69 6e 61 6c 6c 79 20 0a 20 20 2a   originally .  *
2c820 2a 20 77 72 69 74 74 65 6e 20 74 68 65 20 71 75  * written the qu
2c830 65 72 79 20 6d 75 73 74 20 75 73 65 20 61 20 74  ery must use a t
2c840 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20 61 74  emp-table for at
2c850 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 74 68   least one of th
2c860 65 20 4f 52 44 45 52 20 0a 20 20 2a 2a 20 42 59  e ORDER .  ** BY
2c870 20 61 6e 64 20 44 49 53 54 49 4e 43 54 2c 20 61   and DISTINCT, a
2c880 6e 64 20 61 6e 20 69 6e 64 65 78 20 6f 72 20 73  nd an index or s
2c890 65 70 61 72 61 74 65 20 74 65 6d 70 2d 74 61 62  eparate temp-tab
2c8a0 6c 65 20 66 6f 72 20 74 68 65 20 6f 74 68 65 72  le for the other
2c8b0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d  ..  */.  if( (p-
2c8c0 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
2c8d0 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
2c8e0 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74  egate))==SF_Dist
2c8f0 69 6e 63 74 20 0a 20 20 20 26 26 20 73 71 6c 69  inct .   && sqli
2c900 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61  te3ExprListCompa
2c910 72 65 28 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  re(sSort.pOrderB
2c920 79 2c 20 70 45 4c 69 73 74 2c 20 2d 31 29 3d 3d  y, pEList, -1)==
2c930 30 0a 20 20 29 7b 0a 20 20 20 20 70 2d 3e 73 65  0.  ){.    p->se
2c940 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44 69  lFlags &= ~SF_Di
2c950 73 74 69 6e 63 74 3b 0a 20 20 20 20 70 47 72 6f  stinct;.    pGro
2c960 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70  upBy = p->pGroup
2c970 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
2c980 4c 69 73 74 44 75 70 28 64 62 2c 20 70 45 4c 69  ListDup(db, pELi
2c990 73 74 2c 20 30 29 3b 0a 20 20 20 20 2f 2a 20 4e  st, 0);.    /* N
2c9a0 6f 74 69 63 65 20 74 68 61 74 20 65 76 65 6e 20  otice that even 
2c9b0 74 68 6f 75 67 68 74 20 53 46 5f 44 69 73 74 69  thought SF_Disti
2c9c0 6e 63 74 20 68 61 73 20 62 65 65 6e 20 63 6c 65  nct has been cle
2c9d0 61 72 65 64 20 66 72 6f 6d 20 70 2d 3e 73 65 6c  ared from p->sel
2c9e0 46 6c 61 67 73 2c 0a 20 20 20 20 2a 2a 20 74 68  Flags,.    ** th
2c9f0 65 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e  e sDistinct.isTn
2ca00 63 74 20 69 73 20 73 74 69 6c 6c 20 73 65 74 2e  ct is still set.
2ca10 20 20 48 65 6e 63 65 2c 20 69 73 54 6e 63 74 20    Hence, isTnct 
2ca20 72 65 70 72 65 73 65 6e 74 73 20 74 68 65 0a 20  represents the. 
2ca30 20 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 73     ** original s
2ca40 65 74 74 69 6e 67 20 6f 66 20 74 68 65 20 53 46  etting of the SF
2ca50 5f 44 69 73 74 69 6e 63 74 20 66 6c 61 67 2c 20  _Distinct flag, 
2ca60 6e 6f 74 20 74 68 65 20 63 75 72 72 65 6e 74 20  not the current 
2ca70 73 65 74 74 69 6e 67 20 2a 2f 0a 20 20 20 20 61  setting */.    a
2ca80 73 73 65 72 74 28 20 73 44 69 73 74 69 6e 63 74  ssert( sDistinct
2ca90 2e 69 73 54 6e 63 74 20 29 3b 0a 20 20 7d 0a 0a  .isTnct );.  }..
2caa0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
2cab0 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
2cac0 75 73 65 2c 20 74 68 65 6e 20 63 72 65 61 74 65  use, then create
2cad0 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 69 6e   an ephemeral in
2cae0 64 65 78 20 74 6f 0a 20 20 2a 2a 20 64 6f 20 74  dex to.  ** do t
2caf0 68 65 20 73 6f 72 74 69 6e 67 2e 20 20 42 75 74  he sorting.  But
2cb00 20 74 68 69 73 20 73 6f 72 74 69 6e 67 20 65 70   this sorting ep
2cb10 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20 6d 69  hemeral index mi
2cb20 67 68 74 20 65 6e 64 20 75 70 0a 20 20 2a 2a 20  ght end up.  ** 
2cb30 62 65 69 6e 67 20 75 6e 75 73 65 64 20 69 66 20  being unused if 
2cb40 74 68 65 20 64 61 74 61 20 63 61 6e 20 62 65 20  the data can be 
2cb50 65 78 74 72 61 63 74 65 64 20 69 6e 20 70 72 65  extracted in pre
2cb60 2d 73 6f 72 74 65 64 20 6f 72 64 65 72 2e 0a 20  -sorted order.. 
2cb70 20 2a 2a 20 49 66 20 74 68 61 74 20 69 73 20 74   ** If that is t
2cb80 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68  he case, then th
2cb90 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  e OP_OpenEphemer
2cba0 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 77  al instruction w
2cbb0 69 6c 6c 20 62 65 0a 20 20 2a 2a 20 63 68 61 6e  ill be.  ** chan
2cbc0 67 65 64 20 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f  ged to an OP_Noo
2cbd0 70 20 6f 6e 63 65 20 77 65 20 66 69 67 75 72 65  p once we figure
2cbe0 20 6f 75 74 20 74 68 61 74 20 74 68 65 20 73 6f   out that the so
2cbf0 72 74 69 6e 67 20 69 6e 64 65 78 20 69 73 0a 20  rting index is. 
2cc00 20 2a 2a 20 6e 6f 74 20 6e 65 65 64 65 64 2e 20   ** not needed. 
2cc10 20 54 68 65 20 73 53 6f 72 74 2e 61 64 64 72 53   The sSort.addrS
2cc20 6f 72 74 49 6e 64 65 78 20 76 61 72 69 61 62 6c  ortIndex variabl
2cc30 65 20 69 73 20 75 73 65 64 20 74 6f 20 66 61 63  e is used to fac
2cc40 69 6c 69 74 61 74 65 0a 20 20 2a 2a 20 74 68 61  ilitate.  ** tha
2cc50 74 20 63 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a 20  t change..  */. 
2cc60 20 69 66 28 20 73 53 6f 72 74 2e 70 4f 72 64 65   if( sSort.pOrde
2cc70 72 42 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e  rBy ){.    KeyIn
2cc80 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  fo *pKeyInfo;.  
2cc90 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79    pKeyInfo = key
2cca0 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
2ccb0 28 70 50 61 72 73 65 2c 20 73 53 6f 72 74 2e 70  (pParse, sSort.p
2ccc0 4f 72 64 65 72 42 79 2c 20 30 2c 20 70 45 4c 69  OrderBy, 0, pELi
2ccd0 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20  st->nExpr);.    
2cce0 73 53 6f 72 74 2e 69 45 43 75 72 73 6f 72 20 3d  sSort.iECursor =
2ccf0 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
2cd00 0a 20 20 20 20 73 53 6f 72 74 2e 61 64 64 72 53  .    sSort.addrS
2cd10 6f 72 74 49 6e 64 65 78 20 3d 0a 20 20 20 20 20  ortIndex =.     
2cd20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2cd30 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p4(v, OP_OpenEph
2cd40 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20 20 20  emeral,.        
2cd50 20 20 73 53 6f 72 74 2e 69 45 43 75 72 73 6f 72    sSort.iECursor
2cd60 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79  , sSort.pOrderBy
2cd70 2d 3e 6e 45 78 70 72 2b 31 2b 70 45 4c 69 73 74  ->nExpr+1+pEList
2cd80 2d 3e 6e 45 78 70 72 2c 20 30 2c 0a 20 20 20 20  ->nExpr, 0,.    
2cd90 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
2cda0 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
2cdb0 4f 0a 20 20 20 20 20 20 29 3b 0a 20 20 7d 65 6c  O.      );.  }el
2cdc0 73 65 7b 0a 20 20 20 20 73 53 6f 72 74 2e 61 64  se{.    sSort.ad
2cdd0 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 20 2d 31  drSortIndex = -1
2cde0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
2cdf0 68 65 20 6f 75 74 70 75 74 20 69 73 20 64 65 73  he output is des
2ce00 74 69 6e 65 64 20 66 6f 72 20 61 20 74 65 6d 70  tined for a temp
2ce10 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 6f 70 65  orary table, ope
2ce20 6e 20 74 68 61 74 20 74 61 62 6c 65 2e 0a 20 20  n that table..  
2ce30 2a 2f 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e  */.  if( pDest->
2ce40 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d  eDest==SRT_Ephem
2ce50 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Tab ){.    sqlit
2ce60 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2ce70 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
2ce80 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
2ce90 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
2cea0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  ;.  }..  /* Set 
2ceb0 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a 20 20 2a  the limiter..  *
2cec0 2f 0a 20 20 69 45 6e 64 20 3d 20 73 71 6c 69 74  /.  iEnd = sqlit
2ced0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
2cee0 76 29 3b 0a 20 20 70 2d 3e 6e 53 65 6c 65 63 74  v);.  p->nSelect
2cef0 52 6f 77 20 3d 20 33 32 30 3b 20 20 2f 2a 20 34  Row = 320;  /* 4
2cf00 20 62 69 6c 6c 69 6f 6e 20 72 6f 77 73 20 2a 2f   billion rows */
2cf10 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52  .  computeLimitR
2cf20 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
2cf30 20 70 2c 20 69 45 6e 64 29 3b 0a 20 20 69 66 28   p, iEnd);.  if(
2cf40 20 70 2d 3e 69 4c 69 6d 69 74 3d 3d 30 20 26 26   p->iLimit==0 &&
2cf50 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49   sSort.addrSortI
2cf60 6e 64 65 78 3e 3d 30 20 29 7b 0a 20 20 20 20 73  ndex>=0 ){.    s
2cf70 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
2cf80 4f 70 63 6f 64 65 28 76 2c 20 73 53 6f 72 74 2e  Opcode(v, sSort.
2cf90 61 64 64 72 53 6f 72 74 49 6e 64 65 78 2c 20 4f  addrSortIndex, O
2cfa0 50 5f 53 6f 72 74 65 72 4f 70 65 6e 29 3b 0a 20  P_SorterOpen);. 
2cfb0 20 20 20 73 53 6f 72 74 2e 73 6f 72 74 46 6c 61     sSort.sortFla
2cfc0 67 73 20 7c 3d 20 53 4f 52 54 46 4c 41 47 5f 55  gs |= SORTFLAG_U
2cfd0 73 65 53 6f 72 74 65 72 3b 0a 20 20 7d 0a 0a 20  seSorter;.  }.. 
2cfe0 20 2f 2a 20 4f 70 65 6e 20 61 6e 20 65 70 68 65   /* Open an ephe
2cff0 6d 65 72 61 6c 20 69 6e 64 65 78 20 74 6f 20 75  meral index to u
2d000 73 65 20 66 6f 72 20 74 68 65 20 64 69 73 74 69  se for the disti
2d010 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20  nct set..  */.  
2d020 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
2d030 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29 7b  & SF_Distinct ){
2d040 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 74  .    sDistinct.t
2d050 61 62 54 6e 63 74 20 3d 20 70 50 61 72 73 65 2d  abTnct = pParse-
2d060 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 44 69  >nTab++;.    sDi
2d070 73 74 69 6e 63 74 2e 61 64 64 72 54 6e 63 74 20  stinct.addrTnct 
2d080 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
2d090 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op4(v, OP_OpenEp
2d0a0 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20 20  hemeral,.       
2d0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d0c0 20 20 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e        sDistinct.
2d0d0 74 61 62 54 6e 63 74 2c 20 30 2c 20 30 2c 0a 20  tabTnct, 0, 0,. 
2d0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d0f0 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
2d100 72 2a 29 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78  r*)keyInfoFromEx
2d110 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
2d120 2d 3e 70 45 4c 69 73 74 2c 30 2c 30 29 2c 0a 20  ->pEList,0,0),. 
2d130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d140 20 20 20 20 20 20 20 20 20 20 20 20 50 34 5f 4b              P4_K
2d150 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c  EYINFO);.    sql
2d160 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
2d170 28 76 2c 20 42 54 52 45 45 5f 55 4e 4f 52 44 45  (v, BTREE_UNORDE
2d180 52 45 44 29 3b 0a 20 20 20 20 73 44 69 73 74 69  RED);.    sDisti
2d190 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20  nct.eTnctType = 
2d1a0 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
2d1b0 4e 4f 52 44 45 52 45 44 3b 0a 20 20 7d 65 6c 73  NORDERED;.  }els
2d1c0 65 7b 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74  e{.    sDistinct
2d1d0 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 57 48 45  .eTnctType = WHE
2d1e0 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50  RE_DISTINCT_NOOP
2d1f0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 69 73  ;.  }..  if( !is
2d200 41 67 67 20 26 26 20 70 47 72 6f 75 70 42 79 3d  Agg && pGroupBy=
2d210 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20  =0 ){.    /* No 
2d220 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
2d230 6f 6e 73 20 61 6e 64 20 6e 6f 20 47 52 4f 55 50  ons and no GROUP
2d240 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
2d250 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73    u16 wctrlFlags
2d260 20 3d 20 28 73 44 69 73 74 69 6e 63 74 2e 69 73   = (sDistinct.is
2d270 54 6e 63 74 20 3f 20 57 48 45 52 45 5f 57 41 4e  Tnct ? WHERE_WAN
2d280 54 5f 44 49 53 54 49 4e 43 54 20 3a 20 30 29 3b  T_DISTINCT : 0);
2d290 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 48 45  .    assert( WHE
2d2a0 52 45 5f 55 53 45 5f 4c 49 4d 49 54 3d 3d 53 46  RE_USE_LIMIT==SF
2d2b0 5f 46 69 78 65 64 4c 69 6d 69 74 20 29 3b 0a 20  _FixedLimit );. 
2d2c0 20 20 20 77 63 74 72 6c 46 6c 61 67 73 20 7c 3d     wctrlFlags |=
2d2d0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
2d2e0 46 5f 46 69 78 65 64 4c 69 6d 69 74 3b 0a 0a 20  F_FixedLimit;.. 
2d2f0 20 20 20 2f 2a 20 42 65 67 69 6e 20 74 68 65 20     /* Begin the 
2d300 64 61 74 61 62 61 73 65 20 73 63 61 6e 2e 20 2a  database scan. *
2d310 2f 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73  /.    pWInfo = s
2d320 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
2d330 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
2d340 74 2c 20 70 57 68 65 72 65 2c 20 73 53 6f 72 74  t, pWhere, sSort
2d350 2e 70 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20  .pOrderBy,.     
2d360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d370 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 45 4c            p->pEL
2d380 69 73 74 2c 20 77 63 74 72 6c 46 6c 61 67 73 2c  ist, wctrlFlags,
2d390 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b   p->nSelectRow);
2d3a0 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d  .    if( pWInfo=
2d3b0 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  =0 ) goto select
2d3c0 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 73 71  _end;.    if( sq
2d3d0 6c 69 74 65 33 57 68 65 72 65 4f 75 74 70 75 74  lite3WhereOutput
2d3e0 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66 6f 29  RowCount(pWInfo)
2d3f0 20 3c 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77   < p->nSelectRow
2d400 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65   ){.      p->nSe
2d410 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65  lectRow = sqlite
2d420 33 57 68 65 72 65 4f 75 74 70 75 74 52 6f 77 43  3WhereOutputRowC
2d430 6f 75 6e 74 28 70 57 49 6e 66 6f 29 3b 0a 20 20  ount(pWInfo);.  
2d440 20 20 7d 0a 20 20 20 20 69 66 28 20 73 44 69 73    }.    if( sDis
2d450 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 26 26 20  tinct.isTnct && 
2d460 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 44 69  sqlite3WhereIsDi
2d470 73 74 69 6e 63 74 28 70 57 49 6e 66 6f 29 20 29  stinct(pWInfo) )
2d480 7b 0a 20 20 20 20 20 20 73 44 69 73 74 69 6e 63  {.      sDistinc
2d490 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 73 71  t.eTnctType = sq
2d4a0 6c 69 74 65 33 57 68 65 72 65 49 73 44 69 73 74  lite3WhereIsDist
2d4b0 69 6e 63 74 28 70 57 49 6e 66 6f 29 3b 0a 20 20  inct(pWInfo);.  
2d4c0 20 20 7d 0a 20 20 20 20 69 66 28 20 73 53 6f 72    }.    if( sSor
2d4d0 74 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  t.pOrderBy ){.  
2d4e0 20 20 20 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74      sSort.nOBSat
2d4f0 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 49   = sqlite3WhereI
2d500 73 4f 72 64 65 72 65 64 28 70 57 49 6e 66 6f 29  sOrdered(pWInfo)
2d510 3b 0a 20 20 20 20 20 20 69 66 28 20 73 53 6f 72  ;.      if( sSor
2d520 74 2e 6e 4f 42 53 61 74 3d 3d 73 53 6f 72 74 2e  t.nOBSat==sSort.
2d530 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20  pOrderBy->nExpr 
2d540 29 7b 0a 20 20 20 20 20 20 20 20 73 53 6f 72 74  ){.        sSort
2d550 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  .pOrderBy = 0;. 
2d560 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
2d570 20 20 2f 2a 20 49 66 20 73 6f 72 74 69 6e 67 20    /* If sorting 
2d580 69 6e 64 65 78 20 74 68 61 74 20 77 61 73 20 63  index that was c
2d590 72 65 61 74 65 64 20 62 79 20 61 20 70 72 69 6f  reated by a prio
2d5a0 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  r OP_OpenEphemer
2d5b0 61 6c 20 0a 20 20 20 20 2a 2a 20 69 6e 73 74 72  al .    ** instr
2d5c0 75 63 74 69 6f 6e 20 65 6e 64 65 64 20 75 70 20  uction ended up 
2d5d0 6e 6f 74 20 62 65 69 6e 67 20 6e 65 65 64 65 64  not being needed
2d5e0 2c 20 74 68 65 6e 20 63 68 61 6e 67 65 20 74 68  , then change th
2d5f0 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  e OP_OpenEphemer
2d600 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 61  al.    ** into a
2d610 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a 20 20 20 20 2a  n OP_Noop..    *
2d620 2f 0a 20 20 20 20 69 66 28 20 73 53 6f 72 74 2e  /.    if( sSort.
2d630 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30  addrSortIndex>=0
2d640 20 26 26 20 73 53 6f 72 74 2e 70 4f 72 64 65 72   && sSort.pOrder
2d650 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  By==0 ){.      s
2d660 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
2d670 54 6f 4e 6f 6f 70 28 76 2c 20 73 53 6f 72 74 2e  ToNoop(v, sSort.
2d680 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a  addrSortIndex);.
2d690 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 73      }..    /* Us
2d6a0 65 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 69  e the standard i
2d6b0 6e 6e 65 72 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20  nner loop. */.  
2d6c0 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
2d6d0 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45 4c  p(pParse, p, pEL
2d6e0 69 73 74 2c 20 2d 31 2c 20 26 73 53 6f 72 74 2c  ist, -1, &sSort,
2d6f0 20 26 73 44 69 73 74 69 6e 63 74 2c 20 70 44 65   &sDistinct, pDe
2d700 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
2d710 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
2d720 68 65 72 65 43 6f 6e 74 69 6e 75 65 4c 61 62 65  hereContinueLabe
2d730 6c 28 70 57 49 6e 66 6f 29 2c 0a 20 20 20 20 20  l(pWInfo),.     
2d740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
2d750 71 6c 69 74 65 33 57 68 65 72 65 42 72 65 61 6b  qlite3WhereBreak
2d760 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 29 3b 0a  Label(pWInfo));.
2d770 0a 20 20 20 20 2f 2a 20 45 6e 64 20 74 68 65 20  .    /* End the 
2d780 64 61 74 61 62 61 73 65 20 73 63 61 6e 20 6c 6f  database scan lo
2d790 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  op..    */.    s
2d7a0 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
2d7b0 57 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b  WInfo);.  }else{
2d7c0 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73  .    /* This cas
2d7d0 65 20 77 68 65 6e 20 74 68 65 72 65 20 65 78 69  e when there exi
2d7e0 73 74 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  st aggregate fun
2d7f0 63 74 69 6f 6e 73 20 6f 72 20 61 20 47 52 4f 55  ctions or a GROU
2d800 50 20 42 59 20 63 6c 61 75 73 65 0a 20 20 20 20  P BY clause.    
2d810 2a 2a 20 6f 72 20 62 6f 74 68 20 2a 2f 0a 20 20  ** or both */.  
2d820 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
2d830 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f  C;    /* Name co
2d840 6e 74 65 78 74 20 66 6f 72 20 70 72 6f 63 65 73  ntext for proces
2d850 73 69 6e 67 20 61 67 67 72 65 67 61 74 65 20 69  sing aggregate i
2d860 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20  nformation */.  
2d870 20 20 69 6e 74 20 69 41 4d 65 6d 3b 20 20 20 20    int iAMem;    
2d880 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d        /* First M
2d890 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20 73  em address for s
2d8a0 74 6f 72 69 6e 67 20 63 75 72 72 65 6e 74 20 47  toring current G
2d8b0 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69  ROUP BY */.    i
2d8c0 6e 74 20 69 42 4d 65 6d 3b 20 20 20 20 20 20 20  nt iBMem;       
2d8d0 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20     /* First Mem 
2d8e0 61 64 64 72 65 73 73 20 66 6f 72 20 70 72 65 76  address for prev
2d8f0 69 6f 75 73 20 47 52 4f 55 50 20 42 59 20 2a 2f  ious GROUP BY */
2d900 0a 20 20 20 20 69 6e 74 20 69 55 73 65 46 6c 61  .    int iUseFla
2d910 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 20  g;       /* Mem 
2d920 61 64 64 72 65 73 73 20 68 6f 6c 64 69 6e 67 20  address holding 
2d930 66 6c 61 67 20 69 6e 64 69 63 61 74 69 6e 67 20  flag indicating 
2d940 74 68 61 74 20 61 74 20 6c 65 61 73 74 0a 20 20  that at least.  
2d950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d960 20 20 20 20 20 20 2a 2a 20 6f 6e 65 20 72 6f 77        ** one row
2d970 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 74 6f   of the input to
2d980 20 74 68 65 20 61 67 67 72 65 67 61 74 6f 72 20   the aggregator 
2d990 68 61 73 20 62 65 65 6e 0a 20 20 20 20 20 20 20  has been.       
2d9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d9b0 20 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 2a 2f   ** processed */
2d9c0 0a 20 20 20 20 69 6e 74 20 69 41 62 6f 72 74 46  .    int iAbortF
2d9d0 6c 61 67 3b 20 20 20 20 20 2f 2a 20 4d 65 6d 20  lag;     /* Mem 
2d9e0 61 64 64 72 65 73 73 20 77 68 69 63 68 20 63 61  address which ca
2d9f0 75 73 65 73 20 71 75 65 72 79 20 61 62 6f 72 74  uses query abort
2da00 20 69 66 20 70 6f 73 69 74 69 76 65 20 2a 2f 0a   if positive */.
2da10 20 20 20 20 69 6e 74 20 67 72 6f 75 70 42 79 53      int groupByS
2da20 6f 72 74 3b 20 20 20 20 2f 2a 20 52 6f 77 73 20  ort;    /* Rows 
2da30 63 6f 6d 65 20 66 72 6f 6d 20 73 6f 75 72 63 65  come from source
2da40 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64   in GROUP BY ord
2da50 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64  er */.    int ad
2da60 64 72 45 6e 64 3b 20 20 20 20 20 20 20 20 2f 2a  drEnd;        /*
2da70 20 45 6e 64 20 6f 66 20 70 72 6f 63 65 73 73 69   End of processi
2da80 6e 67 20 66 6f 72 20 74 68 69 73 20 53 45 4c 45  ng for this SELE
2da90 43 54 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f  CT */.    int so
2daa0 72 74 50 54 61 62 20 3d 20 30 3b 20 20 20 2f 2a  rtPTab = 0;   /*
2dab0 20 50 73 65 75 64 6f 74 61 62 6c 65 20 75 73 65   Pseudotable use
2dac0 64 20 74 6f 20 64 65 63 6f 64 65 20 73 6f 72 74  d to decode sort
2dad0 69 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20  ing results */. 
2dae0 20 20 20 69 6e 74 20 73 6f 72 74 4f 75 74 20 3d     int sortOut =
2daf0 20 30 3b 20 20 20 20 2f 2a 20 4f 75 74 70 75 74   0;    /* Output
2db00 20 72 65 67 69 73 74 65 72 20 66 72 6f 6d 20 74   register from t
2db10 68 65 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20 20  he sorter */.   
2db20 20 69 6e 74 20 6f 72 64 65 72 42 79 47 72 70 20   int orderByGrp 
2db30 3d 20 30 3b 20 2f 2a 20 54 72 75 65 20 69 66 20  = 0; /* True if 
2db40 74 68 65 20 47 52 4f 55 50 20 42 59 20 61 6e 64  the GROUP BY and
2db50 20 4f 52 44 45 52 20 42 59 20 61 72 65 20 74 68   ORDER BY are th
2db60 65 20 73 61 6d 65 20 2a 2f 0a 0a 20 20 20 20 2f  e same */..    /
2db70 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 61 6e 64  * Remove any and
2db80 20 61 6c 6c 20 61 6c 69 61 73 65 73 20 62 65 74   all aliases bet
2db90 77 65 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  ween the result 
2dba0 73 65 74 20 61 6e 64 20 74 68 65 0a 20 20 20 20  set and the.    
2dbb0 2a 2a 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  ** GROUP BY clau
2dbc0 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  se..    */.    i
2dbd0 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20  f( pGroupBy ){. 
2dbe0 20 20 20 20 20 69 6e 74 20 6b 3b 20 20 20 20 20       int k;     
2dbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dc00 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
2dc10 65 72 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75  er */.      stru
2dc20 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
2dc30 20 2a 70 49 74 65 6d 3b 20 20 2f 2a 20 46 6f 72   *pItem;  /* For
2dc40 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65 78   looping over ex
2dc50 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 20 6c 69  pression in a li
2dc60 73 74 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72  st */..      for
2dc70 28 6b 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  (k=p->pEList->nE
2dc80 78 70 72 2c 20 70 49 74 65 6d 3d 70 2d 3e 70 45  xpr, pItem=p->pE
2dc90 4c 69 73 74 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d  List->a; k>0; k-
2dca0 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  -, pItem++){.   
2dcb0 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e       pItem->u.x.
2dcc0 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20  iAlias = 0;.    
2dcd0 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d    }.      for(k=
2dce0 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c  pGroupBy->nExpr,
2dcf0 20 70 49 74 65 6d 3d 70 47 72 6f 75 70 42 79 2d   pItem=pGroupBy-
2dd00 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49  >a; k>0; k--, pI
2dd10 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
2dd20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c 69 61  pItem->u.x.iAlia
2dd30 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  s = 0;.      }. 
2dd40 20 20 20 20 20 61 73 73 65 72 74 28 20 36 36 3d       assert( 66=
2dd50 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31  =sqlite3LogEst(1
2dd60 30 30 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  00) );.      if(
2dd70 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 36   p->nSelectRow>6
2dd80 36 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  6 ) p->nSelectRo
2dd90 77 20 3d 20 36 36 3b 0a 20 20 20 20 7d 65 6c 73  w = 66;.    }els
2dda0 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
2ddb0 20 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73   0==sqlite3LogEs
2ddc0 74 28 31 29 20 29 3b 0a 20 20 20 20 20 20 70 2d  t(1) );.      p-
2ddd0 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 30 3b  >nSelectRow = 0;
2dde0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
2ddf0 66 20 74 68 65 72 65 20 69 73 20 62 6f 74 68 20  f there is both 
2de00 61 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20 61  a GROUP BY and a
2de10 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
2de20 65 20 61 6e 64 20 74 68 65 79 20 61 72 65 0a 20  e and they are. 
2de30 20 20 20 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c     ** identical,
2de40 20 74 68 65 6e 20 69 74 20 6d 61 79 20 62 65 20   then it may be 
2de50 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 69 73 61  possible to disa
2de60 62 6c 65 20 74 68 65 20 4f 52 44 45 52 20 42 59  ble the ORDER BY
2de70 20 63 6c 61 75 73 65 20 0a 20 20 20 20 2a 2a 20   clause .    ** 
2de80 6f 6e 20 74 68 65 20 67 72 6f 75 6e 64 73 20 74  on the grounds t
2de90 68 61 74 20 74 68 65 20 47 52 4f 55 50 20 42 59  hat the GROUP BY
2dea0 20 77 69 6c 6c 20 63 61 75 73 65 20 65 6c 65 6d   will cause elem
2deb0 65 6e 74 73 20 74 6f 20 63 6f 6d 65 20 6f 75 74  ents to come out
2dec0 20 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20   .    ** in the 
2ded0 63 6f 72 72 65 63 74 20 6f 72 64 65 72 2e 20 49  correct order. I
2dee0 74 20 61 6c 73 6f 20 6d 61 79 20 6e 6f 74 20 2d  t also may not -
2def0 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 6d 69   the GROUP BY mi
2df00 67 68 74 20 75 73 65 20 61 0a 20 20 20 20 2a 2a  ght use a.    **
2df10 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20   database index 
2df20 74 68 61 74 20 63 61 75 73 65 73 20 72 6f 77 73  that causes rows
2df30 20 74 6f 20 62 65 20 67 72 6f 75 70 65 64 20 74   to be grouped t
2df40 6f 67 65 74 68 65 72 20 61 73 20 72 65 71 75 69  ogether as requi
2df50 72 65 64 0a 20 20 20 20 2a 2a 20 62 75 74 20 6e  red.    ** but n
2df60 6f 74 20 61 63 74 75 61 6c 6c 79 20 73 6f 72 74  ot actually sort
2df70 65 64 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20  ed. Either way, 
2df80 72 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20  record the fact 
2df90 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20  that the.    ** 
2dfa0 4f 52 44 45 52 20 42 59 20 61 6e 64 20 47 52 4f  ORDER BY and GRO
2dfb0 55 50 20 42 59 20 63 6c 61 75 73 65 73 20 61 72  UP BY clauses ar
2dfc0 65 20 74 68 65 20 73 61 6d 65 20 62 79 20 73 65  e the same by se
2dfd0 74 74 69 6e 67 20 74 68 65 20 6f 72 64 65 72 42  tting the orderB
2dfe0 79 47 72 70 0a 20 20 20 20 2a 2a 20 76 61 72 69  yGrp.    ** vari
2dff0 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66  able.  */.    if
2e000 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  ( sqlite3ExprLis
2e010 74 43 6f 6d 70 61 72 65 28 70 47 72 6f 75 70 42  tCompare(pGroupB
2e020 79 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  y, sSort.pOrderB
2e030 79 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20  y, -1)==0 ){.   
2e040 20 20 20 6f 72 64 65 72 42 79 47 72 70 20 3d 20     orderByGrp = 
2e050 31 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f  1;.    }. .    /
2e060 2a 20 43 72 65 61 74 65 20 61 20 6c 61 62 65 6c  * Create a label
2e070 20 74 6f 20 6a 75 6d 70 20 74 6f 20 77 68 65 6e   to jump to when
2e080 20 77 65 20 77 61 6e 74 20 74 6f 20 61 62 6f 72   we want to abor
2e090 74 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20  t the query */. 
2e0a0 20 20 20 61 64 64 72 45 6e 64 20 3d 20 73 71 6c     addrEnd = sql
2e0b0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
2e0c0 6c 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f  l(v);..    /* Co
2e0d0 6e 76 65 72 74 20 54 4b 5f 43 4f 4c 55 4d 4e 20  nvert TK_COLUMN 
2e0e0 6e 6f 64 65 73 20 69 6e 74 6f 20 54 4b 5f 41 47  nodes into TK_AG
2e0f0 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 6d 61 6b  G_COLUMN and mak
2e100 65 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 20  e entries in.   
2e110 20 2a 2a 20 73 41 67 67 49 6e 66 6f 20 66 6f 72   ** sAggInfo for
2e120 20 61 6c 6c 20 54 4b 5f 41 47 47 5f 46 55 4e 43   all TK_AGG_FUNC
2e130 54 49 4f 4e 20 6e 6f 64 65 73 20 69 6e 20 65 78  TION nodes in ex
2e140 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65  pressions of the
2e150 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 73  .    ** SELECT s
2e160 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 2a 2f  tatement..    */
2e170 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e 43  .    memset(&sNC
2e180 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29  , 0, sizeof(sNC)
2e190 29 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61 72 73  );.    sNC.pPars
2e1a0 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20  e = pParse;.    
2e1b0 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
2e1c0 54 61 62 4c 69 73 74 3b 0a 20 20 20 20 73 4e 43  TabList;.    sNC
2e1d0 2e 70 41 67 67 49 6e 66 6f 20 3d 20 26 73 41 67  .pAggInfo = &sAg
2e1e0 67 49 6e 66 6f 3b 0a 20 20 20 20 73 41 67 67 49  gInfo;.    sAggI
2e1f0 6e 66 6f 2e 6d 6e 52 65 67 20 3d 20 70 50 61 72  nfo.mnReg = pPar
2e200 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
2e210 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e  sAggInfo.nSortin
2e220 67 43 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f 75 70  gColumn = pGroup
2e230 42 79 20 3f 20 70 47 72 6f 75 70 42 79 2d 3e 6e  By ? pGroupBy->n
2e240 45 78 70 72 20 3a 20 30 3b 0a 20 20 20 20 73 41  Expr : 0;.    sA
2e250 67 67 49 6e 66 6f 2e 70 47 72 6f 75 70 42 79 20  ggInfo.pGroupBy 
2e260 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20  = pGroupBy;.    
2e270 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
2e280 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20  zeAggList(&sNC, 
2e290 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c  pEList);.    sql
2e2a0 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
2e2b0 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 73 53 6f  ggList(&sNC, sSo
2e2c0 72 74 2e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  rt.pOrderBy);.  
2e2d0 20 20 69 66 28 20 70 48 61 76 69 6e 67 20 29 7b    if( pHaving ){
2e2e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
2e2f0 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
2e300 74 65 73 28 26 73 4e 43 2c 20 70 48 61 76 69 6e  tes(&sNC, pHavin
2e310 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 41  g);.    }.    sA
2e320 67 67 49 6e 66 6f 2e 6e 41 63 63 75 6d 75 6c 61  ggInfo.nAccumula
2e330 74 6f 72 20 3d 20 73 41 67 67 49 6e 66 6f 2e 6e  tor = sAggInfo.n
2e340 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 66 6f 72 28  Column;.    for(
2e350 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e  i=0; i<sAggInfo.
2e360 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  nFunc; i++){.   
2e370 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
2e380 48 61 73 50 72 6f 70 65 72 74 79 28 73 41 67 67  HasProperty(sAgg
2e390 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45  Info.aFunc[i].pE
2e3a0 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
2e3b0 74 29 20 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e  t) );.      sNC.
2e3c0 6e 63 46 6c 61 67 73 20 7c 3d 20 4e 43 5f 49 6e  ncFlags |= NC_In
2e3d0 41 67 67 46 75 6e 63 3b 0a 20 20 20 20 20 20 73  AggFunc;.      s
2e3e0 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
2e3f0 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 73  eAggList(&sNC, s
2e400 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d  AggInfo.aFunc[i]
2e410 2e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29  .pExpr->x.pList)
2e420 3b 0a 20 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c  ;.      sNC.ncFl
2e430 61 67 73 20 26 3d 20 7e 4e 43 5f 49 6e 41 67 67  ags &= ~NC_InAgg
2e440 46 75 6e 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Func;.    }.    
2e450 73 41 67 67 49 6e 66 6f 2e 6d 78 52 65 67 20 3d  sAggInfo.mxReg =
2e460 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20   pParse->nMem;. 
2e470 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
2e480 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73  cFailed ) goto s
2e490 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 20 20  elect_end;..    
2e4a0 2f 2a 20 50 72 6f 63 65 73 73 69 6e 67 20 66 6f  /* Processing fo
2e4b0 72 20 61 67 67 72 65 67 61 74 65 73 20 77 69 74  r aggregates wit
2e4c0 68 20 47 52 4f 55 50 20 42 59 20 69 73 20 76 65  h GROUP BY is ve
2e4d0 72 79 20 64 69 66 66 65 72 65 6e 74 20 61 6e 64  ry different and
2e4e0 0a 20 20 20 20 2a 2a 20 6d 75 63 68 20 6d 6f 72  .    ** much mor
2e4f0 65 20 63 6f 6d 70 6c 65 78 20 74 68 61 6e 20 61  e complex than a
2e500 67 67 72 65 67 61 74 65 73 20 77 69 74 68 6f 75  ggregates withou
2e510 74 20 61 20 47 52 4f 55 50 20 42 59 2e 0a 20 20  t a GROUP BY..  
2e520 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47 72    */.    if( pGr
2e530 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 4b  oupBy ){.      K
2e540 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
2e550 3b 20 20 2f 2a 20 4b 65 79 69 6e 67 20 69 6e 66  ;  /* Keying inf
2e560 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65  ormation for the
2e570 20 67 72 6f 75 70 20 62 79 20 63 6c 61 75 73 65   group by clause
2e580 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
2e590 64 72 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  dr1;          /*
2e5a0 20 41 2d 76 73 2d 42 20 63 6f 6d 70 61 72 69 73   A-vs-B comparis
2e5b0 69 6f 6e 20 6a 75 6d 70 20 2a 2f 0a 20 20 20 20  ion jump */.    
2e5c0 20 20 69 6e 74 20 61 64 64 72 4f 75 74 70 75 74    int addrOutput
2e5d0 52 6f 77 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f  Row;  /* Start o
2e5e0 66 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  f subroutine tha
2e5f0 74 20 6f 75 74 70 75 74 73 20 61 20 72 65 73 75  t outputs a resu
2e600 6c 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20  lt row */.      
2e610 69 6e 74 20 72 65 67 4f 75 74 70 75 74 52 6f 77  int regOutputRow
2e620 3b 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64  ;   /* Return ad
2e630 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
2e640 6f 72 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75  or output subrou
2e650 74 69 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  tine */.      in
2e660 74 20 61 64 64 72 53 65 74 41 62 6f 72 74 3b 20  t addrSetAbort; 
2e670 20 20 2f 2a 20 53 65 74 20 74 68 65 20 61 62 6f    /* Set the abo
2e680 72 74 20 66 6c 61 67 20 61 6e 64 20 72 65 74 75  rt flag and retu
2e690 72 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  rn */.      int 
2e6a0 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20  addrTopOfLoop;  
2e6b0 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e  /* Top of the in
2e6c0 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20  put loop */.    
2e6d0 20 20 69 6e 74 20 61 64 64 72 53 6f 72 74 69 6e    int addrSortin
2e6e0 67 49 64 78 3b 20 2f 2a 20 54 68 65 20 4f 50 5f  gIdx; /* The OP_
2e6f0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 66 6f  OpenEphemeral fo
2e700 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e  r the sorting in
2e710 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  dex */.      int
2e720 20 61 64 64 72 52 65 73 65 74 3b 20 20 20 20 20   addrReset;     
2e730 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65 20 66   /* Subroutine f
2e740 6f 72 20 72 65 73 65 74 74 69 6e 67 20 74 68 65  or resetting the
2e750 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a   accumulator */.
2e760 20 20 20 20 20 20 69 6e 74 20 72 65 67 52 65 73        int regRes
2e770 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 74  et;       /* Ret
2e780 75 72 6e 20 61 64 64 72 65 73 73 20 72 65 67 69  urn address regi
2e790 73 74 65 72 20 66 6f 72 20 72 65 73 65 74 20 73  ster for reset s
2e7a0 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20 20  ubroutine */..  
2e7b0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
2e7c0 69 73 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c  is a GROUP BY cl
2e7d0 61 75 73 65 20 77 65 20 6d 69 67 68 74 20 6e 65  ause we might ne
2e7e0 65 64 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64  ed a sorting ind
2e7f0 65 78 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 69  ex to.      ** i
2e800 6d 70 6c 65 6d 65 6e 74 20 69 74 2e 20 20 41 6c  mplement it.  Al
2e810 6c 6f 63 61 74 65 20 74 68 61 74 20 73 6f 72 74  locate that sort
2e820 69 6e 67 20 69 6e 64 65 78 20 6e 6f 77 2e 20 20  ing index now.  
2e830 49 66 20 69 74 20 74 75 72 6e 73 20 6f 75 74 0a  If it turns out.
2e840 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65        ** that we
2e850 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 69 74 20   do not need it 
2e860 61 66 74 65 72 20 61 6c 6c 2c 20 74 68 65 20 4f  after all, the O
2e870 50 5f 53 6f 72 74 65 72 4f 70 65 6e 20 69 6e 73  P_SorterOpen ins
2e880 74 72 75 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a  truction.      *
2e890 2a 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72  * will be conver
2e8a0 74 65 64 20 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e  ted into a Noop.
2e8b0 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20    .      */.    
2e8c0 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69    sAggInfo.sorti
2e8d0 6e 67 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e  ngIdx = pParse->
2e8e0 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70 4b  nTab++;.      pK
2e8f0 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f  eyInfo = keyInfo
2e900 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
2e910 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 30  rse, pGroupBy, 0
2e920 2c 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75  , sAggInfo.nColu
2e930 6d 6e 29 3b 0a 20 20 20 20 20 20 61 64 64 72 53  mn);.      addrS
2e940 6f 72 74 69 6e 67 49 64 78 20 3d 20 73 71 6c 69  ortingIdx = sqli
2e950 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
2e960 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 2c 20   OP_SorterOpen, 
2e970 0a 20 20 20 20 20 20 20 20 20 20 73 41 67 67 49  .          sAggI
2e980 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20  nfo.sortingIdx, 
2e990 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e  sAggInfo.nSortin
2e9a0 67 43 6f 6c 75 6d 6e 2c 20 0a 20 20 20 20 20 20  gColumn, .      
2e9b0 20 20 20 20 30 2c 20 28 63 68 61 72 2a 29 70 4b      0, (char*)pK
2e9c0 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
2e9d0 46 4f 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  FO);..      /* I
2e9e0 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79  nitialize memory
2e9f0 20 6c 6f 63 61 74 69 6f 6e 73 20 75 73 65 64 20   locations used 
2ea00 62 79 20 47 52 4f 55 50 20 42 59 20 61 67 67 72  by GROUP BY aggr
2ea10 65 67 61 74 65 20 70 72 6f 63 65 73 73 69 6e 67  egate processing
2ea20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2ea30 69 55 73 65 46 6c 61 67 20 3d 20 2b 2b 70 50 61  iUseFlag = ++pPa
2ea40 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
2ea50 20 69 41 62 6f 72 74 46 6c 61 67 20 3d 20 2b 2b   iAbortFlag = ++
2ea60 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
2ea70 20 20 20 20 72 65 67 4f 75 74 70 75 74 52 6f 77      regOutputRow
2ea80 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
2ea90 6d 3b 0a 20 20 20 20 20 20 61 64 64 72 4f 75 74  m;.      addrOut
2eaa0 70 75 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  putRow = sqlite3
2eab0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
2eac0 3b 0a 20 20 20 20 20 20 72 65 67 52 65 73 65 74  ;.      regReset
2ead0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
2eae0 6d 3b 0a 20 20 20 20 20 20 61 64 64 72 52 65 73  m;.      addrRes
2eaf0 65 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  et = sqlite3Vdbe
2eb00 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
2eb10 20 20 20 20 69 41 4d 65 6d 20 3d 20 70 50 61 72      iAMem = pPar
2eb20 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20  se->nMem + 1;.  
2eb30 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
2eb40 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45   += pGroupBy->nE
2eb50 78 70 72 3b 0a 20 20 20 20 20 20 69 42 4d 65 6d  xpr;.      iBMem
2eb60 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20   = pParse->nMem 
2eb70 2b 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73  + 1;.      pPars
2eb80 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75  e->nMem += pGrou
2eb90 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  pBy->nExpr;.    
2eba0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2ebb0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
2ebc0 72 2c 20 30 2c 20 69 41 62 6f 72 74 46 6c 61 67  r, 0, iAbortFlag
2ebd0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
2ebe0 6d 65 6e 74 28 28 76 2c 20 22 63 6c 65 61 72 20  ment((v, "clear 
2ebf0 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20  abort flag"));. 
2ec00 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2ec10 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
2ec20 65 67 65 72 2c 20 30 2c 20 69 55 73 65 46 6c 61  eger, 0, iUseFla
2ec30 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  g);.      VdbeCo
2ec40 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64 69 63  mment((v, "indic
2ec50 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  ate accumulator 
2ec60 65 6d 70 74 79 22 29 29 3b 0a 20 20 20 20 20 20  empty"));.      
2ec70 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2ec80 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  3(v, OP_Null, 0,
2ec90 20 69 41 4d 65 6d 2c 20 69 41 4d 65 6d 2b 70 47   iAMem, iAMem+pG
2eca0 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2d 31 29  roupBy->nExpr-1)
2ecb0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 42 65 67 69  ;..      /* Begi
2ecc0 6e 20 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69  n a loop that wi
2ecd0 6c 6c 20 65 78 74 72 61 63 74 20 61 6c 6c 20 73  ll extract all s
2ece0 6f 75 72 63 65 20 72 6f 77 73 20 69 6e 20 47 52  ource rows in GR
2ecf0 4f 55 50 20 42 59 20 6f 72 64 65 72 2e 0a 20 20  OUP BY order..  
2ed00 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68      ** This migh
2ed10 74 20 69 6e 76 6f 6c 76 65 20 74 77 6f 20 73 65  t involve two se
2ed20 70 61 72 61 74 65 20 6c 6f 6f 70 73 20 77 69 74  parate loops wit
2ed30 68 20 61 6e 20 4f 50 5f 53 6f 72 74 20 69 6e 20  h an OP_Sort in 
2ed40 62 65 74 77 65 65 6e 2c 20 6f 72 0a 20 20 20 20  between, or.    
2ed50 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65    ** it might be
2ed60 20 61 20 73 69 6e 67 6c 65 20 6c 6f 6f 70 20 74   a single loop t
2ed70 68 61 74 20 75 73 65 73 20 61 6e 20 69 6e 64 65  hat uses an inde
2ed80 78 20 74 6f 20 65 78 74 72 61 63 74 20 69 6e 66  x to extract inf
2ed90 6f 72 6d 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a  ormation.      *
2eda0 2a 20 69 6e 20 74 68 65 20 72 69 67 68 74 20 6f  * in the right o
2edb0 72 64 65 72 20 74 6f 20 62 65 67 69 6e 20 77 69  rder to begin wi
2edc0 74 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  th..      */.   
2edd0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2ede0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
2edf0 2c 20 72 65 67 52 65 73 65 74 2c 20 61 64 64 72  , regReset, addr
2ee00 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 70 57  Reset);.      pW
2ee10 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68  Info = sqlite3Wh
2ee20 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c  ereBegin(pParse,
2ee30 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72   pTabList, pWher
2ee40 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 30 2c 0a  e, pGroupBy, 0,.
2ee50 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45 5f            WHERE_
2ee60 47 52 4f 55 50 42 59 20 7c 20 28 6f 72 64 65 72  GROUPBY | (order
2ee70 42 79 47 72 70 20 3f 20 57 48 45 52 45 5f 53 4f  ByGrp ? WHERE_SO
2ee80 52 54 42 59 47 52 4f 55 50 20 3a 20 30 29 2c 20  RTBYGROUP : 0), 
2ee90 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  0.      );.     
2eea0 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29   if( pWInfo==0 )
2eeb0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
2eec0 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
2eed0 74 65 33 57 68 65 72 65 49 73 4f 72 64 65 72 65  te3WhereIsOrdere
2eee0 64 28 70 57 49 6e 66 6f 29 3d 3d 70 47 72 6f 75  d(pWInfo)==pGrou
2eef0 70 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  pBy->nExpr ){.  
2ef00 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 74        /* The opt
2ef10 69 6d 69 7a 65 72 20 69 73 20 61 62 6c 65 20 74  imizer is able t
2ef20 6f 20 64 65 6c 69 76 65 72 20 72 6f 77 73 20 69  o deliver rows i
2ef30 6e 20 67 72 6f 75 70 20 62 79 20 6f 72 64 65 72  n group by order
2ef40 20 73 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 77   so.        ** w
2ef50 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f  e do not have to
2ef60 20 73 6f 72 74 2e 20 20 54 68 65 20 4f 50 5f 4f   sort.  The OP_O
2ef70 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 74 61 62  penEphemeral tab
2ef80 6c 65 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20  le will be.     
2ef90 20 20 20 2a 2a 20 63 61 6e 63 65 6c 6c 65 64 20     ** cancelled 
2efa0 6c 61 74 65 72 20 62 65 63 61 75 73 65 20 77 65  later because we
2efb0 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75   still need to u
2efc0 73 65 20 74 68 65 20 70 4b 65 79 49 6e 66 6f 0a  se the pKeyInfo.
2efd0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2efe0 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d     groupBySort =
2eff0 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
2f000 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 73  .        /* Rows
2f010 20 61 72 65 20 63 6f 6d 69 6e 67 20 6f 75 74 20   are coming out 
2f020 69 6e 20 75 6e 64 65 74 65 72 6d 69 6e 65 64 20  in undetermined 
2f030 6f 72 64 65 72 2e 20 20 57 65 20 68 61 76 65 20  order.  We have 
2f040 74 6f 20 70 75 73 68 0a 20 20 20 20 20 20 20 20  to push.        
2f050 2a 2a 20 65 61 63 68 20 72 6f 77 20 69 6e 74 6f  ** each row into
2f060 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78   a sorting index
2f070 2c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  , terminate the 
2f080 66 69 72 73 74 20 6c 6f 6f 70 2c 0a 20 20 20 20  first loop,.    
2f090 20 20 20 20 2a 2a 20 74 68 65 6e 20 6c 6f 6f 70      ** then loop
2f0a0 20 6f 76 65 72 20 74 68 65 20 73 6f 72 74 69 6e   over the sortin
2f0b0 67 20 69 6e 64 65 78 20 69 6e 20 6f 72 64 65 72  g index in order
2f0c0 20 74 6f 20 67 65 74 20 74 68 65 20 6f 75 74 70   to get the outp
2f0d0 75 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  ut.        ** in
2f0e0 20 73 6f 72 74 65 64 20 6f 72 64 65 72 0a 20 20   sorted order.  
2f0f0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2f100 20 69 6e 74 20 72 65 67 42 61 73 65 3b 0a 20 20   int regBase;.  
2f110 20 20 20 20 20 20 69 6e 74 20 72 65 67 52 65 63        int regRec
2f120 6f 72 64 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  ord;.        int
2f130 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69   nCol;.        i
2f140 6e 74 20 6e 47 72 6f 75 70 42 79 3b 0a 0a 20 20  nt nGroupBy;..  
2f150 20 20 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d        explainTem
2f160 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 0a  pTable(pParse, .
2f170 20 20 20 20 20 20 20 20 20 20 20 20 28 73 44 69              (sDi
2f180 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 26 26  stinct.isTnct &&
2f190 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 26 53 46   (p->selFlags&SF
2f1a0 5f 44 69 73 74 69 6e 63 74 29 3d 3d 30 29 20 3f  _Distinct)==0) ?
2f1b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2f1c0 20 20 20 20 20 22 44 49 53 54 49 4e 43 54 22 20       "DISTINCT" 
2f1d0 3a 20 22 47 52 4f 55 50 20 42 59 22 29 3b 0a 0a  : "GROUP BY");..
2f1e0 20 20 20 20 20 20 20 20 67 72 6f 75 70 42 79 53          groupByS
2f1f0 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ort = 1;.       
2f200 20 6e 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f   nGroupBy = pGro
2f210 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  upBy->nExpr;.   
2f220 20 20 20 20 20 6e 43 6f 6c 20 3d 20 6e 47 72 6f       nCol = nGro
2f230 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 6a 20  upBy;.        j 
2f240 3d 20 6e 47 72 6f 75 70 42 79 3b 0a 20 20 20 20  = nGroupBy;.    
2f250 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
2f260 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b  AggInfo.nColumn;
2f270 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
2f280 20 69 66 28 20 73 41 67 67 49 6e 66 6f 2e 61 43   if( sAggInfo.aC
2f290 6f 6c 5b 69 5d 2e 69 53 6f 72 74 65 72 43 6f 6c  ol[i].iSorterCol
2f2a0 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20  umn>=j ){.      
2f2b0 20 20 20 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20        nCol++;.  
2f2c0 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20            j++;. 
2f2d0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2f2e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67     }.        reg
2f2f0 42 61 73 65 20 3d 20 73 71 6c 69 74 65 33 47 65  Base = sqlite3Ge
2f300 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
2f310 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20  e, nCol);.      
2f320 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
2f330 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
2f340 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2f350 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
2f360 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42  (pParse, pGroupB
2f370 79 2c 20 72 65 67 42 61 73 65 2c 20 30 2c 20 30  y, regBase, 0, 0
2f380 29 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e  );.        j = n
2f390 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20  GroupBy;.       
2f3a0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67   for(i=0; i<sAgg
2f3b0 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  Info.nColumn; i+
2f3c0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74  +){.          st
2f3d0 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c  ruct AggInfo_col
2f3e0 20 2a 70 43 6f 6c 20 3d 20 26 73 41 67 67 49 6e   *pCol = &sAggIn
2f3f0 66 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20  fo.aCol[i];.    
2f400 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e        if( pCol->
2f410 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a  iSorterColumn>=j
2f420 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2f430 69 6e 74 20 72 31 20 3d 20 6a 20 2b 20 72 65 67  int r1 = j + reg
2f440 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Base;.          
2f450 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
2f460 65 47 65 74 43 6f 6c 75 6d 6e 54 6f 52 65 67 28  eGetColumnToReg(
2f470 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
2f480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f490 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54          pCol->pT
2f4a0 61 62 2c 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d  ab, pCol->iColum
2f4b0 6e 2c 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c  n, pCol->iTable,
2f4c0 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20   r1);.          
2f4d0 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20    j++;.         
2f4e0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2f4f0 20 20 20 20 20 72 65 67 52 65 63 6f 72 64 20 3d       regRecord =
2f500 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
2f510 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
2f520 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2f530 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
2f540 52 65 63 6f 72 64 2c 20 72 65 67 42 61 73 65 2c  Record, regBase,
2f550 20 6e 43 6f 6c 2c 20 72 65 67 52 65 63 6f 72 64   nCol, regRecord
2f560 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2f570 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2f580 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 2c  OP_SorterInsert,
2f590 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
2f5a0 67 49 64 78 2c 20 72 65 67 52 65 63 6f 72 64 29  gIdx, regRecord)
2f5b0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2f5c0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
2f5d0 70 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72  pParse, regRecor
2f5e0 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  d);.        sqli
2f5f0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
2f600 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 42  nge(pParse, regB
2f610 61 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20  ase, nCol);.    
2f620 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
2f630 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  End(pWInfo);.   
2f640 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f       sAggInfo.so
2f650 72 74 69 6e 67 49 64 78 50 54 61 62 20 3d 20 73  rtingIdxPTab = s
2f660 6f 72 74 50 54 61 62 20 3d 20 70 50 61 72 73 65  ortPTab = pParse
2f670 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
2f680 20 20 73 6f 72 74 4f 75 74 20 3d 20 73 71 6c 69    sortOut = sqli
2f690 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
2f6a0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
2f6b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
2f6c0 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64  (v, OP_OpenPseud
2f6d0 6f 2c 20 73 6f 72 74 50 54 61 62 2c 20 73 6f 72  o, sortPTab, sor
2f6e0 74 4f 75 74 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20  tOut, nCol);.   
2f6f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2f700 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
2f710 74 65 72 53 6f 72 74 2c 20 73 41 67 67 49 6e 66  terSort, sAggInf
2f720 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64  o.sortingIdx, ad
2f730 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 20 20  drEnd);.        
2f740 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
2f750 22 47 52 4f 55 50 20 42 59 20 73 6f 72 74 22 29  "GROUP BY sort")
2f760 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
2f770 76 29 3b 0a 20 20 20 20 20 20 20 20 73 41 67 67  v);.        sAgg
2f780 49 6e 66 6f 2e 75 73 65 53 6f 72 74 69 6e 67 49  Info.useSortingI
2f790 64 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  dx = 1;.        
2f7a0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
2f7b0 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 0a  Clear(pParse);..
2f7c0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
2f7d0 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78 20 6f  * If the index o
2f7e0 72 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  r temporary tabl
2f7f0 65 20 75 73 65 64 20 62 79 20 74 68 65 20 47 52  e used by the GR
2f800 4f 55 50 20 42 59 20 73 6f 72 74 0a 20 20 20 20  OUP BY sort.    
2f810 20 20 2a 2a 20 77 69 6c 6c 20 6e 61 74 75 72 61    ** will natura
2f820 6c 6c 79 20 64 65 6c 69 76 65 72 20 72 6f 77 73  lly deliver rows
2f830 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 72 65   in the order re
2f840 71 75 69 72 65 64 20 62 79 20 74 68 65 20 4f 52  quired by the OR
2f850 44 45 52 20 42 59 0a 20 20 20 20 20 20 2a 2a 20  DER BY.      ** 
2f860 63 6c 61 75 73 65 2c 20 63 61 6e 63 65 6c 20 74  clause, cancel t
2f870 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  he ephemeral tab
2f880 6c 65 20 6f 70 65 6e 20 63 6f 64 65 64 20 65 61  le open coded ea
2f890 72 6c 69 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a  rlier..      **.
2f8a0 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73        ** This is
2f8b0 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
2f8c0 20 2d 20 74 68 65 20 63 6f 72 72 65 63 74 20 61   - the correct a
2f8d0 6e 73 77 65 72 20 73 68 6f 75 6c 64 20 72 65 73  nswer should res
2f8e0 75 6c 74 20 72 65 67 61 72 64 6c 65 73 73 2e 0a  ult regardless..
2f8f0 20 20 20 20 20 20 2a 2a 20 55 73 65 20 74 68 65        ** Use the
2f900 20 53 51 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f   SQLITE_GroupByO
2f910 72 64 65 72 20 66 6c 61 67 20 77 69 74 68 20 53  rder flag with S
2f920 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f  QLITE_TESTCTRL_O
2f930 50 54 49 4d 49 5a 45 52 20 74 6f 20 0a 20 20 20  PTIMIZER to .   
2f940 20 20 20 2a 2a 20 64 69 73 61 62 6c 65 20 74 68     ** disable th
2f950 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  is optimization 
2f960 66 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72 70  for testing purp
2f970 6f 73 65 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20  oses.  */.      
2f980 69 66 28 20 6f 72 64 65 72 42 79 47 72 70 20 26  if( orderByGrp &
2f990 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e  & OptimizationEn
2f9a0 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45  abled(db, SQLITE
2f9b0 5f 47 72 6f 75 70 42 79 4f 72 64 65 72 29 20 0a  _GroupByOrder) .
2f9c0 20 20 20 20 20 20 20 26 26 20 28 67 72 6f 75 70         && (group
2f9d0 42 79 53 6f 72 74 20 7c 7c 20 73 71 6c 69 74 65  BySort || sqlite
2f9e0 33 57 68 65 72 65 49 73 53 6f 72 74 65 64 28 70  3WhereIsSorted(p
2f9f0 57 49 6e 66 6f 29 29 0a 20 20 20 20 20 20 29 7b  WInfo)).      ){
2fa00 0a 20 20 20 20 20 20 20 20 73 53 6f 72 74 2e 70  .        sSort.p
2fa10 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
2fa20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2fa30 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20  ChangeToNoop(v, 
2fa40 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e  sSort.addrSortIn
2fa50 64 65 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  dex);.      }.. 
2fa60 20 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65       /* Evaluate
2fa70 20 74 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f   the current GRO
2fa80 55 50 20 42 59 20 74 65 72 6d 73 20 61 6e 64 20  UP BY terms and 
2fa90 73 74 6f 72 65 20 69 6e 20 62 30 2c 20 62 31 2c  store in b0, b1,
2faa0 20 62 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20   b2....      ** 
2fab0 28 62 30 20 69 73 20 6d 65 6d 6f 72 79 20 6c 6f  (b0 is memory lo
2fac0 63 61 74 69 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20  cation iBMem+0, 
2fad0 62 31 20 69 73 20 69 42 4d 65 6d 2b 31 2c 20 61  b1 is iBMem+1, a
2fae0 6e 64 20 73 6f 20 66 6f 72 74 68 29 0a 20 20 20  nd so forth).   
2faf0 20 20 20 2a 2a 20 54 68 65 6e 20 63 6f 6d 70 61     ** Then compa
2fb00 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 47  re the current G
2fb10 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61 67  ROUP BY terms ag
2fb20 61 69 6e 73 74 20 74 68 65 20 47 52 4f 55 50 20  ainst the GROUP 
2fb30 42 59 20 74 65 72 6d 73 0a 20 20 20 20 20 20 2a  BY terms.      *
2fb40 2a 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69  * from the previ
2fb50 6f 75 73 20 72 6f 77 20 63 75 72 72 65 6e 74 6c  ous row currentl
2fb60 79 20 73 74 6f 72 65 64 20 69 6e 20 61 30 2c 20  y stored in a0, 
2fb70 61 31 2c 20 61 32 2e 2e 2e 0a 20 20 20 20 20 20  a1, a2....      
2fb80 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 54 6f 70  */.      addrTop
2fb90 4f 66 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33  OfLoop = sqlite3
2fba0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
2fbb0 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
2fbc0 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
2fbd0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69  pParse);.      i
2fbe0 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29  f( groupBySort )
2fbf0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2fc00 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
2fc10 50 5f 53 6f 72 74 65 72 44 61 74 61 2c 20 73 41  P_SorterData, sA
2fc20 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
2fc30 78 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  x,.             
2fc40 20 20 20 20 20 20 20 20 20 20 20 20 20 73 6f 72               sor
2fc50 74 4f 75 74 2c 20 73 6f 72 74 50 54 61 62 29 3b  tOut, sortPTab);
2fc60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
2fc70 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75 70  or(j=0; j<pGroup
2fc80 42 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b  By->nExpr; j++){
2fc90 0a 20 20 20 20 20 20 20 20 69 66 28 20 67 72 6f  .        if( gro
2fca0 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20  upBySort ){.    
2fcb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2fcc0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
2fcd0 6c 75 6d 6e 2c 20 73 6f 72 74 50 54 61 62 2c 20  lumn, sortPTab, 
2fce0 6a 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20  j, iBMem+j);.   
2fcf0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2fd00 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 64        sAggInfo.d
2fd10 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20  irectMode = 1;. 
2fd20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2fd30 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
2fd40 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 6a 5d 2e   pGroupBy->a[j].
2fd50 70 45 78 70 72 2c 20 69 42 4d 65 6d 2b 6a 29 3b  pExpr, iBMem+j);
2fd60 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2fd70 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
2fd80 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
2fd90 5f 43 6f 6d 70 61 72 65 2c 20 69 41 4d 65 6d 2c  _Compare, iAMem,
2fda0 20 69 42 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79   iBMem, pGroupBy
2fdb0 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20  ->nExpr,.       
2fdc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fdd0 20 20 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65     (char*)sqlite
2fde0 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79  3KeyInfoRef(pKey
2fdf0 49 6e 66 6f 29 2c 20 50 34 5f 4b 45 59 49 4e 46  Info), P4_KEYINF
2fe00 4f 29 3b 0a 20 20 20 20 20 20 61 64 64 72 31 20  O);.      addr1 
2fe10 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
2fe20 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
2fe30 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2fe40 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c  dOp3(v, OP_Jump,
2fe50 20 61 64 64 72 31 2b 31 2c 20 30 2c 20 61 64 64   addr1+1, 0, add
2fe60 72 31 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72  r1+1); VdbeCover
2fe70 61 67 65 28 76 29 3b 0a 0a 20 20 20 20 20 20 2f  age(v);..      /
2fe80 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
2fe90 74 68 61 74 20 72 75 6e 73 20 77 68 65 6e 65 76  that runs whenev
2fea0 65 72 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  er the GROUP BY 
2feb0 63 68 61 6e 67 65 73 2e 0a 20 20 20 20 20 20 2a  changes..      *
2fec0 2a 20 43 68 61 6e 67 65 73 20 69 6e 20 74 68 65  * Changes in the
2fed0 20 47 52 4f 55 50 20 42 59 20 61 72 65 20 64 65   GROUP BY are de
2fee0 74 65 63 74 65 64 20 62 79 20 74 68 65 20 70 72  tected by the pr
2fef0 65 76 69 6f 75 73 20 63 6f 64 65 0a 20 20 20 20  evious code.    
2ff00 20 20 2a 2a 20 62 6c 6f 63 6b 2e 20 20 49 66 20    ** block.  If 
2ff10 74 68 65 72 65 20 77 65 72 65 20 6e 6f 20 63 68  there were no ch
2ff20 61 6e 67 65 73 2c 20 74 68 69 73 20 62 6c 6f 63  anges, this bloc
2ff30 6b 20 69 73 20 73 6b 69 70 70 65 64 2e 0a 20 20  k is skipped..  
2ff40 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
2ff50 54 68 69 73 20 63 6f 64 65 20 63 6f 70 69 65 73  This code copies
2ff60 20 63 75 72 72 65 6e 74 20 67 72 6f 75 70 20 62   current group b
2ff70 79 20 74 65 72 6d 73 20 69 6e 20 62 30 2c 62 31  y terms in b0,b1
2ff80 2c 62 32 2c 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a  ,b2,....      **
2ff90 20 6f 76 65 72 20 74 6f 20 61 30 2c 61 31 2c 61   over to a0,a1,a
2ffa0 32 2e 20 20 49 74 20 74 68 65 6e 20 63 61 6c 6c  2.  It then call
2ffb0 73 20 74 68 65 20 6f 75 74 70 75 74 20 73 75 62  s the output sub
2ffc0 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a  routine.      **
2ffd0 20 61 6e 64 20 72 65 73 65 74 73 20 74 68 65 20   and resets the 
2ffe0 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75  aggregate accumu
2fff0 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72 73 20  lator registers 
30000 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 0a 20  in preparation. 
30010 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20       ** for the 
30020 6e 65 78 74 20 47 52 4f 55 50 20 42 59 20 62 61  next GROUP BY ba
30030 74 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  tch..      */.  
30040 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
30050 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20  odeMove(pParse, 
30060 69 42 4d 65 6d 2c 20 69 41 4d 65 6d 2c 20 70 47  iBMem, iAMem, pG
30070 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 29 3b 0a  roupBy->nExpr);.
30080 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
30090 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
300a0 73 75 62 2c 20 72 65 67 4f 75 74 70 75 74 52 6f  sub, regOutputRo
300b0 77 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  w, addrOutputRow
300c0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
300d0 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74 70 75 74  ment((v, "output
300e0 20 6f 6e 65 20 72 6f 77 22 29 29 3b 0a 20 20 20   one row"));.   
300f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
30100 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73  dOp2(v, OP_IfPos
30110 2c 20 69 41 62 6f 72 74 46 6c 61 67 2c 20 61 64  , iAbortFlag, ad
30120 64 72 45 6e 64 29 3b 20 56 64 62 65 43 6f 76 65  drEnd); VdbeCove
30130 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56  rage(v);.      V
30140 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
30150 63 68 65 63 6b 20 61 62 6f 72 74 20 66 6c 61 67  check abort flag
30160 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
30170 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
30180 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 73  OP_Gosub, regRes
30190 65 74 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a  et, addrReset);.
301a0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
301b0 74 28 28 76 2c 20 22 72 65 73 65 74 20 61 63 63  t((v, "reset acc
301c0 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20  umulator"));..  
301d0 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
301e0 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75  e aggregate accu
301f0 6d 75 6c 61 74 6f 72 73 20 62 61 73 65 64 20 6f  mulators based o
30200 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  n the content of
30210 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 75  .      ** the cu
30220 72 72 65 6e 74 20 72 6f 77 0a 20 20 20 20 20 20  rrent row.      
30230 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
30240 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
30250 61 64 64 72 31 29 3b 0a 20 20 20 20 20 20 75 70  addr1);.      up
30260 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28  dateAccumulator(
30270 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
30280 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  o);.      sqlite
30290 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
302a0 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 55  P_Integer, 1, iU
302b0 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56  seFlag);.      V
302c0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
302d0 69 6e 64 69 63 61 74 65 20 64 61 74 61 20 69 6e  indicate data in
302e0 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b   accumulator"));
302f0 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f  ..      /* End o
30300 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20 20 20 20  f the loop.     
30310 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 67 72   */.      if( gr
30320 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20  oupBySort ){.   
30330 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
30340 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
30350 74 65 72 4e 65 78 74 2c 20 73 41 67 67 49 6e 66  terNext, sAggInf
30360 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64  o.sortingIdx, ad
30370 64 72 54 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20  drTopOfLoop);.  
30380 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
30390 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ge(v);.      }el
303a0 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
303b0 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e  te3WhereEnd(pWIn
303c0 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  fo);.        sql
303d0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f  ite3VdbeChangeTo
303e0 4e 6f 6f 70 28 76 2c 20 61 64 64 72 53 6f 72 74  Noop(v, addrSort
303f0 69 6e 67 49 64 78 29 3b 0a 20 20 20 20 20 20 7d  ingIdx);.      }
30400 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75  ..      /* Outpu
30410 74 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 20  t the final row 
30420 6f 66 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20  of result.      
30430 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
30440 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
30450 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 70 75  _Gosub, regOutpu
30460 74 52 6f 77 2c 20 61 64 64 72 4f 75 74 70 75 74  tRow, addrOutput
30470 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65  Row);.      Vdbe
30480 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74  Comment((v, "out
30490 70 75 74 20 66 69 6e 61 6c 20 72 6f 77 22 29 29  put final row"))
304a0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70  ;..      /* Jump
304b0 20 6f 76 65 72 20 74 68 65 20 73 75 62 72 6f 75   over the subrou
304c0 74 69 6e 65 73 0a 20 20 20 20 20 20 2a 2f 0a 20  tines.      */. 
304d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
304e0 47 6f 74 6f 28 76 2c 20 61 64 64 72 45 6e 64 29  Goto(v, addrEnd)
304f0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  ;..      /* Gene
30500 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e  rate a subroutin
30510 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 61  e that outputs a
30520 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74   single row of t
30530 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20  he result.      
30540 2a 2a 20 73 65 74 2e 20 20 54 68 69 73 20 73 75  ** set.  This su
30550 62 72 6f 75 74 69 6e 65 20 66 69 72 73 74 20 6c  broutine first l
30560 6f 6f 6b 73 20 61 74 20 74 68 65 20 69 55 73 65  ooks at the iUse
30570 46 6c 61 67 2e 20 20 49 66 20 69 55 73 65 46 6c  Flag.  If iUseFl
30580 61 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6c  ag.      ** is l
30590 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
305a0 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 20 73  l to zero, the s
305b0 75 62 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  ubroutine is a n
305c0 6f 2d 6f 70 2e 20 20 49 66 0a 20 20 20 20 20 20  o-op.  If.      
305d0 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e  ** the processin
305e0 67 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20  g calls for the 
305f0 71 75 65 72 79 20 74 6f 20 61 62 6f 72 74 2c 20  query to abort, 
30600 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 0a  this subroutine.
30610 20 20 20 20 20 20 2a 2a 20 69 6e 63 72 65 6d 65        ** increme
30620 6e 74 73 20 74 68 65 20 69 41 62 6f 72 74 46 6c  nts the iAbortFl
30630 61 67 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69  ag memory locati
30640 6f 6e 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  on before return
30650 69 6e 67 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20  ing in.      ** 
30660 6f 72 64 65 72 20 74 6f 20 73 69 67 6e 61 6c 20  order to signal 
30670 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 61 62  the caller to ab
30680 6f 72 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ort..      */.  
30690 20 20 20 20 61 64 64 72 53 65 74 41 62 6f 72 74      addrSetAbort
306a0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
306b0 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
306c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
306d0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
306e0 67 65 72 2c 20 31 2c 20 69 41 62 6f 72 74 46 6c  ger, 1, iAbortFl
306f0 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ag);.      VdbeC
30700 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73 65 74 20  omment((v, "set 
30710 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20  abort flag"));. 
30720 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
30730 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74  AddOp1(v, OP_Ret
30740 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f  urn, regOutputRo
30750 77 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  w);.      sqlite
30760 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
30770 6c 28 76 2c 20 61 64 64 72 4f 75 74 70 75 74 52  l(v, addrOutputR
30780 6f 77 29 3b 0a 20 20 20 20 20 20 61 64 64 72 4f  ow);.      addrO
30790 75 74 70 75 74 52 6f 77 20 3d 20 73 71 6c 69 74  utputRow = sqlit
307a0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
307b0 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r(v);.      sqli
307c0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
307d0 20 4f 50 5f 49 66 50 6f 73 2c 20 69 55 73 65 46   OP_IfPos, iUseF
307e0 6c 61 67 2c 20 61 64 64 72 4f 75 74 70 75 74 52  lag, addrOutputR
307f0 6f 77 2b 32 29 3b 0a 20 20 20 20 20 20 56 64 62  ow+2);.      Vdb
30800 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
30810 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
30820 28 76 2c 20 22 47 72 6f 75 70 62 79 20 72 65 73  (v, "Groupby res
30830 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 20 65 6e  ult generator en
30840 74 72 79 20 70 6f 69 6e 74 22 29 29 3b 0a 20 20  try point"));.  
30850 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
30860 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
30870 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77  rn, regOutputRow
30880 29 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c 69 7a  );.      finaliz
30890 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50  eAggFunctions(pP
308a0 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
308b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
308c0 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
308d0 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72  e, pHaving, addr
308e0 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 53 51 4c  OutputRow+1, SQL
308f0 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
30900 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e  .      selectInn
30910 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
30920 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 2d 31 2c  , p->pEList, -1,
30930 20 26 73 53 6f 72 74 2c 0a 20 20 20 20 20 20 20   &sSort,.       
30940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
30950 73 44 69 73 74 69 6e 63 74 2c 20 70 44 65 73 74  sDistinct, pDest
30960 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
30970 20 20 20 20 20 20 20 20 61 64 64 72 4f 75 74 70          addrOutp
30980 75 74 52 6f 77 2b 31 2c 20 61 64 64 72 53 65 74  utRow+1, addrSet
30990 41 62 6f 72 74 29 3b 0a 20 20 20 20 20 20 73 71  Abort);.      sq
309a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
309b0 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65  v, OP_Return, re
309c0 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20  gOutputRow);.   
309d0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
309e0 76 2c 20 22 65 6e 64 20 67 72 6f 75 70 62 79 20  v, "end groupby 
309f0 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72  result generator
30a00 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47  "));..      /* G
30a10 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
30a20 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 72  tine that will r
30a30 65 73 65 74 20 74 68 65 20 67 72 6f 75 70 2d 62  eset the group-b
30a40 79 20 61 63 63 75 6d 75 6c 61 74 6f 72 0a 20 20  y accumulator.  
30a50 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
30a60 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
30a70 61 62 65 6c 28 76 2c 20 61 64 64 72 52 65 73 65  abel(v, addrRese
30a80 74 29 3b 0a 20 20 20 20 20 20 72 65 73 65 74 41  t);.      resetA
30a90 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73  ccumulator(pPars
30aa0 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
30ab0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
30ac0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74  AddOp1(v, OP_Ret
30ad0 75 72 6e 2c 20 72 65 67 52 65 73 65 74 29 3b 0a  urn, regReset);.
30ae0 20 20 20 20 20 0a 20 20 20 20 7d 20 2f 2a 20 65       .    } /* e
30af0 6e 64 69 66 20 70 47 72 6f 75 70 42 79 2e 20 20  ndif pGroupBy.  
30b00 42 65 67 69 6e 20 61 67 67 72 65 67 61 74 65 20  Begin aggregate 
30b10 71 75 65 72 69 65 73 20 77 69 74 68 6f 75 74 20  queries without 
30b20 47 52 4f 55 50 20 42 59 3a 20 2a 2f 0a 20 20 20  GROUP BY: */.   
30b30 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 45 78   else {.      Ex
30b40 70 72 4c 69 73 74 20 2a 70 44 65 6c 20 3d 20 30  prList *pDel = 0
30b50 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
30b60 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54  _OMIT_BTREECOUNT
30b70 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
30b80 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70  ab;.      if( (p
30b90 54 61 62 20 3d 20 69 73 53 69 6d 70 6c 65 43 6f  Tab = isSimpleCo
30ba0 75 6e 74 28 70 2c 20 26 73 41 67 67 49 6e 66 6f  unt(p, &sAggInfo
30bb0 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))!=0 ){.       
30bc0 20 2f 2a 20 49 66 20 69 73 53 69 6d 70 6c 65 43   /* If isSimpleC
30bd0 6f 75 6e 74 28 29 20 72 65 74 75 72 6e 73 20 61  ount() returns a
30be0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 54 61   pointer to a Ta
30bf0 62 6c 65 20 73 74 72 75 63 74 75 72 65 2c 20 74  ble structure, t
30c00 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  hen.        ** t
30c10 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
30c20 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a   is of the form:
30c30 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
30c40 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20      **   SELECT 
30c50 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c 74  count(*) FROM <t
30c60 62 6c 3e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  bl>.        **. 
30c70 20 20 20 20 20 20 20 2a 2a 20 77 68 65 72 65 20         ** where 
30c80 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  the Table struct
30c90 75 72 65 20 72 65 74 75 72 6e 65 64 20 72 65 70  ure returned rep
30ca0 72 65 73 65 6e 74 73 20 74 61 62 6c 65 20 3c 74  resents table <t
30cb0 62 6c 3e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  bl>..        **.
30cc0 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20          ** This 
30cd0 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73 6f 20  statement is so 
30ce0 63 6f 6d 6d 6f 6e 20 74 68 61 74 20 69 74 20 69  common that it i
30cf0 73 20 6f 70 74 69 6d 69 7a 65 64 20 73 70 65 63  s optimized spec
30d00 69 61 6c 6c 79 2e 20 54 68 65 0a 20 20 20 20 20  ially. The.     
30d10 20 20 20 2a 2a 20 4f 50 5f 43 6f 75 6e 74 20 69     ** OP_Count i
30d20 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 65 78  nstruction is ex
30d30 65 63 75 74 65 64 20 65 69 74 68 65 72 20 6f 6e  ecuted either on
30d40 20 74 68 65 20 69 6e 74 6b 65 79 20 74 61 62 6c   the intkey tabl
30d50 65 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a  e that.        *
30d60 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64  * contains the d
30d70 61 74 61 20 66 6f 72 20 74 61 62 6c 65 20 3c 74  ata for table <t
30d80 62 6c 3e 20 6f 72 20 6f 6e 20 6f 6e 65 20 6f 66  bl> or on one of
30d90 20 69 74 73 20 69 6e 64 65 78 65 73 2e 20 49 74   its indexes. It
30da0 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 62  .        ** is b
30db0 65 74 74 65 72 20 74 6f 20 65 78 65 63 75 74 65  etter to execute
30dc0 20 74 68 65 20 6f 70 20 6f 6e 20 61 6e 20 69 6e   the op on an in
30dd0 64 65 78 2c 20 61 73 20 69 6e 64 65 78 65 73 20  dex, as indexes 
30de0 61 72 65 20 61 6c 6d 6f 73 74 0a 20 20 20 20 20  are almost.     
30df0 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 70 72     ** always spr
30e00 65 61 64 20 61 63 72 6f 73 73 20 6c 65 73 73 20  ead across less 
30e10 70 61 67 65 73 20 74 68 61 6e 20 74 68 65 69 72  pages than their
30e20 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
30e30 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  ables..        *
30e40 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  /.        const 
30e50 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65  int iDb = sqlite
30e60 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70  3SchemaToIndex(p
30e70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d  Parse->db, pTab-
30e80 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20  >pSchema);.     
30e90 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 43 73     const int iCs
30ea0 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
30eb0 2b 2b 3b 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  ++;     /* Curso
30ec0 72 20 74 6f 20 73 63 61 6e 20 62 2d 74 72 65 65  r to scan b-tree
30ed0 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e 64 65   */.        Inde
30ee0 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20  x *pIdx;        
30ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30f00 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72   /* Iterator var
30f10 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  iable */.       
30f20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
30f30 66 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  fo = 0;         
30f40 20 20 20 20 20 20 2f 2a 20 4b 65 79 69 6e 66 6f        /* Keyinfo
30f50 20 66 6f 72 20 73 63 61 6e 6e 65 64 20 69 6e 64   for scanned ind
30f60 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e  ex */.        In
30f70 64 65 78 20 2a 70 42 65 73 74 20 3d 20 30 3b 20  dex *pBest = 0; 
30f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30f90 20 20 20 2f 2a 20 42 65 73 74 20 69 6e 64 65 78     /* Best index
30fa0 20 66 6f 75 6e 64 20 73 6f 20 66 61 72 20 2a 2f   found so far */
30fb0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 6f  .        int iRo
30fc0 6f 74 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b  ot = pTab->tnum;
30fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30fe0 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 73 63   Root page of sc
30ff0 61 6e 6e 65 64 20 62 2d 74 72 65 65 20 2a 2f 0a  anned b-tree */.
31000 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
31010 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
31020 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
31030 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61         sqlite3Ta
31040 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20  bleLock(pParse, 
31050 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c  iDb, pTab->tnum,
31060 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29   0, pTab->zName)
31070 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65  ;..        /* Se
31080 61 72 63 68 20 66 6f 72 20 74 68 65 20 69 6e 64  arch for the ind
31090 65 78 20 74 68 61 74 20 68 61 73 20 74 68 65 20  ex that has the 
310a0 6c 6f 77 65 73 74 20 73 63 61 6e 20 63 6f 73 74  lowest scan cost
310b0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
310c0 20 20 20 20 20 2a 2a 20 28 32 30 31 31 2d 30 34       ** (2011-04
310d0 2d 31 35 29 20 44 6f 20 6e 6f 74 20 64 6f 20 61  -15) Do not do a
310e0 20 66 75 6c 6c 20 73 63 61 6e 20 6f 66 20 61 6e   full scan of an
310f0 20 75 6e 6f 72 64 65 72 65 64 20 69 6e 64 65 78   unordered index
31100 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
31110 20 20 20 20 20 2a 2a 20 28 32 30 31 33 2d 31 30       ** (2013-10
31120 2d 30 33 29 20 44 6f 20 6e 6f 74 20 63 6f 75 6e  -03) Do not coun
31130 74 20 74 68 65 20 65 6e 74 72 69 65 73 20 69 6e  t the entries in
31140 20 61 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78   a partial index
31150 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
31160 20 20 20 20 20 2a 2a 20 49 6e 20 70 72 61 63 74       ** In pract
31170 69 63 65 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  ice the KeyInfo 
31180 73 74 72 75 63 74 75 72 65 20 77 69 6c 6c 20 6e  structure will n
31190 6f 74 20 62 65 20 75 73 65 64 2e 20 49 74 20 69  ot be used. It i
311a0 73 20 6f 6e 6c 79 20 0a 20 20 20 20 20 20 20 20  s only .        
311b0 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 6b 65 65  ** passed to kee
311c0 70 20 4f 50 5f 4f 70 65 6e 52 65 61 64 20 68 61  p OP_OpenRead ha
311d0 70 70 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ppy..        */.
311e0 20 20 20 20 20 20 20 20 69 66 28 20 21 48 61 73          if( !Has
311f0 52 6f 77 69 64 28 70 54 61 62 29 20 29 20 70 42  Rowid(pTab) ) pB
31200 65 73 74 20 3d 20 73 71 6c 69 74 65 33 50 72 69  est = sqlite3Pri
31210 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61  maryKeyIndex(pTa
31220 62 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  b);.        for(
31230 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
31240 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
31250 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
31260 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
31270 62 55 6e 6f 72 64 65 72 65 64 3d 3d 30 0a 20 20  bUnordered==0.  
31280 20 20 20 20 20 20 20 20 20 26 26 20 70 49 64 78           && pIdx
31290 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 54 61 62 2d  ->szIdxRow<pTab-
312a0 3e 73 7a 54 61 62 52 6f 77 0a 20 20 20 20 20 20  >szTabRow.      
312b0 20 20 20 20 20 26 26 20 70 49 64 78 2d 3e 70 50       && pIdx->pP
312c0 61 72 74 49 64 78 57 68 65 72 65 3d 3d 30 0a 20  artIdxWhere==0. 
312d0 20 20 20 20 20 20 20 20 20 20 26 26 20 28 21 70            && (!p
312e0 42 65 73 74 20 7c 7c 20 70 49 64 78 2d 3e 73 7a  Best || pIdx->sz
312f0 49 64 78 52 6f 77 3c 70 42 65 73 74 2d 3e 73 7a  IdxRow<pBest->sz
31300 49 64 78 52 6f 77 29 0a 20 20 20 20 20 20 20 20  IdxRow).        
31310 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
31320 20 70 42 65 73 74 20 3d 20 70 49 64 78 3b 0a 20   pBest = pIdx;. 
31330 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
31340 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
31350 20 70 42 65 73 74 20 29 7b 0a 20 20 20 20 20 20   pBest ){.      
31360 20 20 20 20 69 52 6f 6f 74 20 3d 20 70 42 65 73      iRoot = pBes
31370 74 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20  t->tnum;.       
31380 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71     pKeyInfo = sq
31390 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e  lite3KeyInfoOfIn
313a0 64 65 78 28 70 50 61 72 73 65 2c 20 70 42 65 73  dex(pParse, pBes
313b0 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  t);.        }.. 
313c0 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 61         /* Open a
313d0 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f   read-only curso
313e0 72 2c 20 65 78 65 63 75 74 65 20 74 68 65 20 4f  r, execute the O
313f0 50 5f 43 6f 75 6e 74 2c 20 63 6c 6f 73 65 20 74  P_Count, close t
31400 68 65 20 63 75 72 73 6f 72 2e 20 2a 2f 0a 20 20  he cursor. */.  
31410 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
31420 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
31430 5f 4f 70 65 6e 52 65 61 64 2c 20 69 43 73 72 2c  _OpenRead, iCsr,
31440 20 69 52 6f 6f 74 2c 20 69 44 62 2c 20 31 29 3b   iRoot, iDb, 1);
31450 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4b 65  .        if( pKe
31460 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20  yInfo ){.       
31470 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
31480 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63  angeP4(v, -1, (c
31490 68 61 72 20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  har *)pKeyInfo, 
314a0 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P4_KEYINFO);.   
314b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
314c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
314d0 28 76 2c 20 4f 50 5f 43 6f 75 6e 74 2c 20 69 43  (v, OP_Count, iC
314e0 73 72 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75  sr, sAggInfo.aFu
314f0 6e 63 5b 30 5d 2e 69 4d 65 6d 29 3b 0a 20 20 20  nc[0].iMem);.   
31500 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
31510 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp1(v, OP_Clo
31520 73 65 2c 20 69 43 73 72 29 3b 0a 20 20 20 20 20  se, iCsr);.     
31530 20 20 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65     explainSimple
31540 43 6f 75 6e 74 28 70 50 61 72 73 65 2c 20 70 54  Count(pParse, pT
31550 61 62 2c 20 70 42 65 73 74 29 3b 0a 20 20 20 20  ab, pBest);.    
31560 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f    }else.#endif /
31570 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54  * SQLITE_OMIT_BT
31580 52 45 45 43 4f 55 4e 54 20 2a 2f 0a 20 20 20 20  REECOUNT */.    
31590 20 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43    {.        /* C
315a0 68 65 63 6b 20 69 66 20 74 68 65 20 71 75 65 72  heck if the quer
315b0 79 20 69 73 20 6f 66 20 6f 6e 65 20 6f 66 20 74  y is of one of t
315c0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72  he following for
315d0 6d 73 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ms:.        **. 
315e0 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45         **   SELE
315f0 43 54 20 6d 69 6e 28 78 29 20 46 52 4f 4d 20 2e  CT min(x) FROM .
31600 2e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  ...        **   
31610 53 45 4c 45 43 54 20 6d 61 78 28 78 29 20 46 52  SELECT max(x) FR
31620 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 20 20 2a  OM ....        *
31630 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20  *.        ** If 
31640 69 74 20 69 73 2c 20 74 68 65 6e 20 61 73 6b 20  it is, then ask 
31650 74 68 65 20 63 6f 64 65 20 69 6e 20 77 68 65 72  the code in wher
31660 65 2e 63 20 74 6f 20 61 74 74 65 6d 70 74 20 74  e.c to attempt t
31670 6f 20 73 6f 72 74 20 72 65 73 75 6c 74 73 0a 20  o sort results. 
31680 20 20 20 20 20 20 20 2a 2a 20 61 73 20 69 66 20         ** as if 
31690 74 68 65 72 65 20 77 61 73 20 61 6e 20 22 4f 52  there was an "OR
316a0 44 45 52 20 4f 4e 20 78 22 20 6f 72 20 22 4f 52  DER ON x" or "OR
316b0 44 45 52 20 4f 4e 20 78 20 44 45 53 43 22 20 63  DER ON x DESC" c
316c0 6c 61 75 73 65 2e 20 0a 20 20 20 20 20 20 20 20  lause. .        
316d0 2a 2a 20 49 66 20 77 68 65 72 65 2e 63 20 69 73  ** If where.c is
316e0 20 61 62 6c 65 20 74 6f 20 70 72 6f 64 75 63 65   able to produce
316f0 20 72 65 73 75 6c 74 73 20 73 6f 72 74 65 64 20   results sorted 
31700 69 6e 20 74 68 69 73 20 6f 72 64 65 72 2c 20 74  in this order, t
31710 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  hen.        ** a
31720 64 64 20 76 64 62 65 20 63 6f 64 65 20 74 6f 20  dd vdbe code to 
31730 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65  break out of the
31740 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 6f 70   processing loop
31750 20 61 66 74 65 72 20 74 68 65 20 0a 20 20 20 20   after the .    
31760 20 20 20 20 2a 2a 20 66 69 72 73 74 20 69 74 65      ** first ite
31770 72 61 74 69 6f 6e 20 28 73 69 6e 63 65 20 74 68  ration (since th
31780 65 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f  e first iteratio
31790 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 73  n of the loop is
317a0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 67 75 61   .        ** gua
317b0 72 61 6e 74 65 65 64 20 74 6f 20 6f 70 65 72 61  ranteed to opera
317c0 74 65 20 6f 6e 20 74 68 65 20 72 6f 77 20 77 69  te on the row wi
317d0 74 68 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 6f  th the minimum o
317e0 72 20 6d 61 78 69 6d 75 6d 20 0a 20 20 20 20 20  r maximum .     
317f0 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 78     ** value of x
31800 2c 20 74 68 65 20 6f 6e 6c 79 20 72 6f 77 20 72  , the only row r
31810 65 71 75 69 72 65 64 29 2e 0a 20 20 20 20 20 20  equired)..      
31820 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
31830 41 20 73 70 65 63 69 61 6c 20 66 6c 61 67 20 6d  A special flag m
31840 75 73 74 20 62 65 20 70 61 73 73 65 64 20 74 6f  ust be passed to
31850 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
31860 69 6e 28 29 20 74 6f 20 73 6c 69 67 68 74 6c 79  in() to slightly
31870 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 69  .        ** modi
31880 66 79 20 62 65 68 61 76 69 6f 72 20 61 73 20 66  fy behavior as f
31890 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20 20 20  ollows:.        
318a0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
318b0 2b 20 49 66 20 74 68 65 20 71 75 65 72 79 20 69  + If the query i
318c0 73 20 61 20 22 53 45 4c 45 43 54 20 6d 69 6e 28  s a "SELECT min(
318d0 78 29 22 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f  x)", then the lo
318e0 6f 70 20 63 6f 64 65 64 20 62 79 0a 20 20 20 20  op coded by.    
318f0 20 20 20 20 2a 2a 20 20 20 20 20 77 68 65 72 65      **     where
31900 2e 63 20 73 68 6f 75 6c 64 20 6e 6f 74 20 69 74  .c should not it
31910 65 72 61 74 65 20 6f 76 65 72 20 61 6e 79 20 76  erate over any v
31920 61 6c 75 65 73 20 77 69 74 68 20 61 20 4e 55 4c  alues with a NUL
31930 4c 20 76 61 6c 75 65 0a 20 20 20 20 20 20 20 20  L value.        
31940 2a 2a 20 20 20 20 20 66 6f 72 20 78 2e 0a 20 20  **     for x..  
31950 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
31960 20 2a 2a 20 20 20 2b 20 54 68 65 20 6f 70 74 69   **   + The opti
31970 6d 69 7a 65 72 20 63 6f 64 65 20 69 6e 20 77 68  mizer code in wh
31980 65 72 65 2e 63 20 28 74 68 65 20 74 68 69 6e 67  ere.c (the thing
31990 20 74 68 61 74 20 64 65 63 69 64 65 73 20 77 68   that decides wh
319a0 69 63 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  ich.        **  
319b0 20 20 20 69 6e 64 65 78 20 6f 72 20 69 6e 64 69     index or indi
319c0 63 65 73 20 74 6f 20 75 73 65 29 20 73 68 6f 75  ces to use) shou
319d0 6c 64 20 70 6c 61 63 65 20 61 20 64 69 66 66 65  ld place a diffe
319e0 72 65 6e 74 20 70 72 69 6f 72 69 74 79 20 6f 6e  rent priority on
319f0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20   .        **    
31a00 20 73 61 74 69 73 66 79 69 6e 67 20 74 68 65 20   satisfying the 
31a10 27 4f 52 44 45 52 20 42 59 27 20 63 6c 61 75 73  'ORDER BY' claus
31a20 65 20 74 68 61 6e 20 69 74 20 64 6f 65 73 20 69  e than it does i
31a30 6e 20 6f 74 68 65 72 20 63 61 73 65 73 2e 0a 20  n other cases.. 
31a40 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 52 65         **     Re
31a50 66 65 72 20 74 6f 20 63 6f 64 65 20 61 6e 64 20  fer to code and 
31a60 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 77 68 65 72  comments in wher
31a70 65 2e 63 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  e.c for details.
31a80 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
31a90 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4d      ExprList *pM
31aa0 69 6e 4d 61 78 20 3d 20 30 3b 0a 20 20 20 20 20  inMax = 0;.     
31ab0 20 20 20 75 38 20 66 6c 61 67 20 3d 20 57 48 45     u8 flag = WHE
31ac0 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41  RE_ORDERBY_NORMA
31ad0 4c 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20  L;.        .    
31ae0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
31af0 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20  GroupBy==0 );.  
31b00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 66 6c        assert( fl
31b10 61 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ag==0 );.       
31b20 20 69 66 28 20 70 2d 3e 70 48 61 76 69 6e 67 3d   if( p->pHaving=
31b30 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
31b40 66 6c 61 67 20 3d 20 6d 69 6e 4d 61 78 51 75 65  flag = minMaxQue
31b50 72 79 28 26 73 41 67 67 49 6e 66 6f 2c 20 26 70  ry(&sAggInfo, &p
31b60 4d 69 6e 4d 61 78 29 3b 0a 20 20 20 20 20 20 20  MinMax);.       
31b70 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
31b80 74 28 20 66 6c 61 67 3d 3d 30 20 7c 7c 20 28 70  t( flag==0 || (p
31b90 4d 69 6e 4d 61 78 21 3d 30 20 26 26 20 70 4d 69  MinMax!=0 && pMi
31ba0 6e 4d 61 78 2d 3e 6e 45 78 70 72 3d 3d 31 29 20  nMax->nExpr==1) 
31bb0 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20  );..        if( 
31bc0 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20  flag ){.        
31bd0 20 20 70 4d 69 6e 4d 61 78 20 3d 20 73 71 6c 69    pMinMax = sqli
31be0 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
31bf0 62 2c 20 70 4d 69 6e 4d 61 78 2c 20 30 29 3b 0a  b, pMinMax, 0);.
31c00 20 20 20 20 20 20 20 20 20 20 70 44 65 6c 20 3d            pDel =
31c10 20 70 4d 69 6e 4d 61 78 3b 0a 20 20 20 20 20 20   pMinMax;.      
31c20 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
31c30 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
31c40 70 4d 69 6e 4d 61 78 21 3d 30 20 29 3b 0a 20 20  pMinMax!=0 );.  
31c50 20 20 20 20 20 20 20 20 69 66 28 20 21 64 62 2d          if( !db-
31c60 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
31c70 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4d 69  .            pMi
31c80 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f  nMax->a[0].sortO
31c90 72 64 65 72 20 3d 20 66 6c 61 67 21 3d 57 48 45  rder = flag!=WHE
31ca0 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20 3f  RE_ORDERBY_MIN ?
31cb0 31 3a 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  1:0;.           
31cc0 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 70   pMinMax->a[0].p
31cd0 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f  Expr->op = TK_CO
31ce0 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20 20  LUMN;.          
31cf0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20  }.        }.  . 
31d00 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63         /* This c
31d10 61 73 65 20 72 75 6e 73 20 69 66 20 74 68 65 20  ase runs if the 
31d20 61 67 67 72 65 67 61 74 65 20 68 61 73 20 6e 6f  aggregate has no
31d30 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
31d40 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a  .  The.        *
31d50 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 69 73 20  * processing is 
31d60 6d 75 63 68 20 73 69 6d 70 6c 65 72 20 73 69 6e  much simpler sin
31d70 63 65 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79  ce there is only
31d80 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 0a 20 20   a single row.  
31d90 20 20 20 20 20 20 2a 2a 20 6f 66 20 6f 75 74 70        ** of outp
31da0 75 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ut..        */. 
31db0 20 20 20 20 20 20 20 72 65 73 65 74 41 63 63 75         resetAccu
31dc0 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20  mulator(pParse, 
31dd0 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
31de0 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c      pWInfo = sql
31df0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70  ite3WhereBegin(p
31e00 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
31e10 20 70 57 68 65 72 65 2c 20 70 4d 69 6e 4d 61 78   pWhere, pMinMax
31e20 2c 30 2c 66 6c 61 67 2c 30 29 3b 0a 20 20 20 20  ,0,flag,0);.    
31e30 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d      if( pWInfo==
31e40 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
31e50 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
31e60 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a  lete(db, pDel);.
31e70 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73            goto s
31e80 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
31e90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75 70 64     }.        upd
31ea0 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70  ateAccumulator(p
31eb0 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
31ec0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
31ed0 74 28 20 70 4d 69 6e 4d 61 78 3d 3d 30 20 7c 7c  t( pMinMax==0 ||
31ee0 20 70 4d 69 6e 4d 61 78 2d 3e 6e 45 78 70 72 3d   pMinMax->nExpr=
31ef0 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  =1 );.        if
31f00 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73  ( sqlite3WhereIs
31f10 4f 72 64 65 72 65 64 28 70 57 49 6e 66 6f 29 3e  Ordered(pWInfo)>
31f20 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
31f30 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
31f40 2c 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 72  , sqlite3WhereBr
31f50 65 61 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29  eakLabel(pWInfo)
31f60 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62  );.          Vdb
31f70 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
31f80 28 29 20 62 79 20 69 6e 64 65 78 22 2c 0a 20 20  () by index",.  
31f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 66                (f
31fa0 6c 61 67 3d 3d 57 48 45 52 45 5f 4f 52 44 45 52  lag==WHERE_ORDER
31fb0 42 59 5f 4d 49 4e 3f 22 6d 69 6e 22 3a 22 6d 61  BY_MIN?"min":"ma
31fc0 78 22 29 29 29 3b 0a 20 20 20 20 20 20 20 20 7d  x")));.        }
31fd0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
31fe0 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29  WhereEnd(pWInfo)
31ff0 3b 0a 20 20 20 20 20 20 20 20 66 69 6e 61 6c 69  ;.        finali
32000 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70  zeAggFunctions(p
32010 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
32020 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
32030 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79    sSort.pOrderBy
32040 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 0;.      sqli
32050 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
32060 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20  Parse, pHaving, 
32070 61 64 64 72 45 6e 64 2c 20 53 51 4c 49 54 45 5f  addrEnd, SQLITE_
32080 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
32090 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f     selectInnerLo
320a0 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  op(pParse, p, p-
320b0 3e 70 45 4c 69 73 74 2c 20 2d 31 2c 20 30 2c 20  >pEList, -1, 0, 
320c0 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  0, .            
320d0 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2c            pDest,
320e0 20 61 64 64 72 45 6e 64 2c 20 61 64 64 72 45 6e   addrEnd, addrEn
320f0 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
32100 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
32110 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20 20 20 7d  db, pDel);.    }
32120 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
32130 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
32140 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 0a 20  addrEnd);.    . 
32150 20 7d 20 2f 2a 20 65 6e 64 69 66 20 61 67 67 72   } /* endif aggr
32160 65 67 61 74 65 20 71 75 65 72 79 20 2a 2f 0a 0a  egate query */..
32170 20 20 69 66 28 20 73 44 69 73 74 69 6e 63 74 2e    if( sDistinct.
32180 65 54 6e 63 74 54 79 70 65 3d 3d 57 48 45 52 45  eTnctType==WHERE
32190 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45  _DISTINCT_UNORDE
321a0 52 45 44 20 29 7b 0a 20 20 20 20 65 78 70 6c 61  RED ){.    expla
321b0 69 6e 54 65 6d 70 54 61 62 6c 65 28 70 50 61 72  inTempTable(pPar
321c0 73 65 2c 20 22 44 49 53 54 49 4e 43 54 22 29 3b  se, "DISTINCT");
321d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
321e0 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ere is an ORDER 
321f0 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20  BY clause, then 
32200 77 65 20 6e 65 65 64 20 74 6f 20 73 6f 72 74 20  we need to sort 
32210 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a  the results.  **
32220 20 61 6e 64 20 73 65 6e 64 20 74 68 65 6d 20 74   and send them t
32230 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f  o the callback o
32240 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a  ne by one..  */.
32250 20 20 69 66 28 20 73 53 6f 72 74 2e 70 4f 72 64    if( sSort.pOrd
32260 65 72 42 79 20 29 7b 0a 20 20 20 20 65 78 70 6c  erBy ){.    expl
32270 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 70 50 61  ainTempTable(pPa
32280 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rse,.           
32290 20 20 20 20 20 20 20 20 20 20 73 53 6f 72 74 2e            sSort.
322a0 6e 4f 42 53 61 74 3e 30 20 3f 20 22 52 49 47 48  nOBSat>0 ? "RIGH
322b0 54 20 50 41 52 54 20 4f 46 20 4f 52 44 45 52 20  T PART OF ORDER 
322c0 42 59 22 3a 22 4f 52 44 45 52 20 42 59 22 29 3b  BY":"ORDER BY");
322d0 0a 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72  .    generateSor
322e0 74 54 61 69 6c 28 70 50 61 72 73 65 2c 20 70 2c  tTail(pParse, p,
322f0 20 26 73 53 6f 72 74 2c 20 70 45 4c 69 73 74 2d   &sSort, pEList-
32300 3e 6e 45 78 70 72 2c 20 70 44 65 73 74 29 3b 0a  >nExpr, pDest);.
32310 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68    }..  /* Jump h
32320 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68 69 73  ere to skip this
32330 20 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71   query.  */.  sq
32340 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
32350 4c 61 62 65 6c 28 76 2c 20 69 45 6e 64 29 3b 0a  Label(v, iEnd);.
32360 0a 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54  .  /* The SELECT
32370 20 68 61 73 20 62 65 65 6e 20 63 6f 64 65 64 2e   has been coded.
32380 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   If there is an 
32390 65 72 72 6f 72 20 69 6e 20 74 68 65 20 50 61 72  error in the Par
323a0 73 65 20 73 74 72 75 63 74 75 72 65 2c 0a 20 20  se structure,.  
323b0 2a 2a 20 73 65 74 20 74 68 65 20 72 65 74 75 72  ** set the retur
323c0 6e 20 63 6f 64 65 20 74 6f 20 31 2e 20 4f 74 68  n code to 1. Oth
323d0 65 72 77 69 73 65 20 30 2e 20 2a 2f 0a 20 20 72  erwise 0. */.  r
323e0 63 20 3d 20 28 70 50 61 72 73 65 2d 3e 6e 45 72  c = (pParse->nEr
323f0 72 3e 30 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74  r>0);..  /* Cont
32400 72 6f 6c 20 6a 75 6d 70 73 20 74 6f 20 68 65 72  rol jumps to her
32410 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73  e if an error is
32420 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 62 6f   encountered abo
32430 76 65 2c 20 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a  ve, or upon.  **
32440 20 73 75 63 63 65 73 73 66 75 6c 20 63 6f 64 69   successful codi
32450 6e 67 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  ng of the SELECT
32460 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e  ..  */.select_en
32470 64 3a 0a 20 20 65 78 70 6c 61 69 6e 53 65 74 49  d:.  explainSetI
32480 6e 74 65 67 65 72 28 70 50 61 72 73 65 2d 3e 69  nteger(pParse->i
32490 53 65 6c 65 63 74 49 64 2c 20 69 52 65 73 74 6f  SelectId, iResto
324a0 72 65 53 65 6c 65 63 74 49 64 29 3b 0a 0a 20 20  reSelectId);..  
324b0 2f 2a 20 49 64 65 6e 74 69 66 79 20 63 6f 6c 75  /* Identify colu
324c0 6d 6e 20 6e 61 6d 65 73 20 69 66 20 72 65 73 75  mn names if resu
324d0 6c 74 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43  lts of the SELEC
324e0 54 20 61 72 65 20 74 6f 20 62 65 20 6f 75 74 70  T are to be outp
324f0 75 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  ut..  */.  if( r
32500 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
32510 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
32520 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20  T_Output ){.    
32530 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
32540 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  mes(pParse, pTab
32550 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 20  List, pEList);. 
32560 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 44 62 46   }..  sqlite3DbF
32570 72 65 65 28 64 62 2c 20 73 41 67 67 49 6e 66 6f  ree(db, sAggInfo
32580 2e 61 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65  .aCol);.  sqlite
32590 33 44 62 46 72 65 65 28 64 62 2c 20 73 41 67 67  3DbFree(db, sAgg
325a0 49 6e 66 6f 2e 61 46 75 6e 63 29 3b 0a 23 69 66  Info.aFunc);.#if
325b0 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
325c0 42 4c 45 44 0a 20 20 53 45 4c 45 43 54 54 52 41  BLED.  SELECTTRA
325d0 43 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 28 22  CE(1,pParse,p,("
325e0 65 6e 64 20 70 72 6f 63 65 73 73 69 6e 67 5c 6e  end processing\n
325f0 22 29 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  "));.  pParse->n
32600 53 65 6c 65 63 74 49 6e 64 65 6e 74 2d 2d 3b 0a  SelectIndent--;.
32610 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
32620 72 63 3b 0a 7d 0a                                rc;.}.