/ Hex Artifact Content
Login

Artifact 1bacfde7b7cec134d2b354cbcf67bafc67078431:


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 54 79 70 65 20 3d 20 70 54 61 62 2d     zType = pTab-
c620: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70  >aCol[iCol].zTyp
c630: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72  e;.          zOr
c640: 69 67 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43  igCol = pTab->aC
c650: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a  ol[iCol].zName;.
c660: 20 20 20 20 20 20 20 20 20 20 65 73 74 57 69 64            estWid
c670: 74 68 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  th = pTab->aCol[
c680: 69 43 6f 6c 5d 2e 73 7a 45 73 74 3b 0a 20 20 20  iCol].szEst;.   
c690: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a       }.        z
c6a0: 4f 72 69 67 54 61 62 20 3d 20 70 54 61 62 2d 3e  OrigTab = pTab->
c6b0: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69  zName;.        i
c6c0: 66 28 20 70 4e 43 2d 3e 70 50 61 72 73 65 20 29  f( pNC->pParse )
c6d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
c6e0: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
c6f0: 65 6d 61 54 6f 49 6e 64 65 78 28 70 4e 43 2d 3e  emaToIndex(pNC->
c700: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
c710: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
c720: 20 20 20 20 20 20 7a 4f 72 69 67 44 62 20 3d 20        zOrigDb = 
c730: 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d  pNC->pParse->db-
c740: 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b  >aDb[iDb].zName;
c750: 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6c 73 65  .        }.#else
c760: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f  .        if( iCo
c770: 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  l<0 ){.         
c780: 20 7a 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45   zType = "INTEGE
c790: 52 22 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  R";.        }els
c7a0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79  e{.          zTy
c7b0: 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  pe = pTab->aCol[
c7c0: 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 20  iCol].zType;.   
c7d0: 20 20 20 20 20 20 20 65 73 74 57 69 64 74 68 20         estWidth 
c7e0: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  = pTab->aCol[iCo
c7f0: 6c 5d 2e 73 7a 45 73 74 3b 0a 20 20 20 20 20 20  l].szEst;.      
c800: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
c810: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
c820: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
c830: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
c840: 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  RY.    case TK_S
c850: 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f  ELECT: {.      /
c860: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
c870: 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63 74   is a sub-select
c880: 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 63  . Return the dec
c890: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 61 6e  laration type an
c8a0: 64 0a 20 20 20 20 20 20 2a 2a 20 6f 72 69 67 69  d.      ** origi
c8b0: 6e 20 69 6e 66 6f 20 66 6f 72 20 74 68 65 20 73  n info for the s
c8c0: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 69 6e 20  ingle column in 
c8d0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
c8e0: 66 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20 20  f the SELECT.   
c8f0: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e     ** statement.
c900: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
c910: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
c920: 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
c930: 53 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  S = pExpr->x.pSe
c940: 6c 65 63 74 3b 0a 20 20 20 20 20 20 45 78 70 72  lect;.      Expr
c950: 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74   *p = pS->pEList
c960: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
c970: 20 20 20 20 61 73 73 65 72 74 28 20 45 78 70 72      assert( Expr
c980: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
c990: 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
c9a0: 20 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 53   );.      sNC.pS
c9b0: 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53 72  rcList = pS->pSr
c9c0: 63 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 4e 65  c;.      sNC.pNe
c9d0: 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20  xt = pNC;.      
c9e0: 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43  sNC.pParse = pNC
c9f0: 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20  ->pParse;.      
ca00: 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79  zType = columnTy
ca10: 70 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72  pe(&sNC, p, &zOr
ca20: 69 67 44 62 2c 20 26 7a 4f 72 69 67 54 61 62 2c  igDb, &zOrigTab,
ca30: 20 26 7a 4f 72 69 67 43 6f 6c 2c 20 26 65 73 74   &zOrigCol, &est
ca40: 57 69 64 74 68 29 3b 20 0a 20 20 20 20 20 20 62  Width); .      b
ca50: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
ca60: 69 66 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53  if.  }..#ifdef S
ca70: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
ca80: 55 4d 4e 5f 4d 45 54 41 44 41 54 41 20 20 0a 20  UMN_METADATA  . 
ca90: 20 69 66 28 20 70 7a 4f 72 69 67 44 62 20 29 7b   if( pzOrigDb ){
caa0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 7a 4f  .    assert( pzO
cab0: 72 69 67 54 61 62 20 26 26 20 70 7a 4f 72 69 67  rigTab && pzOrig
cac0: 43 6f 6c 20 29 3b 0a 20 20 20 20 2a 70 7a 4f 72  Col );.    *pzOr
cad0: 69 67 44 62 20 3d 20 7a 4f 72 69 67 44 62 3b 0a  igDb = zOrigDb;.
cae0: 20 20 20 20 2a 70 7a 4f 72 69 67 54 61 62 20 3d      *pzOrigTab =
caf0: 20 7a 4f 72 69 67 54 61 62 3b 0a 20 20 20 20 2a   zOrigTab;.    *
cb00: 70 7a 4f 72 69 67 43 6f 6c 20 3d 20 7a 4f 72 69  pzOrigCol = zOri
cb10: 67 43 6f 6c 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  gCol;.  }.#endif
cb20: 0a 20 20 69 66 28 20 70 45 73 74 57 69 64 74 68  .  if( pEstWidth
cb30: 20 29 20 2a 70 45 73 74 57 69 64 74 68 20 3d 20   ) *pEstWidth = 
cb40: 65 73 74 57 69 64 74 68 3b 0a 20 20 72 65 74 75  estWidth;.  retu
cb50: 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a  rn zType;.}../*.
cb60: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
cb70: 20 74 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20   that will tell 
cb80: 74 68 65 20 56 44 42 45 20 74 68 65 20 64 65 63  the VDBE the dec
cb90: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 73 20 6f  laration types o
cba0: 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20  f columns.** in 
cbb0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a  the result set..
cbc0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67  */.static void g
cbd0: 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70  enerateColumnTyp
cbe0: 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  es(.  Parse *pPa
cbf0: 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72  rse,      /* Par
cc00: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
cc10: 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
cc20: 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20  st,  /* List of 
cc30: 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72  tables */.  Expr
cc40: 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20  List *pEList    
cc50: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64  /* Expressions d
cc60: 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75  efining the resu
cc70: 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 23 69 66  lt set */.){.#if
cc80: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
cc90: 5f 44 45 43 4c 54 59 50 45 0a 20 20 56 64 62 65  _DECLTYPE.  Vdbe
cca0: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
ccb0: 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
ccc0: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
ccd0: 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20  .  sNC.pSrcList 
cce0: 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 4e  = pTabList;.  sN
ccf0: 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  C.pParse = pPars
cd00: 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  e;.  for(i=0; i<
cd10: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  pEList->nExpr; i
cd20: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
cd30: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
cd40: 70 45 78 70 72 3b 0a 20 20 20 20 63 6f 6e 73 74  pExpr;.    const
cd50: 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 23 69   char *zType;.#i
cd60: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
cd70: 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41  LE_COLUMN_METADA
cd80: 54 41 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  TA.    const cha
cd90: 72 20 2a 7a 4f 72 69 67 44 62 20 3d 20 30 3b 0a  r *zOrigDb = 0;.
cda0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
cdb0: 7a 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a 20 20  zOrigTab = 0;.  
cdc0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
cdd0: 72 69 67 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  rigCol = 0;.    
cde0: 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79  zType = columnTy
cdf0: 70 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72  pe(&sNC, p, &zOr
ce00: 69 67 44 62 2c 20 26 7a 4f 72 69 67 54 61 62 2c  igDb, &zOrigTab,
ce10: 20 26 7a 4f 72 69 67 43 6f 6c 2c 20 30 29 3b 0a   &zOrigCol, 0);.
ce20: 0a 20 20 20 20 2f 2a 20 54 68 65 20 76 64 62 65  .    /* The vdbe
ce30: 20 6d 75 73 74 20 6d 61 6b 65 20 69 74 73 20 6f   must make its o
ce40: 77 6e 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63  wn copy of the c
ce50: 6f 6c 75 6d 6e 2d 74 79 70 65 20 61 6e 64 20 6f  olumn-type and o
ce60: 74 68 65 72 20 0a 20 20 20 20 2a 2a 20 63 6f 6c  ther .    ** col
ce70: 75 6d 6e 20 73 70 65 63 69 66 69 63 20 73 74 72  umn specific str
ce80: 69 6e 67 73 2c 20 69 6e 20 63 61 73 65 20 74 68  ings, in case th
ce90: 65 20 73 63 68 65 6d 61 20 69 73 20 72 65 73 65  e schema is rese
cea0: 74 20 62 65 66 6f 72 65 20 74 68 69 73 0a 20 20  t before this.  
ceb0: 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63    ** virtual mac
cec0: 68 69 6e 65 20 69 73 20 64 65 6c 65 74 65 64 2e  hine is deleted.
ced0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
cee0: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
cef0: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
cf00: 44 41 54 41 42 41 53 45 2c 20 7a 4f 72 69 67 44  DATABASE, zOrigD
cf10: 62 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  b, SQLITE_TRANSI
cf20: 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ENT);.    sqlite
cf30: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
cf40: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 54 41  v, i, COLNAME_TA
cf50: 42 4c 45 2c 20 7a 4f 72 69 67 54 61 62 2c 20 53  BLE, zOrigTab, S
cf60: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
cf70: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
cf80: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
cf90: 2c 20 43 4f 4c 4e 41 4d 45 5f 43 4f 4c 55 4d 4e  , COLNAME_COLUMN
cfa0: 2c 20 7a 4f 72 69 67 43 6f 6c 2c 20 53 51 4c 49  , zOrigCol, SQLI
cfb0: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 23  TE_TRANSIENT);.#
cfc0: 65 6c 73 65 0a 20 20 20 20 7a 54 79 70 65 20 3d  else.    zType =
cfd0: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43   columnType(&sNC
cfe0: 2c 20 70 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29  , p, 0, 0, 0, 0)
cff0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c  ;.#endif.    sql
d000: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
d010: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
d020: 5f 44 45 43 4c 54 59 50 45 2c 20 7a 54 79 70 65  _DECLTYPE, zType
d030: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
d040: 4e 54 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  NT);.  }.#endif 
d050: 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
d060: 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45  TE_OMIT_DECLTYPE
d070: 29 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ) */.}../*.** Ge
d080: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
d090: 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56   will tell the V
d0a0: 44 42 45 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  DBE the names of
d0b0: 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74   columns.** in t
d0c0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20  he result set.  
d0d0: 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  This information
d0e0: 20 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f 76   is used to prov
d0f0: 69 64 65 20 74 68 65 0a 2a 2a 20 61 7a 43 6f 6c  ide the.** azCol
d100: 5b 5d 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65  [] values in the
d110: 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74   callback..*/.st
d120: 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61  atic void genera
d130: 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20  teColumnNames(. 
d140: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
d150: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63       /* Parser c
d160: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
d170: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20  ist *pTabList,  
d180: 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65  /* List of table
d190: 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  s */.  ExprList 
d1a0: 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78  *pEList    /* Ex
d1b0: 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69  pressions defini
d1c0: 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ng the result se
d1d0: 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  t */.){.  Vdbe *
d1e0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
d1f0: 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  e;.  int i, j;. 
d200: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
d210: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
d220: 20 66 75 6c 6c 4e 61 6d 65 73 2c 20 73 68 6f 72   fullNames, shor
d230: 74 4e 61 6d 65 73 3b 0a 0a 23 69 66 6e 64 65 66  tNames;..#ifndef
d240: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
d250: 4c 41 49 4e 0a 20 20 2f 2a 20 49 66 20 74 68 69  LAIN.  /* If thi
d260: 73 20 69 73 20 61 6e 20 45 58 50 4c 41 49 4e 2c  s is an EXPLAIN,
d270: 20 73 6b 69 70 20 74 68 69 73 20 73 74 65 70 20   skip this step 
d280: 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  */.  if( pParse-
d290: 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  >explain ){.    
d2a0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64  return;.  }.#end
d2b0: 69 66 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  if..  if( pParse
d2c0: 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 7c 7c  ->colNamesSet ||
d2d0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
d2e0: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  d ) return;.  as
d2f0: 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20  sert( v!=0 );.  
d300: 61 73 73 65 72 74 28 20 70 54 61 62 4c 69 73 74  assert( pTabList
d310: 21 3d 30 20 29 3b 0a 20 20 70 50 61 72 73 65 2d  !=0 );.  pParse-
d320: 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31  >colNamesSet = 1
d330: 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65 73 20 3d 20  ;.  fullNames = 
d340: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
d350: 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73  ITE_FullColNames
d360: 29 21 3d 30 3b 0a 20 20 73 68 6f 72 74 4e 61 6d  )!=0;.  shortNam
d370: 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20  es = (db->flags 
d380: 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f  & SQLITE_ShortCo
d390: 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73 71  lNames)!=0;.  sq
d3a0: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
d3b0: 6f 6c 73 28 76 2c 20 70 45 4c 69 73 74 2d 3e 6e  ols(v, pEList->n
d3c0: 45 78 70 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30  Expr);.  for(i=0
d3d0: 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
d3e0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
d3f0: 72 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 70 45  r *p;.    p = pE
d400: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
d410: 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28  ;.    if( NEVER(
d420: 70 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75 65  p==0) ) continue
d430: 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73 74  ;.    if( pEList
d440: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a  ->a[i].zName ){.
d450: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
d460: 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  e = pEList->a[i]
d470: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 73 71  .zName;.      sq
d480: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
d490: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
d4a0: 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53  E_NAME, zName, S
d4b0: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
d4c0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
d4d0: 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  p->op==TK_COLUMN
d4e0: 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 47   || p->op==TK_AG
d4f0: 47 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  G_COLUMN ){.    
d500: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
d510: 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b       char *zCol;
d520: 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  .      int iCol 
d530: 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  = p->iColumn;.  
d540: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 41 4c 57      for(j=0; ALW
d550: 41 59 53 28 6a 3c 70 54 61 62 4c 69 73 74 2d 3e  AYS(j<pTabList->
d560: 6e 53 72 63 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nSrc); j++){.   
d570: 20 20 20 20 20 69 66 28 20 70 54 61 62 4c 69 73       if( pTabLis
d580: 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 3d  t->a[j].iCursor=
d590: 3d 70 2d 3e 69 54 61 62 6c 65 20 29 20 62 72 65  =p->iTable ) bre
d5a0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
d5b0: 20 20 61 73 73 65 72 74 28 20 6a 3c 70 54 61 62    assert( j<pTab
d5c0: 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20  List->nSrc );.  
d5d0: 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c      pTab = pTabL
d5e0: 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a  ist->a[j].pTab;.
d5f0: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
d600: 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e   ) iCol = pTab->
d610: 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 61 73 73  iPKey;.      ass
d620: 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c  ert( iCol==-1 ||
d630: 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f   (iCol>=0 && iCo
d640: 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b  l<pTab->nCol) );
d650: 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  .      if( iCol<
d660: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f  0 ){.        zCo
d670: 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20  l = "rowid";.   
d680: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d690: 20 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61    zCol = pTab->a
d6a0: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b  Col[iCol].zName;
d6b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
d6c0: 66 28 20 21 73 68 6f 72 74 4e 61 6d 65 73 20 26  f( !shortNames &
d6d0: 26 20 21 66 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a  & !fullNames ){.
d6e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d6f0: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
d700: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
d710: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  , .            s
d720: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
d730: 62 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  b, pEList->a[i].
d740: 7a 53 70 61 6e 29 2c 20 53 51 4c 49 54 45 5f 44  zSpan), SQLITE_D
d750: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d  YNAMIC);.      }
d760: 65 6c 73 65 20 69 66 28 20 66 75 6c 6c 4e 61 6d  else if( fullNam
d770: 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  es ){.        ch
d780: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20  ar *zName = 0;. 
d790: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73         zName = s
d7a0: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
d7b0: 2c 20 22 25 73 2e 25 73 22 2c 20 70 54 61 62 2d  , "%s.%s", pTab-
d7c0: 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3b 0a 20  >zName, zCol);. 
d7d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d7e0: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
d7f0: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c  i, COLNAME_NAME,
d800: 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 44   zName, SQLITE_D
d810: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d  YNAMIC);.      }
d820: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
d830: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
d840: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
d850: 45 5f 4e 41 4d 45 2c 20 7a 43 6f 6c 2c 20 53 51  E_NAME, zCol, SQ
d860: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
d870: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
d880: 73 65 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  se{.      const 
d890: 63 68 61 72 20 2a 7a 20 3d 20 70 45 4c 69 73 74  char *z = pEList
d8a0: 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 3b 0a 20 20  ->a[i].zSpan;.  
d8b0: 20 20 20 20 7a 20 3d 20 7a 3d 3d 30 20 3f 20 73      z = z==0 ? s
d8c0: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
d8d0: 2c 20 22 63 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b  , "column%d", i+
d8e0: 31 29 20 3a 20 73 71 6c 69 74 65 33 44 62 53 74  1) : sqlite3DbSt
d8f0: 72 44 75 70 28 64 62 2c 20 7a 29 3b 0a 20 20 20  rDup(db, z);.   
d900: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
d910: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
d920: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 2c 20  OLNAME_NAME, z, 
d930: 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b  SQLITE_DYNAMIC);
d940: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 67 65 6e  .    }.  }.  gen
d950: 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73  erateColumnTypes
d960: 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
d970: 74 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a 2f  t, pEList);.}../
d980: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20 65 78  *.** Given an ex
d990: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 28 77  pression list (w
d9a0: 68 69 63 68 20 69 73 20 72 65 61 6c 6c 79 20 74  hich is really t
d9b0: 68 65 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65  he list of expre
d9c0: 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 66  ssions.** that f
d9d0: 6f 72 6d 20 74 68 65 20 72 65 73 75 6c 74 20 73  orm the result s
d9e0: 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73  et of a SELECT s
d9f0: 74 61 74 65 6d 65 6e 74 29 20 63 6f 6d 70 75 74  tatement) comput
da00: 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a  e appropriate.**
da10: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f   column names fo
da20: 72 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 77  r a table that w
da30: 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 78  ould hold the ex
da40: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
da50: 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 6c 75 6d 6e 20  *.** All column 
da60: 6e 61 6d 65 73 20 77 69 6c 6c 20 62 65 20 75 6e  names will be un
da70: 69 71 75 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79  ique..**.** Only
da80: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
da90: 73 20 61 72 65 20 63 6f 6d 70 75 74 65 64 2e 20  s are computed. 
daa0: 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 2c 20 43   Column.zType, C
dab0: 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 2c 0a 2a 2a 20  olumn.zColl,.** 
dac0: 61 6e 64 20 6f 74 68 65 72 20 66 69 65 6c 64 73  and other fields
dad0: 20 6f 66 20 43 6f 6c 75 6d 6e 20 61 72 65 20 7a   of Column are z
dae0: 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  eroed..**.** Ret
daf0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
db00: 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 61 20   success.  If a 
db10: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
db20: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a  n error occurs,.
db30: 2a 2a 20 73 74 6f 72 65 20 4e 55 4c 4c 20 69 6e  ** store NULL in
db40: 20 2a 70 61 43 6f 6c 20 61 6e 64 20 30 20 69 6e   *paCol and 0 in
db50: 20 2a 70 6e 43 6f 6c 20 61 6e 64 20 72 65 74 75   *pnCol and retu
db60: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e  rn SQLITE_NOMEM.
db70: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43  .*/.int sqlite3C
db80: 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69  olumnsFromExprLi
db90: 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
dba0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
dbb0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
dbc0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
dbd0: 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a  pEList,       /*
dbe0: 20 45 78 70 72 20 6c 69 73 74 20 66 72 6f 6d 20   Expr list from 
dbf0: 77 68 69 63 68 20 74 6f 20 64 65 72 69 76 65 20  which to derive 
dc00: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a  column names */.
dc10: 20 20 69 31 36 20 2a 70 6e 43 6f 6c 2c 20 20 20    i16 *pnCol,   
dc20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
dc30: 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
dc40: 20 63 6f 6c 75 6d 6e 73 20 68 65 72 65 20 2a 2f   columns here */
dc50: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 2a 70 61 43 6f  .  Column **paCo
dc60: 6c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72  l          /* Wr
dc70: 69 74 65 20 74 68 65 20 6e 65 77 20 63 6f 6c 75  ite the new colu
dc80: 6d 6e 20 6c 69 73 74 20 68 65 72 65 20 2a 2f 0a  mn list here */.
dc90: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
dca0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
dcb0: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
dcc0: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  nection */.  int
dcd0: 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20   i, j;          
dce0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
dcf0: 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 75   counters */.  u
dd00: 33 32 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20  32 cnt;         
dd10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
dd20: 64 65 78 20 61 64 64 65 64 20 74 6f 20 6d 61 6b  dex added to mak
dd30: 65 20 74 68 65 20 6e 61 6d 65 20 75 6e 69 71 75  e the name uniqu
dd40: 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61  e */.  Column *a
dd50: 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 20 20 20 20 20  Col, *pCol;     
dd60: 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
dd70: 67 20 6f 76 65 72 20 72 65 73 75 6c 74 20 63 6f  g over result co
dd80: 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  lumns */.  int n
dd90: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
dda0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
ddb0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
ddc0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
ddd0: 0a 20 20 45 78 70 72 20 2a 70 3b 20 20 20 20 20  .  Expr *p;     
dde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ddf0: 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 66 6f 72  * Expression for
de00: 20 61 20 73 69 6e 67 6c 65 20 72 65 73 75 6c 74   a single result
de10: 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61   column */.  cha
de20: 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20  r *zName;       
de30: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
de40: 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74  mn name */.  int
de50: 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20   nName;         
de60: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
de70: 20 6f 66 20 6e 61 6d 65 20 69 6e 20 7a 4e 61 6d   of name in zNam
de80: 65 5b 5d 20 2a 2f 0a 20 20 48 61 73 68 20 68 74  e[] */.  Hash ht
de90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
dea0: 20 20 20 20 20 2f 2a 20 48 61 73 68 20 74 61 62       /* Hash tab
deb0: 6c 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d  le of column nam
dec0: 65 73 20 2a 2f 0a 0a 20 20 73 71 6c 69 74 65 33  es */..  sqlite3
ded0: 48 61 73 68 49 6e 69 74 28 26 68 74 29 3b 0a 20  HashInit(&ht);. 
dee0: 20 69 66 28 20 70 45 4c 69 73 74 20 29 7b 0a 20   if( pEList ){. 
def0: 20 20 20 6e 43 6f 6c 20 3d 20 70 45 4c 69 73 74     nCol = pEList
df00: 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61 43 6f  ->nExpr;.    aCo
df10: 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  l = sqlite3DbMal
df20: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
df30: 6f 66 28 61 43 6f 6c 5b 30 5d 29 2a 6e 43 6f 6c  of(aCol[0])*nCol
df40: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
df50: 20 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 7d 65   aCol==0 );.  }e
df60: 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20  lse{.    nCol = 
df70: 30 3b 0a 20 20 20 20 61 43 6f 6c 20 3d 20 30 3b  0;.    aCol = 0;
df80: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
df90: 43 6f 6c 3d 3d 28 69 31 36 29 6e 43 6f 6c 20 29  Col==(i16)nCol )
dfa0: 3b 0a 20 20 2a 70 6e 43 6f 6c 20 3d 20 6e 43 6f  ;.  *pnCol = nCo
dfb0: 6c 3b 0a 20 20 2a 70 61 43 6f 6c 20 3d 20 61 43  l;.  *paCol = aC
dfc0: 6f 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20  ol;..  for(i=0, 
dfd0: 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 6e 43 6f  pCol=aCol; i<nCo
dfe0: 6c 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  l && !db->malloc
dff0: 46 61 69 6c 65 64 3b 20 69 2b 2b 2c 20 70 43 6f  Failed; i++, pCo
e000: 6c 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 47 65 74  l++){.    /* Get
e010: 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
e020: 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 63 6f 6c  name for the col
e030: 75 6d 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  umn.    */.    p
e040: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
e050: 69 70 43 6f 6c 6c 61 74 65 28 70 45 4c 69 73 74  ipCollate(pEList
e060: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
e070: 20 20 20 69 66 28 20 28 7a 4e 61 6d 65 20 3d 20     if( (zName = 
e080: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  pEList->a[i].zNa
e090: 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)!=0 ){.      
e0a0: 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e  /* If the column
e0b0: 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 22 41 53   contains an "AS
e0c0: 20 3c 6e 61 6d 65 3e 22 20 70 68 72 61 73 65 2c   <name>" phrase,
e0d0: 20 75 73 65 20 3c 6e 61 6d 65 3e 20 61 73 20 74   use <name> as t
e0e0: 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 7d  he name */.    }
e0f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72  else{.      Expr
e100: 20 2a 70 43 6f 6c 45 78 70 72 20 3d 20 70 3b 20   *pColExpr = p; 
e110: 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
e120: 6f 6e 20 74 68 61 74 20 69 73 20 74 68 65 20 72  on that is the r
e130: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d  esult column nam
e140: 65 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65  e */.      Table
e150: 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20   *pTab;         
e160: 2f 2a 20 54 61 62 6c 65 20 61 73 73 6f 63 69 61  /* Table associa
e170: 74 65 64 20 77 69 74 68 20 74 68 69 73 20 65 78  ted with this ex
e180: 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  pression */.    
e190: 20 20 77 68 69 6c 65 28 20 70 43 6f 6c 45 78 70    while( pColExp
e1a0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b  r->op==TK_DOT ){
e1b0: 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 45 78 70  .        pColExp
e1c0: 72 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 52  r = pColExpr->pR
e1d0: 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 61 73  ight;.        as
e1e0: 73 65 72 74 28 20 70 43 6f 6c 45 78 70 72 21 3d  sert( pColExpr!=
e1f0: 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  0 );.      }.   
e200: 20 20 20 69 66 28 20 70 43 6f 6c 45 78 70 72 2d     if( pColExpr-
e210: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op==TK_COLUMN &
e220: 26 20 41 4c 57 41 59 53 28 70 43 6f 6c 45 78 70  & ALWAYS(pColExp
e230: 72 2d 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a 20  r->pTab!=0) ){. 
e240: 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f         /* For co
e250: 6c 75 6d 6e 73 20 75 73 65 20 74 68 65 20 63 6f  lumns use the co
e260: 6c 75 6d 6e 20 6e 61 6d 65 20 6e 61 6d 65 20 2a  lumn name name *
e270: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43  /.        int iC
e280: 6f 6c 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 69  ol = pColExpr->i
e290: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
e2a0: 70 54 61 62 20 3d 20 70 43 6f 6c 45 78 70 72 2d  pTab = pColExpr-
e2b0: 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 69  >pTab;.        i
e2c0: 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c  f( iCol<0 ) iCol
e2d0: 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a   = pTab->iPKey;.
e2e0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
e2f0: 69 43 6f 6c 3e 3d 30 20 3f 20 70 54 61 62 2d 3e  iCol>=0 ? pTab->
e300: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65  aCol[iCol].zName
e310: 20 3a 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20   : "rowid";.    
e320: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 6f 6c    }else if( pCol
e330: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20  Expr->op==TK_ID 
e340: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
e350: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
e360: 72 74 79 28 70 43 6f 6c 45 78 70 72 2c 20 45 50  rty(pColExpr, EP
e370: 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
e380: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 43        zName = pC
e390: 6f 6c 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  olExpr->u.zToken
e3a0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
e3b0: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68         /* Use th
e3c0: 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 78 74 20  e original text 
e3d0: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 65 78  of the column ex
e3e0: 70 72 65 73 73 69 6f 6e 20 61 73 20 69 74 73 20  pression as its 
e3f0: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  name */.        
e400: 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e  zName = pEList->
e410: 61 5b 69 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20  a[i].zSpan;.    
e420: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e    }.    }.    zN
e430: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
e440: 69 6e 74 66 28 64 62 2c 20 22 25 73 22 2c 20 7a  intf(db, "%s", z
e450: 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 4d  Name);..    /* M
e460: 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 6f 6c  ake sure the col
e470: 75 6d 6e 20 6e 61 6d 65 20 69 73 20 75 6e 69 71  umn name is uniq
e480: 75 65 2e 20 20 49 66 20 74 68 65 20 6e 61 6d 65  ue.  If the name
e490: 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 2c 0a   is not unique,.
e4a0: 20 20 20 20 2a 2a 20 61 70 70 65 6e 64 20 61 6e      ** append an
e4b0: 20 69 6e 74 65 67 65 72 20 74 6f 20 74 68 65 20   integer to the 
e4c0: 6e 61 6d 65 20 73 6f 20 74 68 61 74 20 69 74 20  name so that it 
e4d0: 62 65 63 6f 6d 65 73 20 75 6e 69 71 75 65 2e 0a  becomes unique..
e4e0: 20 20 20 20 2a 2f 0a 20 20 20 20 63 6e 74 20 3d      */.    cnt =
e4f0: 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 7a   0;.    while( z
e500: 4e 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33 48  Name && sqlite3H
e510: 61 73 68 46 69 6e 64 28 26 68 74 2c 20 7a 4e 61  ashFind(&ht, zNa
e520: 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)!=0 ){.      
e530: 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  nName = sqlite3S
e540: 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a  trlen30(zName);.
e550: 20 20 20 20 20 20 69 66 28 20 6e 4e 61 6d 65 3e        if( nName>
e560: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  0 ){.        for
e570: 28 6a 3d 6e 4e 61 6d 65 2d 31 3b 20 6a 3e 30 20  (j=nName-1; j>0 
e580: 26 26 20 73 71 6c 69 74 65 33 49 73 64 69 67 69  && sqlite3Isdigi
e590: 74 28 7a 4e 61 6d 65 5b 6a 5d 29 3b 20 6a 2d 2d  t(zName[j]); j--
e5a0: 29 7b 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20  ){}.        if( 
e5b0: 7a 4e 61 6d 65 5b 6a 5d 3d 3d 27 3a 27 20 29 20  zName[j]==':' ) 
e5c0: 6e 4e 61 6d 65 20 3d 20 6a 3b 0a 20 20 20 20 20  nName = j;.     
e5d0: 20 7d 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d   }.      zName =
e5e0: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
e5f0: 64 62 2c 20 22 25 2e 2a 7a 3a 25 75 22 2c 20 6e  db, "%.*z:%u", n
e600: 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2b 2b 63  Name, zName, ++c
e610: 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63  nt);.      if( c
e620: 6e 74 3e 33 20 29 20 73 71 6c 69 74 65 33 5f 72  nt>3 ) sqlite3_r
e630: 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66  andomness(sizeof
e640: 28 63 6e 74 29 2c 20 26 63 6e 74 29 3b 0a 20 20  (cnt), &cnt);.  
e650: 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e    }.    pCol->zN
e660: 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20  ame = zName;.   
e670: 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 50 72   sqlite3ColumnPr
e680: 6f 70 65 72 74 69 65 73 46 72 6f 6d 4e 61 6d 65  opertiesFromName
e690: 28 30 2c 20 70 43 6f 6c 29 3b 0a 20 20 20 20 69  (0, pCol);.    i
e6a0: 66 28 20 7a 4e 61 6d 65 20 26 26 20 73 71 6c 69  f( zName && sqli
e6b0: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 68  te3HashInsert(&h
e6c0: 74 2c 20 7a 4e 61 6d 65 2c 20 70 43 6f 6c 29 3d  t, zName, pCol)=
e6d0: 3d 70 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73  =pCol ){.      s
e6e0: 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64  qlite3OomFault(d
e6f0: 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  b);.    }.  }.  
e700: 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72  sqlite3HashClear
e710: 28 26 68 74 29 3b 0a 20 20 69 66 28 20 64 62 2d  (&ht);.  if( db-
e720: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
e730: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
e740: 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73  i; j++){.      s
e750: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
e760: 20 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b   aCol[j].zName);
e770: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
e780: 65 33 44 62 46 72 65 65 28 64 62 2c 20 61 43 6f  e3DbFree(db, aCo
e790: 6c 29 3b 0a 20 20 20 20 2a 70 61 43 6f 6c 20 3d  l);.    *paCol =
e7a0: 20 30 3b 0a 20 20 20 20 2a 70 6e 43 6f 6c 20 3d   0;.    *pnCol =
e7b0: 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   0;.    return S
e7c0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
e7d0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
e7e0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
e7f0: 2a 2a 20 41 64 64 20 74 79 70 65 20 61 6e 64 20  ** Add type and 
e800: 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d  collation inform
e810: 61 74 69 6f 6e 20 74 6f 20 61 20 63 6f 6c 75 6d  ation to a colum
e820: 6e 20 6c 69 73 74 20 62 61 73 65 64 20 6f 6e 0a  n list based on.
e830: 2a 2a 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  ** a SELECT stat
e840: 65 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20 54 68  ement..** .** Th
e850: 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 70 72  e column list pr
e860: 65 73 75 6d 61 62 6c 79 20 63 61 6d 65 20 66 72  esumably came fr
e870: 6f 6d 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 4e  om selectColumnN
e880: 61 6d 65 73 46 72 6f 6d 45 78 70 72 4c 69 73 74  amesFromExprList
e890: 28 29 2e 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d  ()..** The colum
e8a0: 6e 20 6c 69 73 74 20 68 61 73 20 6f 6e 6c 79 20  n list has only 
e8b0: 6e 61 6d 65 73 2c 20 6e 6f 74 20 74 79 70 65 73  names, not types
e8c0: 20 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e 20   or collations. 
e8d0: 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   This.** routine
e8e0: 20 67 6f 65 73 20 74 68 72 6f 75 67 68 20 61 6e   goes through an
e8f0: 64 20 61 64 64 73 20 74 68 65 20 74 79 70 65 73  d adds the types
e900: 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e   and collations.
e910: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
e920: 69 6e 65 20 72 65 71 75 69 72 65 73 20 74 68 61  ine requires tha
e930: 74 20 61 6c 6c 20 69 64 65 6e 74 69 66 69 65 72  t all identifier
e940: 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 0a  s in the SELECT.
e950: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 62 65 20  ** statement be 
e960: 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f 0a 73 74 61  resolved..*/.sta
e970: 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74 41  tic void selectA
e980: 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43  ddColumnTypeAndC
e990: 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 50 61 72 73  ollation(.  Pars
e9a0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
e9b0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
e9c0: 74 65 78 74 73 20 2a 2f 0a 20 20 54 61 62 6c 65  texts */.  Table
e9d0: 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20   *pTab,         
e9e0: 20 2f 2a 20 41 64 64 20 63 6f 6c 75 6d 6e 20 74   /* Add column t
e9f0: 79 70 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ype information 
ea00: 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f  to this table */
ea10: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
ea20: 63 74 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45  ct       /* SELE
ea30: 43 54 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  CT used to deter
ea40: 6d 69 6e 65 20 74 79 70 65 73 20 61 6e 64 20 63  mine types and c
ea50: 6f 6c 6c 61 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a  ollations */.){.
ea60: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
ea70: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4e 61  pParse->db;.  Na
ea80: 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20  meContext sNC;. 
ea90: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
eaa0: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
eab0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78 70 72  .  int i;.  Expr
eac0: 20 2a 70 3b 0a 20 20 73 74 72 75 63 74 20 45 78   *p;.  struct Ex
ead0: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a  prList_item *a;.
eae0: 20 20 75 36 34 20 73 7a 41 6c 6c 20 3d 20 30 3b    u64 szAll = 0;
eaf0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53 65 6c  ..  assert( pSel
eb00: 65 63 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ect!=0 );.  asse
eb10: 72 74 28 20 28 70 53 65 6c 65 63 74 2d 3e 73 65  rt( (pSelect->se
eb20: 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73 6f  lFlags & SF_Reso
eb30: 6c 76 65 64 29 21 3d 30 20 29 3b 0a 20 20 61 73  lved)!=0 );.  as
eb40: 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c  sert( pTab->nCol
eb50: 3d 3d 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  ==pSelect->pELis
eb60: 74 2d 3e 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e  t->nExpr || db->
eb70: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
eb80: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
eb90: 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
eba0: 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20  .  memset(&sNC, 
ebb0: 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b  0, sizeof(sNC));
ebc0: 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20  .  sNC.pSrcList 
ebd0: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b  = pSelect->pSrc;
ebe0: 0a 20 20 61 20 3d 20 70 53 65 6c 65 63 74 2d 3e  .  a = pSelect->
ebf0: 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 66 6f 72  pEList->a;.  for
ec00: 28 69 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62 2d  (i=0, pCol=pTab-
ec10: 3e 61 43 6f 6c 3b 20 69 3c 70 54 61 62 2d 3e 6e  >aCol; i<pTab->n
ec20: 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b  Col; i++, pCol++
ec30: 29 7b 0a 20 20 20 20 70 20 3d 20 61 5b 69 5d 2e  ){.    p = a[i].
ec40: 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70  pExpr;.    if( p
ec50: 43 6f 6c 2d 3e 7a 54 79 70 65 3d 3d 30 20 29 7b  Col->zType==0 ){
ec60: 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 54 79  .      pCol->zTy
ec70: 70 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  pe = sqlite3DbSt
ec80: 72 44 75 70 28 64 62 2c 20 0a 20 20 20 20 20 20  rDup(db, .      
ec90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eca0: 20 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e    columnType(&sN
ecb0: 43 2c 20 70 2c 30 2c 30 2c 30 2c 20 26 70 43 6f  C, p,0,0,0, &pCo
ecc0: 6c 2d 3e 73 7a 45 73 74 29 29 3b 0a 20 20 20 20  l->szEst));.    
ecd0: 7d 0a 20 20 20 20 73 7a 41 6c 6c 20 2b 3d 20 70  }.    szAll += p
ece0: 43 6f 6c 2d 3e 73 7a 45 73 74 3b 0a 20 20 20 20  Col->szEst;.    
ecf0: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d  pCol->affinity =
ed00: 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
ed10: 6e 69 74 79 28 70 29 3b 0a 20 20 20 20 69 66 28  nity(p);.    if(
ed20: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d   pCol->affinity=
ed30: 3d 30 20 29 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  =0 ) pCol->affin
ed40: 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  ity = SQLITE_AFF
ed50: 5f 42 4c 4f 42 3b 0a 20 20 20 20 70 43 6f 6c 6c  _BLOB;.    pColl
ed60: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
ed70: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 29  llSeq(pParse, p)
ed80: 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20  ;.    if( pColl 
ed90: 26 26 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3d 3d  && pCol->zColl==
eda0: 30 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d  0 ){.      pCol-
edb0: 3e 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  >zColl = sqlite3
edc0: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 43 6f  DbStrDup(db, pCo
edd0: 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ll->zName);.    
ede0: 7d 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 73 7a  }.  }.  pTab->sz
edf0: 54 61 62 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  TabRow = sqlite3
ee00: 4c 6f 67 45 73 74 28 73 7a 41 6c 6c 2a 34 29 3b  LogEst(szAll*4);
ee10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
ee20: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
ee30: 6e 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20 54  nt, generate a T
ee40: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74  able structure t
ee50: 68 61 74 20 64 65 73 63 72 69 62 65 73 0a 2a 2a  hat describes.**
ee60: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
ee70: 6f 66 20 74 68 61 74 20 53 45 4c 45 43 54 2e 0a  of that SELECT..
ee80: 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65  */.Table *sqlite
ee90: 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
eea0: 63 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ct(Parse *pParse
eeb0: 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63  , Select *pSelec
eec0: 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  t){.  Table *pTa
eed0: 62 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  b;.  sqlite3 *db
eee0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
eef0: 20 69 6e 74 20 73 61 76 65 64 46 6c 61 67 73 3b   int savedFlags;
ef00: 0a 0a 20 20 73 61 76 65 64 46 6c 61 67 73 20 3d  ..  savedFlags =
ef10: 20 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 64 62   db->flags;.  db
ef20: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ->flags &= ~SQLI
ef30: 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 3b  TE_FullColNames;
ef40: 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20  .  db->flags |= 
ef50: 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e  SQLITE_ShortColN
ef60: 61 6d 65 73 3b 0a 20 20 73 71 6c 69 74 65 33 53  ames;.  sqlite3S
ef70: 65 6c 65 63 74 50 72 65 70 28 70 50 61 72 73 65  electPrep(pParse
ef80: 2c 20 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20  , pSelect, 0);. 
ef90: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
efa0: 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  r ) return 0;.  
efb0: 77 68 69 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e  while( pSelect->
efc0: 70 50 72 69 6f 72 20 29 20 70 53 65 6c 65 63 74  pPrior ) pSelect
efd0: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69   = pSelect->pPri
efe0: 6f 72 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20  or;.  db->flags 
eff0: 3d 20 73 61 76 65 64 46 6c 61 67 73 3b 0a 20 20  = savedFlags;.  
f000: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62  pTab = sqlite3Db
f010: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
f020: 69 7a 65 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a  izeof(Table) );.
f030: 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b    if( pTab==0 ){
f040: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
f050: 20 7d 0a 20 20 2f 2a 20 54 68 65 20 73 71 6c 69   }.  /* The sqli
f060: 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
f070: 6c 65 63 74 28 29 20 69 73 20 6f 6e 6c 79 20 75  lect() is only u
f080: 73 65 64 20 6e 20 63 6f 6e 74 65 78 74 73 20 77  sed n contexts w
f090: 68 65 72 65 20 6c 6f 6f 6b 61 73 69 64 65 0a 20  here lookaside. 
f0a0: 20 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64 20   ** is disabled 
f0b0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  */.  assert( db-
f0c0: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44 69 73 61  >lookaside.bDisa
f0d0: 62 6c 65 20 29 3b 0a 20 20 70 54 61 62 2d 3e 6e  ble );.  pTab->n
f0e0: 52 65 66 20 3d 20 31 3b 0a 20 20 70 54 61 62 2d  Ref = 1;.  pTab-
f0f0: 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70 54  >zName = 0;.  pT
f100: 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d  ab->nRowLogEst =
f110: 20 32 30 30 3b 20 61 73 73 65 72 74 28 20 32 30   200; assert( 20
f120: 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  0==sqlite3LogEst
f130: 28 31 30 34 38 35 37 36 29 20 29 3b 0a 20 20 73  (1048576) );.  s
f140: 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f  qlite3ColumnsFro
f150: 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
f160: 2c 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  , pSelect->pELis
f170: 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20  t, &pTab->nCol, 
f180: 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20  &pTab->aCol);.  
f190: 73 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54  selectAddColumnT
f1a0: 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28  ypeAndCollation(
f1b0: 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 53  pParse, pTab, pS
f1c0: 65 6c 65 63 74 29 3b 0a 20 20 70 54 61 62 2d 3e  elect);.  pTab->
f1d0: 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 69 66  iPKey = -1;.  if
f1e0: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
f1f0: 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ed ){.    sqlite
f200: 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c  3DeleteTable(db,
f210: 20 70 54 61 62 29 3b 0a 20 20 20 20 72 65 74 75   pTab);.    retu
f220: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
f230: 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pTab;.}../*.*
f240: 2a 20 47 65 74 20 61 20 56 44 42 45 20 66 6f 72  * Get a VDBE for
f250: 20 74 68 65 20 67 69 76 65 6e 20 70 61 72 73 65   the given parse
f260: 72 20 63 6f 6e 74 65 78 74 2e 20 20 43 72 65 61  r context.  Crea
f270: 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20  te a new one if 
f280: 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66  necessary..** If
f290: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
f2a0: 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e  , return NULL an
f2b0: 64 20 6c 65 61 76 65 20 61 20 6d 65 73 73 61 67  d leave a messag
f2c0: 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a  e in pParse..*/.
f2d0: 56 64 62 65 20 2a 73 71 6c 69 74 65 33 47 65 74  Vdbe *sqlite3Get
f2e0: 56 64 62 65 28 50 61 72 73 65 20 2a 70 50 61 72  Vdbe(Parse *pPar
f2f0: 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  se){.  Vdbe *v =
f300: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
f310: 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20    if( v==0 ){.  
f320: 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56    v = pParse->pV
f330: 64 62 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dbe = sqlite3Vdb
f340: 65 43 72 65 61 74 65 28 70 50 61 72 73 65 29 3b  eCreate(pParse);
f350: 0a 20 20 20 20 69 66 28 20 76 20 29 20 73 71 6c  .    if( v ) sql
f360: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
f370: 2c 20 4f 50 5f 49 6e 69 74 29 3b 0a 20 20 20 20  , OP_Init);.    
f380: 69 66 28 20 70 50 61 72 73 65 2d 3e 70 54 6f 70  if( pParse->pTop
f390: 6c 65 76 65 6c 3d 3d 30 0a 20 20 20 20 20 26 26  level==0.     &&
f3a0: 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61   OptimizationEna
f3b0: 62 6c 65 64 28 70 50 61 72 73 65 2d 3e 64 62 2c  bled(pParse->db,
f3c0: 53 51 4c 49 54 45 5f 46 61 63 74 6f 72 4f 75 74  SQLITE_FactorOut
f3d0: 43 6f 6e 73 74 29 0a 20 20 20 20 29 7b 0a 20 20  Const).    ){.  
f3e0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6f 6b 43 6f      pParse->okCo
f3f0: 6e 73 74 46 61 63 74 6f 72 20 3d 20 31 3b 0a 20  nstFactor = 1;. 
f400: 20 20 20 7d 0a 0a 20 20 7d 0a 20 20 72 65 74 75     }..  }.  retu
f410: 72 6e 20 76 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rn v;.}.../*.** 
f420: 43 6f 6d 70 75 74 65 20 74 68 65 20 69 4c 69 6d  Compute the iLim
f430: 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 66  it and iOffset f
f440: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 53 45 4c  ields of the SEL
f450: 45 43 54 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ECT based on the
f460: 0a 2a 2a 20 70 4c 69 6d 69 74 20 61 6e 64 20 70  .** pLimit and p
f470: 4f 66 66 73 65 74 20 65 78 70 72 65 73 73 69 6f  Offset expressio
f480: 6e 73 2e 20 20 70 4c 69 6d 69 74 20 61 6e 64 20  ns.  pLimit and 
f490: 70 4f 66 66 73 65 74 20 68 6f 6c 64 20 74 68 65  pOffset hold the
f4a0: 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20   expressions.** 
f4b0: 74 68 61 74 20 61 70 70 65 61 72 20 69 6e 20 74  that appear in t
f4c0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20  he original SQL 
f4d0: 73 74 61 74 65 6d 65 6e 74 20 61 66 74 65 72 20  statement after 
f4e0: 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46  the LIMIT and OF
f4f0: 46 53 45 54 0a 2a 2a 20 6b 65 79 77 6f 72 64 73  FSET.** keywords
f500: 2e 20 20 4f 72 20 4e 55 4c 4c 20 69 66 20 74 68  .  Or NULL if th
f510: 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 61 72 65  ose keywords are
f520: 20 6f 6d 69 74 74 65 64 2e 20 69 4c 69 6d 69 74   omitted. iLimit
f530: 20 61 6e 64 20 69 4f 66 66 73 65 74 20 0a 2a 2a   and iOffset .**
f540: 20 61 72 65 20 74 68 65 20 69 6e 74 65 67 65 72   are the integer
f550: 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72   memory register
f560: 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 63 6f 75   numbers for cou
f570: 6e 74 65 72 73 20 75 73 65 64 20 74 6f 20 63 6f  nters used to co
f580: 6d 70 75 74 65 20 0a 2a 2a 20 74 68 65 20 6c 69  mpute .** the li
f590: 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74 2e 20  mit and offset. 
f5a0: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
f5b0: 6c 69 6d 69 74 20 61 6e 64 2f 6f 72 20 6f 66 66  limit and/or off
f5c0: 73 65 74 2c 20 74 68 65 6e 20 0a 2a 2a 20 69 4c  set, then .** iL
f5d0: 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74  imit and iOffset
f5e0: 20 61 72 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a   are negative..*
f5f0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
f600: 65 20 63 68 61 6e 67 65 73 20 74 68 65 20 76 61  e changes the va
f610: 6c 75 65 73 20 6f 66 20 69 4c 69 6d 69 74 20 61  lues of iLimit a
f620: 6e 64 20 69 4f 66 66 73 65 74 20 6f 6e 6c 79 20  nd iOffset only 
f630: 69 66 0a 2a 2a 20 61 20 6c 69 6d 69 74 20 6f 72  if.** a limit or
f640: 20 6f 66 66 73 65 74 20 69 73 20 64 65 66 69 6e   offset is defin
f650: 65 64 20 62 79 20 70 4c 69 6d 69 74 20 61 6e 64  ed by pLimit and
f660: 20 70 4f 66 66 73 65 74 2e 20 20 69 4c 69 6d 69   pOffset.  iLimi
f670: 74 20 61 6e 64 0a 2a 2a 20 69 4f 66 66 73 65 74  t and.** iOffset
f680: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65   should have bee
f690: 6e 20 70 72 65 73 65 74 20 74 6f 20 61 70 70 72  n preset to appr
f6a0: 6f 70 72 69 61 74 65 20 64 65 66 61 75 6c 74 20  opriate default 
f6b0: 76 61 6c 75 65 73 20 28 7a 65 72 6f 29 0a 2a 2a  values (zero).**
f6c0: 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
f6d0: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  g this routine..
f6e0: 2a 2a 0a 2a 2a 20 54 68 65 20 69 4f 66 66 73 65  **.** The iOffse
f6f0: 74 20 72 65 67 69 73 74 65 72 20 28 69 66 20 69  t register (if i
f700: 74 20 65 78 69 73 74 73 29 20 69 73 20 69 6e 69  t exists) is ini
f710: 74 69 61 6c 69 7a 65 64 20 74 6f 20 74 68 65 20  tialized to the 
f720: 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 65 20  value.** of the 
f730: 4f 46 46 53 45 54 2e 20 20 54 68 65 20 69 4c 69  OFFSET.  The iLi
f740: 6d 69 74 20 72 65 67 69 73 74 65 72 20 69 73 20  mit register is 
f750: 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 4c  initialized to L
f760: 49 4d 49 54 2e 20 20 52 65 67 69 73 74 65 72 0a  IMIT.  Register.
f770: 2a 2a 20 69 4f 66 66 73 65 74 2b 31 20 69 73 20  ** iOffset+1 is 
f780: 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 4c  initialized to L
f790: 49 4d 49 54 2b 4f 46 46 53 45 54 2e 0a 2a 2a 0a  IMIT+OFFSET..**.
f7a0: 2a 2a 20 4f 6e 6c 79 20 69 66 20 70 4c 69 6d 69  ** Only if pLimi
f7b0: 74 21 3d 30 20 6f 72 20 70 4f 66 66 73 65 74 21  t!=0 or pOffset!
f7c0: 3d 30 20 64 6f 20 74 68 65 20 6c 69 6d 69 74 20  =0 do the limit 
f7d0: 72 65 67 69 73 74 65 72 73 20 67 65 74 0a 2a 2a  registers get.**
f7e0: 20 72 65 64 65 66 69 6e 65 64 2e 20 20 54 68 65   redefined.  The
f7f0: 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61   UNION ALL opera
f800: 74 6f 72 20 75 73 65 73 20 74 68 69 73 20 70 72  tor uses this pr
f810: 6f 70 65 72 74 79 20 74 6f 20 66 6f 72 63 65 0a  operty to force.
f820: 2a 2a 20 74 68 65 20 72 65 75 73 65 20 6f 66 20  ** the reuse of 
f830: 74 68 65 20 73 61 6d 65 20 6c 69 6d 69 74 20 61  the same limit a
f840: 6e 64 20 6f 66 66 73 65 74 20 72 65 67 69 73 74  nd offset regist
f850: 65 72 73 20 61 63 72 6f 73 73 20 6d 75 6c 74 69  ers across multi
f860: 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74  ple.** SELECT st
f870: 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61  atements..*/.sta
f880: 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74 65  tic void compute
f890: 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 50  LimitRegisters(P
f8a0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
f8b0: 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 42 72  lect *p, int iBr
f8c0: 65 61 6b 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  eak){.  Vdbe *v 
f8d0: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69  = 0;.  int iLimi
f8e0: 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66  t = 0;.  int iOf
f8f0: 66 73 65 74 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20  fset;.  int n;. 
f900: 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29   if( p->iLimit )
f910: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 0a   return;..  /* .
f920: 20 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31 22 20    ** "LIMIT -1" 
f930: 61 6c 77 61 79 73 20 73 68 6f 77 73 20 61 6c 6c  always shows all
f940: 20 72 6f 77 73 2e 20 20 54 68 65 72 65 20 69 73   rows.  There is
f950: 20 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74 72   some.  ** contr
f960: 6f 76 65 72 73 79 20 61 62 6f 75 74 20 77 68 61  oversy about wha
f970: 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 65  t the correct be
f980: 68 61 76 69 6f 72 20 73 68 6f 75 6c 64 20 62 65  havior should be
f990: 2e 0a 20 20 2a 2a 20 54 68 65 20 63 75 72 72 65  ..  ** The curre
f9a0: 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  nt implementatio
f9b0: 6e 20 69 6e 74 65 72 70 72 65 74 73 20 22 4c 49  n interprets "LI
f9c0: 4d 49 54 20 30 22 20 74 6f 20 6d 65 61 6e 0a 20  MIT 0" to mean. 
f9d0: 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a   ** no rows..  *
f9e0: 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  /.  sqlite3ExprC
f9f0: 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
fa00: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
fa10: 70 4f 66 66 73 65 74 3d 3d 30 20 7c 7c 20 70 2d  pOffset==0 || p-
fa20: 3e 70 4c 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20  >pLimit!=0 );.  
fa30: 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b  if( p->pLimit ){
fa40: 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d  .    p->iLimit =
fa50: 20 69 4c 69 6d 69 74 20 3d 20 2b 2b 70 50 61 72   iLimit = ++pPar
fa60: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 76 20  se->nMem;.    v 
fa70: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
fa80: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 61 73  (pParse);.    as
fa90: 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20  sert( v!=0 );.  
faa0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
fab0: 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c  rIsInteger(p->pL
fac0: 69 6d 69 74 2c 20 26 6e 29 20 29 7b 0a 20 20 20  imit, &n) ){.   
fad0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
fae0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
faf0: 65 72 2c 20 6e 2c 20 69 4c 69 6d 69 74 29 3b 0a  er, n, iLimit);.
fb00: 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
fb10: 74 28 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75  t((v, "LIMIT cou
fb20: 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20 69  nter"));.      i
fb30: 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( n==0 ){.     
fb40: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
fb50: 74 6f 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20  to(v, iBreak);. 
fb60: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e       }else if( n
fb70: 3e 3d 30 20 26 26 20 70 2d 3e 6e 53 65 6c 65 63  >=0 && p->nSelec
fb80: 74 52 6f 77 3e 73 71 6c 69 74 65 33 4c 6f 67 45  tRow>sqlite3LogE
fb90: 73 74 28 28 75 36 34 29 6e 29 20 29 7b 0a 20 20  st((u64)n) ){.  
fba0: 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74        p->nSelect
fbb0: 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Row = sqlite3Log
fbc0: 45 73 74 28 28 75 36 34 29 6e 29 3b 0a 20 20 20  Est((u64)n);.   
fbd0: 20 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73       p->selFlags
fbe0: 20 7c 3d 20 53 46 5f 46 69 78 65 64 4c 69 6d 69   |= SF_FixedLimi
fbf0: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
fc00: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
fc10: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
fc20: 73 65 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 69  se, p->pLimit, i
fc30: 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 73 71  Limit);.      sq
fc40: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
fc50: 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c  v, OP_MustBeInt,
fc60: 20 69 4c 69 6d 69 74 29 3b 20 56 64 62 65 43 6f   iLimit); VdbeCo
fc70: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
fc80: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
fc90: 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22   "LIMIT counter"
fca0: 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
fcb0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
fcc0: 50 5f 49 66 4e 6f 74 2c 20 69 4c 69 6d 69 74 2c  P_IfNot, iLimit,
fcd0: 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f   iBreak); VdbeCo
fce0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d  verage(v);.    }
fcf0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 66 66  .    if( p->pOff
fd00: 73 65 74 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  set ){.      p->
fd10: 69 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 73 65  iOffset = iOffse
fd20: 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
fd30: 65 6d 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  em;.      pParse
fd40: 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 2f 2a 20 41  ->nMem++;   /* A
fd50: 6c 6c 6f 63 61 74 65 20 61 6e 20 65 78 74 72 61  llocate an extra
fd60: 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 6c 69   register for li
fd70: 6d 69 74 2b 6f 66 66 73 65 74 20 2a 2f 0a 20 20  mit+offset */.  
fd80: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
fd90: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  ode(pParse, p->p
fda0: 4f 66 66 73 65 74 2c 20 69 4f 66 66 73 65 74 29  Offset, iOffset)
fdb0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
fdc0: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
fdd0: 4d 75 73 74 42 65 49 6e 74 2c 20 69 4f 66 66 73  MustBeInt, iOffs
fde0: 65 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  et); VdbeCoverag
fdf0: 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65  e(v);.      Vdbe
fe00: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46 46  Comment((v, "OFF
fe10: 53 45 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a  SET counter"));.
fe20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
fe30: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 66  eAddOp3(v, OP_Of
fe40: 66 73 65 74 4c 69 6d 69 74 2c 20 69 4c 69 6d 69  fsetLimit, iLimi
fe50: 74 2c 20 69 4f 66 66 73 65 74 2b 31 2c 20 69 4f  t, iOffset+1, iO
fe60: 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 56 64  ffset);.      Vd
fe70: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c  beComment((v, "L
fe80: 49 4d 49 54 2b 4f 46 46 53 45 54 22 29 29 3b 0a  IMIT+OFFSET"));.
fe90: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66      }.  }.}..#if
fea0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
feb0: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
fec0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
fed0: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 6f  e appropriate co
fee0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
fef0: 20 66 6f 72 20 74 68 65 20 69 43 6f 6c 2d 74 68   for the iCol-th
ff00: 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68   column of.** th
ff10: 65 20 72 65 73 75 6c 74 20 73 65 74 20 66 6f 72  e result set for
ff20: 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 2d 73 65   the compound-se
ff30: 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 22  lect statement "
ff40: 70 22 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  p".  Return NULL
ff50: 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d   if.** the colum
ff60: 6e 20 68 61 73 20 6e 6f 20 64 65 66 61 75 6c 74  n has no default
ff70: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
ff80: 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  nce..**.** The c
ff90: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
ffa0: 65 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75  e for the compou
ffb0: 6e 64 20 73 65 6c 65 63 74 20 69 73 20 74 61 6b  nd select is tak
ffc0: 65 6e 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6c  en from the.** l
ffd0: 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f 66  eft-most term of
ffe0: 20 74 68 65 20 73 65 6c 65 63 74 20 74 68 61 74   the select that
fff0: 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67   has a collating
10000 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74   sequence..*/.st
10010 61 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a 6d 75  atic CollSeq *mu
10020 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71  ltiSelectCollSeq
10030 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
10040 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69  Select *p, int i
10050 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20  Col){.  CollSeq 
10060 2a 70 52 65 74 3b 0a 20 20 69 66 28 20 70 2d 3e  *pRet;.  if( p->
10070 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 52  pPrior ){.    pR
10080 65 74 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  et = multiSelect
10090 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
100a0 70 2d 3e 70 50 72 69 6f 72 2c 20 69 43 6f 6c 29  p->pPrior, iCol)
100b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
100c0 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61  Ret = 0;.  }.  a
100d0 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20 29  ssert( iCol>=0 )
100e0 3b 0a 20 20 2f 2a 20 69 43 6f 6c 20 6d 75 73 74  ;.  /* iCol must
100f0 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 70 2d   be less than p-
10100 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2e 20  >pEList->nExpr. 
10110 20 4f 74 68 65 72 77 69 73 65 20 61 6e 20 65 72   Otherwise an er
10120 72 6f 72 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 68  ror would.  ** h
10130 61 76 65 20 62 65 65 6e 20 74 68 72 6f 77 6e 20  ave been thrown 
10140 64 75 72 69 6e 67 20 6e 61 6d 65 20 72 65 73 6f  during name reso
10150 6c 75 74 69 6f 6e 20 61 6e 64 20 77 65 20 77 6f  lution and we wo
10160 75 6c 64 20 6e 6f 74 20 68 61 76 65 20 67 6f 74  uld not have got
10170 74 65 6e 0a 20 20 2a 2a 20 74 68 69 73 20 66 61  ten.  ** this fa
10180 72 20 2a 2f 0a 20 20 69 66 28 20 70 52 65 74 3d  r */.  if( pRet=
10190 3d 30 20 26 26 20 41 4c 57 41 59 53 28 69 43 6f  =0 && ALWAYS(iCo
101a0 6c 3c 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  l<p->pEList->nEx
101b0 70 72 29 20 29 7b 0a 20 20 20 20 70 52 65 74 20  pr) ){.    pRet 
101c0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
101d0 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e  lSeq(pParse, p->
101e0 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e  pEList->a[iCol].
101f0 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65  pExpr);.  }.  re
10200 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn pRet;.}../*
10210 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63 74 20 73  .** The select s
10220 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20  tatement passed 
10230 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61  as the second pa
10240 72 61 6d 65 74 65 72 20 69 73 20 61 20 63 6f 6d  rameter is a com
10250 70 6f 75 6e 64 20 53 45 4c 45 43 54 0a 2a 2a 20  pound SELECT.** 
10260 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59  with an ORDER BY
10270 20 63 6c 61 75 73 65 2e 20 54 68 69 73 20 66 75   clause. This fu
10280 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73  nction allocates
10290 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20 4b   and returns a K
102a0 65 79 49 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74  eyInfo.** struct
102b0 75 72 65 20 73 75 69 74 61 62 6c 65 20 66 6f 72  ure suitable for
102c0 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68   implementing th
102d0 65 20 4f 52 44 45 52 20 42 59 2e 0a 2a 2a 0a 2a  e ORDER BY..**.*
102e0 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20  * Space to hold 
102f0 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
10300 63 74 75 72 65 20 69 73 20 6f 62 74 61 69 6e 65  cture is obtaine
10310 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 54  d from malloc. T
10320 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75  he calling.** fu
10330 6e 63 74 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e  nction is respon
10340 73 69 62 6c 65 20 66 6f 72 20 65 6e 73 75 72 69  sible for ensuri
10350 6e 67 20 74 68 61 74 20 74 68 69 73 20 73 74 72  ng that this str
10360 75 63 74 75 72 65 20 69 73 20 65 76 65 6e 74 75  ucture is eventu
10370 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 0a 2a  ally.** freed..*
10380 2f 0a 73 74 61 74 69 63 20 4b 65 79 49 6e 66 6f  /.static KeyInfo
10390 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64   *multiSelectOrd
103a0 65 72 42 79 4b 65 79 49 6e 66 6f 28 50 61 72 73  erByKeyInfo(Pars
103b0 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
103c0 74 20 2a 70 2c 20 69 6e 74 20 6e 45 78 74 72 61  t *p, int nExtra
103d0 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  ){.  ExprList *p
103e0 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
103f0 64 65 72 42 79 3b 0a 20 20 69 6e 74 20 6e 4f 72  derBy;.  int nOr
10400 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
10410 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 73 71  rBy->nExpr;.  sq
10420 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
10430 73 65 2d 3e 64 62 3b 0a 20 20 4b 65 79 49 6e 66  se->db;.  KeyInf
10440 6f 20 2a 70 52 65 74 20 3d 20 73 71 6c 69 74 65  o *pRet = sqlite
10450 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62  3KeyInfoAlloc(db
10460 2c 20 6e 4f 72 64 65 72 42 79 2b 6e 45 78 74 72  , nOrderBy+nExtr
10470 61 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 52 65  a, 1);.  if( pRe
10480 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  t ){.    int i;.
10490 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
104a0 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20  OrderBy; i++){. 
104b0 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
104c0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
104d0 20 3d 20 26 70 4f 72 64 65 72 42 79 2d 3e 61 5b   = &pOrderBy->a[
104e0 69 5d 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  i];.      Expr *
104f0 70 54 65 72 6d 20 3d 20 70 49 74 65 6d 2d 3e 70  pTerm = pItem->p
10500 45 78 70 72 3b 0a 20 20 20 20 20 20 43 6f 6c 6c  Expr;.      Coll
10510 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 20  Seq *pColl;..   
10520 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 66 6c     if( pTerm->fl
10530 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65  ags & EP_Collate
10540 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c   ){.        pCol
10550 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
10560 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
10570 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Term);.      }el
10580 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  se{.        pCol
10590 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43  l = multiSelectC
105a0 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
105b0 2c 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72  , pItem->u.x.iOr
105c0 64 65 72 42 79 43 6f 6c 2d 31 29 3b 0a 20 20 20  derByCol-1);.   
105d0 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d       if( pColl==
105e0 30 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e  0 ) pColl = db->
105f0 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
10600 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69     pOrderBy->a[i
10610 5d 2e 70 45 78 70 72 20 3d 0a 20 20 20 20 20 20  ].pExpr =.      
10620 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
10630 64 64 43 6f 6c 6c 61 74 65 53 74 72 69 6e 67 28  ddCollateString(
10640 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70  pParse, pTerm, p
10650 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Coll->zName);.  
10660 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
10670 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  rt( sqlite3KeyIn
10680 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 52  foIsWriteable(pR
10690 65 74 29 20 29 3b 0a 20 20 20 20 20 20 70 52 65  et) );.      pRe
106a0 74 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43  t->aColl[i] = pC
106b0 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 52 65 74 2d  oll;.      pRet-
106c0 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d  >aSortOrder[i] =
106d0 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
106e0 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d  sortOrder;.    }
106f0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
10700 52 65 74 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  Ret;.}..#ifndef 
10710 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
10720 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
10730 6e 65 20 67 65 6e 65 72 61 74 65 73 20 56 44 42  ne generates VDB
10740 45 20 63 6f 64 65 20 74 6f 20 63 6f 6d 70 75 74  E code to comput
10750 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  e the content of
10760 20 61 20 57 49 54 48 20 52 45 43 55 52 53 49 56   a WITH RECURSIV
10770 45 0a 2a 2a 20 71 75 65 72 79 20 6f 66 20 74 68  E.** query of th
10780 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20  e form:.**.**   
10790 3c 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65  <recursive-table
107a0 3e 20 41 53 20 28 3c 73 65 74 75 70 2d 71 75 65  > AS (<setup-que
107b0 72 79 3e 20 55 4e 49 4f 4e 20 5b 41 4c 4c 5d 20  ry> UNION [ALL] 
107c0 3c 72 65 63 75 72 73 69 76 65 2d 71 75 65 72 79  <recursive-query
107d0 3e 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  >).**           
107e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f                \_
107f0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20  __________/     
10800 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f          \_______
10810 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20  ________/.**    
10820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10830 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72         p->pPrior
10840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10850 20 20 20 20 20 20 70 0a 2a 2a 0a 2a 2a 0a 2a 2a        p.**.**.**
10860 20 54 68 65 72 65 20 69 73 20 65 78 61 63 74 6c   There is exactl
10870 79 20 6f 6e 65 20 72 65 66 65 72 65 6e 63 65 20  y one reference 
10880 74 6f 20 74 68 65 20 72 65 63 75 72 73 69 76 65  to the recursive
10890 2d 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52  -table in the FR
108a0 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20 6f 66 20  OM clause.** of 
108b0 72 65 63 75 72 73 69 76 65 2d 71 75 65 72 79 2c  recursive-query,
108c0 20 6d 61 72 6b 65 64 20 77 69 74 68 20 74 68 65   marked with the
108d0 20 53 72 63 4c 69 73 74 2d 3e 61 5b 5d 2e 66 67   SrcList->a[].fg
108e0 2e 69 73 52 65 63 75 72 73 69 76 65 20 66 6c 61  .isRecursive fla
108f0 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 74  g..**.** The set
10900 75 70 2d 71 75 65 72 79 20 72 75 6e 73 20 6f 6e  up-query runs on
10910 63 65 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  ce to generate a
10920 6e 20 69 6e 69 74 69 61 6c 20 73 65 74 20 6f 66  n initial set of
10930 20 72 6f 77 73 20 74 68 61 74 20 67 6f 0a 2a 2a   rows that go.**
10940 20 69 6e 74 6f 20 61 20 51 75 65 75 65 20 74 61   into a Queue ta
10950 62 6c 65 2e 20 20 52 6f 77 73 20 61 72 65 20 65  ble.  Rows are e
10960 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68  xtracted from th
10970 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 6f 6e  e Queue table on
10980 65 20 62 79 0a 2a 2a 20 6f 6e 65 2e 20 20 45 61  e by.** one.  Ea
10990 63 68 20 72 6f 77 20 65 78 74 72 61 63 74 65 64  ch row extracted
109a0 20 66 72 6f 6d 20 51 75 65 75 65 20 69 73 20 6f   from Queue is o
109b0 75 74 70 75 74 20 74 6f 20 70 44 65 73 74 2e 20  utput to pDest. 
109c0 20 54 68 65 6e 20 74 68 65 20 73 69 6e 67 6c 65   Then the single
109d0 0a 2a 2a 20 65 78 74 72 61 63 74 65 64 20 72 6f  .** extracted ro
109e0 77 20 28 6e 6f 77 20 69 6e 20 74 68 65 20 69 43  w (now in the iC
109f0 75 72 72 65 6e 74 20 74 61 62 6c 65 29 20 62 65  urrent table) be
10a00 63 6f 6d 65 73 20 74 68 65 20 63 6f 6e 74 65 6e  comes the conten
10a10 74 20 6f 66 20 74 68 65 0a 2a 2a 20 72 65 63 75  t of the.** recu
10a20 72 73 69 76 65 2d 74 61 62 6c 65 20 66 6f 72 20  rsive-table for 
10a30 61 20 72 65 63 75 72 73 69 76 65 2d 71 75 65 72  a recursive-quer
10a40 79 20 72 75 6e 2e 20 20 54 68 65 20 6f 75 74 70  y run.  The outp
10a50 75 74 20 6f 66 20 74 68 65 20 72 65 63 75 72 73  ut of the recurs
10a60 69 76 65 2d 71 75 65 72 79 0a 2a 2a 20 69 73 20  ive-query.** is 
10a70 61 64 64 65 64 20 62 61 63 6b 20 69 6e 74 6f 20  added back into 
10a80 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 2e  the Queue table.
10a90 20 20 54 68 65 6e 20 61 6e 6f 74 68 65 72 20 72    Then another r
10aa0 6f 77 20 69 73 20 65 78 74 72 61 63 74 65 64 20  ow is extracted 
10ab0 66 72 6f 6d 20 51 75 65 75 65 0a 2a 2a 20 61 6e  from Queue.** an
10ac0 64 20 74 68 65 20 69 74 65 72 61 74 69 6f 6e 20  d the iteration 
10ad0 63 6f 6e 74 69 6e 75 65 73 20 75 6e 74 69 6c 20  continues until 
10ae0 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20  the Queue table 
10af0 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20  is empty..**.** 
10b00 49 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  If the compound 
10b10 71 75 65 72 79 20 6f 70 65 72 61 74 6f 72 20 69  query operator i
10b20 73 20 55 4e 49 4f 4e 20 74 68 65 6e 20 6e 6f 20  s UNION then no 
10b30 64 75 70 6c 69 63 61 74 65 20 72 6f 77 73 20 61  duplicate rows a
10b40 72 65 20 65 76 65 72 0a 2a 2a 20 69 6e 73 65 72  re ever.** inser
10b50 74 65 64 20 69 6e 74 6f 20 74 68 65 20 51 75 65  ted into the Que
10b60 75 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20 69  ue table.  The i
10b70 44 69 73 74 69 6e 63 74 20 74 61 62 6c 65 20 6b  Distinct table k
10b80 65 65 70 73 20 61 20 63 6f 70 79 20 6f 66 20 61  eeps a copy of a
10b90 6c 6c 20 72 6f 77 73 0a 2a 2a 20 74 68 61 74 20  ll rows.** that 
10ba0 68 61 76 65 20 65 76 65 72 20 62 65 65 6e 20 69  have ever been i
10bb0 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 51 75 65  nserted into Que
10bc0 75 65 20 61 6e 64 20 63 61 75 73 65 73 20 64 75  ue and causes du
10bd0 70 6c 69 63 61 74 65 73 20 74 6f 20 62 65 0a 2a  plicates to be.*
10be0 2a 20 64 69 73 63 61 72 64 65 64 2e 20 20 49 66  * discarded.  If
10bf0 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20 69 73   the operator is
10c00 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 74 68 65 6e   UNION ALL, then
10c10 20 64 75 70 6c 69 63 61 74 65 73 20 61 72 65 20   duplicates are 
10c20 61 6c 6c 6f 77 65 64 2e 0a 2a 2a 20 0a 2a 2a 20  allowed..** .** 
10c30 49 66 20 74 68 65 20 71 75 65 72 79 20 68 61 73  If the query has
10c40 20 61 6e 20 4f 52 44 45 52 20 42 59 2c 20 74 68   an ORDER BY, th
10c50 65 6e 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  en entries in th
10c60 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 61 72  e Queue table ar
10c70 65 20 6b 65 70 74 20 69 6e 0a 2a 2a 20 4f 52 44  e kept in.** ORD
10c80 45 52 20 42 59 20 6f 72 64 65 72 20 61 6e 64 20  ER BY order and 
10c90 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
10ca0 69 73 20 65 78 74 72 61 63 74 65 64 20 66 6f 72  is extracted for
10cb0 20 65 61 63 68 20 63 79 63 6c 65 2e 20 20 57 69   each cycle.  Wi
10cc0 74 68 6f 75 74 0a 2a 2a 20 61 6e 20 4f 52 44 45  thout.** an ORDE
10cd0 52 20 42 59 2c 20 74 68 65 20 51 75 65 75 65 20  R BY, the Queue 
10ce0 74 61 62 6c 65 20 69 73 20 6a 75 73 74 20 61 20  table is just a 
10cf0 46 49 46 4f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  FIFO..**.** If a
10d00 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 69 73   LIMIT clause is
10d10 20 70 72 6f 76 69 64 65 64 2c 20 74 68 65 6e 20   provided, then 
10d20 74 68 65 20 69 74 65 72 61 74 69 6f 6e 20 73 74  the iteration st
10d30 6f 70 73 20 61 66 74 65 72 20 4c 49 4d 49 54 20  ops after LIMIT 
10d40 72 6f 77 73 0a 2a 2a 20 68 61 76 65 20 62 65 65  rows.** have bee
10d50 6e 20 6f 75 74 70 75 74 20 74 6f 20 70 44 65 73  n output to pDes
10d60 74 2e 20 20 41 20 4c 49 4d 49 54 20 6f 66 20 7a  t.  A LIMIT of z
10d70 65 72 6f 20 6d 65 61 6e 73 20 74 6f 20 6f 75 74  ero means to out
10d80 70 75 74 20 6e 6f 20 72 6f 77 73 20 61 6e 64 20  put no rows and 
10d90 61 0a 2a 2a 20 6e 65 67 61 74 69 76 65 20 4c 49  a.** negative LI
10da0 4d 49 54 20 6d 65 61 6e 73 20 74 6f 20 6f 75 74  MIT means to out
10db0 70 75 74 20 61 6c 6c 20 72 6f 77 73 2e 20 20 49  put all rows.  I
10dc0 66 20 74 68 65 72 65 20 69 73 20 61 6c 73 6f 20  f there is also 
10dd0 61 6e 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65  an OFFSET clause
10de0 0a 2a 2a 20 77 69 74 68 20 61 20 70 6f 73 69 74  .** with a posit
10df0 69 76 65 20 76 61 6c 75 65 2c 20 74 68 65 6e 20  ive value, then 
10e00 74 68 65 20 66 69 72 73 74 20 4f 46 46 53 45 54  the first OFFSET
10e10 20 6f 75 74 70 75 74 73 20 61 72 65 20 64 69 73   outputs are dis
10e20 63 61 72 64 65 64 20 72 61 74 68 65 72 0a 2a 2a  carded rather.**
10e30 20 74 68 61 6e 20 62 65 69 6e 67 20 73 65 6e 74   than being sent
10e40 20 74 6f 20 70 44 65 73 74 2e 20 20 54 68 65 20   to pDest.  The 
10e50 4c 49 4d 49 54 20 63 6f 75 6e 74 20 64 6f 65 73  LIMIT count does
10e60 20 6e 6f 74 20 62 65 67 69 6e 20 75 6e 74 69 6c   not begin until
10e70 20 61 66 74 65 72 20 4f 46 46 53 45 54 0a 2a 2a   after OFFSET.**
10e80 20 72 6f 77 73 20 68 61 76 65 20 62 65 65 6e 20   rows have been 
10e90 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74  skipped..*/.stat
10ea0 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65  ic void generate
10eb0 57 69 74 68 52 65 63 75 72 73 69 76 65 51 75 65  WithRecursiveQue
10ec0 72 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ry(.  Parse *pPa
10ed0 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
10ee0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
10ef0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
10f00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
10f10 20 72 65 63 75 72 73 69 76 65 20 53 45 4c 45 43   recursive SELEC
10f20 54 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  T to be coded */
10f30 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
10f40 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74  Dest     /* What
10f50 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72   to do with quer
10f60 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a  y results */.){.
10f70 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20    SrcList *pSrc 
10f80 3d 20 70 2d 3e 70 53 72 63 3b 20 20 20 20 20 20  = p->pSrc;      
10f90 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
10fa0 73 65 20 6f 66 20 74 68 65 20 72 65 63 75 72 73  se of the recurs
10fb0 69 76 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  ive query */.  i
10fc0 6e 74 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c  nt nCol = p->pEL
10fd0 69 73 74 2d 3e 6e 45 78 70 72 3b 20 20 2f 2a 20  ist->nExpr;  /* 
10fe0 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
10ff0 73 20 69 6e 20 74 68 65 20 72 65 63 75 72 73 69  s in the recursi
11000 76 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 56 64  ve table */.  Vd
11010 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
11020 70 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20 54  pVdbe;      /* T
11030 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
11040 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73  ement under cons
11050 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 53 65  truction */.  Se
11060 6c 65 63 74 20 2a 70 53 65 74 75 70 20 3d 20 70  lect *pSetup = p
11070 2d 3e 70 50 72 69 6f 72 3b 20 20 20 2f 2a 20 54  ->pPrior;   /* T
11080 68 65 20 73 65 74 75 70 20 71 75 65 72 79 20 2a  he setup query *
11090 2f 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b  /.  int addrTop;
110a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110b0 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20    /* Top of the 
110c0 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64  loop */.  int ad
110d0 64 72 43 6f 6e 74 2c 20 61 64 64 72 42 72 65 61  drCont, addrBrea
110e0 6b 3b 20 20 20 20 20 20 2f 2a 20 43 4f 4e 54 49  k;      /* CONTI
110f0 4e 55 45 20 61 6e 64 20 42 52 45 41 4b 20 61 64  NUE and BREAK ad
11100 64 72 65 73 73 65 73 20 2a 2f 0a 20 20 69 6e 74  dresses */.  int
11110 20 69 43 75 72 72 65 6e 74 20 3d 20 30 3b 20 20   iCurrent = 0;  
11120 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
11130 65 20 43 75 72 72 65 6e 74 20 74 61 62 6c 65 20  e Current table 
11140 2a 2f 0a 20 20 69 6e 74 20 72 65 67 43 75 72 72  */.  int regCurr
11150 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ent;            
11160 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68     /* Register h
11170 6f 6c 64 69 6e 67 20 43 75 72 72 65 6e 74 20 74  olding Current t
11180 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 51  able */.  int iQ
11190 75 65 75 65 3b 20 20 20 20 20 20 20 20 20 20 20  ueue;           
111a0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 51          /* The Q
111b0 75 65 75 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ueue table */.  
111c0 69 6e 74 20 69 44 69 73 74 69 6e 63 74 20 3d 20  int iDistinct = 
111d0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  0;            /*
111e0 20 54 6f 20 65 6e 73 75 72 65 20 75 6e 69 71 75   To ensure uniqu
111f0 65 20 72 65 73 75 6c 74 73 20 69 66 20 55 4e 49  e results if UNI
11200 4f 4e 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73  ON */.  int eDes
11210 74 20 3d 20 53 52 54 5f 46 69 66 6f 3b 20 20 20  t = SRT_Fifo;   
11220 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20        /* How to 
11230 77 72 69 74 65 20 74 6f 20 51 75 65 75 65 20 2a  write to Queue *
11240 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64  /.  SelectDest d
11250 65 73 74 51 75 65 75 65 3b 20 20 20 20 20 20 20  estQueue;       
11260 20 20 2f 2a 20 53 65 6c 65 63 74 44 65 73 74 20    /* SelectDest 
11270 74 61 72 67 65 74 74 69 6e 67 20 74 68 65 20 51  targetting the Q
11280 75 65 75 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ueue table */.  
11290 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
112a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
112b0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
112c0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
112d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112e0 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
112f0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
11300 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 20  OrderBy;        
11310 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20     /* The ORDER 
11320 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  BY clause */.  E
11330 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f  xpr *pLimit, *pO
11340 66 66 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20  ffset;       /* 
11350 53 61 76 65 64 20 4c 49 4d 49 54 20 61 6e 64 20  Saved LIMIT and 
11360 4f 46 46 53 45 54 20 2a 2f 0a 20 20 69 6e 74 20  OFFSET */.  int 
11370 72 65 67 4c 69 6d 69 74 2c 20 72 65 67 4f 66 66  regLimit, regOff
11380 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 52 65 67  set;      /* Reg
11390 69 73 74 65 72 73 20 75 73 65 64 20 62 79 20 4c  isters used by L
113a0 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
113b0 2a 2f 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20  */..  /* Obtain 
113c0 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f  authorization to
113d0 20 64 6f 20 61 20 72 65 63 75 72 73 69 76 65 20   do a recursive 
113e0 71 75 65 72 79 20 2a 2f 0a 20 20 69 66 28 20 73  query */.  if( s
113f0 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
11400 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 52  pParse, SQLITE_R
11410 45 43 55 52 53 49 56 45 2c 20 30 2c 20 30 2c 20  ECURSIVE, 0, 0, 
11420 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  0) ) return;..  
11430 2f 2a 20 50 72 6f 63 65 73 73 20 74 68 65 20 4c  /* Process the L
11440 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
11450 63 6c 61 75 73 65 73 2c 20 69 66 20 74 68 65 79  clauses, if they
11460 20 65 78 69 73 74 20 2a 2f 0a 20 20 61 64 64 72   exist */.  addr
11470 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56  Break = sqlite3V
11480 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
11490 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52  .  computeLimitR
114a0 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
114b0 20 70 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a   p, addrBreak);.
114c0 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c    pLimit = p->pL
114d0 69 6d 69 74 3b 0a 20 20 70 4f 66 66 73 65 74 20  imit;.  pOffset 
114e0 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20  = p->pOffset;.  
114f0 72 65 67 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c  regLimit = p->iL
11500 69 6d 69 74 3b 0a 20 20 72 65 67 4f 66 66 73 65  imit;.  regOffse
11510 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a  t = p->iOffset;.
11520 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 2d    p->pLimit = p-
11530 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >pOffset = 0;.  
11540 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 2d 3e 69  p->iLimit = p->i
11550 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 70 4f  Offset = 0;.  pO
11560 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
11570 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 61  erBy;..  /* Loca
11580 74 65 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  te the cursor nu
11590 6d 62 65 72 20 6f 66 20 74 68 65 20 43 75 72 72  mber of the Curr
115a0 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66  ent table */.  f
115b0 6f 72 28 69 3d 30 3b 20 41 4c 57 41 59 53 28 69  or(i=0; ALWAYS(i
115c0 3c 70 53 72 63 2d 3e 6e 53 72 63 29 3b 20 69 2b  <pSrc->nSrc); i+
115d0 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 53 72 63  +){.    if( pSrc
115e0 2d 3e 61 5b 69 5d 2e 66 67 2e 69 73 52 65 63 75  ->a[i].fg.isRecu
115f0 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 69  rsive ){.      i
11600 43 75 72 72 65 6e 74 20 3d 20 70 53 72 63 2d 3e  Current = pSrc->
11610 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20  a[i].iCursor;.  
11620 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
11630 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  .  }..  /* Alloc
11640 61 74 65 20 63 75 72 73 6f 72 73 20 6e 75 6d 62  ate cursors numb
11650 65 72 73 20 66 6f 72 20 51 75 65 75 65 20 61 6e  ers for Queue an
11660 64 20 44 69 73 74 69 6e 63 74 2e 20 20 54 68 65  d Distinct.  The
11670 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   cursor number f
11680 6f 72 0a 20 20 2a 2a 20 74 68 65 20 44 69 73 74  or.  ** the Dist
11690 69 6e 63 74 20 74 61 62 6c 65 20 6d 75 73 74 20  inct table must 
116a0 62 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 67  be exactly one g
116b0 72 65 61 74 65 72 20 74 68 61 6e 20 51 75 65 75  reater than Queu
116c0 65 20 69 6e 20 6f 72 64 65 72 0a 20 20 2a 2a 20  e in order.  ** 
116d0 66 6f 72 20 74 68 65 20 53 52 54 5f 44 69 73 74  for the SRT_Dist
116e0 46 69 66 6f 20 61 6e 64 20 53 52 54 5f 44 69 73  Fifo and SRT_Dis
116f0 74 51 75 65 75 65 20 64 65 73 74 69 6e 61 74 69  tQueue destinati
11700 6f 6e 73 20 74 6f 20 77 6f 72 6b 2e 20 2a 2f 0a  ons to work. */.
11710 20 20 69 51 75 65 75 65 20 3d 20 70 50 61 72 73    iQueue = pPars
11720 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 69 66 28  e->nTab++;.  if(
11730 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e   p->op==TK_UNION
11740 20 29 7b 0a 20 20 20 20 65 44 65 73 74 20 3d 20   ){.    eDest = 
11750 70 4f 72 64 65 72 42 79 20 3f 20 53 52 54 5f 44  pOrderBy ? SRT_D
11760 69 73 74 51 75 65 75 65 20 3a 20 53 52 54 5f 44  istQueue : SRT_D
11770 69 73 74 46 69 66 6f 3b 0a 20 20 20 20 69 44 69  istFifo;.    iDi
11780 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d  stinct = pParse-
11790 3e 6e 54 61 62 2b 2b 3b 0a 20 20 7d 65 6c 73 65  >nTab++;.  }else
117a0 7b 0a 20 20 20 20 65 44 65 73 74 20 3d 20 70 4f  {.    eDest = pO
117b0 72 64 65 72 42 79 20 3f 20 53 52 54 5f 51 75 65  rderBy ? SRT_Que
117c0 75 65 20 3a 20 53 52 54 5f 46 69 66 6f 3b 0a 20  ue : SRT_Fifo;. 
117d0 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65   }.  sqlite3Sele
117e0 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
117f0 51 75 65 75 65 2c 20 65 44 65 73 74 2c 20 69 51  Queue, eDest, iQ
11800 75 65 75 65 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  ueue);..  /* All
11810 6f 63 61 74 65 20 63 75 72 73 6f 72 73 20 66 6f  ocate cursors fo
11820 72 20 43 75 72 72 65 6e 74 2c 20 51 75 65 75 65  r Current, Queue
11830 2c 20 61 6e 64 20 44 69 73 74 69 6e 63 74 2e 20  , and Distinct. 
11840 2a 2f 0a 20 20 72 65 67 43 75 72 72 65 6e 74 20  */.  regCurrent 
11850 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
11860 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
11870 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp3(v, OP_Open
11880 50 73 65 75 64 6f 2c 20 69 43 75 72 72 65 6e 74  Pseudo, iCurrent
11890 2c 20 72 65 67 43 75 72 72 65 6e 74 2c 20 6e 43  , regCurrent, nC
118a0 6f 6c 29 3b 0a 20 20 69 66 28 20 70 4f 72 64 65  ol);.  if( pOrde
118b0 72 42 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e  rBy ){.    KeyIn
118c0 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6d  fo *pKeyInfo = m
118d0 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
118e0 79 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c  yKeyInfo(pParse,
118f0 20 70 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69   p, 1);.    sqli
11900 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
11910 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
11920 6c 2c 20 69 51 75 65 75 65 2c 20 70 4f 72 64 65  l, iQueue, pOrde
11930 72 42 79 2d 3e 6e 45 78 70 72 2b 32 2c 20 30 2c  rBy->nExpr+2, 0,
11940 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11950 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
11960 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
11970 46 4f 29 3b 0a 20 20 20 20 64 65 73 74 51 75 65  FO);.    destQue
11980 75 65 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  ue.pOrderBy = pO
11990 72 64 65 72 42 79 3b 0a 20 20 7d 65 6c 73 65 7b  rderBy;.  }else{
119a0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
119b0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
119c0 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69 51 75 65  nEphemeral, iQue
119d0 75 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 20  ue, nCol);.  }. 
119e0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
119f0 20 22 51 75 65 75 65 20 74 61 62 6c 65 22 29 29   "Queue table"))
11a00 3b 0a 20 20 69 66 28 20 69 44 69 73 74 69 6e 63  ;.  if( iDistinc
11a10 74 20 29 7b 0a 20 20 20 20 70 2d 3e 61 64 64 72  t ){.    p->addr
11a20 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 73 71  OpenEphm[0] = sq
11a30 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
11a40 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
11a50 72 61 6c 2c 20 69 44 69 73 74 69 6e 63 74 2c 20  ral, iDistinct, 
11a60 30 29 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c  0);.    p->selFl
11a70 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70  ags |= SF_UsesEp
11a80 68 65 6d 65 72 61 6c 3b 0a 20 20 7d 0a 0a 20 20  hemeral;.  }..  
11a90 2f 2a 20 44 65 74 61 63 68 20 74 68 65 20 4f 52  /* Detach the OR
11aa0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 66 72  DER BY clause fr
11ab0 6f 6d 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  om the compound 
11ac0 53 45 4c 45 43 54 20 2a 2f 0a 20 20 70 2d 3e 70  SELECT */.  p->p
11ad0 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 0a 20 20  OrderBy = 0;..  
11ae0 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73  /* Store the res
11af0 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 74 75  ults of the setu
11b00 70 2d 71 75 65 72 79 20 69 6e 20 51 75 65 75 65  p-query in Queue
11b10 2e 20 2a 2f 0a 20 20 70 53 65 74 75 70 2d 3e 70  . */.  pSetup->p
11b20 4e 65 78 74 20 3d 20 30 3b 0a 20 20 72 63 20 3d  Next = 0;.  rc =
11b30 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
11b40 50 61 72 73 65 2c 20 70 53 65 74 75 70 2c 20 26  Parse, pSetup, &
11b50 64 65 73 74 51 75 65 75 65 29 3b 0a 20 20 70 53  destQueue);.  pS
11b60 65 74 75 70 2d 3e 70 4e 65 78 74 20 3d 20 70 3b  etup->pNext = p;
11b70 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
11b80 20 65 6e 64 5f 6f 66 5f 72 65 63 75 72 73 69 76   end_of_recursiv
11b90 65 5f 71 75 65 72 79 3b 0a 0a 20 20 2f 2a 20 46  e_query;..  /* F
11ba0 69 6e 64 20 74 68 65 20 6e 65 78 74 20 72 6f 77  ind the next row
11bb0 20 69 6e 20 74 68 65 20 51 75 65 75 65 20 61 6e   in the Queue an
11bc0 64 20 6f 75 74 70 75 74 20 74 68 61 74 20 72 6f  d output that ro
11bd0 77 20 2a 2f 0a 20 20 61 64 64 72 54 6f 70 20 3d  w */.  addrTop =
11be0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11bf0 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
11c00 20 69 51 75 65 75 65 2c 20 61 64 64 72 42 72 65   iQueue, addrBre
11c10 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ak); VdbeCoverag
11c20 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 54 72 61 6e  e(v);..  /* Tran
11c30 73 66 65 72 20 74 68 65 20 6e 65 78 74 20 72 6f  sfer the next ro
11c40 77 20 69 6e 20 51 75 65 75 65 20 6f 76 65 72 20  w in Queue over 
11c50 74 6f 20 43 75 72 72 65 6e 74 20 2a 2f 0a 20 20  to Current */.  
11c60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11c70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c  1(v, OP_NullRow,
11c80 20 69 43 75 72 72 65 6e 74 29 3b 20 2f 2a 20 54   iCurrent); /* T
11c90 6f 20 72 65 73 65 74 20 63 6f 6c 75 6d 6e 20 63  o reset column c
11ca0 61 63 68 65 20 2a 2f 0a 20 20 69 66 28 20 70 4f  ache */.  if( pO
11cb0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71  rderBy ){.    sq
11cc0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
11cd0 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 51  v, OP_Column, iQ
11ce0 75 65 75 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e  ueue, pOrderBy->
11cf0 6e 45 78 70 72 2b 31 2c 20 72 65 67 43 75 72 72  nExpr+1, regCurr
11d00 65 6e 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ent);.  }else{. 
11d10 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11d20 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 44 61  dOp2(v, OP_RowDa
11d30 74 61 2c 20 69 51 75 65 75 65 2c 20 72 65 67 43  ta, iQueue, regC
11d40 75 72 72 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 73  urrent);.  }.  s
11d50 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
11d60 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69  (v, OP_Delete, i
11d70 51 75 65 75 65 29 3b 0a 0a 20 20 2f 2a 20 4f 75  Queue);..  /* Ou
11d80 74 70 75 74 20 74 68 65 20 73 69 6e 67 6c 65 20  tput the single 
11d90 72 6f 77 20 69 6e 20 43 75 72 72 65 6e 74 20 2a  row in Current *
11da0 2f 0a 20 20 61 64 64 72 43 6f 6e 74 20 3d 20 73  /.  addrCont = s
11db0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
11dc0 62 65 6c 28 76 29 3b 0a 20 20 63 6f 64 65 4f 66  bel(v);.  codeOf
11dd0 66 73 65 74 28 76 2c 20 72 65 67 4f 66 66 73 65  fset(v, regOffse
11de0 74 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20  t, addrCont);.  
11df0 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
11e00 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45  pParse, p, p->pE
11e10 4c 69 73 74 2c 20 69 43 75 72 72 65 6e 74 2c 0a  List, iCurrent,.
11e20 20 20 20 20 20 20 30 2c 20 30 2c 20 70 44 65 73        0, 0, pDes
11e30 74 2c 20 61 64 64 72 43 6f 6e 74 2c 20 61 64 64  t, addrCont, add
11e40 72 42 72 65 61 6b 29 3b 0a 20 20 69 66 28 20 72  rBreak);.  if( r
11e50 65 67 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73  egLimit ){.    s
11e60 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
11e70 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a  (v, OP_DecrJumpZ
11e80 65 72 6f 2c 20 72 65 67 4c 69 6d 69 74 2c 20 61  ero, regLimit, a
11e90 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 56  ddrBreak);.    V
11ea0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
11eb0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
11ec0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
11ed0 20 61 64 64 72 43 6f 6e 74 29 3b 0a 0a 20 20 2f   addrCont);..  /
11ee0 2a 20 45 78 65 63 75 74 65 20 74 68 65 20 72 65  * Execute the re
11ef0 63 75 72 73 69 76 65 20 53 45 4c 45 43 54 20 74  cursive SELECT t
11f00 61 6b 69 6e 67 20 74 68 65 20 73 69 6e 67 6c 65  aking the single
11f10 20 72 6f 77 20 69 6e 20 43 75 72 72 65 6e 74 20   row in Current 
11f20 61 73 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c 75  as.  ** the valu
11f30 65 20 66 6f 72 20 74 68 65 20 72 65 63 75 72 73  e for the recurs
11f40 69 76 65 2d 74 61 62 6c 65 2e 20 53 74 6f 72 65  ive-table. Store
11f50 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20   the results in 
11f60 74 68 65 20 51 75 65 75 65 2e 0a 20 20 2a 2f 0a  the Queue..  */.
11f70 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
11f80 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65  s & SF_Aggregate
11f90 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
11fa0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
11fb0 22 72 65 63 75 72 73 69 76 65 20 61 67 67 72 65  "recursive aggre
11fc0 67 61 74 65 20 71 75 65 72 69 65 73 20 6e 6f 74  gate queries not
11fd0 20 73 75 70 70 6f 72 74 65 64 22 29 3b 0a 20 20   supported");.  
11fe0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 70 50  }else{.    p->pP
11ff0 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 73 71  rior = 0;.    sq
12000 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
12010 73 65 2c 20 70 2c 20 26 64 65 73 74 51 75 65 75  se, p, &destQueu
12020 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e);.    assert( 
12030 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a  p->pPrior==0 );.
12040 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
12050 70 53 65 74 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f  pSetup;.  }..  /
12060 2a 20 4b 65 65 70 20 72 75 6e 6e 69 6e 67 20 74  * Keep running t
12070 68 65 20 6c 6f 6f 70 20 75 6e 74 69 6c 20 74 68  he loop until th
12080 65 20 51 75 65 75 65 20 69 73 20 65 6d 70 74 79  e Queue is empty
12090 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
120a0 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 54 6f 70  eGoto(v, addrTop
120b0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
120c0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
120d0 61 64 64 72 42 72 65 61 6b 29 3b 0a 0a 65 6e 64  addrBreak);..end
120e0 5f 6f 66 5f 72 65 63 75 72 73 69 76 65 5f 71 75  _of_recursive_qu
120f0 65 72 79 3a 0a 20 20 73 71 6c 69 74 65 33 45 78  ery:.  sqlite3Ex
12100 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61  prListDelete(pPa
12110 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 4f 72 64  rse->db, p->pOrd
12120 65 72 42 79 29 3b 0a 20 20 70 2d 3e 70 4f 72 64  erBy);.  p->pOrd
12130 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
12140 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70  .  p->pLimit = p
12150 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e 70 4f 66 66  Limit;.  p->pOff
12160 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20  set = pOffset;. 
12170 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69   return;.}.#endi
12180 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
12190 5f 43 54 45 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77  _CTE */../* Forw
121a0 61 72 64 20 72 65 66 65 72 65 6e 63 65 73 20 2a  ard references *
121b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c  /.static int mul
121c0 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28  tiSelectOrderBy(
121d0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
121e0 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
121f0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
12200 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
12210 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
12220 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45  ght-most of SELE
12230 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20  CTs to be coded 
12240 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
12250 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68  *pDest     /* Wh
12260 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75  at to do with qu
12270 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29  ery results */.)
12280 3b 0a 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 20  ;../*.** Handle 
12290 74 68 65 20 73 70 65 63 69 61 6c 20 63 61 73 65  the special case
122a0 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73   of a compound-s
122b0 65 6c 65 63 74 20 74 68 61 74 20 6f 72 69 67 69  elect that origi
122c0 6e 61 74 65 73 20 66 72 6f 6d 20 61 0a 2a 2a 20  nates from a.** 
122d0 56 41 4c 55 45 53 20 63 6c 61 75 73 65 2e 20 20  VALUES clause.  
122e0 42 79 20 68 61 6e 64 6c 69 6e 67 20 74 68 69 73  By handling this
122f0 20 61 73 20 61 20 73 70 65 63 69 61 6c 20 63 61   as a special ca
12300 73 65 2c 20 77 65 20 61 76 6f 69 64 20 64 65 65  se, we avoid dee
12310 70 0a 2a 2a 20 72 65 63 75 72 73 69 6f 6e 2c 20  p.** recursion, 
12320 61 6e 64 20 74 68 75 73 20 64 6f 20 6e 6f 74 20  and thus do not 
12330 6e 65 65 64 20 74 6f 20 65 6e 66 6f 72 63 65 20  need to enforce 
12340 74 68 65 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54  the SQLITE_LIMIT
12350 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
12360 0a 2a 2a 20 6f 6e 20 61 20 56 41 4c 55 45 53 20  .** on a VALUES 
12370 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 65  clause..**.** Be
12380 63 61 75 73 65 20 74 68 65 20 53 65 6c 65 63 74  cause the Select
12390 20 6f 62 6a 65 63 74 20 6f 72 69 67 69 6e 61 74   object originat
123a0 65 73 20 66 72 6f 6d 20 61 20 56 41 4c 55 45 53  es from a VALUES
123b0 20 63 6c 61 75 73 65 3a 0a 2a 2a 20 20 20 28 31   clause:.**   (1
123c0 29 20 49 74 20 68 61 73 20 6e 6f 20 4c 49 4d 49  ) It has no LIMI
123d0 54 20 6f 72 20 4f 46 46 53 45 54 0a 2a 2a 20 20  T or OFFSET.**  
123e0 20 28 32 29 20 41 6c 6c 20 74 65 72 6d 73 20 61   (2) All terms a
123f0 72 65 20 55 4e 49 4f 4e 20 41 4c 4c 0a 2a 2a 20  re UNION ALL.** 
12400 20 20 28 33 29 20 54 68 65 72 65 20 69 73 20 6e    (3) There is n
12410 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  o ORDER BY claus
12420 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e.*/.static int 
12430 6d 75 6c 74 69 53 65 6c 65 63 74 56 61 6c 75 65  multiSelectValue
12440 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
12450 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
12460 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
12470 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
12480 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
12490 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45  right-most of SE
124a0 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65  LECTs to be code
124b0 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  d */.  SelectDes
124c0 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20  t *pDest     /* 
124d0 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
124e0 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f  query results */
124f0 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 50  .){.  Select *pP
12500 72 69 6f 72 3b 0a 20 20 69 6e 74 20 6e 52 6f 77  rior;.  int nRow
12510 20 3d 20 31 3b 0a 20 20 69 6e 74 20 72 63 20 3d   = 1;.  int rc =
12520 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   0;.  assert( p-
12530 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4d  >selFlags & SF_M
12540 75 6c 74 69 56 61 6c 75 65 20 29 3b 0a 20 20 64  ultiValue );.  d
12550 6f 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  o{.    assert( p
12560 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
12570 56 61 6c 75 65 73 20 29 3b 0a 20 20 20 20 61 73  Values );.    as
12580 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  sert( p->op==TK_
12590 41 4c 4c 20 7c 7c 20 28 70 2d 3e 6f 70 3d 3d 54  ALL || (p->op==T
125a0 4b 5f 53 45 4c 45 43 54 20 26 26 20 70 2d 3e 70  K_SELECT && p->p
125b0 50 72 69 6f 72 3d 3d 30 29 20 29 3b 0a 20 20 20  Prior==0) );.   
125c0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4c 69 6d   assert( p->pLim
125d0 69 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  it==0 );.    ass
125e0 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d  ert( p->pOffset=
125f0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
12600 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 7c 7c  ( p->pNext==0 ||
12610 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
12620 72 3d 3d 70 2d 3e 70 4e 65 78 74 2d 3e 70 45 4c  r==p->pNext->pEL
12630 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20  ist->nExpr );.  
12640 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 3d    if( p->pPrior=
12650 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
12660 61 73 73 65 72 74 28 20 70 2d 3e 70 50 72 69 6f  assert( p->pPrio
12670 72 2d 3e 70 4e 65 78 74 3d 3d 70 20 29 3b 0a 20  r->pNext==p );. 
12680 20 20 20 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72     p = p->pPrior
12690 3b 0a 20 20 20 20 6e 52 6f 77 2b 2b 3b 0a 20 20  ;.    nRow++;.  
126a0 7d 77 68 69 6c 65 28 31 29 3b 0a 20 20 77 68 69  }while(1);.  whi
126b0 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 70 50 72  le( p ){.    pPr
126c0 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ior = p->pPrior;
126d0 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d  .    p->pPrior =
126e0 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   0;.    rc = sql
126f0 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
12700 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20  e, p, pDest);.  
12710 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
12720 72 69 6f 72 3b 0a 20 20 20 20 69 66 28 20 72 63  rior;.    if( rc
12730 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 2d   ) break;.    p-
12740 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 6e 52  >nSelectRow = nR
12750 6f 77 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70  ow;.    p = p->p
12760 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Next;.  }.  retu
12770 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
12780 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
12790 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65 73  called to proces
127a0 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  s a compound que
127b0 72 79 20 66 6f 72 6d 20 66 72 6f 6d 0a 2a 2a 20  ry form from.** 
127c0 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61  two or more sepa
127d0 72 61 74 65 20 71 75 65 72 69 65 73 20 75 73 69  rate queries usi
127e0 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e 49 4f 4e 20  ng UNION, UNION 
127f0 41 4c 4c 2c 20 45 58 43 45 50 54 2c 20 6f 72 0a  ALL, EXCEPT, or.
12800 2a 2a 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a 0a  ** INTERSECT.**.
12810 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73 20 74 6f  ** "p" points to
12820 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
12830 6f 66 20 74 68 65 20 74 77 6f 20 71 75 65 72 69  of the two queri
12840 65 73 2e 20 20 74 68 65 20 71 75 65 72 79 20 6f  es.  the query o
12850 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69 73  n the.** left is
12860 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68 65   p->pPrior.  The
12870 20 6c 65 66 74 20 71 75 65 72 79 20 63 6f 75 6c   left query coul
12880 64 20 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d 70  d also be a comp
12890 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69 6e  ound query.** in
128a0 20 77 68 69 63 68 20 63 61 73 65 20 74 68 69 73   which case this
128b0 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65   routine will be
128c0 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76   called recursiv
128d0 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ely. .**.** The 
128e0 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 74  results of the t
128f0 6f 74 61 6c 20 71 75 65 72 79 20 61 72 65 20 74  otal query are t
12900 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  o be written int
12910 6f 20 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a  o a destination.
12920 2a 2a 20 6f 66 20 74 79 70 65 20 65 44 65 73 74  ** of type eDest
12930 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72 20   with parameter 
12940 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61  iParm..**.** Exa
12950 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64 65  mple 1:  Conside
12960 72 20 61 20 74 68 72 65 65 2d 77 61 79 20 63 6f  r a three-way co
12970 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74 61 74 65  mpound SQL state
12980 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ment..**.**     
12990 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31  SELECT a FROM t1
129a0 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62 20   UNION SELECT b 
129b0 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45  FROM t2 UNION SE
129c0 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a  LECT c FROM t3.*
129d0 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d  *.** This statem
129e0 65 6e 74 20 69 73 20 70 61 72 73 65 64 20 75 70  ent is parsed up
129f0 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
12a00 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63 20  **     SELECT c 
12a10 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20 20  FROM t3.**      
12a20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d 2d  |.**      `-----
12a30 3e 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d  >  SELECT b FROM
12a40 20 74 32 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   t2.**          
12a50 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
12a60 20 20 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d 2d            `-----
12a70 2d 3e 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f  ->  SELECT a FRO
12a80 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  M t1.**.** The a
12a90 72 72 6f 77 73 20 69 6e 20 74 68 65 20 64 69 61  rrows in the dia
12aa0 67 72 61 6d 20 61 62 6f 76 65 20 72 65 70 72 65  gram above repre
12ab0 73 65 6e 74 20 74 68 65 20 53 65 6c 65 63 74 2e  sent the Select.
12ac0 70 50 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e 0a  pPrior pointer..
12ad0 2a 2a 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f  ** So if this ro
12ae0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
12af0 77 69 74 68 20 70 20 65 71 75 61 6c 20 74 6f 20  with p equal to 
12b00 74 68 65 20 74 33 20 71 75 65 72 79 2c 20 74 68  the t3 query, th
12b10 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69 6c  en.** pPrior wil
12b20 6c 20 62 65 20 74 68 65 20 74 32 20 71 75 65 72  l be the t2 quer
12b30 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20 62  y.  p->op will b
12b40 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74 68  e TK_UNION in th
12b50 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e  is case..**.** N
12b60 6f 74 69 63 65 20 74 68 61 74 20 62 65 63 61 75  otice that becau
12b70 73 65 20 6f 66 20 74 68 65 20 77 61 79 20 53 51  se of the way SQ
12b80 4c 69 74 65 20 70 61 72 73 65 73 20 63 6f 6d 70  Lite parses comp
12b90 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c 20 74 68  ound SELECTs, th
12ba0 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20  e.** individual 
12bb0 73 65 6c 65 63 74 73 20 61 6c 77 61 79 73 20 67  selects always g
12bc0 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74 20 74  roup from left t
12bd0 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74  o right..*/.stat
12be0 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65  ic int multiSele
12bf0 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ct(.  Parse *pPa
12c00 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
12c10 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
12c20 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
12c30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
12c40 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53   right-most of S
12c50 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64  ELECTs to be cod
12c60 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ed */.  SelectDe
12c70 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a  st *pDest     /*
12c80 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
12c90 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
12ca0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
12cb0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20  SQLITE_OK;   /* 
12cc0 53 75 63 63 65 73 73 20 63 6f 64 65 20 66 72 6f  Success code fro
12cd0 6d 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  m a subroutine *
12ce0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69  /.  Select *pPri
12cf0 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f  or;       /* Ano
12d00 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65  ther SELECT imme
12d10 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c  diately to our l
12d20 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  eft */.  Vdbe *v
12d30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
12d40 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
12d50 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a  to this VDBE */.
12d60 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
12d70 74 3b 20 20 20 20 20 20 2f 2a 20 41 6c 74 65 72  t;      /* Alter
12d80 6e 61 74 69 76 65 20 64 61 74 61 20 64 65 73 74  native data dest
12d90 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c  ination */.  Sel
12da0 65 63 74 20 2a 70 44 65 6c 65 74 65 20 3d 20 30  ect *pDelete = 0
12db0 3b 20 20 2f 2a 20 43 68 61 69 6e 20 6f 66 20 73  ;  /* Chain of s
12dc0 69 6d 70 6c 65 20 73 65 6c 65 63 74 73 20 74 6f  imple selects to
12dd0 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 73 71 6c   delete */.  sql
12de0 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
12df0 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
12e00 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 23 69 66  onnection */.#if
12e10 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
12e20 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69  _EXPLAIN.  int i
12e30 53 75 62 31 20 3d 20 30 3b 20 20 20 20 20 20 20  Sub1 = 0;       
12e40 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 6c 65   /* EQP id of le
12e50 66 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f  ft-hand query */
12e60 0a 20 20 69 6e 74 20 69 53 75 62 32 20 3d 20 30  .  int iSub2 = 0
12e70 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20  ;        /* EQP 
12e80 69 64 20 6f 66 20 72 69 67 68 74 2d 68 61 6e 64  id of right-hand
12e90 20 71 75 65 72 79 20 2a 2f 0a 23 65 6e 64 69 66   query */.#endif
12ea0 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
12eb0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44   there is no ORD
12ec0 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 20 63  ER BY or LIMIT c
12ed0 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f 72 20 53  lause on prior S
12ee0 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 0a 20 20  ELECTs.  Only.  
12ef0 2a 2a 20 74 68 65 20 6c 61 73 74 20 28 72 69 67  ** the last (rig
12f00 68 74 2d 6d 6f 73 74 29 20 53 45 4c 45 43 54 20  ht-most) SELECT 
12f10 69 6e 20 74 68 65 20 73 65 72 69 65 73 20 6d 61  in the series ma
12f20 79 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20  y have an ORDER 
12f30 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a  BY or LIMIT..  *
12f40 2f 0a 20 20 61 73 73 65 72 74 28 20 70 20 26 26  /.  assert( p &&
12f50 20 70 2d 3e 70 50 72 69 6f 72 20 29 3b 20 20 2f   p->pPrior );  /
12f60 2a 20 43 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  * Calling functi
12f70 6f 6e 20 67 75 61 72 61 6e 74 65 65 73 20 74 68  on guarantees th
12f80 69 73 20 6d 75 63 68 20 2a 2f 0a 20 20 61 73 73  is much */.  ass
12f90 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ert( (p->selFlag
12fa0 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65  s & SF_Recursive
12fb0 29 3d 3d 30 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54  )==0 || p->op==T
12fc0 4b 5f 41 4c 4c 20 7c 7c 20 70 2d 3e 6f 70 3d 3d  K_ALL || p->op==
12fd0 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 64 62  TK_UNION );.  db
12fe0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
12ff0 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72   pPrior = p->pPr
13000 69 6f 72 3b 0a 20 20 64 65 73 74 20 3d 20 2a 70  ior;.  dest = *p
13010 44 65 73 74 3b 0a 20 20 69 66 28 20 70 50 72 69  Dest;.  if( pPri
13020 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  or->pOrderBy ){.
13030 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
13040 4d 73 67 28 70 50 61 72 73 65 2c 22 4f 52 44 45  Msg(pParse,"ORDE
13050 52 20 42 59 20 63 6c 61 75 73 65 20 73 68 6f 75  R BY clause shou
13060 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73  ld come after %s
13070 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20   not before",.  
13080 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65      selectOpName
13090 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63  (p->op));.    rc
130a0 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d   = 1;.    goto m
130b0 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
130c0 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72 69 6f  .  }.  if( pPrio
130d0 72 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  r->pLimit ){.   
130e0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
130f0 28 70 50 61 72 73 65 2c 22 4c 49 4d 49 54 20 63  (pParse,"LIMIT c
13100 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d  lause should com
13110 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62  e after %s not b
13120 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 73 65  efore",.      se
13130 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70  lectOpName(p->op
13140 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a  ));.    rc = 1;.
13150 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
13160 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a  elect_end;.  }..
13170 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
13180 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
13190 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20  assert( v!=0 ); 
131a0 20 2f 2a 20 54 68 65 20 56 44 42 45 20 61 6c 72   /* The VDBE alr
131b0 65 61 64 79 20 63 72 65 61 74 65 64 20 62 79 20  eady created by 
131c0 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
131d0 20 2a 2f 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65   */..  /* Create
131e0 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e   the destination
131f0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
13200 20 69 66 20 6e 65 63 65 73 73 61 72 79 0a 20 20   if necessary.  
13210 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 2e 65 44  */.  if( dest.eD
13220 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61  est==SRT_EphemTa
13230 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  b ){.    assert(
13240 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
13250 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13260 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
13270 68 65 6d 65 72 61 6c 2c 20 64 65 73 74 2e 69 53  hemeral, dest.iS
13280 44 50 61 72 6d 2c 20 70 2d 3e 70 45 4c 69 73 74  DParm, p->pEList
13290 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 64 65  ->nExpr);.    de
132a0 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 54  st.eDest = SRT_T
132b0 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  able;.  }..  /* 
132c0 53 70 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67  Special handling
132d0 20 66 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64 2d   for a compound-
132e0 73 65 6c 65 63 74 20 74 68 61 74 20 6f 72 69 67  select that orig
132f0 69 6e 61 74 65 73 20 61 73 20 61 20 56 41 4c 55  inates as a VALU
13300 45 53 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a  ES clause..  */.
13310 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
13320 73 20 26 20 53 46 5f 4d 75 6c 74 69 56 61 6c 75  s & SF_MultiValu
13330 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d 75  e ){.    rc = mu
13340 6c 74 69 53 65 6c 65 63 74 56 61 6c 75 65 73 28  ltiSelectValues(
13350 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74  pParse, p, &dest
13360 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  );.    goto mult
13370 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
13380 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
13390 65 20 61 6c 6c 20 53 45 4c 45 43 54 73 20 69 6e  e all SELECTs in
133a0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 68   the statement h
133b0 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  ave the same num
133c0 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 0a  ber of elements.
133d0 20 20 2a 2a 20 69 6e 20 74 68 65 69 72 20 72 65    ** in their re
133e0 73 75 6c 74 20 73 65 74 73 2e 0a 20 20 2a 2f 0a  sult sets..  */.
133f0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
13400 69 73 74 20 26 26 20 70 50 72 69 6f 72 2d 3e 70  ist && pPrior->p
13410 45 4c 69 73 74 20 29 3b 0a 20 20 61 73 73 65 72  EList );.  asser
13420 74 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  t( p->pEList->nE
13430 78 70 72 3d 3d 70 50 72 69 6f 72 2d 3e 70 45 4c  xpr==pPrior->pEL
13440 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 0a 23  ist->nExpr );..#
13450 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13460 49 54 5f 43 54 45 0a 20 20 69 66 28 20 70 2d 3e  IT_CTE.  if( p->
13470 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65  selFlags & SF_Re
13480 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 67  cursive ){.    g
13490 65 6e 65 72 61 74 65 57 69 74 68 52 65 63 75 72  enerateWithRecur
134a0 73 69 76 65 51 75 65 72 79 28 70 50 61 72 73 65  siveQuery(pParse
134b0 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 7d  , p, &dest);.  }
134c0 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  else.#endif..  /
134d0 2a 20 43 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  * Compound SELEC
134e0 54 73 20 74 68 61 74 20 68 61 76 65 20 61 6e 20  Ts that have an 
134f0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
13500 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65 70 61  are handled sepa
13510 72 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69  rately..  */.  i
13520 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29  f( p->pOrderBy )
13530 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c  {.    return mul
13540 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28  tiSelectOrderBy(
13550 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74  pParse, p, pDest
13560 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a  );.  }else..  /*
13570 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
13580 6f 72 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20  or the left and 
13590 72 69 67 68 74 20 53 45 4c 45 43 54 20 73 74 61  right SELECT sta
135a0 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20  tements..  */.  
135b0 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b  switch( p->op ){
135c0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c  .    case TK_ALL
135d0 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  : {.      int ad
135e0 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  dr = 0;.      in
135f0 74 20 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  t nLimit;.      
13600 61 73 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d  assert( !pPrior-
13610 3e 70 4c 69 6d 69 74 20 29 3b 0a 20 20 20 20 20  >pLimit );.     
13620 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20   pPrior->iLimit 
13630 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20  = p->iLimit;.   
13640 20 20 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73     pPrior->iOffs
13650 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b  et = p->iOffset;
13660 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70  .      pPrior->p
13670 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69  Limit = p->pLimi
13680 74 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d  t;.      pPrior-
13690 3e 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f  >pOffset = p->pO
136a0 66 66 73 65 74 3b 0a 20 20 20 20 20 20 65 78 70  ffset;.      exp
136b0 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69  lainSetInteger(i
136c0 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e  Sub1, pParse->iN
136d0 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
136e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
136f0 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
13700 50 72 69 6f 72 2c 20 26 64 65 73 74 29 3b 0a 20  Prior, &dest);. 
13710 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d       p->pLimit =
13720 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66   0;.      p->pOf
13730 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fset = 0;.      
13740 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
13750 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
13760 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
13770 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
13780 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69   = 0;.      p->i
13790 4c 69 6d 69 74 20 3d 20 70 50 72 69 6f 72 2d 3e  Limit = pPrior->
137a0 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d  iLimit;.      p-
137b0 3e 69 4f 66 66 73 65 74 20 3d 20 70 50 72 69 6f  >iOffset = pPrio
137c0 72 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20  r->iOffset;.    
137d0 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20    if( p->iLimit 
137e0 29 7b 0a 20 20 20 20 20 20 20 20 61 64 64 72 20  ){.        addr 
137f0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
13800 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c  Op1(v, OP_IfNot,
13810 20 70 2d 3e 69 4c 69 6d 69 74 29 3b 20 56 64 62   p->iLimit); Vdb
13820 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
13830 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
13840 74 28 28 76 2c 20 22 4a 75 6d 70 20 61 68 65 61  t((v, "Jump ahea
13850 64 20 69 66 20 4c 49 4d 49 54 20 72 65 61 63 68  d if LIMIT reach
13860 65 64 22 29 29 3b 0a 20 20 20 20 20 20 20 20 69  ed"));.        i
13870 66 28 20 70 2d 3e 69 4f 66 66 73 65 74 20 29 7b  f( p->iOffset ){
13880 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
13890 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
138a0 4f 50 5f 4f 66 66 73 65 74 4c 69 6d 69 74 2c 0a  OP_OffsetLimit,.
138b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
138c0 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69              p->i
138d0 4c 69 6d 69 74 2c 20 70 2d 3e 69 4f 66 66 73 65  Limit, p->iOffse
138e0 74 2b 31 2c 20 70 2d 3e 69 4f 66 66 73 65 74 29  t+1, p->iOffset)
138f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
13900 20 20 7d 0a 20 20 20 20 20 20 65 78 70 6c 61 69    }.      explai
13910 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62  nSetInteger(iSub
13920 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74  2, pParse->iNext
13930 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20  SelectId);.     
13940 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
13950 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26  ect(pParse, p, &
13960 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73  dest);.      tes
13970 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
13980 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70 44  E_OK );.      pD
13990 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f  elete = p->pPrio
139a0 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  r;.      p->pPri
139b0 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
139c0 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77     p->nSelectRow
139d0 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
139e0 41 64 64 28 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  Add(p->nSelectRo
139f0 77 2c 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65  w, pPrior->nSele
13a00 63 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 69 66  ctRow);.      if
13a10 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74  ( pPrior->pLimit
13a20 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74  .       && sqlit
13a30 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
13a40 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 2c 20  pPrior->pLimit, 
13a50 26 6e 4c 69 6d 69 74 29 0a 20 20 20 20 20 20 20  &nLimit).       
13a60 26 26 20 6e 4c 69 6d 69 74 3e 30 20 26 26 20 70  && nLimit>0 && p
13a70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20 73  ->nSelectRow > s
13a80 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 28 75 36  qlite3LogEst((u6
13a90 34 29 6e 4c 69 6d 69 74 29 20 0a 20 20 20 20 20  4)nLimit) .     
13aa0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e   ){.        p->n
13ab0 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69  SelectRow = sqli
13ac0 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e  te3LogEst((u64)n
13ad0 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a  Limit);.      }.
13ae0 20 20 20 20 20 20 69 66 28 20 61 64 64 72 20 29        if( addr )
13af0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
13b00 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
13b10 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20 7d 0a   addr);.      }.
13b20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
13b30 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45   }.    case TK_E
13b40 58 43 45 50 54 3a 0a 20 20 20 20 63 61 73 65 20  XCEPT:.    case 
13b50 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20  TK_UNION: {.    
13b60 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20    int unionTab; 
13b70 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d     /* Cursor num
13b80 62 65 72 20 6f 66 20 74 68 65 20 74 65 6d 70 6f  ber of the tempo
13b90 72 61 72 79 20 74 61 62 6c 65 20 68 6f 6c 64 69  rary table holdi
13ba0 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20  ng result */.   
13bb0 20 20 20 75 38 20 6f 70 20 3d 20 30 3b 20 20 20     u8 op = 0;   
13bc0 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
13bd0 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e  e SRT_ operation
13be0 73 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 73 65  s to apply to se
13bf0 6c 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  lf */.      int 
13c00 70 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20  priorOp;     /* 
13c10 54 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69  The SRT_ operati
13c20 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70  on to apply to p
13c30 72 69 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a  rior selects */.
13c40 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d        Expr *pLim
13c50 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 20 2f 2a  it, *pOffset; /*
13c60 20 53 61 76 65 64 20 76 61 6c 75 65 73 20 6f 66   Saved values of
13c70 20 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64 20 70   p->nLimit and p
13c80 2d 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a 20 20 20  ->nOffset */.   
13c90 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
13ca0 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 75 6e     SelectDest un
13cb0 69 6f 6e 64 65 73 74 3b 0a 0a 20 20 20 20 20 20  iondest;..      
13cc0 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d  testcase( p->op=
13cd0 3d 54 4b 5f 45 58 43 45 50 54 20 29 3b 0a 20 20  =TK_EXCEPT );.  
13ce0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d      testcase( p-
13cf0 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b  >op==TK_UNION );
13d00 0a 20 20 20 20 20 20 70 72 69 6f 72 4f 70 20 3d  .      priorOp =
13d10 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20   SRT_Union;.    
13d20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74    if( dest.eDest
13d30 3d 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20  ==priorOp ){.   
13d40 20 20 20 20 20 2f 2a 20 57 65 20 63 61 6e 20 72       /* We can r
13d50 65 75 73 65 20 61 20 74 65 6d 70 6f 72 61 72 79  euse a temporary
13d60 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64   table generated
13d70 20 62 79 20 61 20 53 45 4c 45 43 54 20 74 6f 20   by a SELECT to 
13d80 6f 75 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  our.        ** r
13d90 69 67 68 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ight..        */
13da0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
13db0 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30 20 29 3b   p->pLimit==0 );
13dc0 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c        /* Not all
13dd0 6f 77 65 64 20 6f 6e 20 6c 65 66 74 77 61 72 64  owed on leftward
13de0 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20   elements */.   
13df0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
13e00 70 4f 66 66 73 65 74 3d 3d 30 20 29 3b 20 20 20  pOffset==0 );   
13e10 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64    /* Not allowed
13e20 20 6f 6e 20 6c 65 66 74 77 61 72 64 20 65 6c 65   on leftward ele
13e30 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20  ments */.       
13e40 20 75 6e 69 6f 6e 54 61 62 20 3d 20 64 65 73 74   unionTab = dest
13e50 2e 69 53 44 50 61 72 6d 3b 0a 20 20 20 20 20 20  .iSDParm;.      
13e60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
13e70 2a 20 57 65 20 77 69 6c 6c 20 6e 65 65 64 20 74  * We will need t
13e80 6f 20 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e  o create our own
13e90 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
13ea0 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20 20   to hold the.   
13eb0 20 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64       ** intermed
13ec0 69 61 74 65 20 72 65 73 75 6c 74 73 2e 0a 20 20  iate results..  
13ed0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
13ee0 20 75 6e 69 6f 6e 54 61 62 20 3d 20 70 50 61 72   unionTab = pPar
13ef0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
13f00 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
13f10 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20  OrderBy==0 );.  
13f20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
13f30 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
13f40 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
13f50 61 6c 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29  al, unionTab, 0)
13f60 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
13f70 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  ( p->addrOpenEph
13f80 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20  m[0] == -1 );.  
13f90 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65        p->addrOpe
13fa0 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b  nEphm[0] = addr;
13fb0 0a 20 20 20 20 20 20 20 20 66 69 6e 64 52 69 67  .        findRig
13fc0 68 74 6d 6f 73 74 28 70 29 2d 3e 73 65 6c 46 6c  htmost(p)->selFl
13fd0 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70  ags |= SF_UsesEp
13fe0 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20 20  hemeral;.       
13ff0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
14000 73 74 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  st );.      }.. 
14010 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
14020 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
14030 74 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 0a 20  ts to our left. 
14040 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
14050 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70  sert( !pPrior->p
14060 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 20 20 20  OrderBy );.     
14070 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
14080 73 74 49 6e 69 74 28 26 75 6e 69 6f 6e 64 65 73  stInit(&uniondes
14090 74 2c 20 70 72 69 6f 72 4f 70 2c 20 75 6e 69 6f  t, priorOp, unio
140a0 6e 54 61 62 29 3b 0a 20 20 20 20 20 20 65 78 70  nTab);.      exp
140b0 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69  lainSetInteger(i
140c0 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e  Sub1, pParse->iN
140d0 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
140e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
140f0 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
14100 50 72 69 6f 72 2c 20 26 75 6e 69 6f 6e 64 65 73  Prior, &uniondes
14110 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
14120 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
14130 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
14140 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  d;.      }..    
14150 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75    /* Code the cu
14160 72 72 65 6e 74 20 53 45 4c 45 43 54 20 73 74 61  rrent SELECT sta
14170 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2f 0a  tement.      */.
14180 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d        if( p->op=
14190 3d 54 4b 5f 45 58 43 45 50 54 20 29 7b 0a 20 20  =TK_EXCEPT ){.  
141a0 20 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 45        op = SRT_E
141b0 78 63 65 70 74 3b 0a 20 20 20 20 20 20 7d 65 6c  xcept;.      }el
141c0 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
141d0 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e  rt( p->op==TK_UN
141e0 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 6f  ION );.        o
141f0 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20  p = SRT_Union;. 
14200 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e       }.      p->
14210 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
14220 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c    pLimit = p->pL
14230 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70  imit;.      p->p
14240 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
14250 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f   pOffset = p->pO
14260 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e  ffset;.      p->
14270 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20  pOffset = 0;.   
14280 20 20 20 75 6e 69 6f 6e 64 65 73 74 2e 65 44 65     uniondest.eDe
14290 73 74 20 3d 20 6f 70 3b 0a 20 20 20 20 20 20 65  st = op;.      e
142a0 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
142b0 28 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e  (iSub2, pParse->
142c0 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
142d0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
142e0 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
142f0 20 70 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b   p, &uniondest);
14300 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
14310 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
14320 3b 0a 20 20 20 20 20 20 2f 2a 20 51 75 65 72 79  ;.      /* Query
14330 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 6e 20 73   flattening in s
14340 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20 6d  qlite3Select() m
14350 69 67 68 74 20 72 65 66 69 6c 6c 20 70 2d 3e 70  ight refill p->p
14360 4f 72 64 65 72 42 79 2e 0a 20 20 20 20 20 20 2a  OrderBy..      *
14370 2a 20 42 65 20 73 75 72 65 20 74 6f 20 64 65 6c  * Be sure to del
14380 65 74 65 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c  ete p->pOrderBy,
14390 20 74 68 65 72 65 66 6f 72 65 2c 20 74 6f 20 61   therefore, to a
143a0 76 6f 69 64 20 61 20 6d 65 6d 6f 72 79 20 6c 65  void a memory le
143b0 61 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ak. */.      sql
143c0 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
143d0 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72  te(db, p->pOrder
143e0 42 79 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65  By);.      pDele
143f0 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a  te = p->pPrior;.
14400 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
14410 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  = pPrior;.      
14420 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  p->pOrderBy = 0;
14430 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70  .      if( p->op
14440 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20  ==TK_UNION ){.  
14450 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74        p->nSelect
14460 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Row = sqlite3Log
14470 45 73 74 41 64 64 28 70 2d 3e 6e 53 65 6c 65 63  EstAdd(p->nSelec
14480 74 52 6f 77 2c 20 70 50 72 69 6f 72 2d 3e 6e 53  tRow, pPrior->nS
14490 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20 20 20 20  electRow);.     
144a0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
144b0 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
144c0 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  ->pLimit);.     
144d0 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69   p->pLimit = pLi
144e0 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f  mit;.      p->pO
144f0 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b  ffset = pOffset;
14500 0a 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74  .      p->iLimit
14510 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69   = 0;.      p->i
14520 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20 20  Offset = 0;..   
14530 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68     /* Convert th
14540 65 20 64 61 74 61 20 69 6e 20 74 68 65 20 74 65  e data in the te
14550 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 6e  mporary table in
14560 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d  to whatever form
14570 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20  .      ** it is 
14580 74 68 61 74 20 77 65 20 63 75 72 72 65 6e 74 6c  that we currentl
14590 79 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f  y need..      */
145a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 75  .      assert( u
145b0 6e 69 6f 6e 54 61 62 3d 3d 64 65 73 74 2e 69 53  nionTab==dest.iS
145c0 44 50 61 72 6d 20 7c 7c 20 64 65 73 74 2e 65 44  DParm || dest.eD
145d0 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 29 3b 0a  est!=priorOp );.
145e0 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65        if( dest.e
145f0 44 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 29 7b  Dest!=priorOp ){
14600 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f  .        int iCo
14610 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61  nt, iBreak, iSta
14620 72 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  rt;.        asse
14630 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
14640 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 65 73  .        if( des
14650 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  t.eDest==SRT_Out
14660 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  put ){.         
14670 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20   Select *pFirst 
14680 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20 77  = p;.          w
14690 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50  hile( pFirst->pP
146a0 72 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20  rior ) pFirst = 
146b0 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a  pFirst->pPrior;.
146c0 20 20 20 20 20 20 20 20 20 20 67 65 6e 65 72 61            genera
146d0 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  teColumnNames(pP
146e0 61 72 73 65 2c 20 70 46 69 72 73 74 2d 3e 70 53  arse, pFirst->pS
146f0 72 63 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69  rc, pFirst->pELi
14700 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  st);.        }. 
14710 20 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20         iBreak = 
14720 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
14730 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
14740 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33   iCont = sqlite3
14750 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
14760 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74  ;.        comput
14770 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
14780 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61  pParse, p, iBrea
14790 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  k);.        sqli
147a0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
147b0 20 4f 50 5f 52 65 77 69 6e 64 2c 20 75 6e 69 6f   OP_Rewind, unio
147c0 6e 54 61 62 2c 20 69 42 72 65 61 6b 29 3b 20 56  nTab, iBreak); V
147d0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
147e0 20 20 20 20 20 20 20 20 69 53 74 61 72 74 20 3d          iStart =
147f0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
14800 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
14810 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c      selectInnerL
14820 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  oop(pParse, p, p
14830 2d 3e 70 45 4c 69 73 74 2c 20 75 6e 69 6f 6e 54  ->pEList, unionT
14840 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ab,.            
14850 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30              0, 0
14860 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20  , &dest, iCont, 
14870 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20  iBreak);.       
14880 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
14890 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e  lveLabel(v, iCon
148a0 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
148b0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
148c0 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e 54   OP_Next, unionT
148d0 61 62 2c 20 69 53 74 61 72 74 29 3b 20 56 64 62  ab, iStart); Vdb
148e0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
148f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
14900 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
14910 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
14920 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14930 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op2(v, OP_Close,
14940 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20   unionTab, 0);. 
14950 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
14960 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
14970 66 61 75 6c 74 3a 20 61 73 73 65 72 74 28 20 70  fault: assert( p
14980 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45  ->op==TK_INTERSE
14990 43 54 20 29 3b 20 7b 0a 20 20 20 20 20 20 69 6e  CT ); {.      in
149a0 74 20 74 61 62 31 2c 20 74 61 62 32 3b 0a 20 20  t tab1, tab2;.  
149b0 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69      int iCont, i
149c0 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20  Break, iStart;. 
149d0 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69       Expr *pLimi
149e0 74 2c 20 2a 70 4f 66 66 73 65 74 3b 0a 20 20 20  t, *pOffset;.   
149f0 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
14a00 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 69 6e     SelectDest in
14a10 74 65 72 73 65 63 74 64 65 73 74 3b 0a 20 20 20  tersectdest;.   
14a20 20 20 20 69 6e 74 20 72 31 3b 0a 0a 20 20 20 20     int r1;..    
14a30 20 20 2f 2a 20 49 4e 54 45 52 53 45 43 54 20 69    /* INTERSECT i
14a40 73 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  s different from
14a50 20 74 68 65 20 6f 74 68 65 72 73 20 73 69 6e 63   the others sinc
14a60 65 20 69 74 20 72 65 71 75 69 72 65 73 0a 20 20  e it requires.  
14a70 20 20 20 20 2a 2a 20 74 77 6f 20 74 65 6d 70 6f      ** two tempo
14a80 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20 48 65  rary tables.  He
14a90 6e 63 65 20 69 74 20 68 61 73 20 69 74 73 20 6f  nce it has its o
14aa0 77 6e 20 63 61 73 65 2e 20 20 42 65 67 69 6e 0a  wn case.  Begin.
14ab0 20 20 20 20 20 20 2a 2a 20 62 79 20 61 6c 6c 6f        ** by allo
14ac0 63 61 74 69 6e 67 20 74 68 65 20 74 61 62 6c 65  cating the table
14ad0 73 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 2e 0a  s we will need..
14ae0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74        */.      t
14af0 61 62 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  ab1 = pParse->nT
14b00 61 62 2b 2b 3b 0a 20 20 20 20 20 20 74 61 62 32  ab++;.      tab2
14b10 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
14b20 2b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  +;.      assert(
14b30 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20   p->pOrderBy==0 
14b40 29 3b 0a 0a 20 20 20 20 20 20 61 64 64 72 20 3d  );..      addr =
14b50 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14b60 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
14b70 65 6d 65 72 61 6c 2c 20 74 61 62 31 2c 20 30 29  emeral, tab1, 0)
14b80 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
14b90 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
14ba0 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20  0] == -1 );.    
14bb0 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68    p->addrOpenEph
14bc0 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20  m[0] = addr;.   
14bd0 20 20 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74     findRightmost
14be0 28 70 29 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d  (p)->selFlags |=
14bf0 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61   SF_UsesEphemera
14c00 6c 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  l;.      assert(
14c10 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 0a 20   p->pEList );.. 
14c20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
14c30 20 53 45 4c 45 43 54 73 20 74 6f 20 6f 75 72 20   SELECTs to our 
14c40 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d 70 6f 72  left into tempor
14c50 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 31 22  ary table "tab1"
14c60 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
14c70 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
14c80 73 74 49 6e 69 74 28 26 69 6e 74 65 72 73 65 63  stInit(&intersec
14c90 74 64 65 73 74 2c 20 53 52 54 5f 55 6e 69 6f 6e  tdest, SRT_Union
14ca0 2c 20 74 61 62 31 29 3b 0a 20 20 20 20 20 20 65  , tab1);.      e
14cb0 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
14cc0 28 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e  (iSub1, pParse->
14cd0 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
14ce0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
14cf0 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
14d00 20 70 50 72 69 6f 72 2c 20 26 69 6e 74 65 72 73   pPrior, &inters
14d10 65 63 74 64 65 73 74 29 3b 0a 20 20 20 20 20 20  ectdest);.      
14d20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
14d30 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
14d40 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
14d50 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
14d60 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45  the current SELE
14d70 43 54 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72  CT into temporar
14d80 79 20 74 61 62 6c 65 20 22 74 61 62 32 22 0a 20  y table "tab2". 
14d90 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64       */.      ad
14da0 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
14db0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
14dc0 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 32  nEphemeral, tab2
14dd0 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65  , 0);.      asse
14de0 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45  rt( p->addrOpenE
14df0 70 68 6d 5b 31 5d 20 3d 3d 20 2d 31 20 29 3b 0a  phm[1] == -1 );.
14e00 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65        p->addrOpe
14e10 6e 45 70 68 6d 5b 31 5d 20 3d 20 61 64 64 72 3b  nEphm[1] = addr;
14e20 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
14e30 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d   = 0;.      pLim
14e40 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a  it = p->pLimit;.
14e50 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20        p->pLimit 
14e60 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 66 66 73  = 0;.      pOffs
14e70 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b  et = p->pOffset;
14e80 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65  .      p->pOffse
14e90 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  t = 0;.      int
14ea0 65 72 73 65 63 74 64 65 73 74 2e 69 53 44 50 61  ersectdest.iSDPa
14eb0 72 6d 20 3d 20 74 61 62 32 3b 0a 20 20 20 20 20  rm = tab2;.     
14ec0 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
14ed0 65 72 28 69 53 75 62 32 2c 20 70 50 61 72 73 65  er(iSub2, pParse
14ee0 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29  ->iNextSelectId)
14ef0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
14f00 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
14f10 65 2c 20 70 2c 20 26 69 6e 74 65 72 73 65 63 74  e, p, &intersect
14f20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73  dest);.      tes
14f30 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
14f40 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70 44  E_OK );.      pD
14f50 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f  elete = p->pPrio
14f60 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  r;.      p->pPri
14f70 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
14f80 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63     if( p->nSelec
14f90 74 52 6f 77 3e 70 50 72 69 6f 72 2d 3e 6e 53 65  tRow>pPrior->nSe
14fa0 6c 65 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53 65  lectRow ) p->nSe
14fb0 6c 65 63 74 52 6f 77 20 3d 20 70 50 72 69 6f 72  lectRow = pPrior
14fc0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20  ->nSelectRow;.  
14fd0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
14fe0 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69  elete(db, p->pLi
14ff0 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  mit);.      p->p
15000 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a  Limit = pLimit;.
15010 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74        p->pOffset
15020 20 3d 20 70 4f 66 66 73 65 74 3b 0a 0a 20 20 20   = pOffset;..   
15030 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
15040 6f 64 65 20 74 6f 20 74 61 6b 65 20 74 68 65 20  ode to take the 
15050 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20  intersection of 
15060 74 68 65 20 74 77 6f 20 74 65 6d 70 6f 72 61 72  the two temporar
15070 79 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65  y.      ** table
15080 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  s..      */.    
15090 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
150a0 69 73 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ist );.      if(
150b0 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54   dest.eDest==SRT
150c0 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20  _Output ){.     
150d0 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73     Select *pFirs
150e0 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 77  t = p;.        w
150f0 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50  hile( pFirst->pP
15100 72 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20  rior ) pFirst = 
15110 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a  pFirst->pPrior;.
15120 20 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65          generate
15130 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
15140 73 65 2c 20 70 46 69 72 73 74 2d 3e 70 53 72 63  se, pFirst->pSrc
15150 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74  , pFirst->pEList
15160 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
15170 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65   iBreak = sqlite
15180 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
15190 29 3b 0a 20 20 20 20 20 20 69 43 6f 6e 74 20 3d  );.      iCont =
151a0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
151b0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
151c0 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
151d0 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c  sters(pParse, p,
151e0 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
151f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15200 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
15210 74 61 62 31 2c 20 69 42 72 65 61 6b 29 3b 20 56  tab1, iBreak); V
15220 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
15230 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
15240 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
15250 72 73 65 29 3b 0a 20 20 20 20 20 20 69 53 74 61  rse);.      iSta
15260 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rt = sqlite3Vdbe
15270 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77  AddOp2(v, OP_Row
15280 4b 65 79 2c 20 74 61 62 31 2c 20 72 31 29 3b 0a  Key, tab1, r1);.
15290 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
152a0 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
152b0 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 62 32 2c  _NotFound, tab2,
152c0 20 69 43 6f 6e 74 2c 20 72 31 2c 20 30 29 3b 20   iCont, r1, 0); 
152d0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
152e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
152f0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
15300 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
15310 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
15320 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45  pParse, p, p->pE
15330 4c 69 73 74 2c 20 74 61 62 31 2c 0a 20 20 20 20  List, tab1,.    
15340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15350 20 20 30 2c 20 30 2c 20 26 64 65 73 74 2c 20 69    0, 0, &dest, i
15360 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20  Cont, iBreak);. 
15370 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15380 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
15390 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73 71  iCont);.      sq
153a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
153b0 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 74 61 62 31  v, OP_Next, tab1
153c0 2c 20 69 53 74 61 72 74 29 3b 20 56 64 62 65 43  , iStart); VdbeC
153d0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
153e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
153f0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72  olveLabel(v, iBr
15400 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eak);.      sqli
15410 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
15420 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32 2c   OP_Close, tab2,
15430 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
15440 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
15450 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31 2c 20  OP_Close, tab1, 
15460 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
15470 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 65 78  .    }.  }..  ex
15480 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 70  plainComposite(p
15490 50 61 72 73 65 2c 20 70 2d 3e 6f 70 2c 20 69 53  Parse, p->op, iS
154a0 75 62 31 2c 20 69 53 75 62 32 2c 20 70 2d 3e 6f  ub1, iSub2, p->o
154b0 70 21 3d 54 4b 5f 41 4c 4c 29 3b 0a 0a 20 20 2f  p!=TK_ALL);..  /
154c0 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c 6c 61 74  * Compute collat
154d0 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 75 73  ing sequences us
154e0 65 64 20 62 79 20 0a 20 20 2a 2a 20 74 65 6d 70  ed by .  ** temp
154f0 6f 72 61 72 79 20 74 61 62 6c 65 73 20 6e 65 65  orary tables nee
15500 64 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ded to implement
15510 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65   the compound se
15520 6c 65 63 74 2e 0a 20 20 2a 2a 20 41 74 74 61 63  lect..  ** Attac
15530 68 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74  h the KeyInfo st
15540 72 75 63 74 75 72 65 20 74 6f 20 61 6c 6c 20 74  ructure to all t
15550 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e  emporary tables.
15560 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
15570 73 65 63 74 69 6f 6e 20 69 73 20 72 75 6e 20 62  section is run b
15580 79 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  y the right-most
15590 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
155a0 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20 53 45 4c  t only..  ** SEL
155b0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74  ECT statements t
155c0 6f 20 74 68 65 20 6c 65 66 74 20 61 6c 77 61 79  o the left alway
155d0 73 20 73 6b 69 70 20 74 68 69 73 20 70 61 72 74  s skip this part
155e0 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  .  The right-mos
155f0 74 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 6d 69  t.  ** SELECT mi
15600 67 68 74 20 61 6c 73 6f 20 73 6b 69 70 20 74 68  ght also skip th
15610 69 73 20 70 61 72 74 20 69 66 20 69 74 20 68 61  is part if it ha
15620 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c  s no ORDER BY cl
15630 61 75 73 65 20 61 6e 64 0a 20 20 2a 2a 20 6e 6f  ause and.  ** no
15640 20 74 65 6d 70 20 74 61 62 6c 65 73 20 61 72 65   temp tables are
15650 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a   required..  */.
15660 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
15670 73 20 26 20 53 46 5f 55 73 65 73 45 70 68 65 6d  s & SF_UsesEphem
15680 65 72 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20  eral ){.    int 
15690 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
156a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
156b0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
156c0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
156d0 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  fo;            /
156e0 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  * Collating sequ
156f0 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72 65 73  ence for the res
15700 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20 20 53  ult set */.    S
15710 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b 20 20 20  elect *pLoop;   
15720 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15730 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f  For looping thro
15740 75 67 68 20 53 45 4c 45 43 54 20 73 74 61 74 65  ugh SELECT state
15750 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 43 6f 6c  ments */.    Col
15760 6c 53 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b 20 20  lSeq **apColl;  
15770 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
15780 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67  r looping throug
15790 68 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  h pKeyInfo->aCol
157a0 6c 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  l[] */.    int n
157b0 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
157c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
157d0 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
157e0 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a   result set */..
157f0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
15800 4e 65 78 74 3d 3d 30 20 29 3b 0a 20 20 20 20 6e  Next==0 );.    n
15810 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  Col = p->pEList-
15820 3e 6e 45 78 70 72 3b 0a 20 20 20 20 70 4b 65 79  >nExpr;.    pKey
15830 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65  Info = sqlite3Ke
15840 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e  yInfoAlloc(db, n
15850 43 6f 6c 2c 20 31 29 3b 0a 20 20 20 20 69 66 28  Col, 1);.    if(
15860 20 21 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20   !pKeyInfo ){.  
15870 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
15880 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
15890 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
158a0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20  ect_end;.    }. 
158b0 20 20 20 66 6f 72 28 69 3d 30 2c 20 61 70 43 6f     for(i=0, apCo
158c0 6c 6c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  ll=pKeyInfo->aCo
158d0 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c  ll; i<nCol; i++,
158e0 20 61 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20 20 20   apColl++){.    
158f0 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74    *apColl = mult
15900 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70  iSelectCollSeq(p
15910 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20  Parse, p, i);.  
15920 20 20 20 20 69 66 28 20 30 3d 3d 2a 61 70 43 6f      if( 0==*apCo
15930 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 61  ll ){.        *a
15940 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c  pColl = db->pDfl
15950 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  tColl;.      }. 
15960 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 70 4c     }..    for(pL
15970 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c  oop=p; pLoop; pL
15980 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f  oop=pLoop->pPrio
15990 72 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  r){.      for(i=
159a0 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<2; i++){.  
159b0 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d        int addr =
159c0 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e   pLoop->addrOpen
159d0 45 70 68 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 20  Ephm[i];.       
159e0 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20   if( addr<0 ){. 
159f0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 5b           /* If [
15a00 30 5d 20 69 73 20 75 6e 75 73 65 64 20 74 68 65  0] is unused the
15a10 6e 20 5b 31 5d 20 69 73 20 61 6c 73 6f 20 75 6e  n [1] is also un
15a20 75 73 65 64 2e 20 20 53 6f 20 77 65 20 63 61 6e  used.  So we can
15a30 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  .          ** al
15a40 77 61 79 73 20 73 61 66 65 6c 79 20 61 62 6f 72  ways safely abor
15a50 74 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 65  t as soon as the
15a60 20 66 69 72 73 74 20 75 6e 75 73 65 64 20 73 6c   first unused sl
15a70 6f 74 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a 20  ot is found */. 
15a80 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
15a90 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e   pLoop->addrOpen
15aa0 45 70 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20 20  Ephm[1]<0 );.   
15ab0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
15ac0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
15ad0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
15ae0 65 50 32 28 76 2c 20 61 64 64 72 2c 20 6e 43 6f  eP2(v, addr, nCo
15af0 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
15b00 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
15b10 76 2c 20 61 64 64 72 2c 20 28 63 68 61 72 2a 29  v, addr, (char*)
15b20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65  sqlite3KeyInfoRe
15b30 66 28 70 4b 65 79 49 6e 66 6f 29 2c 0a 20 20 20  f(pKeyInfo),.   
15b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b50 20 20 20 20 20 20 20 20 20 50 34 5f 4b 45 59 49           P4_KEYI
15b60 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20 20 70 4c  NFO);.        pL
15b70 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  oop->addrOpenEph
15b80 6d 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 20  m[i] = -1;.     
15b90 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
15ba0 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66  ite3KeyInfoUnref
15bb0 28 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 7d 0a  (pKeyInfo);.  }.
15bc0 0a 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e  .multi_select_en
15bd0 64 3a 0a 20 20 70 44 65 73 74 2d 3e 69 53 64 73  d:.  pDest->iSds
15be0 74 20 3d 20 64 65 73 74 2e 69 53 64 73 74 3b 0a  t = dest.iSdst;.
15bf0 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d    pDest->nSdst =
15c00 20 64 65 73 74 2e 6e 53 64 73 74 3b 0a 20 20 73   dest.nSdst;.  s
15c10 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
15c20 74 65 28 64 62 2c 20 70 44 65 6c 65 74 65 29 3b  te(db, pDelete);
15c30 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
15c40 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
15c50 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
15c60 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ELECT */../*.** 
15c70 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 6f  Error message fo
15c80 72 20 77 68 65 6e 20 74 77 6f 20 6f 72 20 6d 6f  r when two or mo
15c90 72 65 20 74 65 72 6d 73 20 6f 66 20 61 20 63 6f  re terms of a co
15ca0 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 68 61  mpound select ha
15cb0 76 65 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20  ve different.** 
15cc0 73 69 7a 65 20 72 65 73 75 6c 74 20 73 65 74 73  size result sets
15cd0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
15ce0 33 53 65 6c 65 63 74 57 72 6f 6e 67 4e 75 6d 54  3SelectWrongNumT
15cf0 65 72 6d 73 45 72 72 6f 72 28 50 61 72 73 65 20  ermsError(Parse 
15d00 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
15d10 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 73 65  *p){.  if( p->se
15d20 6c 46 6c 61 67 73 20 26 20 53 46 5f 56 61 6c 75  lFlags & SF_Valu
15d30 65 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  es ){.    sqlite
15d40 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
15d50 2c 20 22 61 6c 6c 20 56 41 4c 55 45 53 20 6d 75  , "all VALUES mu
15d60 73 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  st have the same
15d70 20 6e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73   number of terms
15d80 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ");.  }else{.   
15d90 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
15da0 28 70 50 61 72 73 65 2c 20 22 53 45 4c 45 43 54  (pParse, "SELECT
15db0 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6e  s to the left an
15dc0 64 20 72 69 67 68 74 20 6f 66 20 25 73 22 0a 20  d right of %s". 
15dd0 20 20 20 20 20 22 20 64 6f 20 6e 6f 74 20 68 61       " do not ha
15de0 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  ve the same numb
15df0 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c  er of result col
15e00 75 6d 6e 73 22 2c 20 73 65 6c 65 63 74 4f 70 4e  umns", selectOpN
15e10 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 7d  ame(p->op));.  }
15e20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61  .}../*.** Code a
15e30 6e 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74  n output subrout
15e40 69 6e 65 20 66 6f 72 20 61 20 63 6f 72 6f 75 74  ine for a corout
15e50 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ine implementati
15e60 6f 6e 20 6f 66 20 61 0a 2a 2a 20 53 45 4c 45 43  on of a.** SELEC
15e70 54 20 73 74 61 74 6d 65 6e 74 2e 0a 2a 2a 0a 2a  T statment..**.*
15e80 2a 20 54 68 65 20 64 61 74 61 20 74 6f 20 62 65  * The data to be
15e90 20 6f 75 74 70 75 74 20 69 73 20 63 6f 6e 74 61   output is conta
15ea0 69 6e 65 64 20 69 6e 20 70 49 6e 2d 3e 69 53 64  ined in pIn->iSd
15eb0 73 74 2e 20 20 54 68 65 72 65 20 61 72 65 0a 2a  st.  There are.*
15ec0 2a 20 70 49 6e 2d 3e 6e 53 64 73 74 20 63 6f 6c  * pIn->nSdst col
15ed0 75 6d 6e 73 20 74 6f 20 62 65 20 6f 75 74 70 75  umns to be outpu
15ee0 74 2e 20 20 70 44 65 73 74 20 69 73 20 77 68 65  t.  pDest is whe
15ef0 72 65 20 74 68 65 20 6f 75 74 70 75 74 20 73 68  re the output sh
15f00 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 6e 74 2e  ould.** be sent.
15f10 0a 2a 2a 0a 2a 2a 20 72 65 67 52 65 74 75 72 6e  .**.** regReturn
15f20 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
15f30 66 20 74 68 65 20 72 65 67 69 73 74 65 72 20 68  f the register h
15f40 6f 6c 64 69 6e 67 20 74 68 65 20 73 75 62 72 6f  olding the subro
15f50 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 20  utine.** return 
15f60 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49  address..**.** I
15f70 66 20 72 65 67 50 72 65 76 3e 30 20 74 68 65 6e  f regPrev>0 then
15f80 20 69 74 20 69 73 20 74 68 65 20 66 69 72 73 74   it is the first
15f90 20 72 65 67 69 73 74 65 72 20 69 6e 20 61 20 76   register in a v
15fa0 65 63 74 6f 72 20 74 68 61 74 0a 2a 2a 20 72 65  ector that.** re
15fb0 63 6f 72 64 73 20 74 68 65 20 70 72 65 76 69 6f  cords the previo
15fc0 75 73 20 6f 75 74 70 75 74 2e 20 20 6d 65 6d 5b  us output.  mem[
15fd0 72 65 67 50 72 65 76 5d 20 69 73 20 61 20 66 6c  regPrev] is a fl
15fe0 61 67 20 74 68 61 74 20 69 73 20 66 61 6c 73 65  ag that is false
15ff0 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 68 61 73  .** if there has
16000 20 62 65 65 6e 20 6e 6f 20 70 72 65 76 69 6f 75   been no previou
16010 73 20 6f 75 74 70 75 74 2e 20 20 49 66 20 72 65  s output.  If re
16020 67 50 72 65 76 3e 30 20 74 68 65 6e 20 63 6f 64  gPrev>0 then cod
16030 65 20 69 73 0a 2a 2a 20 67 65 6e 65 72 61 74 65  e is.** generate
16040 64 20 74 6f 20 73 75 70 70 72 65 73 73 20 64 75  d to suppress du
16050 70 6c 69 63 61 74 65 73 2e 20 20 70 4b 65 79 49  plicates.  pKeyI
16060 6e 66 6f 20 69 73 20 75 73 65 64 20 66 6f 72 20  nfo is used for 
16070 63 6f 6d 70 61 72 69 6e 67 0a 2a 2a 20 6b 65 79  comparing.** key
16080 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
16090 4c 49 4d 49 54 20 66 6f 75 6e 64 20 69 6e 20 70  LIMIT found in p
160a0 2d 3e 69 4c 69 6d 69 74 20 69 73 20 72 65 61 63  ->iLimit is reac
160b0 68 65 64 2c 20 6a 75 6d 70 20 69 6d 6d 65 64 69  hed, jump immedi
160c0 61 74 65 6c 79 20 74 6f 0a 2a 2a 20 69 42 72 65  ately to.** iBre
160d0 61 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ak..*/.static in
160e0 74 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74  t generateOutput
160f0 53 75 62 72 6f 75 74 69 6e 65 28 0a 20 20 50 61  Subroutine(.  Pa
16100 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
16110 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
16120 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
16130 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
16140 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
16150 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
16160 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
16170 49 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  In,        /* Co
16180 72 6f 75 74 69 6e 65 20 73 75 70 70 6c 79 69 6e  routine supplyin
16190 67 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65  g data */.  Sele
161a0 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20  ctDest *pDest,  
161b0 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20      /* Where to 
161c0 73 65 6e 64 20 74 68 65 20 64 61 74 61 20 2a 2f  send the data */
161d0 0a 20 20 69 6e 74 20 72 65 67 52 65 74 75 72 6e  .  int regReturn
161e0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
161f0 65 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73  e return address
16200 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69   register */.  i
16210 6e 74 20 72 65 67 50 72 65 76 2c 20 20 20 20 20  nt regPrev,     
16220 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f         /* Previo
16230 75 73 20 72 65 73 75 6c 74 20 72 65 67 69 73 74  us result regist
16240 65 72 2e 20 20 4e 6f 20 75 6e 69 71 75 65 6e 65  er.  No uniquene
16250 73 73 20 69 66 20 30 20 2a 2f 0a 20 20 4b 65 79  ss if 0 */.  Key
16260 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20  Info *pKeyInfo, 
16270 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6d 70       /* For comp
16280 61 72 69 6e 67 20 77 69 74 68 20 70 72 65 76 69  aring with previ
16290 6f 75 73 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69  ous entry */.  i
162a0 6e 74 20 69 42 72 65 61 6b 20 20 20 20 20 20 20  nt iBreak       
162b0 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
162c0 65 72 65 20 69 66 20 77 65 20 68 69 74 20 74 68  ere if we hit th
162d0 65 20 4c 49 4d 49 54 20 2a 2f 0a 29 7b 0a 20 20  e LIMIT */.){.  
162e0 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
162f0 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
16300 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 6e 74 20  Continue;.  int 
16310 61 64 64 72 3b 0a 0a 20 20 61 64 64 72 20 3d 20  addr;..  addr = 
16320 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
16330 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69 43 6f  ntAddr(v);.  iCo
16340 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33  ntinue = sqlite3
16350 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
16360 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73 73  ;..  /* Suppress
16370 20 64 75 70 6c 69 63 61 74 65 73 20 66 6f 72 20   duplicates for 
16380 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61  UNION, EXCEPT, a
16390 6e 64 20 49 4e 54 45 52 53 45 43 54 20 0a 20 20  nd INTERSECT .  
163a0 2a 2f 0a 20 20 69 66 28 20 72 65 67 50 72 65 76  */.  if( regPrev
163b0 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72   ){.    int addr
163c0 31 2c 20 61 64 64 72 32 3b 0a 20 20 20 20 61 64  1, addr2;.    ad
163d0 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
163e0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
163f0 4e 6f 74 2c 20 72 65 67 50 72 65 76 29 3b 20 56  Not, regPrev); V
16400 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
16410 20 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69      addr2 = sqli
16420 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
16430 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 70 49 6e   OP_Compare, pIn
16440 2d 3e 69 53 64 73 74 2c 20 72 65 67 50 72 65 76  ->iSdst, regPrev
16450 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 0a  +1, pIn->nSdst,.
16460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
16480 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49  har*)sqlite3KeyI
16490 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f 29  nfoRef(pKeyInfo)
164a0 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
164b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
164c0 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c  dOp3(v, OP_Jump,
164d0 20 61 64 64 72 32 2b 32 2c 20 69 43 6f 6e 74 69   addr2+2, iConti
164e0 6e 75 65 2c 20 61 64 64 72 32 2b 32 29 3b 20 56  nue, addr2+2); V
164f0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
16500 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
16510 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31  umpHere(v, addr1
16520 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
16530 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
16540 6f 70 79 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c  opy, pIn->iSdst,
16550 20 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d   regPrev+1, pIn-
16560 3e 6e 53 64 73 74 2d 31 29 3b 0a 20 20 20 20 73  >nSdst-1);.    s
16570 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
16580 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
16590 31 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20 7d  1, regPrev);.  }
165a0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64  .  if( pParse->d
165b0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
165c0 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f  ) return 0;..  /
165d0 2a 20 53 75 70 70 72 65 73 73 20 74 68 65 20 66  * Suppress the f
165e0 69 72 73 74 20 4f 46 46 53 45 54 20 65 6e 74 72  irst OFFSET entr
165f0 69 65 73 20 69 66 20 74 68 65 72 65 20 69 73 20  ies if there is 
16600 61 6e 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65  an OFFSET clause
16610 0a 20 20 2a 2f 0a 20 20 63 6f 64 65 4f 66 66 73  .  */.  codeOffs
16620 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74  et(v, p->iOffset
16630 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 0a 20  , iContinue);.. 
16640 20 61 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e   assert( pDest->
16650 65 44 65 73 74 21 3d 53 52 54 5f 45 78 69 73 74  eDest!=SRT_Exist
16660 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  s );.  assert( p
16670 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54  Dest->eDest!=SRT
16680 5f 54 61 62 6c 65 20 29 3b 0a 20 20 73 77 69 74  _Table );.  swit
16690 63 68 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74  ch( pDest->eDest
166a0 20 29 7b 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65   ){.    /* Store
166b0 20 74 68 65 20 72 65 73 75 6c 74 20 61 73 20 64   the result as d
166c0 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71  ata using a uniq
166d0 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20  ue key..    */. 
166e0 20 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65     case SRT_Ephe
166f0 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e  mTab: {.      in
16700 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
16710 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
16720 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 32 20 3d  ;.      int r2 =
16730 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
16740 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
16750 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16760 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
16770 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 53 64 73 74  cord, pIn->iSdst
16780 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 20 72 31  , pIn->nSdst, r1
16790 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
167a0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
167b0 5f 4e 65 77 52 6f 77 69 64 2c 20 70 44 65 73 74  _NewRowid, pDest
167c0 2d 3e 69 53 44 50 61 72 6d 2c 20 72 32 29 3b 0a  ->iSDParm, r2);.
167d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
167e0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
167f0 73 65 72 74 2c 20 70 44 65 73 74 2d 3e 69 53 44  sert, pDest->iSD
16800 50 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20  Parm, r1, r2);. 
16810 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
16820 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
16830 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20  AG_APPEND);.    
16840 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
16850 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
16860 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r2);.      sqlit
16870 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
16880 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
16890 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
168a0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
168b0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
168c0 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20     /* If we are 
168d0 63 72 65 61 74 69 6e 67 20 61 20 73 65 74 20 66  creating a set f
168e0 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28  or an "expr IN (
168f0 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e  SELECT ...)" con
16900 73 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74  struct,.    ** t
16910 68 65 6e 20 74 68 65 72 65 20 73 68 6f 75 6c 64  hen there should
16920 20 62 65 20 61 20 73 69 6e 67 6c 65 20 69 74 65   be a single ite
16930 6d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20  m on the stack. 
16940 20 57 72 69 74 65 20 74 68 69 73 0a 20 20 20 20   Write this.    
16950 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74 68 65  ** item into the
16960 20 73 65 74 20 74 61 62 6c 65 20 77 69 74 68 20   set table with 
16970 62 6f 67 75 73 20 64 61 74 61 2e 0a 20 20 20 20  bogus data..    
16980 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
16990 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  Set: {.      int
169a0 20 72 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72   r1;.      asser
169b0 74 28 20 70 49 6e 2d 3e 6e 53 64 73 74 3d 3d 31  t( pIn->nSdst==1
169c0 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
169d0 3e 30 20 29 3b 0a 20 20 20 20 20 20 70 44 65 73  >0 );.      pDes
169e0 74 2d 3e 61 66 66 53 64 73 74 20 3d 20 0a 20 20  t->affSdst = .  
169f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f         sqlite3Co
16a00 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 2d  mpareAffinity(p-
16a10 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  >pEList->a[0].pE
16a20 78 70 72 2c 20 70 44 65 73 74 2d 3e 61 66 66 53  xpr, pDest->affS
16a30 64 73 74 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  dst);.      r1 =
16a40 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
16a50 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
16a60 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16a70 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op4(v, OP_MakeRe
16a80 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 53 64 73 74  cord, pIn->iSdst
16a90 2c 20 31 2c 20 72 31 2c 20 26 70 44 65 73 74 2d  , 1, r1, &pDest-
16aa0 3e 61 66 66 53 64 73 74 2c 31 29 3b 0a 20 20 20  >affSdst,1);.   
16ab0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
16ac0 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
16ad0 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69  e(pParse, pIn->i
16ae0 53 64 73 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  Sdst, 1);.      
16af0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16b00 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
16b10 74 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  t, pDest->iSDPar
16b20 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  m, r1);.      sq
16b30 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
16b40 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
16b50 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
16b60 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
16b70 68 69 73 20 69 73 20 61 20 73 63 61 6c 61 72 20  his is a scalar 
16b80 73 65 6c 65 63 74 20 74 68 61 74 20 69 73 20 70  select that is p
16b90 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73  art of an expres
16ba0 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a  sion, then.    *
16bb0 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  * store the resu
16bc0 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f  lts in the appro
16bd0 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65  priate memory ce
16be0 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74  ll and break out
16bf0 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73  .    ** of the s
16c00 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f  can loop..    */
16c10 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65  .    case SRT_Me
16c20 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  m: {.      asser
16c30 74 28 20 70 49 6e 2d 3e 6e 53 64 73 74 3d 3d 31  t( pIn->nSdst==1
16c40 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
16c50 3e 30 20 29 3b 20 20 74 65 73 74 63 61 73 65 28  >0 );  testcase(
16c60 20 70 49 6e 2d 3e 6e 53 64 73 74 21 3d 31 20 29   pIn->nSdst!=1 )
16c70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
16c80 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72  xprCodeMove(pPar
16c90 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  se, pIn->iSdst, 
16ca0 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20  pDest->iSDParm, 
16cb0 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  1);.      /* The
16cc0 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69   LIMIT clause wi
16cd0 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74  ll jump out of t
16ce0 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a  he loop for us *
16cf0 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
16d00 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23     }.#endif /* #
16d10 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
16d20 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
16d30 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c      /* The resul
16d40 74 73 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e  ts are stored in
16d50 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72   a sequence of r
16d60 65 67 69 73 74 65 72 73 0a 20 20 20 20 2a 2a 20  egisters.    ** 
16d70 73 74 61 72 74 69 6e 67 20 61 74 20 70 44 65 73  starting at pDes
16d80 74 2d 3e 69 53 64 73 74 2e 20 20 54 68 65 6e 20  t->iSdst.  Then 
16d90 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 79  the co-routine y
16da0 69 65 6c 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  ields..    */.  
16db0 20 20 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75    case SRT_Corou
16dc0 74 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 66  tine: {.      if
16dd0 28 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3d 3d  ( pDest->iSdst==
16de0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65  0 ){.        pDe
16df0 73 74 2d 3e 69 53 64 73 74 20 3d 20 73 71 6c 69  st->iSdst = sqli
16e00 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
16e10 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 6e 53 64  pParse, pIn->nSd
16e20 73 74 29 3b 0a 20 20 20 20 20 20 20 20 70 44 65  st);.        pDe
16e30 73 74 2d 3e 6e 53 64 73 74 20 3d 20 70 49 6e 2d  st->nSdst = pIn-
16e40 3e 6e 53 64 73 74 3b 0a 20 20 20 20 20 20 7d 0a  >nSdst;.      }.
16e50 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
16e60 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65  rCodeMove(pParse
16e70 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 44  , pIn->iSdst, pD
16e80 65 73 74 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d  est->iSdst, pIn-
16e90 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73  >nSdst);.      s
16ea0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
16eb0 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44  (v, OP_Yield, pD
16ec0 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20  est->iSDParm);. 
16ed0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
16ee0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e  }..    /* If non
16ef0 65 20 6f 66 20 74 68 65 20 61 62 6f 76 65 2c 20  e of the above, 
16f00 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
16f10 64 65 73 74 69 6e 61 74 69 6f 6e 20 6d 75 73 74  destination must
16f20 20 62 65 0a 20 20 20 20 2a 2a 20 53 52 54 5f 4f   be.    ** SRT_O
16f30 75 74 70 75 74 2e 20 20 54 68 69 73 20 72 6f 75  utput.  This rou
16f40 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61  tine is never ca
16f50 6c 6c 65 64 20 77 69 74 68 20 61 6e 79 20 6f 74  lled with any ot
16f60 68 65 72 0a 20 20 20 20 2a 2a 20 64 65 73 74 69  her.    ** desti
16f70 6e 61 74 69 6f 6e 20 6f 74 68 65 72 20 74 68 61  nation other tha
16f80 6e 20 74 68 65 20 6f 6e 65 73 20 68 61 6e 64 6c  n the ones handl
16f90 65 64 20 61 62 6f 76 65 20 6f 72 20 53 52 54 5f  ed above or SRT_
16fa0 4f 75 74 70 75 74 2e 0a 20 20 20 20 2a 2a 0a 20  Output..    **. 
16fb0 20 20 20 2a 2a 20 46 6f 72 20 53 52 54 5f 4f 75     ** For SRT_Ou
16fc0 74 70 75 74 2c 20 72 65 73 75 6c 74 73 20 61 72  tput, results ar
16fd0 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73 65  e stored in a se
16fe0 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74  quence of regist
16ff0 65 72 73 2e 20 20 0a 20 20 20 20 2a 2a 20 54 68  ers.  .    ** Th
17000 65 6e 20 74 68 65 20 4f 50 5f 52 65 73 75 6c 74  en the OP_Result
17010 52 6f 77 20 6f 70 63 6f 64 65 20 69 73 20 75 73  Row opcode is us
17020 65 64 20 74 6f 20 63 61 75 73 65 20 73 71 6c 69  ed to cause sqli
17030 74 65 33 5f 73 74 65 70 28 29 20 74 6f 0a 20 20  te3_step() to.  
17040 20 20 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20    ** return the 
17050 6e 65 78 74 20 72 6f 77 20 6f 66 20 72 65 73 75  next row of resu
17060 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  lt..    */.    d
17070 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
17080 61 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e 65  assert( pDest->e
17090 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
170a0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
170b0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
170c0 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70 49 6e  P_ResultRow, pIn
170d0 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53  ->iSdst, pIn->nS
170e0 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  dst);.      sqli
170f0 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
17100 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
17110 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70  e, pIn->iSdst, p
17120 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20  In->nSdst);.    
17130 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
17140 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f   }..  /* Jump to
17150 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
17160 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c 49 4d 49  loop if the LIMI
17170 54 20 69 73 20 72 65 61 63 68 65 64 2e 0a 20 20  T is reached..  
17180 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d  */.  if( p->iLim
17190 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  it ){.    sqlite
171a0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
171b0 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c 20  P_DecrJumpZero, 
171c0 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61  p->iLimit, iBrea
171d0 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  k); VdbeCoverage
171e0 28 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47  (v);.  }..  /* G
171f0 65 6e 65 72 61 74 65 20 74 68 65 20 73 75 62 72  enerate the subr
17200 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 0a 20 20  outine return.  
17210 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
17220 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
17230 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 73 71  iContinue);.  sq
17240 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
17250 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65  v, OP_Return, re
17260 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20 72 65 74  gReturn);..  ret
17270 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a  urn addr;.}../*.
17280 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 20 63  ** Alternative c
17290 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 63  ompound select c
172a0 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 66 6f  ode generator fo
172b0 72 20 63 61 73 65 73 20 77 68 65 6e 20 74 68 65  r cases when the
172c0 72 65 0a 2a 2a 20 69 73 20 61 6e 20 4f 52 44 45  re.** is an ORDE
172d0 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  R BY clause..**.
172e0 2a 2a 20 57 65 20 61 73 73 75 6d 65 20 61 20 71  ** We assume a q
172f0 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c  uery of the foll
17300 6f 77 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  owing form:.**.*
17310 2a 20 20 20 20 20 20 3c 73 65 6c 65 63 74 41 3e  *      <selectA>
17320 20 20 3c 6f 70 65 72 61 74 6f 72 3e 20 20 3c 73    <operator>  <s
17330 65 6c 65 63 74 42 3e 20 20 4f 52 44 45 52 20 42  electB>  ORDER B
17340 59 20 3c 6f 72 64 65 72 62 79 6c 69 73 74 3e 0a  Y <orderbylist>.
17350 2a 2a 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e  **.** <operator>
17360 20 69 73 20 6f 6e 65 20 6f 66 20 55 4e 49 4f 4e   is one of UNION
17370 20 41 4c 4c 2c 20 55 4e 49 4f 4e 2c 20 45 58 43   ALL, UNION, EXC
17380 45 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43  EPT, or INTERSEC
17390 54 2e 20 20 54 68 65 20 69 64 65 61 0a 2a 2a 20  T.  The idea.** 
173a0 69 73 20 74 6f 20 63 6f 64 65 20 62 6f 74 68 20  is to code both 
173b0 3c 73 65 6c 65 63 74 41 3e 20 61 6e 64 20 3c 73  <selectA> and <s
173c0 65 6c 65 63 74 42 3e 20 77 69 74 68 20 74 68 65  electB> with the
173d0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
173e0 20 61 73 0a 2a 2a 20 63 6f 2d 72 6f 75 74 69 6e   as.** co-routin
173f0 65 73 2e 20 20 54 68 65 6e 20 72 75 6e 20 74 68  es.  Then run th
17400 65 20 63 6f 2d 72 6f 75 74 69 6e 65 73 20 69 6e  e co-routines in
17410 20 70 61 72 61 6c 6c 65 6c 20 61 6e 64 20 6d 65   parallel and me
17420 72 67 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a  rge the results.
17430 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70  ** into the outp
17440 75 74 2e 20 20 49 6e 20 61 64 64 69 74 69 6f 6e  ut.  In addition
17450 20 74 6f 20 74 68 65 20 74 77 6f 20 63 6f 72 6f   to the two coro
17460 75 74 69 6e 65 73 20 28 63 61 6c 6c 65 64 20 73  utines (called s
17470 65 6c 65 63 74 41 20 61 6e 64 0a 2a 2a 20 73 65  electA and.** se
17480 6c 65 63 74 42 29 20 74 68 65 72 65 20 61 72 65  lectB) there are
17490 20 37 20 73 75 62 72 6f 75 74 69 6e 65 73 3a 0a   7 subroutines:.
174a0 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20 20  **.**    outA:  
174b0 20 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75    Move the outpu
174c0 74 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 41  t of the selectA
174d0 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20   coroutine into 
174e0 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20  the output.**   
174f0 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65            of the
17500 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e   compound query.
17510 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20  .**.**    outB: 
17520 20 20 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70     Move the outp
17530 75 74 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ut of the select
17540 42 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f  B coroutine into
17550 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20   the output.**  
17560 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68             of th
17570 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  e compound query
17580 2e 20 20 28 4f 6e 6c 79 20 67 65 6e 65 72 61 74  .  (Only generat
17590 65 64 20 66 6f 72 20 55 4e 49 4f 4e 20 61 6e 64  ed for UNION and
175a0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
175b0 55 4e 49 4f 4e 20 41 4c 4c 2e 20 20 45 58 43 45  UNION ALL.  EXCE
175c0 50 54 20 61 6e 64 20 49 4e 53 45 52 54 53 45 43  PT and INSERTSEC
175d0 54 20 6e 65 76 65 72 20 6f 75 74 70 75 74 20 61  T never output a
175e0 20 72 6f 77 20 74 68 61 74 0a 2a 2a 20 20 20 20   row that.**    
175f0 20 20 20 20 20 20 20 20 20 61 70 70 65 61 72 73           appears
17600 20 6f 6e 6c 79 20 69 6e 20 42 2e 29 0a 2a 2a 0a   only in B.).**.
17610 2a 2a 20 20 20 20 41 6c 74 42 3a 20 20 20 20 43  **    AltB:    C
17620 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65  alled when there
17630 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f   is data from bo
17640 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e  th coroutines an
17650 64 20 41 3c 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  d A<B..**.**    
17660 41 65 71 42 3a 20 20 20 20 43 61 6c 6c 65 64 20  AeqB:    Called 
17670 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 64 61  when there is da
17680 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72  ta from both cor
17690 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3d 3d 42  outines and A==B
176a0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 67 74 42 3a  ..**.**    AgtB:
176b0 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20      Called when 
176c0 74 68 65 72 65 20 69 73 20 64 61 74 61 20 66 72  there is data fr
176d0 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e  om both coroutin
176e0 65 73 20 61 6e 64 20 41 3e 42 2e 0a 2a 2a 0a 2a  es and A>B..**.*
176f0 2a 20 20 20 20 45 6f 66 41 3a 20 20 20 20 43 61  *    EofA:    Ca
17700 6c 6c 65 64 20 77 68 65 6e 20 64 61 74 61 20 69  lled when data i
17710 73 20 65 78 68 61 75 73 74 65 64 20 66 72 6f 6d  s exhausted from
17720 20 73 65 6c 65 63 74 41 2e 0a 2a 2a 0a 2a 2a 20   selectA..**.** 
17730 20 20 20 45 6f 66 42 3a 20 20 20 20 43 61 6c 6c     EofB:    Call
17740 65 64 20 77 68 65 6e 20 64 61 74 61 20 69 73 20  ed when data is 
17750 65 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20 73  exhausted from s
17760 65 6c 65 63 74 42 2e 0a 2a 2a 0a 2a 2a 20 54 68  electB..**.** Th
17770 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
17780 20 6f 66 20 74 68 65 20 6c 61 74 74 65 72 20 66   of the latter f
17790 69 76 65 20 73 75 62 72 6f 75 74 69 6e 65 73 20  ive subroutines 
177a0 64 65 70 65 6e 64 20 6f 6e 20 77 68 69 63 68 20  depend on which 
177b0 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69  .** <operator> i
177c0 73 20 75 73 65 64 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a  s used:.**.**.**
177d0 20 20 20 20 20 20 20 20 20 20 20 20 20 55 4e 49               UNI
177e0 4f 4e 20 41 4c 4c 20 20 20 20 20 20 20 20 20 55  ON ALL         U
177f0 4e 49 4f 4e 20 20 20 20 20 20 20 20 20 20 20 20  NION            
17800 45 58 43 45 50 54 20 20 20 20 20 20 20 20 20 20  EXCEPT          
17810 49 4e 54 45 52 53 45 43 54 0a 2a 2a 20 20 20 20  INTERSECT.**    
17820 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d        ----------
17830 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ---  -----------
17840 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ------  --------
17850 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ------  --------
17860 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 41  ---------.**   A
17870 6c 74 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78  ltB:   outA, nex
17880 74 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65  tA      outA, ne
17890 78 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c 20  xtA       outA, 
178a0 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 6e 65  nextA         ne
178b0 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 65 71 42  xtA.**.**   AeqB
178c0 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20  :   outA, nextA 
178d0 20 20 20 20 20 20 20 20 6e 65 78 74 41 20 20 20          nextA   
178e0 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 20            nextA 
178f0 20 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65          outA, ne
17900 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 67 74 42  xtA.**.**   AgtB
17910 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20  :   outB, nextB 
17920 20 20 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42       outB, nextB
17930 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 42 20            nextB 
17940 20 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 42             nextB
17950 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 41 3a 20 20  .**.**   EofA:  
17960 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20   outB, nextB    
17970 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20    outB, nextB   
17980 20 20 20 20 20 20 20 68 61 6c 74 20 20 20 20 20         halt     
17990 20 20 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a          halt.**.
179a0 2a 2a 20 20 20 45 6f 66 42 3a 20 20 20 6f 75 74  **   EofB:   out
179b0 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 6f 75  A, nextA      ou
179c0 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20  tA, nextA       
179d0 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
179e0 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 49      halt.**.** I
179f0 6e 20 74 68 65 20 41 6c 74 42 2c 20 41 65 71 42  n the AltB, AeqB
17a00 2c 20 61 6e 64 20 41 67 74 42 20 73 75 62 72 6f  , and AgtB subro
17a10 75 74 69 6e 65 73 2c 20 61 6e 20 45 4f 46 20 6f  utines, an EOF o
17a20 6e 20 41 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65  n A following ne
17a30 78 74 41 0a 2a 2a 20 63 61 75 73 65 73 20 61 6e  xtA.** causes an
17a40 20 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20   immediate jump 
17a50 74 6f 20 45 6f 66 41 20 61 6e 64 20 61 6e 20 45  to EofA and an E
17a60 4f 46 20 6f 6e 20 42 20 66 6f 6c 6c 6f 77 69 6e  OF on B followin
17a70 67 20 6e 65 78 74 42 20 63 61 75 73 65 73 0a 2a  g nextB causes.*
17a80 2a 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a  * an immediate j
17a90 75 6d 70 20 74 6f 20 45 6f 66 42 2e 20 20 57 69  ump to EofB.  Wi
17aa0 74 68 69 6e 20 45 6f 66 41 20 61 6e 64 20 45 6f  thin EofA and Eo
17ab0 66 42 2c 20 61 6e 64 20 45 4f 46 20 6f 6e 20 65  fB, and EOF on e
17ac0 6e 74 72 79 20 6f 72 0a 2a 2a 20 66 6f 6c 6c 6f  ntry or.** follo
17ad0 77 69 6e 67 20 6e 65 78 74 58 20 63 61 75 73 65  wing nextX cause
17ae0 73 20 61 20 6a 75 6d 70 20 74 6f 20 74 68 65 20  s a jump to the 
17af0 65 6e 64 20 6f 66 20 74 68 65 20 73 65 6c 65 63  end of the selec
17b00 74 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a  t processing..**
17b10 0a 2a 2a 20 44 75 70 6c 69 63 61 74 65 20 72 65  .** Duplicate re
17b20 6d 6f 76 61 6c 20 69 6e 20 74 68 65 20 55 4e 49  moval in the UNI
17b30 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e 64 20  ON, EXCEPT, and 
17b40 49 4e 54 45 52 53 45 43 54 20 63 61 73 65 73 20  INTERSECT cases 
17b50 69 73 20 68 61 6e 64 6c 65 64 0a 2a 2a 20 77 69  is handled.** wi
17b60 74 68 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20  thin the output 
17b70 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65  subroutine.  The
17b80 20 72 65 67 50 72 65 76 20 72 65 67 69 73 74 65   regPrev registe
17b90 72 20 73 65 74 20 68 6f 6c 64 73 20 74 68 65 20  r set holds the 
17ba0 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 6f 75  previously.** ou
17bb0 74 70 75 74 20 76 61 6c 75 65 2e 20 20 41 20 63  tput value.  A c
17bc0 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6d 61 64  omparison is mad
17bd0 65 20 61 67 61 69 6e 73 74 20 74 68 69 73 20 76  e against this v
17be0 61 6c 75 65 20 61 6e 64 20 74 68 65 20 6f 75 74  alue and the out
17bf0 70 75 74 0a 2a 2a 20 69 73 20 73 6b 69 70 70 65  put.** is skippe
17c00 64 20 69 66 20 74 68 65 20 6e 65 78 74 20 72 65  d if the next re
17c10 73 75 6c 74 73 20 77 6f 75 6c 64 20 62 65 20 74  sults would be t
17c20 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 70  he same as the p
17c30 72 65 76 69 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20 54  revious..**.** T
17c40 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
17c50 6e 20 70 6c 61 6e 20 69 73 20 74 6f 20 69 6d 70  n plan is to imp
17c60 6c 65 6d 65 6e 74 20 74 68 65 20 74 77 6f 20 63  lement the two c
17c70 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 73 65  oroutines and se
17c80 76 65 6e 0a 2a 2a 20 73 75 62 72 6f 75 74 69 6e  ven.** subroutin
17c90 65 73 20 66 69 72 73 74 2c 20 74 68 65 6e 20 70  es first, then p
17ca0 75 74 20 74 68 65 20 63 6f 6e 74 72 6f 6c 20 6c  ut the control l
17cb0 6f 67 69 63 20 61 74 20 74 68 65 20 62 6f 74 74  ogic at the bott
17cc0 6f 6d 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a  om.  Like this:.
17cd0 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 67  **.**          g
17ce0 6f 74 6f 20 49 6e 69 74 0a 2a 2a 20 20 20 20 20  oto Init.**     
17cf0 63 6f 41 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66  coA: coroutine f
17d00 6f 72 20 6c 65 66 74 20 71 75 65 72 79 20 28 41  or left query (A
17d10 29 0a 2a 2a 20 20 20 20 20 63 6f 42 3a 20 63 6f  ).**     coB: co
17d20 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 69 67 68  routine for righ
17d30 74 20 71 75 65 72 79 20 28 42 29 0a 2a 2a 20 20  t query (B).**  
17d40 20 20 6f 75 74 41 3a 20 6f 75 74 70 75 74 20 6f    outA: output o
17d50 6e 65 20 72 6f 77 20 6f 66 20 41 0a 2a 2a 20 20  ne row of A.**  
17d60 20 20 6f 75 74 42 3a 20 6f 75 74 70 75 74 20 6f    outB: output o
17d70 6e 65 20 72 6f 77 20 6f 66 20 42 20 28 55 4e 49  ne row of B (UNI
17d80 4f 4e 20 61 6e 64 20 55 4e 49 4f 4e 20 41 4c 4c  ON and UNION ALL
17d90 20 6f 6e 6c 79 29 0a 2a 2a 20 20 20 20 45 6f 66   only).**    Eof
17da0 41 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 45 6f 66  A: ....**    Eof
17db0 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 6c 74  B: ....**    Alt
17dc0 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 65 71  B: ....**    Aeq
17dd0 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 67 74  B: ....**    Agt
17de0 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 49 6e 69  B: ....**    Ini
17df0 74 3a 20 69 6e 69 74 69 61 6c 69 7a 65 20 63 6f  t: initialize co
17e00 72 6f 75 74 69 6e 65 20 72 65 67 69 73 74 65 72  routine register
17e10 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69  s.**          yi
17e20 65 6c 64 20 63 6f 41 0a 2a 2a 20 20 20 20 20 20  eld coA.**      
17e30 20 20 20 20 69 66 20 65 6f 66 28 41 29 20 67 6f      if eof(A) go
17e40 74 6f 20 45 6f 66 41 0a 2a 2a 20 20 20 20 20 20  to EofA.**      
17e50 20 20 20 20 79 69 65 6c 64 20 63 6f 42 0a 2a 2a      yield coB.**
17e60 20 20 20 20 20 20 20 20 20 20 69 66 20 65 6f 66            if eof
17e70 28 42 29 20 67 6f 74 6f 20 45 6f 66 42 0a 2a 2a  (B) goto EofB.**
17e80 20 20 20 20 43 6d 70 72 3a 20 43 6f 6d 70 61 72      Cmpr: Compar
17e90 65 20 41 2c 20 42 0a 2a 2a 20 20 20 20 20 20 20  e A, B.**       
17ea0 20 20 20 4a 75 6d 70 20 41 6c 74 42 2c 20 41 65     Jump AltB, Ae
17eb0 71 42 2c 20 41 67 74 42 0a 2a 2a 20 20 20 20 20  qB, AgtB.**     
17ec0 45 6e 64 3a 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 57  End: ....**.** W
17ed0 65 20 63 61 6c 6c 20 41 6c 74 42 2c 20 41 65 71  e call AltB, Aeq
17ee0 42 2c 20 41 67 74 42 2c 20 45 6f 66 41 2c 20 61  B, AgtB, EofA, a
17ef0 6e 64 20 45 6f 66 42 20 22 73 75 62 72 6f 75 74  nd EofB "subrout
17f00 69 6e 65 73 22 20 62 75 74 20 74 68 65 79 20 61  ines" but they a
17f10 72 65 20 6e 6f 74 0a 2a 2a 20 61 63 74 75 61 6c  re not.** actual
17f20 6c 79 20 63 61 6c 6c 65 64 20 75 73 69 6e 67 20  ly called using 
17f30 47 6f 73 75 62 20 61 6e 64 20 74 68 65 79 20 64  Gosub and they d
17f40 6f 20 6e 6f 74 20 52 65 74 75 72 6e 2e 20 20 45  o not Return.  E
17f50 6f 66 41 20 61 6e 64 20 45 6f 66 42 20 6c 6f 6f  ofA and EofB loo
17f60 70 0a 2a 2a 20 75 6e 74 69 6c 20 61 6c 6c 20 64  p.** until all d
17f70 61 74 61 20 69 73 20 65 78 68 61 75 73 74 65 64  ata is exhausted
17f80 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 74 68   then jump to th
17f90 65 20 22 65 6e 64 22 20 6c 61 62 65 2e 20 20 41  e "end" labe.  A
17fa0 6c 74 42 2c 20 41 65 71 42 2c 0a 2a 2a 20 61 6e  ltB, AeqB,.** an
17fb0 64 20 41 67 74 42 20 6a 75 6d 70 20 74 6f 20 65  d AgtB jump to e
17fc0 69 74 68 65 72 20 4c 32 20 6f 72 20 74 6f 20 6f  ither L2 or to o
17fd0 6e 65 20 6f 66 20 45 6f 66 41 20 6f 72 20 45 6f  ne of EofA or Eo
17fe0 66 42 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  fB..*/.#ifndef S
17ff0 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
18000 55 4e 44 5f 53 45 4c 45 43 54 0a 73 74 61 74 69  UND_SELECT.stati
18010 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63  c int multiSelec
18020 74 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72 73  tOrderBy(.  Pars
18030 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
18040 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
18050 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
18060 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
18070 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  /* The right-mos
18080 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20  t of SELECTs to 
18090 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65  be coded */.  Se
180a0 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20  lectDest *pDest 
180b0 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
180c0 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73  o with query res
180d0 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ults */.){.  int
180e0 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20   i, j;          
180f0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
18100 65 72 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ers */.  Select 
18110 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f  *pPrior;       /
18120 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54  * Another SELECT
18130 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20   immediately to 
18140 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64  our left */.  Vd
18150 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
18160 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
18170 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44 42  code to this VDB
18180 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  E */.  SelectDes
18190 74 20 64 65 73 74 41 3b 20 20 20 20 20 2f 2a 20  t destA;     /* 
181a0 44 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20  Destination for 
181b0 63 6f 72 6f 75 74 69 6e 65 20 41 20 2a 2f 0a 20  coroutine A */. 
181c0 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
181d0 42 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e  B;     /* Destin
181e0 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74  ation for corout
181f0 69 6e 65 20 42 20 2a 2f 0a 20 20 69 6e 74 20 72  ine B */.  int r
18200 65 67 41 64 64 72 41 3b 20 20 20 20 20 20 20 20  egAddrA;        
18210 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69   /* Address regi
18220 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d  ster for select-
18230 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  A coroutine */. 
18240 20 69 6e 74 20 72 65 67 41 64 64 72 42 3b 20 20   int regAddrB;  
18250 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
18260 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73  s register for s
18270 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e  elect-B coroutin
18280 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53  e */.  int addrS
18290 65 6c 65 63 74 41 3b 20 20 20 20 20 20 2f 2a 20  electA;      /* 
182a0 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73  Address of the s
182b0 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e  elect-A coroutin
182c0 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53  e */.  int addrS
182d0 65 6c 65 63 74 42 3b 20 20 20 20 20 20 2f 2a 20  electB;      /* 
182e0 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73  Address of the s
182f0 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e  elect-B coroutin
18300 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75  e */.  int regOu
18310 74 41 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  tA;          /* 
18320 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72  Address register
18330 20 66 6f 72 20 74 68 65 20 6f 75 74 70 75 74 2d   for the output-
18340 41 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  A subroutine */.
18350 20 20 69 6e 74 20 72 65 67 4f 75 74 42 3b 20 20    int regOutB;  
18360 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
18370 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ss register for 
18380 74 68 65 20 6f 75 74 70 75 74 2d 42 20 73 75 62  the output-B sub
18390 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
183a0 20 61 64 64 72 4f 75 74 41 3b 20 20 20 20 20 20   addrOutA;      
183b0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
183c0 20 74 68 65 20 6f 75 74 70 75 74 2d 41 20 73 75   the output-A su
183d0 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
183e0 74 20 61 64 64 72 4f 75 74 42 20 3d 20 30 3b 20  t addrOutB = 0; 
183f0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
18400 66 20 74 68 65 20 6f 75 74 70 75 74 2d 42 20 73  f the output-B s
18410 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
18420 6e 74 20 61 64 64 72 45 6f 66 41 3b 20 20 20 20  nt addrEofA;    
18430 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
18440 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 41 2d  of the select-A-
18450 65 78 68 61 75 73 74 65 64 20 73 75 62 72 6f 75  exhausted subrou
18460 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
18470 64 72 45 6f 66 41 5f 6e 6f 42 3b 20 20 20 20 20  drEofA_noB;     
18480 2f 2a 20 41 6c 74 65 72 6e 61 74 65 20 61 64 64  /* Alternate add
18490 72 45 6f 66 41 20 69 66 20 42 20 69 73 20 75 6e  rEofA if B is un
184a0 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20  initialized */. 
184b0 20 69 6e 74 20 61 64 64 72 45 6f 66 42 3b 20 20   int addrEofB;  
184c0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
184d0 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d  s of the select-
184e0 42 2d 65 78 68 61 75 73 74 65 64 20 73 75 62 72  B-exhausted subr
184f0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
18500 61 64 64 72 41 6c 74 42 3b 20 20 20 20 20 20 20  addrAltB;       
18510 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
18520 74 68 65 20 41 3c 42 20 73 75 62 72 6f 75 74 69  the A<B subrouti
18530 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
18540 41 65 71 42 3b 20 20 20 20 20 20 20 20 20 2f 2a  AeqB;         /*
18550 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
18560 41 3d 3d 42 20 73 75 62 72 6f 75 74 69 6e 65 20  A==B subroutine 
18570 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 67 74  */.  int addrAgt
18580 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  B;         /* Ad
18590 64 72 65 73 73 20 6f 66 20 74 68 65 20 41 3e 42  dress of the A>B
185a0 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
185b0 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 41 3b 20   int regLimitA; 
185c0 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20         /* Limit 
185d0 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c  register for sel
185e0 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72  ect-A */.  int r
185f0 65 67 4c 69 6d 69 74 42 3b 20 20 20 20 20 20 20  egLimitB;       
18600 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69 73 74   /* Limit regist
18610 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20  er for select-A 
18620 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 72 65 76  */.  int regPrev
18630 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20  ;          /* A 
18640 72 61 6e 67 65 20 6f 66 20 72 65 67 69 73 74 65  range of registe
18650 72 73 20 74 6f 20 68 6f 6c 64 20 70 72 65 76 69  rs to hold previ
18660 6f 75 73 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20  ous output */.  
18670 69 6e 74 20 73 61 76 65 64 4c 69 6d 69 74 3b 20  int savedLimit; 
18680 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76        /* Saved v
18690 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4c 69 6d 69  alue of p->iLimi
186a0 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64  t */.  int saved
186b0 4f 66 66 73 65 74 3b 20 20 20 20 20 20 2f 2a 20  Offset;      /* 
186c0 53 61 76 65 64 20 76 61 6c 75 65 20 6f 66 20 70  Saved value of p
186d0 2d 3e 69 4f 66 66 73 65 74 20 2a 2f 0a 20 20 69  ->iOffset */.  i
186e0 6e 74 20 6c 61 62 65 6c 43 6d 70 72 3b 20 20 20  nt labelCmpr;   
186f0 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f       /* Label fo
18700 72 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  r the start of t
18710 68 65 20 6d 65 72 67 65 20 61 6c 67 6f 72 69 74  he merge algorit
18720 68 6d 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65  hm */.  int labe
18730 6c 45 6e 64 3b 20 20 20 20 20 20 20 20 20 2f 2a  lEnd;         /*
18740 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 65 20 65   Label for the e
18750 6e 64 20 6f 66 20 74 68 65 20 6f 76 65 72 61 6c  nd of the overal
18760 6c 20 53 45 4c 45 43 54 20 73 74 6d 74 20 2a 2f  l SELECT stmt */
18770 0a 20 20 69 6e 74 20 61 64 64 72 31 3b 20 20 20  .  int addr1;   
18780 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
18790 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 74 68   instructions th
187a0 61 74 20 67 65 74 20 72 65 74 61 72 67 65 74 74  at get retargett
187b0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20  ed */.  int op; 
187c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
187d0 20 4f 6e 65 20 6f 66 20 54 4b 5f 41 4c 4c 2c 20   One of TK_ALL, 
187e0 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43  TK_UNION, TK_EXC
187f0 45 50 54 2c 20 54 4b 5f 49 4e 54 45 52 53 45 43  EPT, TK_INTERSEC
18800 54 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  T */.  KeyInfo *
18810 70 4b 65 79 44 75 70 20 3d 20 30 3b 20 2f 2a 20  pKeyDup = 0; /* 
18820 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72  Comparison infor
18830 6d 61 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69  mation for dupli
18840 63 61 74 65 20 72 65 6d 6f 76 61 6c 20 2a 2f 0a  cate removal */.
18850 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 4d    KeyInfo *pKeyM
18860 65 72 67 65 3b 20 20 20 2f 2a 20 43 6f 6d 70 61  erge;   /* Compa
18870 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f  rison informatio
18880 6e 20 66 6f 72 20 6d 65 72 67 69 6e 67 20 72 6f  n for merging ro
18890 77 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ws */.  sqlite3 
188a0 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  *db;          /*
188b0 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
188c0 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 4c 69  tion */.  ExprLi
188d0 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20  st *pOrderBy;   
188e0 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
188f0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
18900 6e 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20  nOrderBy;       
18910 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
18920 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45  erms in the ORDE
18930 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
18940 20 69 6e 74 20 2a 61 50 65 72 6d 75 74 65 3b 20   int *aPermute; 
18950 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e         /* Mappin
18960 67 20 66 72 6f 6d 20 4f 52 44 45 52 20 42 59 20  g from ORDER BY 
18970 74 65 72 6d 73 20 74 6f 20 72 65 73 75 6c 74 20  terms to result 
18980 73 65 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 23  set columns */.#
18990 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
189a0 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74  IT_EXPLAIN.  int
189b0 20 69 53 75 62 31 3b 20 20 20 20 20 20 20 20 20   iSub1;         
189c0 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20     /* EQP id of 
189d0 6c 65 66 74 2d 68 61 6e 64 20 71 75 65 72 79 20  left-hand query 
189e0 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 3b 20  */.  int iSub2; 
189f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 51             /* EQ
18a00 50 20 69 64 20 6f 66 20 72 69 67 68 74 2d 68 61  P id of right-ha
18a10 6e 64 20 71 75 65 72 79 20 2a 2f 0a 23 65 6e 64  nd query */.#end
18a20 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  if..  assert( p-
18a30 3e 70 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a  >pOrderBy!=0 );.
18a40 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 44 75    assert( pKeyDu
18a50 70 3d 3d 30 20 29 3b 20 2f 2a 20 22 4d 61 6e 61  p==0 ); /* "Mana
18a60 67 65 64 22 20 63 6f 64 65 20 6e 65 65 64 73 20  ged" code needs 
18a70 74 68 69 73 2e 20 20 54 69 63 6b 65 74 20 23 33  this.  Ticket #3
18a80 33 38 32 2e 20 2a 2f 0a 20 20 64 62 20 3d 20 70  382. */.  db = p
18a90 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76 20 3d  Parse->db;.  v =
18aa0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
18ab0 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
18ac0 3b 20 20 20 20 20 20 20 2f 2a 20 41 6c 72 65 61  ;       /* Alrea
18ad0 64 79 20 74 68 72 6f 77 6e 20 74 68 65 20 65 72  dy thrown the er
18ae0 72 6f 72 20 69 66 20 56 44 42 45 20 61 6c 6c 6f  ror if VDBE allo
18af0 63 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 6c 61  c failed */.  la
18b00 62 65 6c 45 6e 64 20 3d 20 73 71 6c 69 74 65 33  belEnd = sqlite3
18b10 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
18b20 3b 0a 20 20 6c 61 62 65 6c 43 6d 70 72 20 3d 20  ;.  labelCmpr = 
18b30 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
18b40 61 62 65 6c 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20  abel(v);...  /* 
18b50 50 61 74 63 68 20 75 70 20 74 68 65 20 4f 52 44  Patch up the ORD
18b60 45 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20 2a  ER BY clause.  *
18b70 2f 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 20  /.  op = p->op; 
18b80 20 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e   .  pPrior = p->
18b90 70 50 72 69 6f 72 3b 0a 20 20 61 73 73 65 72 74  pPrior;.  assert
18ba0 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72  ( pPrior->pOrder
18bb0 42 79 3d 3d 30 20 29 3b 0a 20 20 70 4f 72 64 65  By==0 );.  pOrde
18bc0 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
18bd0 79 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72  y;.  assert( pOr
18be0 64 65 72 42 79 20 29 3b 0a 20 20 6e 4f 72 64 65  derBy );.  nOrde
18bf0 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  rBy = pOrderBy->
18c00 6e 45 78 70 72 3b 0a 0a 20 20 2f 2a 20 46 6f 72  nExpr;..  /* For
18c10 20 6f 70 65 72 61 74 6f 72 73 20 6f 74 68 65 72   operators other
18c20 20 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20   than UNION ALL 
18c30 77 65 20 68 61 76 65 20 74 6f 20 6d 61 6b 65 20  we have to make 
18c40 73 75 72 65 20 74 68 61 74 0a 20 20 2a 2a 20 74  sure that.  ** t
18c50 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
18c60 73 65 20 63 6f 76 65 72 73 20 65 76 65 72 79 20  se covers every 
18c70 74 65 72 6d 20 6f 66 20 74 68 65 20 72 65 73 75  term of the resu
18c80 6c 74 20 73 65 74 2e 20 20 41 64 64 0a 20 20 2a  lt set.  Add.  *
18c90 2a 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 4f  * terms to the O
18ca0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
18cb0 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a  s necessary..  *
18cc0 2f 0a 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f 41  /.  if( op!=TK_A
18cd0 4c 4c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  LL ){.    for(i=
18ce0 31 3b 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  1; db->mallocFai
18cf0 6c 65 64 3d 3d 30 20 26 26 20 69 3c 3d 70 2d 3e  led==0 && i<=p->
18d00 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  pEList->nExpr; i
18d10 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  ++){.      struc
18d20 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
18d30 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 66 6f  *pItem;.      fo
18d40 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72  r(j=0, pItem=pOr
18d50 64 65 72 42 79 2d 3e 61 3b 20 6a 3c 6e 4f 72 64  derBy->a; j<nOrd
18d60 65 72 42 79 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d  erBy; j++, pItem
18d70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ++){.        ass
18d80 65 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e  ert( pItem->u.x.
18d90 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20 29 3b  iOrderByCol>0 );
18da0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74  .        if( pIt
18db0 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79  em->u.x.iOrderBy
18dc0 43 6f 6c 3d 3d 69 20 29 20 62 72 65 61 6b 3b 0a  Col==i ) break;.
18dd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
18de0 28 20 6a 3d 3d 6e 4f 72 64 65 72 42 79 20 29 7b  ( j==nOrderBy ){
18df0 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
18e00 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
18e10 72 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52  r(db, TK_INTEGER
18e20 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
18e30 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
18e40 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
18e50 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 70 4e  BKPT;.        pN
18e60 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f  ew->flags |= EP_
18e70 49 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20 20 20  IntValue;.      
18e80 20 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65    pNew->u.iValue
18e90 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 70 4f   = i;.        pO
18ea0 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33  rderBy = sqlite3
18eb0 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
18ec0 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c  Parse, pOrderBy,
18ed0 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20   pNew);.        
18ee0 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 20 70  if( pOrderBy ) p
18ef0 4f 72 64 65 72 42 79 2d 3e 61 5b 6e 4f 72 64 65  OrderBy->a[nOrde
18f00 72 42 79 2b 2b 5d 2e 75 2e 78 2e 69 4f 72 64 65  rBy++].u.x.iOrde
18f10 72 42 79 43 6f 6c 20 3d 20 28 75 31 36 29 69 3b  rByCol = (u16)i;
18f20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
18f30 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65   }..  /* Compute
18f40 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
18f50 70 65 72 6d 75 74 61 74 69 6f 6e 20 61 6e 64 20  permutation and 
18f60 6b 65 79 69 6e 66 6f 20 74 68 61 74 20 69 73 20  keyinfo that is 
18f70 75 73 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 74  used with.  ** t
18f80 68 65 20 70 65 72 6d 75 74 61 74 69 6f 6e 20 75  he permutation u
18f90 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
18fa0 20 69 66 20 74 68 65 20 6e 65 78 74 0a 20 20 2a   if the next.  *
18fb0 2a 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 73  * row of results
18fc0 20 63 6f 6d 65 73 20 66 72 6f 6d 20 73 65 6c 65   comes from sele
18fd0 63 74 41 20 6f 72 20 73 65 6c 65 63 74 42 2e 20  ctA or selectB. 
18fe0 20 41 6c 73 6f 20 61 64 64 20 65 78 70 6c 69 63   Also add explic
18ff0 69 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f  it.  ** collatio
19000 6e 73 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20  ns to the ORDER 
19010 42 59 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  BY clause terms 
19020 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74 68 65  so that when the
19030 20 73 75 62 71 75 65 72 69 65 73 0a 20 20 2a 2a   subqueries.  **
19040 20 74 6f 20 74 68 65 20 72 69 67 68 74 20 61 6e   to the right an
19050 64 20 74 68 65 20 6c 65 66 74 20 61 72 65 20 65  d the left are e
19060 76 61 6c 75 61 74 65 64 2c 20 74 68 65 79 20 75  valuated, they u
19070 73 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a 20  se the correct. 
19080 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 20   ** collation.. 
19090 20 2a 2f 0a 20 20 61 50 65 72 6d 75 74 65 20 3d   */.  aPermute =
190a0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
190b0 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66  RawNN(db, sizeof
190c0 28 69 6e 74 29 2a 28 6e 4f 72 64 65 72 42 79 20  (int)*(nOrderBy 
190d0 2b 20 31 29 29 3b 0a 20 20 69 66 28 20 61 50 65  + 1));.  if( aPe
190e0 72 6d 75 74 65 20 29 7b 0a 20 20 20 20 73 74 72  rmute ){.    str
190f0 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
19100 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 61 50  m *pItem;.    aP
19110 65 72 6d 75 74 65 5b 30 5d 20 3d 20 6e 4f 72 64  ermute[0] = nOrd
19120 65 72 42 79 3b 0a 20 20 20 20 66 6f 72 28 69 3d  erBy;.    for(i=
19130 31 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42  1, pItem=pOrderB
19140 79 2d 3e 61 3b 20 69 3c 3d 6e 4f 72 64 65 72 42  y->a; i<=nOrderB
19150 79 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  y; i++, pItem++)
19160 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
19170 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65  pItem->u.x.iOrde
19180 72 42 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20  rByCol>0 );.    
19190 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
191a0 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  >u.x.iOrderByCol
191b0 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  <=p->pEList->nEx
191c0 70 72 20 29 3b 0a 20 20 20 20 20 20 61 50 65 72  pr );.      aPer
191d0 6d 75 74 65 5b 69 5d 20 3d 20 70 49 74 65 6d 2d  mute[i] = pItem-
191e0 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  >u.x.iOrderByCol
191f0 20 2d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   - 1;.    }.    
19200 70 4b 65 79 4d 65 72 67 65 20 3d 20 6d 75 6c 74  pKeyMerge = mult
19210 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 4b 65  iSelectOrderByKe
19220 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 2c  yInfo(pParse, p,
19230 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   1);.  }else{.  
19240 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 20 30 3b    pKeyMerge = 0;
19250 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 74 74  .  }..  /* Reatt
19260 61 63 68 20 74 68 65 20 4f 52 44 45 52 20 42 59  ach the ORDER BY
19270 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20 71   clause to the q
19280 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e  uery..  */.  p->
19290 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
192a0 72 42 79 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70  rBy;.  pPrior->p
192b0 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65  OrderBy = sqlite
192c0 33 45 78 70 72 4c 69 73 74 44 75 70 28 70 50 61  3ExprListDup(pPa
192d0 72 73 65 2d 3e 64 62 2c 20 70 4f 72 64 65 72 42  rse->db, pOrderB
192e0 79 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  y, 0);..  /* All
192f0 6f 63 61 74 65 20 61 20 72 61 6e 67 65 20 6f 66  ocate a range of
19300 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
19310 74 65 72 73 20 61 6e 64 20 74 68 65 20 4b 65 79  ters and the Key
19320 49 6e 66 6f 20 6e 65 65 64 65 64 0a 20 20 2a 2a  Info needed.  **
19330 20 66 6f 72 20 74 68 65 20 6c 6f 67 69 63 20 74   for the logic t
19340 68 61 74 20 72 65 6d 6f 76 65 73 20 64 75 70 6c  hat removes dupl
19350 69 63 61 74 65 20 72 65 73 75 6c 74 20 72 6f 77  icate result row
19360 73 20 77 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20  s when the.  ** 
19370 6f 70 65 72 61 74 6f 72 20 69 73 20 55 4e 49 4f  operator is UNIO
19380 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72 20 49 4e  N, EXCEPT, or IN
19390 54 45 52 53 45 43 54 20 28 62 75 74 20 6e 6f 74  TERSECT (but not
193a0 20 55 4e 49 4f 4e 20 41 4c 4c 29 2e 0a 20 20 2a   UNION ALL)..  *
193b0 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41  /.  if( op==TK_A
193c0 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 50 72 65  LL ){.    regPre
193d0 76 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  v = 0;.  }else{.
193e0 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20      int nExpr = 
193f0 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
19400 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4f  ;.    assert( nO
19410 72 64 65 72 42 79 3e 3d 6e 45 78 70 72 20 7c 7c  rderBy>=nExpr ||
19420 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
19430 64 20 29 3b 0a 20 20 20 20 72 65 67 50 72 65 76  d );.    regPrev
19440 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
19450 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  1;.    pParse->n
19460 4d 65 6d 20 2b 3d 20 6e 45 78 70 72 2b 31 3b 0a  Mem += nExpr+1;.
19470 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19480 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
19490 67 65 72 2c 20 30 2c 20 72 65 67 50 72 65 76 29  ger, 0, regPrev)
194a0 3b 0a 20 20 20 20 70 4b 65 79 44 75 70 20 3d 20  ;.    pKeyDup = 
194b0 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c  sqlite3KeyInfoAl
194c0 6c 6f 63 28 64 62 2c 20 6e 45 78 70 72 2c 20 31  loc(db, nExpr, 1
194d0 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 44  );.    if( pKeyD
194e0 75 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  up ){.      asse
194f0 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  rt( sqlite3KeyIn
19500 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 4b  foIsWriteable(pK
19510 65 79 44 75 70 29 20 29 3b 0a 20 20 20 20 20 20  eyDup) );.      
19520 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72  for(i=0; i<nExpr
19530 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
19540 70 4b 65 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b 69  pKeyDup->aColl[i
19550 5d 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43  ] = multiSelectC
19560 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
19570 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 70 4b  , i);.        pK
19580 65 79 44 75 70 2d 3e 61 53 6f 72 74 4f 72 64 65  eyDup->aSortOrde
19590 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  r[i] = 0;.      
195a0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 0a 20 20  }.    }.  }. .  
195b0 2f 2a 20 53 65 70 61 72 61 74 65 20 74 68 65 20  /* Separate the 
195c0 6c 65 66 74 20 61 6e 64 20 74 68 65 20 72 69 67  left and the rig
195d0 68 74 20 71 75 65 72 79 20 66 72 6f 6d 20 6f 6e  ht query from on
195e0 65 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2f 0a 20  e another.  */. 
195f0 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
19600 20 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20    pPrior->pNext 
19610 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  = 0;.  sqlite3Re
19620 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42  solveOrderGroupB
19630 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e  y(pParse, p, p->
19640 70 4f 72 64 65 72 42 79 2c 20 22 4f 52 44 45 52  pOrderBy, "ORDER
19650 22 29 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72  ");.  if( pPrior
19660 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20  ->pPrior==0 ){. 
19670 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76     sqlite3Resolv
19680 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70 50  eOrderGroupBy(pP
19690 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 70 50  arse, pPrior, pP
196a0 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 2c 20  rior->pOrderBy, 
196b0 22 4f 52 44 45 52 22 29 3b 0a 20 20 7d 0a 0a 20  "ORDER");.  }.. 
196c0 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
196d0 6c 69 6d 69 74 20 72 65 67 69 73 74 65 72 73 20  limit registers 
196e0 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69  */.  computeLimi
196f0 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73  tRegisters(pPars
19700 65 2c 20 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  e, p, labelEnd);
19710 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74  .  if( p->iLimit
19720 20 26 26 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29   && op==TK_ALL )
19730 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 41 20  {.    regLimitA 
19740 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
19750 3b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 42 20  ;.    regLimitB 
19760 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
19770 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
19780 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f  eAddOp2(v, OP_Co
19790 70 79 2c 20 70 2d 3e 69 4f 66 66 73 65 74 20 3f  py, p->iOffset ?
197a0 20 70 2d 3e 69 4f 66 66 73 65 74 2b 31 20 3a 20   p->iOffset+1 : 
197b0 70 2d 3e 69 4c 69 6d 69 74 2c 0a 20 20 20 20 20  p->iLimit,.     
197c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
197d0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67               reg
197e0 4c 69 6d 69 74 41 29 3b 0a 20 20 20 20 73 71 6c  LimitA);.    sql
197f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
19800 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 4c 69  , OP_Copy, regLi
19810 6d 69 74 41 2c 20 72 65 67 4c 69 6d 69 74 42 29  mitA, regLimitB)
19820 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
19830 65 67 4c 69 6d 69 74 41 20 3d 20 72 65 67 4c 69  egLimitA = regLi
19840 6d 69 74 42 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  mitB = 0;.  }.  
19850 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
19860 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  e(db, p->pLimit)
19870 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20  ;.  p->pLimit = 
19880 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  0;.  sqlite3Expr
19890 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f  Delete(db, p->pO
198a0 66 66 73 65 74 29 3b 0a 20 20 70 2d 3e 70 4f 66  ffset);.  p->pOf
198b0 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20 72 65 67  fset = 0;..  reg
198c0 41 64 64 72 41 20 3d 20 2b 2b 70 50 61 72 73 65  AddrA = ++pParse
198d0 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 41 64 64  ->nMem;.  regAdd
198e0 72 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rB = ++pParse->n
198f0 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 41 20 3d  Mem;.  regOutA =
19900 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
19910 0a 20 20 72 65 67 4f 75 74 42 20 3d 20 2b 2b 70  .  regOutB = ++p
19920 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73  Parse->nMem;.  s
19930 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
19940 49 6e 69 74 28 26 64 65 73 74 41 2c 20 53 52 54  Init(&destA, SRT
19950 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41  _Coroutine, regA
19960 64 64 72 41 29 3b 0a 20 20 73 71 6c 69 74 65 33  ddrA);.  sqlite3
19970 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
19980 64 65 73 74 42 2c 20 53 52 54 5f 43 6f 72 6f 75  destB, SRT_Corou
19990 74 69 6e 65 2c 20 72 65 67 41 64 64 72 42 29 3b  tine, regAddrB);
199a0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
199b0 61 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65  a coroutine to e
199c0 76 61 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45  valuate the SELE
199d0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  CT statement to 
199e0 74 68 65 0a 20 20 2a 2a 20 6c 65 66 74 20 6f 66  the.  ** left of
199f0 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 6f 70   the compound op
19a00 65 72 61 74 6f 72 20 2d 20 74 68 65 20 22 41 22  erator - the "A"
19a10 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20   select..  */.  
19a20 61 64 64 72 53 65 6c 65 63 74 41 20 3d 20 73 71  addrSelectA = sq
19a30 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
19a40 41 64 64 72 28 76 29 20 2b 20 31 3b 0a 20 20 61  Addr(v) + 1;.  a
19a50 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
19a60 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
19a70 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65  nitCoroutine, re
19a80 67 41 64 64 72 41 2c 20 30 2c 20 61 64 64 72 53  gAddrA, 0, addrS
19a90 65 6c 65 63 74 41 29 3b 0a 20 20 56 64 62 65 43  electA);.  VdbeC
19aa0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6c 65 66 74  omment((v, "left
19ab0 20 53 45 4c 45 43 54 22 29 29 3b 0a 20 20 70 50   SELECT"));.  pP
19ac0 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d 20 72  rior->iLimit = r
19ad0 65 67 4c 69 6d 69 74 41 3b 0a 20 20 65 78 70 6c  egLimitA;.  expl
19ae0 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53  ainSetInteger(iS
19af0 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65  ub1, pParse->iNe
19b00 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 73  xtSelectId);.  s
19b10 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
19b20 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64 65  rse, pPrior, &de
19b30 73 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  stA);.  sqlite3V
19b40 64 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28  dbeEndCoroutine(
19b50 76 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20  v, regAddrA);.  
19b60 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
19b70 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 0a  ere(v, addr1);..
19b80 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
19b90 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76 61  coroutine to eva
19ba0 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45 43 54  luate the SELECT
19bb0 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 0a 20   statement on . 
19bc0 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 2d 20   ** the right - 
19bd0 74 68 65 20 22 42 22 20 73 65 6c 65 63 74 0a 20  the "B" select. 
19be0 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65 63 74   */.  addrSelect
19bf0 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  B = sqlite3VdbeC
19c00 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20  urrentAddr(v) + 
19c10 31 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c  1;.  addr1 = sql
19c20 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
19c30 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69  , OP_InitCorouti
19c40 6e 65 2c 20 72 65 67 41 64 64 72 42 2c 20 30 2c  ne, regAddrB, 0,
19c50 20 61 64 64 72 53 65 6c 65 63 74 42 29 3b 0a 20   addrSelectB);. 
19c60 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
19c70 20 22 72 69 67 68 74 20 53 45 4c 45 43 54 22 29   "right SELECT")
19c80 29 3b 0a 20 20 73 61 76 65 64 4c 69 6d 69 74 20  );.  savedLimit 
19c90 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 73  = p->iLimit;.  s
19ca0 61 76 65 64 4f 66 66 73 65 74 20 3d 20 70 2d 3e  avedOffset = p->
19cb0 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e 69 4c  iOffset;.  p->iL
19cc0 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69 74 42  imit = regLimitB
19cd0 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d  ;.  p->iOffset =
19ce0 20 30 3b 20 20 0a 20 20 65 78 70 6c 61 69 6e 53   0;  .  explainS
19cf0 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c  etInteger(iSub2,
19d00 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
19d10 6c 65 63 74 49 64 29 3b 0a 20 20 73 71 6c 69 74  lectId);.  sqlit
19d20 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
19d30 20 70 2c 20 26 64 65 73 74 42 29 3b 0a 20 20 70   p, &destB);.  p
19d40 2d 3e 69 4c 69 6d 69 74 20 3d 20 73 61 76 65 64  ->iLimit = saved
19d50 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e 69 4f 66 66  Limit;.  p->iOff
19d60 73 65 74 20 3d 20 73 61 76 65 64 4f 66 66 73 65  set = savedOffse
19d70 74 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  t;.  sqlite3Vdbe
19d80 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28 76 2c 20  EndCoroutine(v, 
19d90 72 65 67 41 64 64 72 42 29 3b 0a 0a 20 20 2f 2a  regAddrB);..  /*
19da0 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
19db0 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70  outine that outp
19dc0 75 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20  uts the current 
19dd0 72 6f 77 20 6f 66 20 74 68 65 20 41 0a 20 20 2a  row of the A.  *
19de0 2a 20 73 65 6c 65 63 74 20 61 73 20 74 68 65 20  * select as the 
19df0 6e 65 78 74 20 6f 75 74 70 75 74 20 72 6f 77 20  next output row 
19e00 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  of the compound 
19e10 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 56  select..  */.  V
19e20 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
19e30 76 2c 20 22 4f 75 74 70 75 74 20 72 6f 75 74 69  v, "Output routi
19e40 6e 65 20 66 6f 72 20 41 22 29 29 3b 0a 20 20 61  ne for A"));.  a
19e50 64 64 72 4f 75 74 41 20 3d 20 67 65 6e 65 72 61  ddrOutA = genera
19e60 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69  teOutputSubrouti
19e70 6e 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  ne(pParse,.     
19e80 20 20 20 20 20 20 20 20 20 20 20 20 70 2c 20 26              p, &
19e90 64 65 73 74 41 2c 20 70 44 65 73 74 2c 20 72 65  destA, pDest, re
19ea0 67 4f 75 74 41 2c 0a 20 20 20 20 20 20 20 20 20  gOutA,.         
19eb0 20 20 20 20 20 20 20 20 72 65 67 50 72 65 76 2c          regPrev,
19ec0 20 70 4b 65 79 44 75 70 2c 20 6c 61 62 65 6c 45   pKeyDup, labelE
19ed0 6e 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 47 65 6e  nd);.  .  /* Gen
19ee0 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
19ef0 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20  ne that outputs 
19f00 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20  the current row 
19f10 6f 66 20 74 68 65 20 42 0a 20 20 2a 2a 20 73 65  of the B.  ** se
19f20 6c 65 63 74 20 61 73 20 74 68 65 20 6e 65 78 74  lect as the next
19f30 20 6f 75 74 70 75 74 20 72 6f 77 20 6f 66 20 74   output row of t
19f40 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  he compound sele
19f50 63 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f  ct..  */.  if( o
19f60 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d  p==TK_ALL || op=
19f70 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20  =TK_UNION ){.   
19f80 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
19f90 28 28 76 2c 20 22 4f 75 74 70 75 74 20 72 6f 75  ((v, "Output rou
19fa0 74 69 6e 65 20 66 6f 72 20 42 22 29 29 3b 0a 20  tine for B"));. 
19fb0 20 20 20 61 64 64 72 4f 75 74 42 20 3d 20 67 65     addrOutB = ge
19fc0 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75 62 72  nerateOutputSubr
19fd0 6f 75 74 69 6e 65 28 70 50 61 72 73 65 2c 0a 20  outine(pParse,. 
19fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ff0 70 2c 20 26 64 65 73 74 42 2c 20 70 44 65 73 74  p, &destB, pDest
1a000 2c 20 72 65 67 4f 75 74 42 2c 0a 20 20 20 20 20  , regOutB,.     
1a010 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67 50              regP
1a020 72 65 76 2c 20 70 4b 65 79 44 75 70 2c 20 6c 61  rev, pKeyDup, la
1a030 62 65 6c 45 6e 64 29 3b 0a 20 20 7d 0a 20 20 73  belEnd);.  }.  s
1a040 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72  qlite3KeyInfoUnr
1a050 65 66 28 70 4b 65 79 44 75 70 29 3b 0a 0a 20 20  ef(pKeyDup);..  
1a060 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
1a070 62 72 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20  broutine to run 
1a080 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73  when the results
1a090 20 66 72 6f 6d 20 73 65 6c 65 63 74 20 41 0a 20   from select A. 
1a0a0 20 2a 2a 20 61 72 65 20 65 78 68 61 75 73 74 65   ** are exhauste
1a0b0 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20  d and only data 
1a0c0 69 6e 20 73 65 6c 65 63 74 20 42 20 72 65 6d 61  in select B rema
1a0d0 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ins..  */.  if( 
1a0e0 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 7c 7c  op==TK_EXCEPT ||
1a0f0 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43   op==TK_INTERSEC
1a100 54 20 29 7b 0a 20 20 20 20 61 64 64 72 45 6f 66  T ){.    addrEof
1a110 41 5f 6e 6f 42 20 3d 20 61 64 64 72 45 6f 66 41  A_noB = addrEofA
1a120 20 3d 20 6c 61 62 65 6c 45 6e 64 3b 0a 20 20 7d   = labelEnd;.  }
1a130 65 6c 73 65 7b 20 20 0a 20 20 20 20 56 64 62 65  else{  .    Vdbe
1a140 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
1a150 22 65 6f 66 2d 41 20 73 75 62 72 6f 75 74 69 6e  "eof-A subroutin
1a160 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72 45 6f  e"));.    addrEo
1a170 66 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  fA = sqlite3Vdbe
1a180 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
1a190 75 62 2c 20 72 65 67 4f 75 74 42 2c 20 61 64 64  ub, regOutB, add
1a1a0 72 4f 75 74 42 29 3b 0a 20 20 20 20 61 64 64 72  rOutB);.    addr
1a1b0 45 6f 66 41 5f 6e 6f 42 20 3d 20 73 71 6c 69 74  EofA_noB = sqlit
1a1c0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1a1d0 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
1a1e0 72 42 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20  rB, labelEnd);. 
1a1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a210 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1a220 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
1a230 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72  VdbeGoto(v, addr
1a240 45 6f 66 41 29 3b 0a 20 20 20 20 70 2d 3e 6e 53  EofA);.    p->nS
1a250 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74  electRow = sqlit
1a260 65 33 4c 6f 67 45 73 74 41 64 64 28 70 2d 3e 6e  e3LogEstAdd(p->n
1a270 53 65 6c 65 63 74 52 6f 77 2c 20 70 50 72 69 6f  SelectRow, pPrio
1a280 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a  r->nSelectRow);.
1a290 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
1a2a0 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
1a2b0 74 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65 20  to run when the 
1a2c0 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c  results from sel
1a2d0 65 63 74 20 42 0a 20 20 2a 2a 20 61 72 65 20 65  ect B.  ** are e
1a2e0 78 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c  xhausted and onl
1a2f0 79 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63 74  y data in select
1a300 20 41 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f   A remains..  */
1a310 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e  .  if( op==TK_IN
1a320 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61  TERSECT ){.    a
1a330 64 64 72 45 6f 66 42 20 3d 20 61 64 64 72 45 6f  ddrEofB = addrEo
1a340 66 41 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e  fA;.    if( p->n
1a350 53 65 6c 65 63 74 52 6f 77 20 3e 20 70 50 72 69  SelectRow > pPri
1a360 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29  or->nSelectRow )
1a370 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
1a380 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74   pPrior->nSelect
1a390 52 6f 77 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a  Row;.  }else{  .
1a3a0 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d      VdbeNoopComm
1a3b0 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 42 20 73  ent((v, "eof-B s
1a3c0 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20  ubroutine"));.  
1a3d0 20 20 61 64 64 72 45 6f 66 42 20 3d 20 73 71 6c    addrEofB = sql
1a3e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1a3f0 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
1a400 75 74 41 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a  utA, addrOutA);.
1a410 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1a420 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp2(v, OP_Yiel
1a430 64 2c 20 72 65 67 41 64 64 72 41 2c 20 6c 61 62  d, regAddrA, lab
1a440 65 6c 45 6e 64 29 3b 20 56 64 62 65 43 6f 76 65  elEnd); VdbeCove
1a450 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
1a460 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
1a470 61 64 64 72 45 6f 66 42 29 3b 0a 20 20 7d 0a 0a  addrEofB);.  }..
1a480 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
1a490 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  de to handle the
1a4a0 20 63 61 73 65 20 6f 66 20 41 3c 42 0a 20 20 2a   case of A<B.  *
1a4b0 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  /.  VdbeNoopComm
1a4c0 65 6e 74 28 28 76 2c 20 22 41 2d 6c 74 2d 42 20  ent((v, "A-lt-B 
1a4d0 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20  subroutine"));. 
1a4e0 20 61 64 64 72 41 6c 74 42 20 3d 20 73 71 6c 69   addrAltB = sqli
1a4f0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1a500 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75   OP_Gosub, regOu
1a510 74 41 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20  tA, addrOutA);. 
1a520 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a530 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p2(v, OP_Yield, 
1a540 72 65 67 41 64 64 72 41 2c 20 61 64 64 72 45 6f  regAddrA, addrEo
1a550 66 41 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  fA); VdbeCoverag
1a560 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  e(v);.  sqlite3V
1a570 64 62 65 47 6f 74 6f 28 76 2c 20 6c 61 62 65 6c  dbeGoto(v, label
1a580 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  Cmpr);..  /* Gen
1a590 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61  erate code to ha
1a5a0 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66  ndle the case of
1a5b0 20 41 3d 3d 42 0a 20 20 2a 2f 0a 20 20 69 66 28   A==B.  */.  if(
1a5c0 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20   op==TK_ALL ){. 
1a5d0 20 20 20 61 64 64 72 41 65 71 42 20 3d 20 61 64     addrAeqB = ad
1a5e0 64 72 41 6c 74 42 3b 0a 20 20 7d 65 6c 73 65 20  drAltB;.  }else 
1a5f0 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52  if( op==TK_INTER
1a600 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72  SECT ){.    addr
1a610 41 65 71 42 20 3d 20 61 64 64 72 41 6c 74 42 3b  AeqB = addrAltB;
1a620 0a 20 20 20 20 61 64 64 72 41 6c 74 42 2b 2b 3b  .    addrAltB++;
1a630 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64  .  }else{.    Vd
1a640 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
1a650 2c 20 22 41 2d 65 71 2d 42 20 73 75 62 72 6f 75  , "A-eq-B subrou
1a660 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64  tine"));.    add
1a670 72 41 65 71 42 20 3d 0a 20 20 20 20 73 71 6c 69  rAeqB =.    sqli
1a680 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1a690 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
1a6a0 64 72 41 2c 20 61 64 64 72 45 6f 66 41 29 3b 20  drA, addrEofA); 
1a6b0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1a6c0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1a6d0 47 6f 74 6f 28 76 2c 20 6c 61 62 65 6c 43 6d 70  Goto(v, labelCmp
1a6e0 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  r);.  }..  /* Ge
1a6f0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68  nerate code to h
1a700 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f  andle the case o
1a710 66 20 41 3e 42 0a 20 20 2a 2f 0a 20 20 56 64 62  f A>B.  */.  Vdb
1a720 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
1a730 20 22 41 2d 67 74 2d 42 20 73 75 62 72 6f 75 74   "A-gt-B subrout
1a740 69 6e 65 22 29 29 3b 0a 20 20 61 64 64 72 41 67  ine"));.  addrAg
1a750 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  tB = sqlite3Vdbe
1a760 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
1a770 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c    if( op==TK_ALL
1a780 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e   || op==TK_UNION
1a790 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
1a7a0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1a7b0 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 42 2c 20  Gosub, regOutB, 
1a7c0 61 64 64 72 4f 75 74 42 29 3b 0a 20 20 7d 0a 20  addrOutB);.  }. 
1a7d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a7e0 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p2(v, OP_Yield, 
1a7f0 72 65 67 41 64 64 72 42 2c 20 61 64 64 72 45 6f  regAddrB, addrEo
1a800 66 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  fB); VdbeCoverag
1a810 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  e(v);.  sqlite3V
1a820 64 62 65 47 6f 74 6f 28 76 2c 20 6c 61 62 65 6c  dbeGoto(v, label
1a830 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 69  Cmpr);..  /* Thi
1a840 73 20 63 6f 64 65 20 72 75 6e 73 20 6f 6e 63 65  s code runs once
1a850 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 65   to initialize e
1a860 76 65 72 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a  verything..  */.
1a870 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
1a880 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
1a890 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
1a8a0 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp2(v, OP_Yield
1a8b0 2c 20 72 65 67 41 64 64 72 41 2c 20 61 64 64 72  , regAddrA, addr
1a8c0 45 6f 66 41 5f 6e 6f 42 29 3b 20 56 64 62 65 43  EofA_noB); VdbeC
1a8d0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71  overage(v);.  sq
1a8e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1a8f0 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
1a900 41 64 64 72 42 2c 20 61 64 64 72 45 6f 66 42 29  AddrB, addrEofB)
1a910 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
1a920 29 3b 0a 0a 20 20 2f 2a 20 49 6d 70 6c 65 6d 65  );..  /* Impleme
1a930 6e 74 20 74 68 65 20 6d 61 69 6e 20 6d 65 72 67  nt the main merg
1a940 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71  e loop.  */.  sq
1a950 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
1a960 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 43 6d  Label(v, labelCm
1a970 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  pr);.  sqlite3Vd
1a980 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 50  beAddOp4(v, OP_P
1a990 65 72 6d 75 74 61 74 69 6f 6e 2c 20 30 2c 20 30  ermutation, 0, 0
1a9a0 2c 20 30 2c 20 28 63 68 61 72 2a 29 61 50 65 72  , 0, (char*)aPer
1a9b0 6d 75 74 65 2c 20 50 34 5f 49 4e 54 41 52 52 41  mute, P4_INTARRA
1a9c0 59 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  Y);.  sqlite3Vdb
1a9d0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f  eAddOp4(v, OP_Co
1a9e0 6d 70 61 72 65 2c 20 64 65 73 74 41 2e 69 53 64  mpare, destA.iSd
1a9f0 73 74 2c 20 64 65 73 74 42 2e 69 53 64 73 74 2c  st, destB.iSdst,
1aa00 20 6e 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20   nOrderBy,.     
1aa10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 4d      (char*)pKeyM
1aa30 65 72 67 65 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  erge, P4_KEYINFO
1aa40 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1aa50 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
1aa60 41 47 5f 50 45 52 4d 55 54 45 29 3b 0a 20 20 73  AG_PERMUTE);.  s
1aa70 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1aa80 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64  (v, OP_Jump, add
1aa90 72 41 6c 74 42 2c 20 61 64 64 72 41 65 71 42 2c  rAltB, addrAeqB,
1aaa0 20 61 64 64 72 41 67 74 42 29 3b 20 56 64 62 65   addrAgtB); Vdbe
1aab0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20  Coverage(v);..  
1aac0 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 74  /* Jump to the t
1aad0 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 6f 72 64  his point in ord
1aae0 65 72 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20  er to terminate 
1aaf0 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a  the query..  */.
1ab00 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
1ab10 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62  olveLabel(v, lab
1ab20 65 6c 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 53 65  elEnd);..  /* Se
1ab30 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
1ab40 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 73 0a 20  output columns. 
1ab50 20 2a 2f 0a 20 20 69 66 28 20 70 44 65 73 74 2d   */.  if( pDest-
1ab60 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70  >eDest==SRT_Outp
1ab70 75 74 20 29 7b 0a 20 20 20 20 53 65 6c 65 63 74  ut ){.    Select
1ab80 20 2a 70 46 69 72 73 74 20 3d 20 70 50 72 69 6f   *pFirst = pPrio
1ab90 72 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 46  r;.    while( pF
1aba0 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70  irst->pPrior ) p
1abb0 46 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e  First = pFirst->
1abc0 70 50 72 69 6f 72 3b 0a 20 20 20 20 67 65 6e 65  pPrior;.    gene
1abd0 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  rateColumnNames(
1abe0 70 50 61 72 73 65 2c 20 70 46 69 72 73 74 2d 3e  pParse, pFirst->
1abf0 70 53 72 63 2c 20 70 46 69 72 73 74 2d 3e 70 45  pSrc, pFirst->pE
1ac00 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  List);.  }..  /*
1ac10 20 52 65 61 73 73 65 6d 62 6c 79 20 74 68 65 20   Reassembly the 
1ac20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 73  compound query s
1ac30 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62  o that it will b
1ac40 65 20 66 72 65 65 64 20 63 6f 72 72 65 63 74 6c  e freed correctl
1ac50 79 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 63 61  y.  ** by the ca
1ac60 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a  lling function *
1ac70 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  /.  if( p->pPrio
1ac80 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
1ac90 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
1aca0 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 7d   p->pPrior);.  }
1acb0 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70  .  p->pPrior = p
1acc0 50 72 69 6f 72 3b 0a 20 20 70 50 72 69 6f 72 2d  Prior;.  pPrior-
1acd0 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 0a 20 20 2f  >pNext = p;..  /
1ace0 2a 2a 2a 20 54 42 44 3a 20 20 49 6e 73 65 72 74  *** TBD:  Insert
1acf0 20 73 75 62 72 6f 75 74 69 6e 65 20 63 61 6c 6c   subroutine call
1ad00 73 20 74 6f 20 63 6c 6f 73 65 20 63 75 72 73 6f  s to close curso
1ad10 72 73 20 6f 6e 20 69 6e 63 6f 6d 70 6c 65 74 65  rs on incomplete
1ad20 0a 20 20 2a 2a 2a 2a 20 73 75 62 71 75 65 72 69  .  **** subqueri
1ad30 65 73 20 2a 2a 2a 2a 2f 0a 20 20 65 78 70 6c 61  es ****/.  expla
1ad40 69 6e 43 6f 6d 70 6f 73 69 74 65 28 70 50 61 72  inComposite(pPar
1ad50 73 65 2c 20 70 2d 3e 6f 70 2c 20 69 53 75 62 31  se, p->op, iSub1
1ad60 2c 20 69 53 75 62 32 2c 20 30 29 3b 0a 20 20 72  , iSub2, 0);.  r
1ad70 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 6e 45  eturn pParse->nE
1ad80 72 72 21 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  rr!=0;.}.#endif.
1ad90 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
1ada0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
1adb0 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
1adc0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
1add0 29 0a 2f 2a 20 46 6f 72 77 61 72 64 20 44 65 63  )./* Forward Dec
1ade0 6c 61 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61  larations */.sta
1adf0 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45 78  tic void substEx
1ae00 70 72 4c 69 73 74 28 73 71 6c 69 74 65 33 2a 2c  prList(sqlite3*,
1ae10 20 45 78 70 72 4c 69 73 74 2a 2c 20 69 6e 74 2c   ExprList*, int,
1ae20 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74 61   ExprList*);.sta
1ae30 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 53 65  tic void substSe
1ae40 6c 65 63 74 28 73 71 6c 69 74 65 33 2a 2c 20 53  lect(sqlite3*, S
1ae50 65 6c 65 63 74 20 2a 2c 20 69 6e 74 2c 20 45 78  elect *, int, Ex
1ae60 70 72 4c 69 73 74 2a 2c 20 69 6e 74 29 3b 0a 0a  prList*, int);..
1ae70 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 72 6f 75  /*.** Scan throu
1ae80 67 68 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  gh the expressio
1ae90 6e 20 70 45 78 70 72 2e 20 20 52 65 70 6c 61 63  n pExpr.  Replac
1aea0 65 20 65 76 65 72 79 20 72 65 66 65 72 65 6e 63  e every referenc
1aeb0 65 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e  e to.** a column
1aec0 20 69 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65 72   in table number
1aed0 20 69 54 61 62 6c 65 20 77 69 74 68 20 61 20 63   iTable with a c
1aee0 6f 70 79 20 6f 66 20 74 68 65 20 69 43 6f 6c 75  opy of the iColu
1aef0 6d 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72 79 20 69  mn-th.** entry i
1af00 6e 20 70 45 4c 69 73 74 2e 20 20 28 42 75 74 20  n pEList.  (But 
1af10 6c 65 61 76 65 20 72 65 66 65 72 65 6e 63 65 73  leave references
1af20 20 74 6f 20 74 68 65 20 52 4f 57 49 44 20 63 6f   to the ROWID co
1af30 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67  lumn .** unchang
1af40 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ed.).**.** This 
1af50 72 6f 75 74 69 6e 65 20 69 73 20 70 61 72 74 20  routine is part 
1af60 6f 66 20 74 68 65 20 66 6c 61 74 74 65 6e 69 6e  of the flattenin
1af70 67 20 70 72 6f 63 65 64 75 72 65 2e 20 20 41 20  g procedure.  A 
1af80 73 75 62 71 75 65 72 79 0a 2a 2a 20 77 68 6f 73  subquery.** whos
1af90 65 20 72 65 73 75 6c 74 20 73 65 74 20 69 73 20  e result set is 
1afa0 64 65 66 69 6e 65 64 20 62 79 20 70 45 4c 69 73  defined by pELis
1afb0 74 20 61 70 70 65 61 72 73 20 61 73 20 65 6e 74  t appears as ent
1afc0 72 79 20 69 6e 20 74 68 65 0a 2a 2a 20 46 52 4f  ry in the.** FRO
1afd0 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45  M clause of a SE
1afe0 4c 45 43 54 20 73 75 63 68 20 74 68 61 74 20 74  LECT such that t
1aff0 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 61  he VDBE cursor a
1b000 73 73 69 67 6e 65 64 20 74 6f 20 74 68 61 74 0a  ssigned to that.
1b010 2a 2a 20 46 4f 52 4d 20 63 6c 61 75 73 65 20 65  ** FORM clause e
1b020 6e 74 72 79 20 69 73 20 69 54 61 62 6c 65 2e 20  ntry is iTable. 
1b030 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
1b040 6b 65 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  ke the necessary
1b050 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20   .** changes to 
1b060 70 45 78 70 72 20 73 6f 20 74 68 61 74 20 69 74  pExpr so that it
1b070 20 72 65 66 65 72 73 20 64 69 72 65 63 74 6c 79   refers directly
1b080 20 74 6f 20 74 68 65 20 73 6f 75 72 63 65 20 74   to the source t
1b090 61 62 6c 65 0a 2a 2a 20 6f 66 20 74 68 65 20 73  able.** of the s
1b0a0 75 62 71 75 65 72 79 20 72 61 74 68 65 72 20 74  ubquery rather t
1b0b0 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
1b0c0 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 2a   the subquery..*
1b0d0 2f 0a 73 74 61 74 69 63 20 45 78 70 72 20 2a 73  /.static Expr *s
1b0e0 75 62 73 74 45 78 70 72 28 0a 20 20 73 71 6c 69  ubstExpr(.  sqli
1b0f0 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
1b100 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63  /* Report malloc
1b110 20 65 72 72 6f 72 73 20 74 6f 20 74 68 69 73 20   errors to this 
1b120 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
1b130 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
1b140 20 20 20 20 2f 2a 20 45 78 70 72 20 69 6e 20 77      /* Expr in w
1b150 68 69 63 68 20 73 75 62 73 74 69 74 75 74 69 6f  hich substitutio
1b160 6e 20 6f 63 63 75 72 73 20 2a 2f 0a 20 20 69 6e  n occurs */.  in
1b170 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20  t iTable,       
1b180 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65    /* Table to be
1b190 20 73 75 62 73 74 69 74 75 74 65 64 20 2a 2f 0a   substituted */.
1b1a0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
1b1b0 73 74 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74  st    /* Substit
1b1c0 75 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ute expressions 
1b1d0 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 45 78 70  */.){.  if( pExp
1b1e0 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  r==0 ) return 0;
1b1f0 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
1b200 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  ==TK_COLUMN && p
1b210 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54  Expr->iTable==iT
1b220 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 66 28 20  able ){.    if( 
1b230 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30  pExpr->iColumn<0
1b240 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   ){.      pExpr-
1b250 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20  >op = TK_NULL;. 
1b260 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1b270 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20  Expr *pNew;.    
1b280 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74    assert( pEList
1b290 21 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 69 43  !=0 && pExpr->iC
1b2a0 6f 6c 75 6d 6e 3c 70 45 4c 69 73 74 2d 3e 6e 45  olumn<pEList->nE
1b2b0 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73  xpr );.      ass
1b2c0 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66  ert( pExpr->pLef
1b2d0 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70  t==0 && pExpr->p
1b2e0 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Right==0 );.    
1b2f0 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
1b300 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 4c 69  ExprDup(db, pELi
1b310 73 74 2d 3e 61 5b 70 45 78 70 72 2d 3e 69 43 6f  st->a[pExpr->iCo
1b320 6c 75 6d 6e 5d 2e 70 45 78 70 72 2c 20 30 29 3b  lumn].pExpr, 0);
1b330 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1b340 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78  prDelete(db, pEx
1b350 70 72 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  pr);.      pExpr
1b360 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 7d 0a 20   = pNew;.    }. 
1b370 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 45 78 70   }else{.    pExp
1b380 72 2d 3e 70 4c 65 66 74 20 3d 20 73 75 62 73 74  r->pLeft = subst
1b390 45 78 70 72 28 64 62 2c 20 70 45 78 70 72 2d 3e  Expr(db, pExpr->
1b3a0 70 4c 65 66 74 2c 20 69 54 61 62 6c 65 2c 20 70  pLeft, iTable, p
1b3b0 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 45 78 70  EList);.    pExp
1b3c0 72 2d 3e 70 52 69 67 68 74 20 3d 20 73 75 62 73  r->pRight = subs
1b3d0 74 45 78 70 72 28 64 62 2c 20 70 45 78 70 72 2d  tExpr(db, pExpr-
1b3e0 3e 70 52 69 67 68 74 2c 20 69 54 61 62 6c 65 2c  >pRight, iTable,
1b3f0 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 69 66   pEList);.    if
1b400 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
1b410 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
1b420 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
1b430 73 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20  substSelect(db, 
1b440 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
1b450 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
1b460 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 1);.    }else{
1b470 0a 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72  .      substExpr
1b480 4c 69 73 74 28 64 62 2c 20 70 45 78 70 72 2d 3e  List(db, pExpr->
1b490 78 2e 70 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c  x.pList, iTable,
1b4a0 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a   pEList);.    }.
1b4b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 45 78    }.  return pEx
1b4c0 70 72 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  pr;.}.static voi
1b4d0 64 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28  d substExprList(
1b4e0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
1b4f0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72          /* Repor
1b500 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20  t malloc errors 
1b510 68 65 72 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  here */.  ExprLi
1b520 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f  st *pList,     /
1b530 2a 20 4c 69 73 74 20 74 6f 20 73 63 61 6e 20 61  * List to scan a
1b540 6e 64 20 69 6e 20 77 68 69 63 68 20 74 6f 20 6d  nd in which to m
1b550 61 6b 65 20 73 75 62 73 74 69 74 75 74 65 73 20  ake substitutes 
1b560 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
1b570 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
1b580 6c 65 20 74 6f 20 62 65 20 73 75 62 73 74 69 74  le to be substit
1b590 75 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69  uted */.  ExprLi
1b5a0 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 20 2f  st *pEList     /
1b5b0 2a 20 53 75 62 73 74 69 74 75 74 65 20 76 61 6c  * Substitute val
1b5c0 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ues */.){.  int 
1b5d0 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  i;.  if( pList==
1b5e0 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
1b5f0 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
1b600 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
1b610 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
1b620 70 72 20 3d 20 73 75 62 73 74 45 78 70 72 28 64  pr = substExpr(d
1b630 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  b, pList->a[i].p
1b640 45 78 70 72 2c 20 69 54 61 62 6c 65 2c 20 70 45  Expr, iTable, pE
1b650 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61  List);.  }.}.sta
1b660 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 53 65  tic void substSe
1b670 6c 65 63 74 28 0a 20 20 73 71 6c 69 74 65 33 20  lect(.  sqlite3 
1b680 2a 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  *db,         /* 
1b690 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72  Report malloc er
1b6a0 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 53  rors here */.  S
1b6b0 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
1b6c0 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74      /* SELECT st
1b6d0 61 74 65 6d 65 6e 74 20 69 6e 20 77 68 69 63 68  atement in which
1b6e0 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74   to make substit
1b6f0 75 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  utions */.  int 
1b700 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
1b710 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20   /* Table to be 
1b720 72 65 70 6c 61 63 65 64 20 2a 2f 0a 20 20 45 78  replaced */.  Ex
1b730 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
1b740 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65     /* Substitute
1b750 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74   values */.  int
1b760 20 64 6f 50 72 69 6f 72 20 20 20 20 20 20 20 20   doPrior        
1b770 20 20 2f 2a 20 44 6f 20 73 75 62 73 74 69 74 75    /* Do substitu
1b780 74 65 73 20 6f 6e 20 70 2d 3e 70 50 72 69 6f 72  tes on p->pPrior
1b790 20 74 6f 6f 20 2a 2f 0a 29 7b 0a 20 20 53 72 63   too */.){.  Src
1b7a0 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 73 74  List *pSrc;.  st
1b7b0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1b7c0 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20  m *pItem;.  int 
1b7d0 69 3b 0a 20 20 69 66 28 20 21 70 20 29 20 72 65  i;.  if( !p ) re
1b7e0 74 75 72 6e 3b 0a 20 20 64 6f 7b 0a 20 20 20 20  turn;.  do{.    
1b7f0 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62  substExprList(db
1b800 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 69 54 61  , p->pEList, iTa
1b810 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
1b820 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
1b830 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c  db, p->pGroupBy,
1b840 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
1b850 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c  ;.    substExprL
1b860 69 73 74 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65  ist(db, p->pOrde
1b870 72 42 79 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  rBy, iTable, pEL
1b880 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 48 61  ist);.    p->pHa
1b890 76 69 6e 67 20 3d 20 73 75 62 73 74 45 78 70 72  ving = substExpr
1b8a0 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c  (db, p->pHaving,
1b8b0 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
1b8c0 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20  ;.    p->pWhere 
1b8d0 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20  = substExpr(db, 
1b8e0 70 2d 3e 70 57 68 65 72 65 2c 20 69 54 61 62 6c  p->pWhere, iTabl
1b8f0 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  e, pEList);.    
1b900 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
1b910 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63      assert( pSrc
1b920 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 69  !=0 );.    for(i
1b930 3d 70 53 72 63 2d 3e 6e 53 72 63 2c 20 70 49 74  =pSrc->nSrc, pIt
1b940 65 6d 3d 70 53 72 63 2d 3e 61 3b 20 69 3e 30 3b  em=pSrc->a; i>0;
1b950 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i--, pItem++){.
1b960 20 20 20 20 20 20 73 75 62 73 74 53 65 6c 65 63        substSelec
1b970 74 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 53 65  t(db, pItem->pSe
1b980 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  lect, iTable, pE
1b990 4c 69 73 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  List, 1);.      
1b9a0 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73  if( pItem->fg.is
1b9b0 54 61 62 46 75 6e 63 20 29 7b 0a 20 20 20 20 20  TabFunc ){.     
1b9c0 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74     substExprList
1b9d0 28 64 62 2c 20 70 49 74 65 6d 2d 3e 75 31 2e 70  (db, pItem->u1.p
1b9e0 46 75 6e 63 41 72 67 2c 20 69 54 61 62 6c 65 2c  FuncArg, iTable,
1b9f0 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20   pEList);.      
1ba00 7d 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65  }.    }.  }while
1ba10 28 20 64 6f 50 72 69 6f 72 20 26 26 20 28 70 20  ( doPrior && (p 
1ba20 3d 20 70 2d 3e 70 50 72 69 6f 72 29 21 3d 30 20  = p->pPrior)!=0 
1ba30 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  );.}.#endif /* !
1ba40 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1ba50 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
1ba60 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1ba70 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a  _OMIT_VIEW) */..
1ba80 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
1ba90 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
1baa0 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
1bab0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
1bac0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1bad0 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ine attempts to 
1bae0 66 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72 69  flatten subqueri
1baf0 65 73 20 61 73 20 61 20 70 65 72 66 6f 72 6d 61  es as a performa
1bb00 6e 63 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  nce optimization
1bb10 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
1bb20 65 20 72 65 74 75 72 6e 73 20 31 20 69 66 20 69  e returns 1 if i
1bb30 74 20 6d 61 6b 65 73 20 63 68 61 6e 67 65 73 20  t makes changes 
1bb40 61 6e 64 20 30 20 69 66 20 6e 6f 20 66 6c 61 74  and 0 if no flat
1bb50 74 65 6e 69 6e 67 20 6f 63 63 75 72 73 2e 0a 2a  tening occurs..*
1bb60 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74 61  *.** To understa
1bb70 6e 64 20 74 68 65 20 63 6f 6e 63 65 70 74 20 6f  nd the concept o
1bb80 66 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f  f flattening, co
1bb90 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f  nsider the follo
1bba0 77 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a  wing.** query:.*
1bbb0 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
1bbc0 61 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78  a FROM (SELECT x
1bbd0 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20  +y AS a FROM t1 
1bbe0 57 48 45 52 45 20 7a 3c 31 30 30 29 20 57 48 45  WHERE z<100) WHE
1bbf0 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65  RE a>5.**.** The
1bc00 20 64 65 66 61 75 6c 74 20 77 61 79 20 6f 66 20   default way of 
1bc10 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69  implementing thi
1bc20 73 20 71 75 65 72 79 20 69 73 20 74 6f 20 65 78  s query is to ex
1bc30 65 63 75 74 65 20 74 68 65 0a 2a 2a 20 73 75 62  ecute the.** sub
1bc40 71 75 65 72 79 20 66 69 72 73 74 20 61 6e 64 20  query first and 
1bc50 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
1bc60 73 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  s in a temporary
1bc70 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20   table, then.** 
1bc80 72 75 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75  run the outer qu
1bc90 65 72 79 20 6f 6e 20 74 68 61 74 20 74 65 6d 70  ery on that temp
1bca0 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 20 54 68  orary table.  Th
1bcb0 69 73 20 72 65 71 75 69 72 65 73 20 74 77 6f 0a  is requires two.
1bcc0 2a 2a 20 70 61 73 73 65 73 20 6f 76 65 72 20 74  ** passes over t
1bcd0 68 65 20 64 61 74 61 2e 20 20 46 75 72 74 68 65  he data.  Furthe
1bce0 72 6d 6f 72 65 2c 20 62 65 63 61 75 73 65 20 74  rmore, because t
1bcf0 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
1bd00 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64  le.** has no ind
1bd10 69 63 65 73 2c 20 74 68 65 20 57 48 45 52 45 20  ices, the WHERE 
1bd20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 6f 75  clause on the ou
1bd30 74 65 72 20 71 75 65 72 79 20 63 61 6e 6e 6f 74  ter query cannot
1bd40 20 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64   be.** optimized
1bd50 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1bd60 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f  tine attempts to
1bd70 20 72 65 77 72 69 74 65 20 71 75 65 72 69 65 73   rewrite queries
1bd80 20 73 75 63 68 20 61 73 20 74 68 65 20 61 62 6f   such as the abo
1bd90 76 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e  ve into.** a sin
1bda0 67 6c 65 20 66 6c 61 74 20 73 65 6c 65 63 74 2c  gle flat select,
1bdb0 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
1bdc0 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b 79  *     SELECT x+y
1bdd0 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48   AS a FROM t1 WH
1bde0 45 52 45 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e  ERE z<100 AND a>
1bdf0 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65  5.**.** The code
1be00 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74   generated for t
1be10 68 69 73 20 73 69 6d 70 6c 69 66 69 63 61 74 69  his simplificati
1be20 6f 6e 20 67 69 76 65 73 20 74 68 65 20 73 61 6d  on gives the sam
1be30 65 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20  e result.** but 
1be40 6f 6e 6c 79 20 68 61 73 20 74 6f 20 73 63 61 6e  only has to scan
1be50 20 74 68 65 20 64 61 74 61 20 6f 6e 63 65 2e 20   the data once. 
1be60 20 41 6e 64 20 62 65 63 61 75 73 65 20 69 6e 64   And because ind
1be70 69 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65  ices might .** e
1be80 78 69 73 74 20 6f 6e 20 74 68 65 20 74 61 62 6c  xist on the tabl
1be90 65 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65  e t1, a complete
1bea0 20 73 63 61 6e 20 6f 66 20 74 68 65 20 64 61 74   scan of the dat
1beb0 61 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 76  a might be.** av
1bec0 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61  oided..**.** Fla
1bed0 74 74 65 6e 69 6e 67 20 69 73 20 6f 6e 6c 79 20  ttening is only 
1bee0 61 74 74 65 6d 70 74 65 64 20 69 66 20 61 6c 6c  attempted if all
1bef0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1bf00 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a  g are true:.**.*
1bf10 2a 20 20 20 28 31 29 20 20 54 68 65 20 73 75 62  *   (1)  The sub
1bf20 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75  query and the ou
1bf30 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74  ter query do not
1bf40 20 62 6f 74 68 20 75 73 65 20 61 67 67 72 65 67   both use aggreg
1bf50 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32  ates..**.**   (2
1bf60 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
1bf70 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67  is not an aggreg
1bf80 61 74 65 20 6f 72 20 28 32 61 29 20 74 68 65 20  ate or (2a) the 
1bf90 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
1bfa0 6f 74 20 61 20 6a 6f 69 6e 0a 2a 2a 20 20 20 20  ot a join.**    
1bfb0 20 20 20 20 61 6e 64 20 28 32 62 29 20 74 68 65      and (2b) the
1bfc0 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65   outer query doe
1bfd0 73 20 6e 6f 74 20 75 73 65 20 73 75 62 71 75 65  s not use subque
1bfe0 72 69 65 73 20 6f 74 68 65 72 20 74 68 61 6e 20  ries other than 
1bff0 74 68 65 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 20  the one.**      
1c000 20 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75    FROM-clause su
1c010 62 71 75 65 72 79 20 74 68 61 74 20 69 73 20 61  bquery that is a
1c020 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 66   candidate for f
1c030 6c 61 74 74 65 6e 69 6e 67 2e 20 20 28 32 62 20  lattening.  (2b 
1c040 69 73 0a 2a 2a 20 20 20 20 20 20 20 20 64 75 65  is.**        due
1c050 20 74 6f 20 74 69 63 6b 65 74 20 5b 32 66 37 31   to ticket [2f71
1c060 37 30 64 37 33 62 66 39 61 62 66 38 30 5d 20 66  70d73bf9abf80] f
1c070 72 6f 6d 20 32 30 31 35 2d 30 32 2d 30 39 2e 29  rom 2015-02-09.)
1c080 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 20 54 68  .**.**   (3)  Th
1c090 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f  e subquery is no
1c0a0 74 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  t the right oper
1c0b0 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f 75  and of a left ou
1c0c0 74 65 72 20 6a 6f 69 6e 0a 2a 2a 20 20 20 20 20  ter join.**     
1c0d0 20 20 20 28 4f 72 69 67 69 6e 61 6c 6c 79 20 74     (Originally t
1c0e0 69 63 6b 65 74 20 23 33 30 36 2e 20 20 53 74 72  icket #306.  Str
1c0f0 65 6e 67 74 68 65 6e 65 64 20 62 79 20 74 69 63  engthened by tic
1c100 6b 65 74 20 23 33 33 30 30 29 0a 2a 2a 0a 2a 2a  ket #3300).**.**
1c110 20 20 20 28 34 29 20 20 54 68 65 20 73 75 62 71     (4)  The subq
1c120 75 65 72 79 20 69 73 20 6e 6f 74 20 44 49 53 54  uery is not DIST
1c130 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a  INCT..**.**  (**
1c140 29 20 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20  )  At one point 
1c150 72 65 73 74 72 69 63 74 69 6f 6e 73 20 28 34 29  restrictions (4)
1c160 20 61 6e 64 20 28 35 29 20 64 65 66 69 6e 65 64   and (5) defined
1c170 20 61 20 73 75 62 73 65 74 20 6f 66 20 44 49 53   a subset of DIS
1c180 54 49 4e 43 54 0a 2a 2a 20 20 20 20 20 20 20 20  TINCT.**        
1c190 73 75 62 2d 71 75 65 72 69 65 73 20 74 68 61 74  sub-queries that
1c1a0 20 77 65 72 65 20 65 78 63 6c 75 64 65 64 20 66   were excluded f
1c1b0 72 6f 6d 20 74 68 69 73 20 6f 70 74 69 6d 69 7a  rom this optimiz
1c1c0 61 74 69 6f 6e 2e 20 52 65 73 74 72 69 63 74 69  ation. Restricti
1c1d0 6f 6e 20 0a 2a 2a 20 20 20 20 20 20 20 20 28 34  on .**        (4
1c1e0 29 20 68 61 73 20 73 69 6e 63 65 20 62 65 65 6e  ) has since been
1c1f0 20 65 78 70 61 6e 64 65 64 20 74 6f 20 65 78 63   expanded to exc
1c200 6c 75 64 65 20 61 6c 6c 20 44 49 53 54 49 4e 43  lude all DISTINC
1c210 54 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a  T subqueries..**
1c220 0a 2a 2a 20 20 20 28 36 29 20 20 54 68 65 20 73  .**   (6)  The s
1c230 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
1c240 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73 20   use aggregates 
1c250 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
1c260 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20  ry is not.**    
1c270 20 20 20 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a      DISTINCT..**
1c280 0a 2a 2a 20 20 20 28 37 29 20 20 54 68 65 20 73  .**   (7)  The s
1c290 75 62 71 75 65 72 79 20 68 61 73 20 61 20 46 52  ubquery has a FR
1c2a0 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 4f 44 4f  OM clause.  TODO
1c2b0 3a 20 20 46 6f 72 20 73 75 62 71 75 65 72 69 65  :  For subquerie
1c2c0 73 20 77 69 74 68 6f 75 74 0a 2a 2a 20 20 20 20  s without.**    
1c2d0 20 20 20 20 41 20 46 52 4f 4d 20 63 6c 61 75 73      A FROM claus
1c2e0 65 2c 20 63 6f 6e 73 69 64 65 72 20 61 64 64 69  e, consider addi
1c2f0 6e 67 20 61 20 46 52 4f 4d 20 63 6c 6f 73 65 20  ng a FROM close 
1c300 77 69 74 68 20 74 68 65 20 73 70 65 63 69 61 6c  with the special
1c310 0a 2a 2a 20 20 20 20 20 20 20 20 74 61 62 6c 65  .**        table
1c320 20 73 71 6c 69 74 65 5f 6f 6e 63 65 20 74 68 61   sqlite_once tha
1c330 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20  t consists of a 
1c340 73 69 6e 67 6c 65 20 72 6f 77 20 63 6f 6e 74 61  single row conta
1c350 69 6e 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20  ining a.**      
1c360 20 20 73 69 6e 67 6c 65 20 4e 55 4c 4c 2e 0a 2a    single NULL..*
1c370 2a 0a 2a 2a 20 20 20 28 38 29 20 20 54 68 65 20  *.**   (8)  The 
1c380 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
1c390 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74  t use LIMIT or t
1c3a0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
1c3b0 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a  s not a join..**
1c3c0 0a 2a 2a 20 20 20 28 39 29 20 20 54 68 65 20 73  .**   (9)  The s
1c3d0 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
1c3e0 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68   use LIMIT or th
1c3f0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
1c400 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20  es not use.**   
1c410 20 20 20 20 20 61 67 67 72 65 67 61 74 65 73 2e       aggregates.
1c420 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 52 65  .**.**  (**)  Re
1c430 73 74 72 69 63 74 69 6f 6e 20 28 31 30 29 20 77  striction (10) w
1c440 61 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  as removed from 
1c450 74 68 65 20 63 6f 64 65 20 6f 6e 20 32 30 30 35  the code on 2005
1c460 2d 30 32 2d 30 35 20 62 75 74 20 77 65 0a 2a 2a  -02-05 but we.**
1c470 20 20 20 20 20 20 20 20 61 63 63 69 64 65 6e 74          accident
1c480 6c 79 20 63 61 72 72 69 65 64 20 74 68 65 20 63  ly carried the c
1c490 6f 6d 6d 65 6e 74 20 66 6f 72 77 61 72 64 20 75  omment forward u
1c4a0 6e 74 69 6c 20 32 30 31 34 2d 30 39 2d 31 35 2e  ntil 2014-09-15.
1c4b0 20 20 4f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20    Original.**   
1c4c0 20 20 20 20 20 74 65 78 74 3a 20 22 54 68 65 20       text: "The 
1c4d0 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
1c4e0 74 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73  t use aggregates
1c4f0 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
1c500 65 72 79 20 0a 2a 2a 20 20 20 20 20 20 20 20 64  ery .**        d
1c510 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49  oes not use LIMI
1c520 54 2e 22 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20  T.".**.**  (11) 
1c530 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e   The subquery an
1c540 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  d the outer quer
1c550 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 68 61  y do not both ha
1c560 76 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  ve ORDER BY clau
1c570 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29  ses..**.**  (**)
1c580 20 20 4e 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65    Not implemente
1c590 64 2e 20 20 53 75 62 73 75 6d 65 64 20 69 6e 74  d.  Subsumed int
1c5a0 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 33  o restriction (3
1c5b0 29 2e 20 20 57 61 73 20 70 72 65 76 69 6f 75 73  ).  Was previous
1c5c0 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 61 20 73  ly.**        a s
1c5d0 65 70 61 72 61 74 65 20 72 65 73 74 72 69 63 74  eparate restrict
1c5e0 69 6f 6e 20 64 65 72 69 76 69 6e 67 20 66 72 6f  ion deriving fro
1c5f0 6d 20 74 69 63 6b 65 74 20 23 33 35 30 2e 0a 2a  m ticket #350..*
1c600 2a 0a 2a 2a 20 20 28 31 33 29 20 20 54 68 65 20  *.**  (13)  The 
1c610 73 75 62 71 75 65 72 79 20 61 6e 64 20 6f 75 74  subquery and out
1c620 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20  er query do not 
1c630 62 6f 74 68 20 75 73 65 20 4c 49 4d 49 54 2e 0a  both use LIMIT..
1c640 2a 2a 0a 2a 2a 20 20 28 31 34 29 20 20 54 68 65  **.**  (14)  The
1c650 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
1c660 6f 74 20 75 73 65 20 4f 46 46 53 45 54 2e 0a 2a  ot use OFFSET..*
1c670 2a 0a 2a 2a 20 20 28 31 35 29 20 20 54 68 65 20  *.**  (15)  The 
1c680 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
1c690 6f 74 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d  ot part of a com
1c6a0 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 6f 72 20  pound select or 
1c6b0 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 75  the.**        su
1c6c0 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
1c6d0 68 61 76 65 20 61 20 4c 49 4d 49 54 20 63 6c 61  have a LIMIT cla
1c6e0 75 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 28  use..**        (
1c6f0 53 65 65 20 74 69 63 6b 65 74 20 23 32 33 33 39  See ticket #2339
1c700 20 61 6e 64 20 74 69 63 6b 65 74 20 5b 30 32 61   and ticket [02a
1c710 38 65 38 31 64 34 34 5d 29 2e 0a 2a 2a 0a 2a 2a  8e81d44])..**.**
1c720 20 20 28 31 36 29 20 20 54 68 65 20 6f 75 74 65    (16)  The oute
1c730 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  r query is not a
1c740 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 74  n aggregate or t
1c750 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
1c760 0a 2a 2a 20 20 20 20 20 20 20 20 6e 6f 74 20 63  .**        not c
1c770 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20 42 59 2e  ontain ORDER BY.
1c780 20 20 28 54 69 63 6b 65 74 20 23 32 39 34 32 29    (Ticket #2942)
1c790 20 20 54 68 69 73 20 75 73 65 64 20 74 6f 20 6e    This used to n
1c7a0 6f 74 20 6d 61 74 74 65 72 0a 2a 2a 20 20 20 20  ot matter.**    
1c7b0 20 20 20 20 75 6e 74 69 6c 20 77 65 20 69 6e 74      until we int
1c7c0 72 6f 64 75 63 65 64 20 74 68 65 20 67 72 6f 75  roduced the grou
1c7d0 70 5f 63 6f 6e 63 61 74 28 29 20 66 75 6e 63 74  p_concat() funct
1c7e0 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20 20 28 31  ion.  .**.**  (1
1c7f0 37 29 20 20 54 68 65 20 73 75 62 2d 71 75 65 72  7)  The sub-quer
1c800 79 20 69 73 20 6e 6f 74 20 61 20 63 6f 6d 70 6f  y is not a compo
1c810 75 6e 64 20 73 65 6c 65 63 74 2c 20 6f 72 20 69  und select, or i
1c820 74 20 69 73 20 61 20 55 4e 49 4f 4e 20 41 4c 4c  t is a UNION ALL
1c830 20 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f 6d 70   .**        comp
1c840 6f 75 6e 64 20 63 6c 61 75 73 65 20 6d 61 64 65  ound clause made
1c850 20 75 70 20 65 6e 74 69 72 65 6c 79 20 6f 66 20   up entirely of 
1c860 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 71 75  non-aggregate qu
1c870 65 72 69 65 73 2c 20 61 6e 64 20 0a 2a 2a 20 20  eries, and .**  
1c880 20 20 20 20 20 20 74 68 65 20 70 61 72 65 6e 74        the parent
1c890 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20   query:.**.**   
1c8a0 20 20 20 20 20 20 20 2a 20 69 73 20 6e 6f 74 20         * is not 
1c8b0 69 74 73 65 6c 66 20 70 61 72 74 20 6f 66 20 61  itself part of a
1c8c0 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
1c8d0 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2a 20  ,.**          * 
1c8e0 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67  is not an aggreg
1c8f0 61 74 65 20 6f 72 20 44 49 53 54 49 4e 43 54 20  ate or DISTINCT 
1c900 71 75 65 72 79 2c 20 61 6e 64 0a 2a 2a 20 20 20  query, and.**   
1c910 20 20 20 20 20 20 20 2a 20 69 73 20 6e 6f 74 20         * is not 
1c920 61 20 6a 6f 69 6e 0a 2a 2a 0a 2a 2a 20 20 20 20  a join.**.**    
1c930 20 20 20 20 54 68 65 20 70 61 72 65 6e 74 20 61      The parent a
1c940 6e 64 20 73 75 62 2d 71 75 65 72 79 20 6d 61 79  nd sub-query may
1c950 20 63 6f 6e 74 61 69 6e 20 57 48 45 52 45 20 63   contain WHERE c
1c960 6c 61 75 73 65 73 2e 20 53 75 62 6a 65 63 74 20  lauses. Subject 
1c970 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 72 75 6c  to.**        rul
1c980 65 73 20 28 31 31 29 2c 20 28 31 33 29 20 61 6e  es (11), (13) an
1c990 64 20 28 31 34 29 2c 20 74 68 65 79 20 6d 61 79  d (14), they may
1c9a0 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 20 4f 52   also contain OR
1c9b0 44 45 52 20 42 59 2c 0a 2a 2a 20 20 20 20 20 20  DER BY,.**      
1c9c0 20 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53    LIMIT and OFFS
1c9d0 45 54 20 63 6c 61 75 73 65 73 2e 20 20 54 68 65  ET clauses.  The
1c9e0 20 73 75 62 71 75 65 72 79 20 63 61 6e 6e 6f 74   subquery cannot
1c9f0 20 75 73 65 20 61 6e 79 20 63 6f 6d 70 6f 75 6e   use any compoun
1ca00 64 0a 2a 2a 20 20 20 20 20 20 20 20 6f 70 65 72  d.**        oper
1ca10 61 74 6f 72 20 6f 74 68 65 72 20 74 68 61 6e 20  ator other than 
1ca20 55 4e 49 4f 4e 20 41 4c 4c 20 62 65 63 61 75 73  UNION ALL becaus
1ca30 65 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20  e all the other 
1ca40 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20  compound.**     
1ca50 20 20 20 6f 70 65 72 61 74 6f 72 73 20 68 61 76     operators hav
1ca60 65 20 61 6e 20 69 6d 70 6c 69 65 64 20 44 49 53  e an implied DIS
1ca70 54 49 4e 43 54 20 77 68 69 63 68 20 69 73 20 64  TINCT which is d
1ca80 69 73 61 6c 6c 6f 77 65 64 20 62 79 0a 2a 2a 20  isallowed by.** 
1ca90 20 20 20 20 20 20 20 72 65 73 74 72 69 63 74 69         restricti
1caa0 6f 6e 20 28 34 29 2e 0a 2a 2a 0a 2a 2a 20 20 20  on (4)..**.**   
1cab0 20 20 20 20 20 41 6c 73 6f 2c 20 65 61 63 68 20       Also, each 
1cac0 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20 74 68 65  component of the
1cad0 20 73 75 62 2d 71 75 65 72 79 20 6d 75 73 74 20   sub-query must 
1cae0 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20  return the same 
1caf0 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 20 20 20 20  number.**       
1cb00 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d   of result colum
1cb10 6e 73 2e 20 54 68 69 73 20 69 73 20 61 63 74 75  ns. This is actu
1cb20 61 6c 6c 79 20 61 20 72 65 71 75 69 72 65 6d 65  ally a requireme
1cb30 6e 74 20 66 6f 72 20 61 6e 79 20 63 6f 6d 70 6f  nt for any compo
1cb40 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 53 45  und.**        SE
1cb50 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20  LECT statement, 
1cb60 62 75 74 20 61 6c 6c 20 74 68 65 20 63 6f 64 65  but all the code
1cb70 20 68 65 72 65 20 64 6f 65 73 20 69 73 20 6d 61   here does is ma
1cb80 6b 65 20 73 75 72 65 20 74 68 61 74 20 6e 6f 0a  ke sure that no.
1cb90 2a 2a 20 20 20 20 20 20 20 20 73 75 63 68 20 28  **        such (
1cba0 69 6c 6c 65 67 61 6c 29 20 73 75 62 2d 71 75 65  illegal) sub-que
1cbb0 72 79 20 69 73 20 66 6c 61 74 74 65 6e 65 64 2e  ry is flattened.
1cbc0 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   The caller will
1cbd0 20 64 65 74 65 63 74 20 74 68 65 0a 2a 2a 20 20   detect the.**  
1cbe0 20 20 20 20 20 20 73 79 6e 74 61 78 20 65 72 72        syntax err
1cbf0 6f 72 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  or and return a 
1cc00 64 65 74 61 69 6c 65 64 20 6d 65 73 73 61 67 65  detailed message
1cc10 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 38 29 20 20 49  ..**.**  (18)  I
1cc20 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20  f the sub-query 
1cc30 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65  is a compound se
1cc40 6c 65 63 74 2c 20 74 68 65 6e 20 61 6c 6c 20 74  lect, then all t
1cc50 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 20  erms of the.**  
1cc60 20 20 20 20 20 20 4f 52 44 45 52 20 62 79 20 63        ORDER by c
1cc70 6c 61 75 73 65 20 6f 66 20 74 68 65 20 70 61 72  lause of the par
1cc80 65 6e 74 20 6d 75 73 74 20 62 65 20 73 69 6d 70  ent must be simp
1cc90 6c 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  le references to
1cca0 20 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f 6c 75   .**        colu
1ccb0 6d 6e 73 20 6f 66 20 74 68 65 20 73 75 62 2d 71  mns of the sub-q
1ccc0 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 39  uery..**.**  (19
1ccd0 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
1cce0 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d  does not use LIM
1ccf0 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  IT or the outer 
1cd00 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a  query does not.*
1cd10 2a 20 20 20 20 20 20 20 20 68 61 76 65 20 61 20  *        have a 
1cd20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a  WHERE clause..**
1cd30 0a 2a 2a 20 20 28 32 30 29 20 20 49 66 20 74 68  .**  (20)  If th
1cd40 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61  e sub-query is a
1cd50 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
1cd60 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74 20 6e  , then it must n
1cd70 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20  ot use.**       
1cd80 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
1cd90 75 73 65 2e 20 20 54 69 63 6b 65 74 20 23 33 37  use.  Ticket #37
1cda0 37 33 2e 20 20 57 65 20 63 6f 75 6c 64 20 72 65  73.  We could re
1cdb0 6c 61 78 20 74 68 69 73 20 63 6f 6e 73 74 72 61  lax this constra
1cdc0 69 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 73 6f  int.**        so
1cdd0 6d 65 77 68 61 74 20 62 79 20 73 61 79 69 6e 67  mewhat by saying
1cde0 20 74 68 61 74 20 74 68 65 20 74 65 72 6d 73 20   that the terms 
1cdf0 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
1ce00 63 6c 61 75 73 65 20 6d 75 73 74 0a 2a 2a 20 20  clause must.**  
1ce10 20 20 20 20 20 20 61 70 70 65 61 72 20 61 73 20        appear as 
1ce20 75 6e 6d 6f 64 69 66 69 65 64 20 72 65 73 75 6c  unmodified resul
1ce30 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  t columns in the
1ce40 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42   outer query.  B
1ce50 75 74 20 77 65 0a 2a 2a 20 20 20 20 20 20 20 20  ut we.**        
1ce60 68 61 76 65 20 6f 74 68 65 72 20 6f 70 74 69 6d  have other optim
1ce70 69 7a 61 74 69 6f 6e 73 20 69 6e 20 6d 69 6e 64  izations in mind
1ce80 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 74 68   to deal with th
1ce90 61 74 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20  at case..**.**  
1cea0 28 32 31 29 20 20 54 68 65 20 73 75 62 71 75 65  (21)  The subque
1ceb0 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
1cec0 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74  LIMIT or the out
1ced0 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 0a  er query is not.
1cee0 2a 2a 20 20 20 20 20 20 20 20 44 49 53 54 49 4e  **        DISTIN
1cef0 43 54 2e 20 20 28 53 65 65 20 74 69 63 6b 65 74  CT.  (See ticket
1cf00 20 5b 37 35 32 65 31 36 34 36 66 63 5d 29 2e 0a   [752e1646fc])..
1cf10 2a 2a 0a 2a 2a 20 20 28 32 32 29 20 20 54 68 65  **.**  (22)  The
1cf20 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
1cf30 20 61 20 72 65 63 75 72 73 69 76 65 20 43 54 45   a recursive CTE
1cf40 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 33 29 20 20 54  ..**.**  (23)  T
1cf50 68 65 20 70 61 72 65 6e 74 20 69 73 20 6e 6f 74  he parent is not
1cf60 20 61 20 72 65 63 75 72 73 69 76 65 20 43 54 45   a recursive CTE
1cf70 2c 20 6f 72 20 74 68 65 20 73 75 62 2d 71 75 65  , or the sub-que
1cf80 72 79 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 20  ry is not a.**  
1cf90 20 20 20 20 20 20 63 6f 6d 70 6f 75 6e 64 20 71        compound q
1cfa0 75 65 72 79 2e 20 54 68 69 73 20 72 65 73 74 72  uery. This restr
1cfb0 69 63 74 69 6f 6e 20 69 73 20 62 65 63 61 75 73  iction is becaus
1cfc0 65 20 74 72 61 6e 73 66 6f 72 6d 69 6e 67 20 74  e transforming t
1cfd0 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 70 61 72  he.**        par
1cfe0 65 6e 74 20 74 6f 20 61 20 63 6f 6d 70 6f 75 6e  ent to a compoun
1cff0 64 20 71 75 65 72 79 20 63 6f 6e 66 75 73 65 73  d query confuses
1d000 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 68   the code that h
1d010 61 6e 64 6c 65 73 0a 2a 2a 20 20 20 20 20 20 20  andles.**       
1d020 20 72 65 63 75 72 73 69 76 65 20 71 75 65 72 69   recursive queri
1d030 65 73 20 69 6e 20 6d 75 6c 74 69 53 65 6c 65 63  es in multiSelec
1d040 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 34 29  t()..**.**  (24)
1d050 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
1d060 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61  s not an aggrega
1d070 74 65 20 74 68 61 74 20 75 73 65 73 20 74 68 65  te that uses the
1d080 20 62 75 69 6c 74 2d 69 6e 20 6d 69 6e 28 29 20   built-in min() 
1d090 6f 72 20 0a 2a 2a 20 20 20 20 20 20 20 20 6f 72  or .**        or
1d0a0 20 6d 61 78 28 29 20 66 75 6e 63 74 69 6f 6e 73   max() functions
1d0b0 2e 20 20 28 57 69 74 68 6f 75 74 20 74 68 69 73  .  (Without this
1d0c0 20 72 65 73 74 72 69 63 74 69 6f 6e 2c 20 61 20   restriction, a 
1d0d0 71 75 65 72 79 20 6c 69 6b 65 3a 0a 2a 2a 20 20  query like:.**  
1d0e0 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 78 20        "SELECT x 
1d0f0 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 6d 61 78  FROM (SELECT max
1d100 28 79 29 2c 20 78 20 46 52 4f 4d 20 74 31 29 22  (y), x FROM t1)"
1d110 20 77 6f 75 6c 64 20 6e 6f 74 20 6e 65 63 65 73   would not neces
1d120 73 61 72 69 6c 79 0a 2a 2a 20 20 20 20 20 20 20  sarily.**       
1d130 20 72 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   return the valu
1d140 65 20 58 20 66 6f 72 20 77 68 69 63 68 20 59 20  e X for which Y 
1d150 77 61 73 20 6d 61 78 69 6d 61 6c 2e 29 0a 2a 2a  was maximal.).**
1d160 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 72  .**.** In this r
1d170 6f 75 74 69 6e 65 2c 20 74 68 65 20 22 70 22 20  outine, the "p" 
1d180 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 70  parameter is a p
1d190 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6f 75  ointer to the ou
1d1a0 74 65 72 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68  ter query..** Th
1d1b0 65 20 73 75 62 71 75 65 72 79 20 69 73 20 70 2d  e subquery is p-
1d1c0 3e 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e  >pSrc->a[iFrom].
1d1d0 20 20 69 73 41 67 67 20 69 73 20 74 72 75 65 20    isAgg is true 
1d1e0 69 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  if the outer que
1d1f0 72 79 0a 2a 2a 20 75 73 65 73 20 61 67 67 72 65  ry.** uses aggre
1d200 67 61 74 65 73 20 61 6e 64 20 73 75 62 71 75 65  gates and subque
1d210 72 79 49 73 41 67 67 20 69 73 20 74 72 75 65 20  ryIsAgg is true 
1d220 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  if the subquery 
1d230 75 73 65 73 20 61 67 67 72 65 67 61 74 65 73 2e  uses aggregates.
1d240 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65  .**.** If flatte
1d250 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61 74 74 65  ning is not atte
1d260 6d 70 74 65 64 2c 20 74 68 69 73 20 72 6f 75 74  mpted, this rout
1d270 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 61  ine is a no-op a
1d280 6e 64 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a  nd returns 0..**
1d290 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69   If flattening i
1d2a0 73 20 61 74 74 65 6d 70 74 65 64 20 74 68 69 73  s attempted this
1d2b0 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
1d2c0 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66   1..**.** All of
1d2d0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
1d2e0 61 6e 61 6c 79 73 69 73 20 6d 75 73 74 20 6f 63  analysis must oc
1d2f0 63 75 72 20 6f 6e 20 62 6f 74 68 20 74 68 65 20  cur on both the 
1d300 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64 0a  outer query and.
1d310 2a 2a 20 74 68 65 20 73 75 62 71 75 65 72 79 20  ** the subquery 
1d320 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74  before this rout
1d330 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61  ine runs..*/.sta
1d340 74 69 63 20 69 6e 74 20 66 6c 61 74 74 65 6e 53  tic int flattenS
1d350 75 62 71 75 65 72 79 28 0a 20 20 50 61 72 73 65  ubquery(.  Parse
1d360 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
1d370 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
1d380 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
1d390 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  p,           /* 
1d3a0 54 68 65 20 70 61 72 65 6e 74 20 6f 72 20 6f 75  The parent or ou
1d3b0 74 65 72 20 53 45 4c 45 43 54 20 73 74 61 74 65  ter SELECT state
1d3c0 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46  ment */.  int iF
1d3d0 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20 2f  rom,           /
1d3e0 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e 70 53  * Index in p->pS
1d3f0 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20 69  rc->a[] of the i
1d400 6e 6e 65 72 20 73 75 62 71 75 65 72 79 20 2a 2f  nner subquery */
1d410 0a 20 20 69 6e 74 20 69 73 41 67 67 2c 20 20 20  .  int isAgg,   
1d420 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1d430 69 66 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20  if outer SELECT 
1d440 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66  uses aggregate f
1d450 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e  unctions */.  in
1d460 74 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  t subqueryIsAgg 
1d470 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
1d480 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20  e subquery uses 
1d490 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
1d4a0 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  ons */.){.  cons
1d4b0 74 20 63 68 61 72 20 2a 7a 53 61 76 65 64 41 75  t char *zSavedAu
1d4c0 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 50 61 72  thContext = pPar
1d4d0 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74  se->zAuthContext
1d4e0 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 61 72  ;.  Select *pPar
1d4f0 65 6e 74 3b 20 20 20 20 2f 2a 20 43 75 72 72 65  ent;    /* Curre
1d500 6e 74 20 55 4e 49 4f 4e 20 41 4c 4c 20 74 65 72  nt UNION ALL ter
1d510 6d 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20 71  m of the other q
1d520 75 65 72 79 20 2a 2f 0a 20 20 53 65 6c 65 63 74  uery */.  Select
1d530 20 2a 70 53 75 62 3b 20 20 20 20 20 20 20 2f 2a   *pSub;       /*
1d540 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79   The inner query
1d550 20 6f 72 20 22 73 75 62 71 75 65 72 79 22 20 2a   or "subquery" *
1d560 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62  /.  Select *pSub
1d570 31 3b 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74  1;      /* Point
1d580 65 72 20 74 6f 20 74 68 65 20 72 69 67 68 74 6d  er to the rightm
1d590 6f 73 74 20 73 65 6c 65 63 74 20 69 6e 20 73 75  ost select in su
1d5a0 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63  b-query */.  Src
1d5b0 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20  List *pSrc;     
1d5c0 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
1d5d0 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
1d5e0 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c   query */.  SrcL
1d5f0 69 73 74 20 2a 70 53 75 62 53 72 63 3b 20 20 20  ist *pSubSrc;   
1d600 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
1d610 73 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  se of the subque
1d620 72 79 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  ry */.  ExprList
1d630 20 2a 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54   *pList;    /* T
1d640 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
1d650 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1d660 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e   */.  int iParen
1d670 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 44 42  t;        /* VDB
1d680 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  E cursor number 
1d690 6f 66 20 74 68 65 20 70 53 75 62 20 72 65 73 75  of the pSub resu
1d6a0 6c 74 20 73 65 74 20 74 65 6d 70 20 74 61 62 6c  lt set temp tabl
1d6b0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  e */.  int i;   
1d6c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
1d6d0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
1d6e0 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20  Expr *pWhere;   
1d6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d700 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
1d710 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  ause */.  struct
1d720 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1d730 53 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20 54 68  Subitem;   /* Th
1d740 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  e subquery */.  
1d750 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
1d760 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20  arse->db;..  /* 
1d770 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
1d780 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65  flattening is pe
1d790 72 6d 69 74 74 65 64 2e 20 20 52 65 74 75 72 6e  rmitted.  Return
1d7a0 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a   0 if not..  */.
1d7b0 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
1d7c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
1d7d0 50 72 69 6f 72 3d 3d 30 20 29 3b 20 20 2f 2a 20  Prior==0 );  /* 
1d7e0 55 6e 61 62 6c 65 20 74 6f 20 66 6c 61 74 74 65  Unable to flatte
1d7f0 6e 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 69  n compound queri
1d800 65 73 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69  es */.  if( Opti
1d810 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64  mizationDisabled
1d820 28 64 62 2c 20 53 51 4c 49 54 45 5f 51 75 65 72  (db, SQLITE_Quer
1d830 79 46 6c 61 74 74 65 6e 65 72 29 20 29 20 72 65  yFlattener) ) re
1d840 74 75 72 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d  turn 0;.  pSrc =
1d850 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65   p->pSrc;.  asse
1d860 72 74 28 20 70 53 72 63 20 26 26 20 69 46 72 6f  rt( pSrc && iFro
1d870 6d 3e 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70 53  m>=0 && iFrom<pS
1d880 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53  rc->nSrc );.  pS
1d890 75 62 69 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e  ubitem = &pSrc->
1d8a0 61 5b 69 46 72 6f 6d 5d 3b 0a 20 20 69 50 61 72  a[iFrom];.  iPar
1d8b0 65 6e 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  ent = pSubitem->
1d8c0 69 43 75 72 73 6f 72 3b 0a 20 20 70 53 75 62 20  iCursor;.  pSub 
1d8d0 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c  = pSubitem->pSel
1d8e0 65 63 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ect;.  assert( p
1d8f0 53 75 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  Sub!=0 );.  if( 
1d900 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29 7b  subqueryIsAgg ){
1d910 0a 20 20 20 20 69 66 28 20 69 73 41 67 67 20 29  .    if( isAgg )
1d920 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1d930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d940 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
1d950 74 72 69 63 74 69 6f 6e 20 28 31 29 20 20 20 2a  triction (1)   *
1d960 2f 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e  /.    if( pSrc->
1d970 6e 53 72 63 3e 31 20 29 20 72 65 74 75 72 6e 20  nSrc>1 ) return 
1d980 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1d990 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1d9a0 73 74 72 69 63 74 69 6f 6e 20 28 32 61 29 20 20  striction (2a)  
1d9b0 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 70  */.    if( (p->p
1d9c0 57 68 65 72 65 20 26 26 20 45 78 70 72 48 61 73  Where && ExprHas
1d9d0 50 72 6f 70 65 72 74 79 28 70 2d 3e 70 57 68 65  Property(p->pWhe
1d9e0 72 65 2c 45 50 5f 53 75 62 71 75 65 72 79 29 29  re,EP_Subquery))
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 45 4c 69 73 74 29 20 26 20 45 50 5f 53  ->pEList) & EP_S
1da20 75 62 71 75 65 72 79 29 21 3d 30 0a 20 20 20 20  ubquery)!=0.    
1da30 20 7c 7c 20 28 73 71 6c 69 74 65 33 45 78 70 72   || (sqlite3Expr
1da40 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e 70 4f 72  ListFlags(p->pOr
1da50 64 65 72 42 79 29 20 26 20 45 50 5f 53 75 62 71  derBy) & EP_Subq
1da60 75 65 72 79 29 21 3d 30 0a 20 20 20 20 29 7b 0a  uery)!=0.    ){.
1da70 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20        return 0; 
1da80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1daa0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
1dab0 72 69 63 74 69 6f 6e 20 28 32 62 29 20 20 2a 2f  riction (2b)  */
1dac0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 20 20 0a  .    }.  }.    .
1dad0 20 20 70 53 75 62 53 72 63 20 3d 20 70 53 75 62    pSubSrc = pSub
1dae0 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74  ->pSrc;.  assert
1daf0 28 20 70 53 75 62 53 72 63 20 29 3b 0a 20 20 2f  ( pSubSrc );.  /
1db00 2a 20 50 72 69 6f 72 20 74 6f 20 76 65 72 73 69  * Prior to versi
1db10 6f 6e 20 33 2e 31 2e 32 2c 20 77 68 65 6e 20 4c  on 3.1.2, when L
1db20 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
1db30 68 61 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 65  had to be simple
1db40 20 63 6f 6e 73 74 61 6e 74 73 2c 0a 20 20 2a 2a   constants,.  **
1db50 20 6e 6f 74 20 61 72 62 69 74 72 61 72 79 20 65   not arbitrary e
1db60 78 70 72 65 73 73 69 6f 6e 73 2c 20 77 65 20 61  xpressions, we a
1db70 6c 6c 6f 77 65 64 20 73 6f 6d 65 20 63 6f 6d 62  llowed some comb
1db80 69 6e 69 6e 67 20 6f 66 20 4c 49 4d 49 54 20 61  ining of LIMIT a
1db90 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62  nd OFFSET.  ** b
1dba0 65 63 61 75 73 65 20 74 68 65 79 20 63 6f 75 6c  ecause they coul
1dbb0 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20 61 74  d be computed at
1dbc0 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20   compile-time.  
1dbd0 42 75 74 20 77 68 65 6e 20 4c 49 4d 49 54 20 61  But when LIMIT a
1dbe0 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62  nd OFFSET.  ** b
1dbf0 65 63 61 6d 65 20 61 72 62 69 74 72 61 72 79 20  ecame arbitrary 
1dc00 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 77 65 20  expressions, we 
1dc10 77 65 72 65 20 66 6f 72 63 65 64 20 74 6f 20 61  were forced to a
1dc20 64 64 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20  dd restrictions 
1dc30 28 31 33 29 0a 20 20 2a 2a 20 61 6e 64 20 28 31  (13).  ** and (1
1dc40 34 29 2e 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  4). */.  if( pSu
1dc50 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e  b->pLimit && p->
1dc60 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20  pLimit ) return 
1dc70 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1dc80 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1dc90 31 33 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  13) */.  if( pSu
1dca0 62 2d 3e 70 4f 66 66 73 65 74 20 29 20 72 65 74  b->pOffset ) ret
1dcb0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
1dcc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dcd0 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1dce0 31 34 29 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d  14) */.  if( (p-
1dcf0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 43  >selFlags & SF_C
1dd00 6f 6d 70 6f 75 6e 64 29 21 3d 30 20 26 26 20 70  ompound)!=0 && p
1dd10 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20  Sub->pLimit ){. 
1dd20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
1dd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd50 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1dd60 69 63 74 69 6f 6e 20 28 31 35 29 20 2a 2f 0a 20  iction (15) */. 
1dd70 20 7d 0a 20 20 69 66 28 20 70 53 75 62 53 72 63   }.  if( pSubSrc
1dd80 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72 65 74 75  ->nSrc==0 ) retu
1dd90 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1dda0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1ddb0 65 73 74 72 69 63 74 69 6f 6e 20 28 37 29 20 20  estriction (7)  
1ddc0 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 73  */.  if( pSub->s
1ddd0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
1dde0 74 69 6e 63 74 20 29 20 72 65 74 75 72 6e 20 30  tinct ) return 0
1ddf0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ;           /* R
1de00 65 73 74 72 69 63 74 69 6f 6e 20 28 35 29 20 20  estriction (5)  
1de10 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
1de20 4c 69 6d 69 74 20 26 26 20 28 70 53 72 63 2d 3e  Limit && (pSrc->
1de30 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41 67 67 29  nSrc>1 || isAgg)
1de40 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20   ){.     return 
1de50 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  0;         /* Re
1de60 73 74 72 69 63 74 69 6f 6e 73 20 28 38 29 28 39  strictions (8)(9
1de70 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 28  ) */.  }.  if( (
1de80 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
1de90 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20 26 26  _Distinct)!=0 &&
1dea0 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29   subqueryIsAgg )
1deb0 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  {.     return 0;
1dec0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
1ded0 72 69 63 74 69 6f 6e 20 28 36 29 20 20 2a 2f 0a  riction (6)  */.
1dee0 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72    }.  if( p->pOr
1def0 64 65 72 42 79 20 26 26 20 70 53 75 62 2d 3e 70  derBy && pSub->p
1df00 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
1df10 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1df20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df40 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1df50 6f 6e 20 28 31 31 29 20 2a 2f 0a 20 20 7d 0a 20  on (11) */.  }. 
1df60 20 69 66 28 20 69 73 41 67 67 20 26 26 20 70 53   if( isAgg && pS
1df70 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 20 72  ub->pOrderBy ) r
1df80 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1df90 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1dfa0 69 63 74 69 6f 6e 20 28 31 36 29 20 2a 2f 0a 20  iction (16) */. 
1dfb0 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69   if( pSub->pLimi
1dfc0 74 20 26 26 20 70 2d 3e 70 57 68 65 72 65 20 29  t && p->pWhere )
1dfd0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1dfe0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1dff0 69 63 74 69 6f 6e 20 28 31 39 29 20 2a 2f 0a 20  iction (19) */. 
1e000 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69   if( pSub->pLimi
1e010 74 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67  t && (p->selFlag
1e020 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29  s & SF_Distinct)
1e030 21 3d 30 20 29 7b 0a 20 20 20 20 20 72 65 74 75  !=0 ){.     retu
1e040 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a  rn 0;         /*
1e050 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32 31   Restriction (21
1e060 29 20 2a 2f 0a 20 20 7d 0a 20 20 74 65 73 74 63  ) */.  }.  testc
1e070 61 73 65 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c  ase( pSub->selFl
1e080 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69  ags & SF_Recursi
1e090 76 65 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  ve );.  testcase
1e0a0 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73  ( pSub->selFlags
1e0b0 20 26 20 53 46 5f 4d 69 6e 4d 61 78 41 67 67 20   & SF_MinMaxAgg 
1e0c0 29 3b 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 73  );.  if( pSub->s
1e0d0 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 52 65  elFlags & (SF_Re
1e0e0 63 75 72 73 69 76 65 7c 53 46 5f 4d 69 6e 4d 61  cursive|SF_MinMa
1e0f0 78 41 67 67 29 20 29 7b 0a 20 20 20 20 72 65 74  xAgg) ){.    ret
1e100 75 72 6e 20 30 3b 20 2f 2a 20 52 65 73 74 72 69  urn 0; /* Restri
1e110 63 74 69 6f 6e 73 20 28 32 32 29 20 61 6e 64 20  ctions (22) and 
1e120 28 32 34 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  (24) */.  }.  if
1e130 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
1e140 20 53 46 5f 52 65 63 75 72 73 69 76 65 29 20 26   SF_Recursive) &
1e150 26 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 20 29  & pSub->pPrior )
1e160 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  {.    return 0; 
1e170 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1e180 32 33 29 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a  23) */.  }..  /*
1e190 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e   OBSOLETE COMMEN
1e1a0 54 20 31 3a 0a 20 20 2a 2a 20 52 65 73 74 72 69  T 1:.  ** Restri
1e1b0 63 74 69 6f 6e 20 33 3a 20 20 49 66 20 74 68 65  ction 3:  If the
1e1c0 20 73 75 62 71 75 65 72 79 20 69 73 20 61 20 6a   subquery is a j
1e1d0 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  oin, make sure t
1e1e0 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 0a  he subquery is .
1e1f0 20 20 2a 2a 20 6e 6f 74 20 75 73 65 64 20 61 73    ** not used as
1e200 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
1e210 6e 64 20 6f 66 20 61 6e 20 6f 75 74 65 72 20 6a  nd of an outer j
1e220 6f 69 6e 2e 20 20 45 78 61 6d 70 6c 65 73 20 6f  oin.  Examples o
1e230 66 20 77 68 79 20 74 68 69 73 0a 20 20 2a 2a 20  f why this.  ** 
1e240 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a  is not allowed:.
1e250 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
1e260 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20    t1 LEFT OUTER 
1e270 4a 4f 49 4e 20 28 74 32 20 4a 4f 49 4e 20 74 33  JOIN (t2 JOIN t3
1e280 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77  ).  **.  ** If w
1e290 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62  e flatten the ab
1e2a0 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65  ove, we would ge
1e2b0 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  t.  **.  **     
1e2c0 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54      (t1 LEFT OUT
1e2d0 45 52 20 4a 4f 49 4e 20 74 32 29 20 4a 4f 49 4e  ER JOIN t2) JOIN
1e2e0 20 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 68   t3.  **.  ** wh
1e2f0 69 63 68 20 69 73 20 6e 6f 74 20 61 74 20 61 6c  ich is not at al
1e300 6c 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67  l the same thing
1e310 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 42 53 4f  ..  **.  ** OBSO
1e320 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 20 32 3a 0a  LETE COMMENT 2:.
1e330 20 20 2a 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    ** Restriction
1e340 20 31 32 3a 20 20 49 66 20 74 68 65 20 73 75 62   12:  If the sub
1e350 71 75 65 72 79 20 69 73 20 74 68 65 20 72 69 67  query is the rig
1e360 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20  ht operand of a 
1e370 6c 65 66 74 20 6f 75 74 65 72 0a 20 20 2a 2a 20  left outer.  ** 
1e380 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20  join, make sure 
1e390 74 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73  the subquery has
1e3a0 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65   no WHERE clause
1e3b0 2e 0a 20 20 2a 2a 20 41 6e 20 65 78 61 6d 70 6c  ..  ** An exampl
1e3c0 65 73 20 6f 66 20 77 68 79 20 74 68 69 73 20 69  es of why this i
1e3d0 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20  s not allowed:. 
1e3e0 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
1e3f0 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a   t1 LEFT OUTER J
1e400 4f 49 4e 20 28 53 45 4c 45 43 54 20 2a 20 46 52  OIN (SELECT * FR
1e410 4f 4d 20 74 32 20 57 48 45 52 45 20 74 32 2e 78  OM t2 WHERE t2.x
1e420 3e 30 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  >0).  **.  ** If
1e430 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20   we flatten the 
1e440 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20  above, we would 
1e450 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  get.  **.  **   
1e460 20 20 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f        (t1 LEFT O
1e470 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 57 48  UTER JOIN t2) WH
1e480 45 52 45 20 74 32 2e 78 3e 30 0a 20 20 2a 2a 0a  ERE t2.x>0.  **.
1e490 20 20 2a 2a 20 42 75 74 20 74 68 65 20 74 32 2e    ** But the t2.
1e4a0 78 3e 30 20 74 65 73 74 20 77 69 6c 6c 20 61 6c  x>0 test will al
1e4b0 77 61 79 73 20 66 61 69 6c 20 6f 6e 20 61 20 4e  ways fail on a N
1e4c0 55 4c 4c 20 72 6f 77 20 6f 66 20 74 32 2c 20 77  ULL row of t2, w
1e4d0 68 69 63 68 0a 20 20 2a 2a 20 65 66 66 65 63 74  hich.  ** effect
1e4e0 69 76 65 6c 79 20 63 6f 6e 76 65 72 74 73 20 74  ively converts t
1e4f0 68 65 20 4f 55 54 45 52 20 4a 4f 49 4e 20 69 6e  he OUTER JOIN in
1e500 74 6f 20 61 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e  to an INNER JOIN
1e510 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 48 49 53  ..  **.  ** THIS
1e520 20 4f 56 45 52 52 49 44 45 53 20 4f 42 53 4f 4c   OVERRIDES OBSOL
1e530 45 54 45 20 43 4f 4d 4d 45 4e 54 53 20 31 20 41  ETE COMMENTS 1 A
1e540 4e 44 20 32 20 41 42 4f 56 45 3a 0a 20 20 2a 2a  ND 2 ABOVE:.  **
1e550 20 54 69 63 6b 65 74 20 23 33 33 30 30 20 73 68   Ticket #3300 sh
1e560 6f 77 73 20 74 68 61 74 20 66 6c 61 74 74 65 6e  ows that flatten
1e570 69 6e 67 20 74 68 65 20 72 69 67 68 74 20 74 65  ing the right te
1e580 72 6d 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  rm of a LEFT JOI
1e590 4e 0a 20 20 2a 2a 20 69 73 20 66 72 61 75 67 68  N.  ** is fraugh
1e5a0 74 20 77 69 74 68 20 64 61 6e 67 65 72 2e 20 20  t with danger.  
1e5b0 42 65 73 74 20 74 6f 20 61 76 6f 69 64 20 74 68  Best to avoid th
1e5c0 65 20 77 68 6f 6c 65 20 74 68 69 6e 67 2e 20 20  e whole thing.  
1e5d0 49 66 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71  If the.  ** subq
1e5e0 75 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68  uery is the righ
1e5f0 74 20 74 65 72 6d 20 6f 66 20 61 20 4c 45 46 54  t term of a LEFT
1e600 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 64 6f 20 6e   JOIN, then do n
1e610 6f 74 20 66 6c 61 74 74 65 6e 2e 0a 20 20 2a 2f  ot flatten..  */
1e620 0a 20 20 69 66 28 20 28 70 53 75 62 69 74 65 6d  .  if( (pSubitem
1e630 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20  ->fg.jointype & 
1e640 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 29 7b 0a  JT_OUTER)!=0 ){.
1e650 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1e660 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69 63 74  }..  /* Restrict
1e670 69 6f 6e 20 31 37 3a 20 49 66 20 74 68 65 20 73  ion 17: If the s
1e680 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f  ub-query is a co
1e690 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 2c 20 74  mpound SELECT, t
1e6a0 68 65 6e 20 69 74 20 6d 75 73 74 0a 20 20 2a 2a  hen it must.  **
1e6b0 20 75 73 65 20 6f 6e 6c 79 20 74 68 65 20 55 4e   use only the UN
1e6c0 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72  ION ALL operator
1e6d0 2e 20 41 6e 64 20 6e 6f 6e 65 20 6f 66 20 74 68  . And none of th
1e6e0 65 20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74 20  e simple select 
1e6f0 71 75 65 72 69 65 73 0a 20 20 2a 2a 20 74 68 61  queries.  ** tha
1e700 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20 63 6f  t make up the co
1e710 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 61 72  mpound SELECT ar
1e720 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20  e allowed to be 
1e730 61 67 67 72 65 67 61 74 65 20 6f 72 20 64 69 73  aggregate or dis
1e740 74 69 6e 63 74 0a 20 20 2a 2a 20 71 75 65 72 69  tinct.  ** queri
1e750 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  es..  */.  if( p
1e760 53 75 62 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  Sub->pPrior ){. 
1e770 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72     if( pSub->pOr
1e780 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 72  derBy ){.      r
1e790 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 52 65 73  eturn 0;  /* Res
1e7a0 74 72 69 63 74 69 6f 6e 20 32 30 20 2a 2f 0a 20  triction 20 */. 
1e7b0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 41     }.    if( isA
1e7c0 67 67 20 7c 7c 20 28 70 2d 3e 73 65 6c 46 6c 61  gg || (p->selFla
1e7d0 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74  gs & SF_Distinct
1e7e0 29 21 3d 30 20 7c 7c 20 70 53 72 63 2d 3e 6e 53  )!=0 || pSrc->nS
1e7f0 72 63 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 72  rc!=1 ){.      r
1e800 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
1e810 20 20 20 66 6f 72 28 70 53 75 62 31 3d 70 53 75     for(pSub1=pSu
1e820 62 3b 20 70 53 75 62 31 3b 20 70 53 75 62 31 3d  b; pSub1; pSub1=
1e830 70 53 75 62 31 2d 3e 70 50 72 69 6f 72 29 7b 0a  pSub1->pPrior){.
1e840 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1e850 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73  (pSub1->selFlags
1e860 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c   & (SF_Distinct|
1e870 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d  SF_Aggregate))==
1e880 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20  SF_Distinct );. 
1e890 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28       testcase( (
1e8a0 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20  pSub1->selFlags 
1e8b0 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53  & (SF_Distinct|S
1e8c0 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53  F_Aggregate))==S
1e8d0 46 5f 41 67 67 72 65 67 61 74 65 20 29 3b 0a 20  F_Aggregate );. 
1e8e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75       assert( pSu
1e8f0 62 2d 3e 70 53 72 63 21 3d 30 20 29 3b 0a 20 20  b->pSrc!=0 );.  
1e900 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62      assert( pSub
1e910 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  ->pEList->nExpr=
1e920 3d 70 53 75 62 31 2d 3e 70 45 4c 69 73 74 2d 3e  =pSub1->pEList->
1e930 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 69  nExpr );.      i
1e940 66 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c  f( (pSub1->selFl
1e950 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e  ags & (SF_Distin
1e960 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29  ct|SF_Aggregate)
1e970 29 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 28  )!=0.       || (
1e980 70 53 75 62 31 2d 3e 70 50 72 69 6f 72 20 26 26  pSub1->pPrior &&
1e990 20 70 53 75 62 31 2d 3e 6f 70 21 3d 54 4b 5f 41   pSub1->op!=TK_A
1e9a0 4c 4c 29 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  LL) .       || p
1e9b0 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63  Sub1->pSrc->nSrc
1e9c0 3c 31 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  <1.      ){.    
1e9d0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1e9e0 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74      }.      test
1e9f0 63 61 73 65 28 20 70 53 75 62 31 2d 3e 70 53 72  case( pSub1->pSr
1ea00 63 2d 3e 6e 53 72 63 3e 31 20 29 3b 0a 20 20 20  c->nSrc>1 );.   
1ea10 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 74 72   }..    /* Restr
1ea20 69 63 74 69 6f 6e 20 31 38 2e 20 2a 2f 0a 20 20  iction 18. */.  
1ea30 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
1ea40 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  y ){.      int i
1ea50 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d  i;.      for(ii=
1ea60 30 3b 20 69 69 3c 70 2d 3e 70 4f 72 64 65 72 42  0; ii<p->pOrderB
1ea70 79 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b  y->nExpr; ii++){
1ea80 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
1ea90 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 69 5d 2e  pOrderBy->a[ii].
1eaa0 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d  u.x.iOrderByCol=
1eab0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
1eac0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1ead0 0a 0a 20 20 2f 2a 2a 2a 2a 2a 20 49 66 20 77 65  ..  /***** If we
1eae0 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
1eaf0 74 2c 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73  t, flattening is
1eb00 20 70 65 72 6d 69 74 74 65 64 2e 20 2a 2a 2a 2a   permitted. ****
1eb10 2a 2f 0a 20 20 53 45 4c 45 43 54 54 52 41 43 45  */.  SELECTTRACE
1eb20 28 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 66 6c  (1,pParse,p,("fl
1eb30 61 74 74 65 6e 20 25 73 2e 25 70 20 66 72 6f 6d  atten %s.%p from
1eb40 20 74 65 72 6d 20 25 64 5c 6e 22 2c 0a 20 20 20   term %d\n",.   
1eb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb60 70 53 75 62 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 20  pSub->zSelName, 
1eb70 70 53 75 62 2c 20 69 46 72 6f 6d 29 29 3b 0a 0a  pSub, iFrom));..
1eb80 20 20 2f 2a 20 41 75 74 68 6f 72 69 7a 65 20 74    /* Authorize t
1eb90 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  he subquery */. 
1eba0 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f   pParse->zAuthCo
1ebb0 6e 74 65 78 74 20 3d 20 70 53 75 62 69 74 65 6d  ntext = pSubitem
1ebc0 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 54 45 53 54 4f  ->zName;.  TESTO
1ebd0 4e 4c 59 28 69 20 3d 29 20 73 71 6c 69 74 65 33  NLY(i =) sqlite3
1ebe0 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
1ebf0 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c  , SQLITE_SELECT,
1ec00 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 74 65 73   0, 0, 0);.  tes
1ec10 74 63 61 73 65 28 20 69 3d 3d 53 51 4c 49 54 45  tcase( i==SQLITE
1ec20 5f 44 45 4e 59 20 29 3b 0a 20 20 70 50 61 72 73  _DENY );.  pPars
1ec30 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20  e->zAuthContext 
1ec40 3d 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74  = zSavedAuthCont
1ec50 65 78 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ext;..  /* If th
1ec60 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61  e sub-query is a
1ec70 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
1ec80 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e   statement, then
1ec90 20 28 62 79 20 72 65 73 74 72 69 63 74 69 6f 6e   (by restriction
1eca0 73 0a 20 20 2a 2a 20 31 37 20 61 6e 64 20 31 38  s.  ** 17 and 18
1ecb0 20 61 62 6f 76 65 29 20 69 74 20 6d 75 73 74 20   above) it must 
1ecc0 62 65 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 61  be a UNION ALL a
1ecd0 6e 64 20 74 68 65 20 70 61 72 65 6e 74 20 71 75  nd the parent qu
1ece0 65 72 79 20 6d 75 73 74 20 0a 20 20 2a 2a 20 62  ery must .  ** b
1ecf0 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20  e of the form:. 
1ed00 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c   **.  **     SEL
1ed10 45 43 54 20 3c 65 78 70 72 2d 6c 69 73 74 3e 20  ECT <expr-list> 
1ed20 46 52 4f 4d 20 28 3c 73 75 62 2d 71 75 65 72 79  FROM (<sub-query
1ed30 3e 29 20 3c 77 68 65 72 65 2d 63 6c 61 75 73 65  >) <where-clause
1ed40 3e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 66 6f 6c  > .  **.  ** fol
1ed50 6c 6f 77 65 64 20 62 79 20 61 6e 79 20 4f 52 44  lowed by any ORD
1ed60 45 52 20 42 59 2c 20 4c 49 4d 49 54 20 61 6e 64  ER BY, LIMIT and
1ed70 2f 6f 72 20 4f 46 46 53 45 54 20 63 6c 61 75 73  /or OFFSET claus
1ed80 65 73 2e 20 54 68 69 73 20 62 6c 6f 63 6b 0a 20  es. This block. 
1ed90 20 2a 2a 20 63 72 65 61 74 65 73 20 4e 2d 31 20   ** creates N-1 
1eda0 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70 61  copies of the pa
1edb0 72 65 6e 74 20 71 75 65 72 79 20 77 69 74 68 6f  rent query witho
1edc0 75 74 20 61 6e 79 20 4f 52 44 45 52 20 42 59 2c  ut any ORDER BY,
1edd0 20 4c 49 4d 49 54 20 6f 72 20 0a 20 20 2a 2a 20   LIMIT or .  ** 
1ede0 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 20 61  OFFSET clauses a
1edf0 6e 64 20 6a 6f 69 6e 73 20 74 68 65 6d 20 74 6f  nd joins them to
1ee00 20 74 68 65 20 6c 65 66 74 2d 68 61 6e 64 2d 73   the left-hand-s
1ee10 69 64 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69  ide of the origi
1ee20 6e 61 6c 0a 20 20 2a 2a 20 75 73 69 6e 67 20 55  nal.  ** using U
1ee30 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f  NION ALL operato
1ee40 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  rs. In this case
1ee50 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72   N is the number
1ee60 20 6f 66 20 73 69 6d 70 6c 65 0a 20 20 2a 2a 20   of simple.  ** 
1ee70 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
1ee80 73 20 69 6e 20 74 68 65 20 63 6f 6d 70 6f 75 6e  s in the compoun
1ee90 64 20 73 75 62 2d 71 75 65 72 79 2e 0a 20 20 2a  d sub-query..  *
1eea0 2a 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a  *.  ** Example:.
1eeb0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45    **.  **     SE
1eec0 4c 45 43 54 20 61 2b 31 20 46 52 4f 4d 20 28 0a  LECT a+1 FROM (.
1eed0 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45    **        SELE
1eee0 43 54 20 78 20 46 52 4f 4d 20 74 61 62 0a 20 20  CT x FROM tab.  
1eef0 2a 2a 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20  **        UNION 
1ef00 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  ALL.  **        
1ef10 53 45 4c 45 43 54 20 79 20 46 52 4f 4d 20 74 61  SELECT y FROM ta
1ef20 62 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 55 4e  b.  **        UN
1ef30 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20  ION ALL.  **    
1ef40 20 20 20 20 53 45 4c 45 43 54 20 61 62 73 28 7a      SELECT abs(z
1ef50 2a 32 29 20 46 52 4f 4d 20 74 61 62 32 0a 20 20  *2) FROM tab2.  
1ef60 2a 2a 20 20 20 20 20 29 20 57 48 45 52 45 20 61  **     ) WHERE a
1ef70 21 3d 35 20 4f 52 44 45 52 20 42 59 20 31 0a 20  !=5 ORDER BY 1. 
1ef80 20 2a 2a 0a 20 20 2a 2a 20 54 72 61 6e 73 66 6f   **.  ** Transfo
1ef90 72 6d 65 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a  rmed into:.  **.
1efa0 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
1efb0 78 2b 31 20 46 52 4f 4d 20 74 61 62 20 57 48 45  x+1 FROM tab WHE
1efc0 52 45 20 78 2b 31 21 3d 35 0a 20 20 2a 2a 20 20  RE x+1!=5.  **  
1efd0 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a     UNION ALL.  *
1efe0 2a 20 20 20 20 20 53 45 4c 45 43 54 20 79 2b 31  *     SELECT y+1
1eff0 20 46 52 4f 4d 20 74 61 62 20 57 48 45 52 45 20   FROM tab WHERE 
1f000 79 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20  y+1!=5.  **     
1f010 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20  UNION ALL.  **  
1f020 20 20 20 53 45 4c 45 43 54 20 61 62 73 28 7a 2a     SELECT abs(z*
1f030 32 29 2b 31 20 46 52 4f 4d 20 74 61 62 32 20 57  2)+1 FROM tab2 W
1f040 48 45 52 45 20 61 62 73 28 7a 2a 32 29 2b 31 21  HERE abs(z*2)+1!
1f050 3d 35 0a 20 20 2a 2a 20 20 20 20 20 4f 52 44 45  =5.  **     ORDE
1f060 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a  R BY 1.  **.  **
1f070 20 57 65 20 63 61 6c 6c 20 74 68 69 73 20 74 68   We call this th
1f080 65 20 22 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71  e "compound-subq
1f090 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 22  uery flattening"
1f0a0 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 53 75  ..  */.  for(pSu
1f0b0 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 3b 20  b=pSub->pPrior; 
1f0c0 70 53 75 62 3b 20 70 53 75 62 3d 70 53 75 62 2d  pSub; pSub=pSub-
1f0d0 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 53 65  >pPrior){.    Se
1f0e0 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20  lect *pNew;.    
1f0f0 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
1f100 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
1f110 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d  ;.    Expr *pLim
1f120 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a  it = p->pLimit;.
1f130 20 20 20 20 45 78 70 72 20 2a 70 4f 66 66 73 65      Expr *pOffse
1f140 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a  t = p->pOffset;.
1f150 20 20 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69      Select *pPri
1f160 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a  or = p->pPrior;.
1f170 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
1f180 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63  = 0;.    p->pSrc
1f190 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 50 72   = 0;.    p->pPr
1f1a0 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  ior = 0;.    p->
1f1b0 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  pLimit = 0;.    
1f1c0 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->pOffset = 0;.
1f1d0 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
1f1e0 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
1f1f0 70 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  p, 0);.    sqlit
1f200 65 33 53 65 6c 65 63 74 53 65 74 4e 61 6d 65 28  e3SelectSetName(
1f210 70 4e 65 77 2c 20 70 53 75 62 2d 3e 7a 53 65 6c  pNew, pSub->zSel
1f220 4e 61 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 70 4f  Name);.    p->pO
1f230 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b  ffset = pOffset;
1f240 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d  .    p->pLimit =
1f250 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 70 2d 3e   pLimit;.    p->
1f260 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
1f270 72 42 79 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63  rBy;.    p->pSrc
1f280 20 3d 20 70 53 72 63 3b 0a 20 20 20 20 70 2d 3e   = pSrc;.    p->
1f290 6f 70 20 3d 20 54 4b 5f 41 4c 4c 3b 0a 20 20 20  op = TK_ALL;.   
1f2a0 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
1f2b0 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
1f2c0 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 7d 65  = pPrior;.    }e
1f2d0 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d  lse{.      pNew-
1f2e0 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
1f2f0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 69  ;.      if( pPri
1f300 6f 72 20 29 20 70 50 72 69 6f 72 2d 3e 70 4e 65  or ) pPrior->pNe
1f310 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  xt = pNew;.     
1f320 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70   pNew->pNext = p
1f330 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  ;.      p->pPrio
1f340 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  r = pNew;.      
1f350 53 45 4c 45 43 54 54 52 41 43 45 28 32 2c 70 50  SELECTTRACE(2,pP
1f360 61 72 73 65 2c 70 2c 0a 20 20 20 20 20 20 20 20  arse,p,.        
1f370 20 28 22 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71   ("compound-subq
1f380 75 65 72 79 20 66 6c 61 74 74 65 6e 65 72 20 63  uery flattener c
1f390 72 65 61 74 65 73 20 25 73 2e 25 70 20 61 73 20  reates %s.%p as 
1f3a0 70 65 65 72 5c 6e 22 2c 0a 20 20 20 20 20 20 20  peer\n",.       
1f3b0 20 20 70 4e 65 77 2d 3e 7a 53 65 6c 4e 61 6d 65    pNew->zSelName
1f3c0 2c 20 70 4e 65 77 29 29 3b 0a 20 20 20 20 7d 0a  , pNew));.    }.
1f3d0 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
1f3e0 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
1f3f0 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42  n 1;.  }..  /* B
1f400 65 67 69 6e 20 66 6c 61 74 74 65 6e 69 6e 67 20  egin flattening 
1f410 74 68 65 20 69 46 72 6f 6d 2d 74 68 20 65 6e 74  the iFrom-th ent
1f420 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  ry of the FROM c
1f430 6c 61 75 73 65 20 0a 20 20 2a 2a 20 69 6e 20 74  lause .  ** in t
1f440 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a  he outer query..
1f450 20 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20 70 53    */.  pSub = pS
1f460 75 62 31 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  ub1 = pSubitem->
1f470 70 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20 44  pSelect;..  /* D
1f480 65 6c 65 74 65 20 74 68 65 20 74 72 61 6e 73 69  elete the transi
1f490 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74  ent table struct
1f4a0 75 72 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ure associated w
1f4b0 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75 62  ith the.  ** sub
1f4c0 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c  query.  */.  sql
1f4d0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
1f4e0 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61  Subitem->zDataba
1f4f0 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  se);.  sqlite3Db
1f500 46 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65  Free(db, pSubite
1f510 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c  m->zName);.  sql
1f520 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
1f530 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 29  Subitem->zAlias)
1f540 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44  ;.  pSubitem->zD
1f550 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 70  atabase = 0;.  p
1f560 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d  Subitem->zName =
1f570 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e   0;.  pSubitem->
1f580 7a 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 70 53  zAlias = 0;.  pS
1f590 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20  ubitem->pSelect 
1f5a0 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 65 66 65 72  = 0;..  /* Defer
1f5b0 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 54 61   deleting the Ta
1f5c0 62 6c 65 20 6f 62 6a 65 63 74 20 61 73 73 6f 63  ble object assoc
1f5d0 69 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 20  iated with the. 
1f5e0 20 2a 2a 20 73 75 62 71 75 65 72 79 20 75 6e 74   ** subquery unt
1f5f0 69 6c 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  il code generati
1f600 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 6c  on is.  ** compl
1f610 65 74 65 2c 20 73 69 6e 63 65 20 74 68 65 72 65  ete, since there
1f620 20 6d 61 79 20 73 74 69 6c 6c 20 65 78 69 73 74   may still exist
1f630 20 45 78 70 72 2e 70 54 61 62 20 65 6e 74 72 69   Expr.pTab entri
1f640 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 72 65 66  es that.  ** ref
1f650 65 72 20 74 6f 20 74 68 65 20 73 75 62 71 75 65  er to the subque
1f660 72 79 20 65 76 65 6e 20 61 66 74 65 72 20 66 6c  ry even after fl
1f670 61 74 74 65 6e 69 6e 67 2e 20 20 54 69 63 6b 65  attening.  Ticke
1f680 74 20 23 33 33 34 36 2e 0a 20 20 2a 2a 0a 20 20  t #3346..  **.  
1f690 2a 2a 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61  ** pSubitem->pTa
1f6a0 62 20 69 73 20 61 6c 77 61 79 73 20 6e 6f 6e 2d  b is always non-
1f6b0 4e 55 4c 4c 20 62 79 20 74 65 73 74 20 72 65 73  NULL by test res
1f6c0 74 72 69 63 74 69 6f 6e 73 20 61 6e 64 20 74 65  trictions and te
1f6d0 73 74 73 20 61 62 6f 76 65 2e 0a 20 20 2a 2f 0a  sts above..  */.
1f6e0 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 53 75    if( ALWAYS(pSu
1f6f0 62 69 74 65 6d 2d 3e 70 54 61 62 21 3d 30 29 20  bitem->pTab!=0) 
1f700 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
1f710 61 62 54 6f 44 65 6c 20 3d 20 70 53 75 62 69 74  abToDel = pSubit
1f720 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66  em->pTab;.    if
1f730 28 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65  ( pTabToDel->nRe
1f740 66 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 50 61  f==1 ){.      Pa
1f750 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d  rse *pToplevel =
1f760 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70   sqlite3ParseTop
1f770 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20  level(pParse);. 
1f780 20 20 20 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e       pTabToDel->
1f790 70 4e 65 78 74 5a 6f 6d 62 69 65 20 3d 20 70 54  pNextZombie = pT
1f7a0 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65  oplevel->pZombie
1f7b0 54 61 62 3b 0a 20 20 20 20 20 20 70 54 6f 70 6c  Tab;.      pTopl
1f7c0 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62  evel->pZombieTab
1f7d0 20 3d 20 70 54 61 62 54 6f 44 65 6c 3b 0a 20 20   = pTabToDel;.  
1f7e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
1f7f0 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65 66 2d 2d  TabToDel->nRef--
1f800 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 75 62  ;.    }.    pSub
1f810 69 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a  item->pTab = 0;.
1f820 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f    }..  /* The fo
1f830 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72 75 6e  llowing loop run
1f840 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  s once for each 
1f850 74 65 72 6d 20 69 6e 20 61 20 63 6f 6d 70 6f 75  term in a compou
1f860 6e 64 2d 73 75 62 71 75 65 72 79 0a 20 20 2a 2a  nd-subquery.  **
1f870 20 66 6c 61 74 74 65 6e 69 6e 67 20 28 61 73 20   flattening (as 
1f880 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 29  described above)
1f890 2e 20 20 49 66 20 77 65 20 61 72 65 20 64 6f 69  .  If we are doi
1f8a0 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74 20 6b  ng a different k
1f8b0 69 6e 64 0a 20 20 2a 2a 20 6f 66 20 66 6c 61 74  ind.  ** of flat
1f8c0 74 65 6e 69 6e 67 20 2d 20 61 20 66 6c 61 74 74  tening - a flatt
1f8d0 65 6e 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e  ening other than
1f8e0 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71   a compound-subq
1f8f0 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20  uery flattening 
1f900 2d 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 69 73  -.  ** then this
1f910 20 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e 73 20   loop only runs 
1f920 6f 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  once..  **.  ** 
1f930 54 68 69 73 20 6c 6f 6f 70 20 6d 6f 76 65 73 20  This loop moves 
1f940 61 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  all of the FROM 
1f950 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20  elements of the 
1f960 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68  subquery into th
1f970 65 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20  e.  ** the FROM 
1f980 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75  clause of the ou
1f990 74 65 72 20 71 75 65 72 79 2e 20 20 42 65 66 6f  ter query.  Befo
1f9a0 72 65 20 64 6f 69 6e 67 20 74 68 69 73 2c 20 72  re doing this, r
1f9b0 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65  emember.  ** the
1f9c0 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   cursor number f
1f9d0 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  or the original 
1f9e0 6f 75 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d  outer query FROM
1f9f0 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a   element in.  **
1fa00 20 69 50 61 72 65 6e 74 2e 20 20 54 68 65 20 69   iParent.  The i
1fa10 50 61 72 65 6e 74 20 63 75 72 73 6f 72 20 77 69  Parent cursor wi
1fa20 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65 64  ll never be used
1fa30 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20 63 6f  .  Subsequent co
1fa40 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61  de.  ** will sca
1fa50 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f  n expressions lo
1fa60 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61 72 65 6e  oking for iParen
1fa70 74 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64  t references and
1fa80 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68   replace.  ** th
1fa90 6f 73 65 20 72 65 66 65 72 65 6e 63 65 73 20 77  ose references w
1faa0 69 74 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ith expressions 
1fab0 74 68 61 74 20 72 65 73 6f 6c 76 65 20 74 6f 20  that resolve to 
1fac0 74 68 65 20 73 75 62 71 75 65 72 79 20 46 52 4f  the subquery FRO
1fad0 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20  M.  ** elements 
1fae0 77 65 20 61 72 65 20 6e 6f 77 20 63 6f 70 79 69  we are now copyi
1faf0 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f  ng in..  */.  fo
1fb00 72 28 70 50 61 72 65 6e 74 3d 70 3b 20 70 50 61  r(pParent=p; pPa
1fb10 72 65 6e 74 3b 20 70 50 61 72 65 6e 74 3d 70 50  rent; pParent=pP
1fb20 61 72 65 6e 74 2d 3e 70 50 72 69 6f 72 2c 20 70  arent->pPrior, p
1fb30 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72  Sub=pSub->pPrior
1fb40 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75 62 53  ){.    int nSubS
1fb50 72 63 3b 0a 20 20 20 20 75 38 20 6a 6f 69 6e 74  rc;.    u8 joint
1fb60 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 70 53 75  ype = 0;.    pSu
1fb70 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72  bSrc = pSub->pSr
1fb80 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63  c;     /* FROM c
1fb90 6c 61 75 73 65 20 6f 66 20 73 75 62 71 75 65 72  lause of subquer
1fba0 79 20 2a 2f 0a 20 20 20 20 6e 53 75 62 53 72 63  y */.    nSubSrc
1fbb0 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63   = pSubSrc->nSrc
1fbc0 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  ;  /* Number of 
1fbd0 74 65 72 6d 73 20 69 6e 20 73 75 62 71 75 65 72  terms in subquer
1fbe0 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  y FROM clause */
1fbf0 0a 20 20 20 20 70 53 72 63 20 3d 20 70 50 61 72  .    pSrc = pPar
1fc00 65 6e 74 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f  ent->pSrc;     /
1fc10 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  * FROM clause of
1fc20 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1fc30 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70 53 72   */..    if( pSr
1fc40 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  c ){.      asser
1fc50 74 28 20 70 50 61 72 65 6e 74 3d 3d 70 20 29 3b  t( pParent==p );
1fc60 20 20 2f 2a 20 46 69 72 73 74 20 74 69 6d 65 20    /* First time 
1fc70 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70  through the loop
1fc80 20 2a 2f 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79   */.      jointy
1fc90 70 65 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 66  pe = pSubitem->f
1fca0 67 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20  g.jointype;.    
1fcb0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
1fcc0 65 72 74 28 20 70 50 61 72 65 6e 74 21 3d 70 20  ert( pParent!=p 
1fcd0 29 3b 20 20 2f 2a 20 32 6e 64 20 61 6e 64 20 73  );  /* 2nd and s
1fce0 75 62 73 65 71 75 65 6e 74 20 74 69 6d 65 73 20  ubsequent times 
1fcf0 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70  through the loop
1fd00 20 2a 2f 0a 20 20 20 20 20 20 70 53 72 63 20 3d   */.      pSrc =
1fd10 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d   pParent->pSrc =
1fd20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
1fd30 70 70 65 6e 64 28 64 62 2c 20 30 2c 20 30 2c 20  ppend(db, 0, 0, 
1fd40 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53  0);.      if( pS
1fd50 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rc==0 ){.       
1fd60 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c   assert( db->mal
1fd70 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
1fd80 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1fd90 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1fda0 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20 75  * The subquery u
1fdb0 73 65 73 20 61 20 73 69 6e 67 6c 65 20 73 6c 6f  ses a single slo
1fdc0 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  t of the FROM cl
1fdd0 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65  ause of the oute
1fde0 72 0a 20 20 20 20 2a 2a 20 71 75 65 72 79 2e 20  r.    ** query. 
1fdf0 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79   If the subquery
1fe00 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f   has more than o
1fe10 6e 65 20 65 6c 65 6d 65 6e 74 20 69 6e 20 69 74  ne element in it
1fe20 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 20  s FROM clause,. 
1fe30 20 20 20 2a 2a 20 74 68 65 6e 20 65 78 70 61 6e     ** then expan
1fe40 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  d the outer quer
1fe50 79 20 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 20  y to make space 
1fe60 66 6f 72 20 69 74 20 74 6f 20 68 6f 6c 64 20 61  for it to hold a
1fe70 6c 6c 20 65 6c 65 6d 65 6e 74 73 0a 20 20 20 20  ll elements.    
1fe80 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ** of the subque
1fe90 72 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ry..    **.    *
1fea0 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a  * Example:.    *
1feb0 2a 0a 20 20 20 20 2a 2a 20 20 20 20 53 45 4c 45  *.    **    SELE
1fec0 43 54 20 2a 20 46 52 4f 4d 20 74 61 62 41 2c 20  CT * FROM tabA, 
1fed0 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73  (SELECT * FROM s
1fee0 75 62 31 2c 20 73 75 62 32 29 2c 20 74 61 62 42  ub1, sub2), tabB
1fef0 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
1ff00 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  The outer query 
1ff10 68 61 73 20 33 20 73 6c 6f 74 73 20 69 6e 20 69  has 3 slots in i
1ff20 74 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20  ts FROM clause. 
1ff30 20 4f 6e 65 20 73 6c 6f 74 20 6f 66 20 74 68 65   One slot of the
1ff40 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75  .    ** outer qu
1ff50 65 72 79 20 28 74 68 65 20 6d 69 64 64 6c 65 20  ery (the middle 
1ff60 73 6c 6f 74 29 20 69 73 20 75 73 65 64 20 62 79  slot) is used by
1ff70 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 20 20   the subquery.  
1ff80 54 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20  The next.    ** 
1ff90 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 77 69  block of code wi
1ffa0 6c 6c 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75  ll expand the ou
1ffb0 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20 63  ter query FROM c
1ffc0 6c 61 75 73 65 20 74 6f 20 34 20 73 6c 6f 74 73  lause to 4 slots
1ffd0 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6d 69 64  ..    ** The mid
1ffe0 64 6c 65 20 73 6c 6f 74 20 69 73 20 65 78 70 61  dle slot is expa
1fff0 6e 64 65 64 20 74 6f 20 74 77 6f 20 73 6c 6f 74  nded to two slot
20000 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61  s in order to ma
20010 6b 65 20 73 70 61 63 65 0a 20 20 20 20 2a 2a 20  ke space.    ** 
20020 66 6f 72 20 74 68 65 20 74 77 6f 20 65 6c 65 6d  for the two elem
20030 65 6e 74 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  ents in the FROM
20040 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73   clause of the s
20050 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a  ubquery..    */.
20060 20 20 20 20 69 66 28 20 6e 53 75 62 53 72 63 3e      if( nSubSrc>
20070 31 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 65  1 ){.      pPare
20080 6e 74 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 20  nt->pSrc = pSrc 
20090 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
200a0 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 53 72 63  Enlarge(db, pSrc
200b0 2c 20 6e 53 75 62 53 72 63 2d 31 2c 69 46 72 6f  , nSubSrc-1,iFro
200c0 6d 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  m+1);.      if( 
200d0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
200e0 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
200f0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
20100 0a 0a 20 20 20 20 2f 2a 20 54 72 61 6e 73 66 65  ..    /* Transfe
20110 72 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  r the FROM claus
20120 65 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65  e terms from the
20130 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74   subquery into t
20140 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20  he.    ** outer 
20150 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  query..    */.  
20160 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75    for(i=0; i<nSu
20170 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  bSrc; i++){.    
20180 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44    sqlite3IdListD
20190 65 6c 65 74 65 28 64 62 2c 20 70 53 72 63 2d 3e  elete(db, pSrc->
201a0 61 5b 69 2b 69 46 72 6f 6d 5d 2e 70 55 73 69 6e  a[i+iFrom].pUsin
201b0 67 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  g);.      assert
201c0 28 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f  ( pSrc->a[i+iFro
201d0 6d 5d 2e 66 67 2e 69 73 54 61 62 46 75 6e 63 3d  m].fg.isTabFunc=
201e0 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 53 72 63  =0 );.      pSrc
201f0 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70  ->a[i+iFrom] = p
20200 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20  SubSrc->a[i];.  
20210 20 20 20 20 6d 65 6d 73 65 74 28 26 70 53 75 62      memset(&pSub
20220 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69  Src->a[i], 0, si
20230 7a 65 6f 66 28 70 53 75 62 53 72 63 2d 3e 61 5b  zeof(pSubSrc->a[
20240 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  i]));.    }.    
20250 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 66  pSrc->a[iFrom].f
20260 67 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69  g.jointype = joi
20270 6e 74 79 70 65 3b 0a 20 20 0a 20 20 20 20 2f 2a  ntype;.  .    /*
20280 20 4e 6f 77 20 62 65 67 69 6e 20 73 75 62 73 74   Now begin subst
20290 69 74 75 74 69 6e 67 20 73 75 62 71 75 65 72 79  ituting subquery
202a0 20 72 65 73 75 6c 74 20 73 65 74 20 65 78 70 72   result set expr
202b0 65 73 73 69 6f 6e 73 20 66 6f 72 20 0a 20 20 20  essions for .   
202c0 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20 74   ** references t
202d0 6f 20 74 68 65 20 69 50 61 72 65 6e 74 20 69 6e  o the iParent in
202e0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
202f0 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a  ..    ** .    **
20300 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a   Example:.    **
20310 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54  .    **   SELECT
20320 20 61 2b 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20   a+5, b*10 FROM 
20330 28 53 45 4c 45 43 54 20 78 2a 33 20 41 53 20 61  (SELECT x*3 AS a
20340 2c 20 79 2b 31 30 20 41 53 20 62 20 46 52 4f 4d  , y+10 AS b FROM
20350 20 74 31 29 20 57 48 45 52 45 20 61 3e 62 3b 0a   t1) WHERE a>b;.
20360 20 20 20 20 2a 2a 20 20 20 5c 20 20 20 20 20 20      **   \      
20370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
20380 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75  _____________ su
20390 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f  bquery _________
203a0 5f 2f 20 20 20 20 20 20 20 20 20 20 2f 0a 20 20  _/          /.  
203b0 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f    **    \_______
203c0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f  ______________ o
203d0 75 74 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f  uter query _____
203e0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
203f0 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20 20 2a  _________/.    *
20400 2a 0a 20 20 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b  *.    ** We look
20410 20 61 74 20 65 76 65 72 79 20 65 78 70 72 65 73   at every expres
20420 73 69 6f 6e 20 69 6e 20 74 68 65 20 6f 75 74 65  sion in the oute
20430 72 20 71 75 65 72 79 20 61 6e 64 20 65 76 65 72  r query and ever
20440 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 0a 20  y place we see. 
20450 20 20 20 2a 2a 20 22 61 22 20 77 65 20 73 75 62     ** "a" we sub
20460 73 74 69 74 75 74 65 20 22 78 2a 33 22 20 61 6e  stitute "x*3" an
20470 64 20 65 76 65 72 79 20 70 6c 61 63 65 20 77 65  d every place we
20480 20 73 65 65 20 22 62 22 20 77 65 20 73 75 62 73   see "b" we subs
20490 74 69 74 75 74 65 20 22 79 2b 31 30 22 2e 0a 20  titute "y+10".. 
204a0 20 20 20 2a 2f 0a 20 20 20 20 70 4c 69 73 74 20     */.    pList 
204b0 3d 20 70 50 61 72 65 6e 74 2d 3e 70 45 4c 69 73  = pParent->pELis
204c0 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  t;.    for(i=0; 
204d0 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
204e0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
204f0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
20500 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
20510 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71  char *zName = sq
20520 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
20530 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53  , pList->a[i].zS
20540 70 61 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71  pan);.        sq
20550 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 4e 61  lite3Dequote(zNa
20560 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 69  me);.        pLi
20570 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d  st->a[i].zName =
20580 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a   zName;.      }.
20590 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53      }.    if( pS
205a0 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  ub->pOrderBy ){.
205b0 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73        /* At this
205c0 20 70 6f 69 6e 74 2c 20 61 6e 79 20 6e 6f 6e 2d   point, any non-
205d0 7a 65 72 6f 20 69 4f 72 64 65 72 42 79 43 6f 6c  zero iOrderByCol
205e0 20 76 61 6c 75 65 73 20 69 6e 64 69 63 61 74 65   values indicate
205f0 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20   that the.      
20600 2a 2a 20 4f 52 44 45 52 20 42 59 20 63 6f 6c 75  ** ORDER BY colu
20610 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  mn expression is
20620 20 69 64 65 6e 74 69 63 61 6c 20 74 6f 20 74 68   identical to th
20630 65 20 69 4f 72 64 65 72 42 79 43 6f 6c 27 74 68  e iOrderByCol'th
20640 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73  .      ** expres
20650 73 69 6f 6e 20 72 65 74 75 72 6e 65 64 20 62 79  sion returned by
20660 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
20670 74 20 70 53 75 62 2e 20 53 69 6e 63 65 20 74 68  t pSub. Since th
20680 65 73 65 20 76 61 6c 75 65 73 0a 20 20 20 20 20  ese values.     
20690 20 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65 63 65 73   ** do not neces
206a0 73 61 72 69 6c 79 20 63 6f 72 72 65 73 70 6f 6e  sarily correspon
206b0 64 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  d to columns in 
206c0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
206d0 20 70 50 61 72 65 6e 74 2c 0a 20 20 20 20 20 20   pParent,.      
206e0 2a 2a 20 7a 65 72 6f 20 74 68 65 6d 20 62 65 66  ** zero them bef
206f0 6f 72 65 20 74 72 61 6e 73 66 65 72 69 6e 67 20  ore transfering 
20700 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
20710 75 73 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  use..      **.  
20720 20 20 20 20 2a 2a 20 4e 6f 74 20 64 6f 69 6e 67      ** Not doing
20730 20 74 68 69 73 20 6d 61 79 20 63 61 75 73 65 20   this may cause 
20740 61 6e 20 65 72 72 6f 72 20 69 66 20 61 20 73 75  an error if a su
20750 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 20 74 6f  bsequent call to
20760 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 66   this.      ** f
20770 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73  unction attempts
20780 20 74 6f 20 66 6c 61 74 74 65 6e 20 61 20 63 6f   to flatten a co
20790 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65 72 79  mpound sub-query
207a0 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 0a 20 20   into pParent.  
207b0 20 20 20 20 2a 2a 20 28 74 68 65 20 6f 6e 6c 79      ** (the only
207c0 20 77 61 79 20 74 68 69 73 20 63 61 6e 20 68 61   way this can ha
207d0 70 70 65 6e 20 69 73 20 69 66 20 74 68 65 20 63  ppen is if the c
207e0 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65 72  ompound sub-quer
207f0 79 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 63 75  y is.      ** cu
20800 72 72 65 6e 74 6c 79 20 70 61 72 74 20 6f 66 20  rrently part of 
20810 70 53 75 62 2d 3e 70 53 72 63 29 2e 20 53 65 65  pSub->pSrc). See
20820 20 74 69 63 6b 65 74 20 5b 64 31 31 61 36 65 39   ticket [d11a6e9
20830 30 38 66 5d 2e 20 20 2a 2f 0a 20 20 20 20 20 20  08f].  */.      
20840 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
20850 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72 64 65  By = pSub->pOrde
20860 72 42 79 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  rBy;.      for(i
20870 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e  =0; i<pOrderBy->
20880 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
20890 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61       pOrderBy->a
208a0 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79  [i].u.x.iOrderBy
208b0 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  Col = 0;.      }
208c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
208d0 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79  Parent->pOrderBy
208e0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ==0 );.      ass
208f0 65 72 74 28 20 70 53 75 62 2d 3e 70 50 72 69 6f  ert( pSub->pPrio
20900 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50  r==0 );.      pP
20910 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20  arent->pOrderBy 
20920 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  = pOrderBy;.    
20930 20 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79    pSub->pOrderBy
20940 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
20950 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
20960 45 78 70 72 44 75 70 28 64 62 2c 20 70 53 75 62  ExprDup(db, pSub
20970 2d 3e 70 57 68 65 72 65 2c 20 30 29 3b 0a 20 20  ->pWhere, 0);.  
20980 20 20 69 66 28 20 73 75 62 71 75 65 72 79 49 73    if( subqueryIs
20990 41 67 67 20 29 7b 0a 20 20 20 20 20 20 61 73 73  Agg ){.      ass
209a0 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 48  ert( pParent->pH
209b0 61 76 69 6e 67 3d 3d 30 20 29 3b 0a 20 20 20 20  aving==0 );.    
209c0 20 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69    pParent->pHavi
209d0 6e 67 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 57  ng = pParent->pW
209e0 68 65 72 65 3b 0a 20 20 20 20 20 20 70 50 61 72  here;.      pPar
209f0 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20 70 57  ent->pWhere = pW
20a00 68 65 72 65 3b 0a 20 20 20 20 20 20 70 50 61 72  here;.      pPar
20a10 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73  ent->pHaving = s
20a20 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62  qlite3ExprAnd(db
20a30 2c 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69  , pParent->pHavi
20a40 6e 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ng, .           
20a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
20a70 70 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e  prDup(db, pSub->
20a80 70 48 61 76 69 6e 67 2c 20 30 29 29 3b 0a 20 20  pHaving, 0));.  
20a90 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
20aa0 65 6e 74 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30  ent->pGroupBy==0
20ab0 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e   );.      pParen
20ac0 74 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71  t->pGroupBy = sq
20ad0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
20ae0 28 64 62 2c 20 70 53 75 62 2d 3e 70 47 72 6f 75  (db, pSub->pGrou
20af0 70 42 79 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  pBy, 0);.    }el
20b00 73 65 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e  se{.      pParen
20b10 74 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69  t->pWhere = sqli
20b20 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70  te3ExprAnd(db, p
20b30 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 2c 20  Parent->pWhere, 
20b40 70 57 68 65 72 65 29 3b 0a 20 20 20 20 7d 0a 20  pWhere);.    }. 
20b50 20 20 20 73 75 62 73 74 53 65 6c 65 63 74 28 64     substSelect(d
20b60 62 2c 20 70 50 61 72 65 6e 74 2c 20 69 50 61 72  b, pParent, iPar
20b70 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
20b80 74 2c 20 30 29 3b 0a 20 20 0a 20 20 20 20 2f 2a  t, 0);.  .    /*
20b90 20 54 68 65 20 66 6c 61 74 74 65 6e 65 64 20 71   The flattened q
20ba0 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74  uery is distinct
20bb0 20 69 66 20 65 69 74 68 65 72 20 74 68 65 20 69   if either the i
20bc0 6e 6e 65 72 20 6f 72 20 74 68 65 0a 20 20 20 20  nner or the.    
20bd0 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  ** outer query i
20be0 73 20 64 69 73 74 69 6e 63 74 2e 20 0a 20 20 20  s distinct. .   
20bf0 20 2a 2f 0a 20 20 20 20 70 50 61 72 65 6e 74 2d   */.    pParent-
20c00 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 70 53 75  >selFlags |= pSu
20c10 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  b->selFlags & SF
20c20 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 0a 20 20  _Distinct;.  .  
20c30 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 45 4c 45    /*.    ** SELE
20c40 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 28 53 45 4c  CT ... FROM (SEL
20c50 45 43 54 20 2e 2e 2e 20 4c 49 4d 49 54 20 61 20  ECT ... LIMIT a 
20c60 4f 46 46 53 45 54 20 62 29 20 4c 49 4d 49 54 20  OFFSET b) LIMIT 
20c70 78 20 4f 46 46 53 45 54 20 79 3b 0a 20 20 20 20  x OFFSET y;.    
20c80 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 65 20 69 73  **.    ** One is
20c90 20 74 65 6d 70 74 65 64 20 74 6f 20 74 72 79 20   tempted to try 
20ca0 74 6f 20 61 64 64 20 61 20 61 6e 64 20 62 20 74  to add a and b t
20cb0 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65 20 6c 69  o combine the li
20cc0 6d 69 74 73 2e 20 20 42 75 74 20 74 68 69 73 0a  mits.  But this.
20cd0 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20      ** does not 
20ce0 77 6f 72 6b 20 69 66 20 65 69 74 68 65 72 20 6c  work if either l
20cf0 69 6d 69 74 20 69 73 20 6e 65 67 61 74 69 76 65  imit is negative
20d00 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
20d10 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b   pSub->pLimit ){
20d20 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
20d30 70 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e 70  pLimit = pSub->p
20d40 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 53 75  Limit;.      pSu
20d50 62 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  b->pLimit = 0;. 
20d60 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
20d70 69 6e 69 61 6c 6c 79 2c 20 64 65 6c 65 74 65 20  inially, delete 
20d80 77 68 61 74 20 69 73 20 6c 65 66 74 20 6f 66 20  what is left of 
20d90 74 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  the subquery and
20da0 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 73 75 63   return.  ** suc
20db0 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  cess..  */.  sql
20dc0 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
20dd0 28 64 62 2c 20 70 53 75 62 31 29 3b 0a 0a 23 69  (db, pSub1);..#i
20de0 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e  f SELECTTRACE_EN
20df0 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69  ABLED.  if( sqli
20e00 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26  te3SelectTrace &
20e10 20 30 78 31 30 30 20 29 7b 0a 20 20 20 20 53 45   0x100 ){.    SE
20e20 4c 45 43 54 54 52 41 43 45 28 30 78 31 30 30 2c  LECTTRACE(0x100,
20e30 70 50 61 72 73 65 2c 70 2c 28 22 41 66 74 65 72  pParse,p,("After
20e40 20 66 6c 61 74 74 65 6e 69 6e 67 3a 5c 6e 22 29   flattening:\n")
20e50 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72  );.    sqlite3Tr
20e60 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20  eeViewSelect(0, 
20e70 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  p, 0);.  }.#endi
20e80 66 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  f..  return 1;.}
20e90 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
20ea0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
20eb0 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65  SUBQUERY) || !de
20ec0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
20ed0 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 0a 0a 23 69  T_VIEW) */....#i
20ee0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
20ef0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
20f00 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
20f10 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f  ITE_OMIT_VIEW)./
20f20 2a 0a 2a 2a 20 4d 61 6b 65 20 63 6f 70 69 65 73  *.** Make copies
20f30 20 6f 66 20 72 65 6c 65 76 61 6e 74 20 57 48 45   of relevant WHE
20f40 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  RE clause terms 
20f50 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
20f60 72 79 20 69 6e 74 6f 0a 2a 2a 20 74 68 65 20 57  ry into.** the W
20f70 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 73  HERE clause of s
20f80 75 62 71 75 65 72 79 2e 20 20 45 78 61 6d 70 6c  ubquery.  Exampl
20f90 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45  e:.**.**    SELE
20fa0 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43  CT * FROM (SELEC
20fb0 54 20 61 20 41 53 20 78 2c 20 63 2d 64 20 41 53  T a AS x, c-d AS
20fc0 20 79 20 46 52 4f 4d 20 74 31 29 20 57 48 45 52   y FROM t1) WHER
20fd0 45 20 78 3d 35 20 41 4e 44 20 79 3d 31 30 3b 0a  E x=5 AND y=10;.
20fe0 2a 2a 0a 2a 2a 20 54 72 61 6e 73 66 6f 72 6d 65  **.** Transforme
20ff0 64 20 69 6e 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20  d into:.**.**   
21000 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28   SELECT * FROM (
21010 53 45 4c 45 43 54 20 61 20 41 53 20 78 2c 20 63  SELECT a AS x, c
21020 2d 64 20 41 53 20 79 20 46 52 4f 4d 20 74 31 20  -d AS y FROM t1 
21030 57 48 45 52 45 20 61 3d 35 20 41 4e 44 20 63 2d  WHERE a=5 AND c-
21040 64 3d 31 30 29 0a 2a 2a 20 20 20 20 20 57 48 45  d=10).**     WHE
21050 52 45 20 78 3d 35 20 41 4e 44 20 79 3d 31 30 3b  RE x=5 AND y=10;
21060 0a 2a 2a 0a 2a 2a 20 54 68 65 20 68 6f 70 65 20  .**.** The hope 
21070 69 73 20 74 68 61 74 20 74 68 65 20 74 65 72 6d  is that the term
21080 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69  s added to the i
21090 6e 6e 65 72 20 71 75 65 72 79 20 77 69 6c 6c 20  nner query will 
210a0 6d 61 6b 65 20 69 74 20 6d 6f 72 65 0a 2a 2a 20  make it more.** 
210b0 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a  efficient..**.**
210c0 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20   Do not attempt 
210d0 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  this optimizatio
210e0 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31  n if:.**.**   (1
210f0 29 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72  ) The inner quer
21100 79 20 69 73 20 61 6e 20 61 67 67 72 65 67 61 74  y is an aggregat
21110 65 2e 20 20 28 49 6e 20 74 68 61 74 20 63 61 73  e.  (In that cas
21120 65 2c 20 77 65 27 64 20 72 65 61 6c 6c 79 20 77  e, we'd really w
21130 61 6e 74 0a 2a 2a 20 20 20 20 20 20 20 74 6f 20  ant.**       to 
21140 63 6f 70 79 20 74 68 65 20 6f 75 74 65 72 20 57  copy the outer W
21150 48 45 52 45 2d 63 6c 61 75 73 65 20 74 65 72 6d  HERE-clause term
21160 73 20 6f 6e 74 6f 20 74 68 65 20 48 41 56 49 4e  s onto the HAVIN
21170 47 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 0a  G clause of the.
21180 2a 2a 20 20 20 20 20 20 20 69 6e 6e 65 72 20 71  **       inner q
21190 75 65 72 79 2e 20 20 42 75 74 20 74 68 65 79 20  uery.  But they 
211a0 70 72 6f 62 61 62 6c 79 20 77 6f 6e 27 74 20 68  probably won't h
211b0 65 6c 70 20 74 68 65 72 65 20 73 6f 20 64 6f 20  elp there so do 
211c0 6e 6f 74 20 62 6f 74 68 65 72 2e 29 0a 2a 2a 0a  not bother.).**.
211d0 2a 2a 20 20 20 28 32 29 20 54 68 65 20 69 6e 6e  **   (2) The inn
211e0 65 72 20 71 75 65 72 79 20 69 73 20 74 68 65 20  er query is the 
211f0 72 65 63 75 72 73 69 76 65 20 70 61 72 74 20 6f  recursive part o
21200 66 20 61 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65  f a common table
21210 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
21220 2a 2a 20 20 20 28 33 29 20 54 68 65 20 69 6e 6e  **   (3) The inn
21230 65 72 20 71 75 65 72 79 20 68 61 73 20 61 20 4c  er query has a L
21240 49 4d 49 54 20 63 6c 61 75 73 65 20 28 73 69 6e  IMIT clause (sin
21250 63 65 20 74 68 65 20 63 68 61 6e 67 65 73 20 74  ce the changes t
21260 6f 20 74 68 65 20 57 48 45 52 45 0a 2a 2a 20 20  o the WHERE.**  
21270 20 20 20 20 20 63 6c 6f 73 65 20 77 6f 75 6c 64       close would
21280 20 63 68 61 6e 67 65 20 74 68 65 20 6d 65 61 6e   change the mean
21290 69 6e 67 20 6f 66 20 74 68 65 20 4c 49 4d 49 54  ing of the LIMIT
212a0 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 54  )..**.**   (4) T
212b0 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 69  he inner query i
212c0 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  s the right oper
212d0 61 6e 64 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  and of a LEFT JO
212e0 49 4e 2e 20 20 28 54 68 65 20 63 61 6c 6c 65 72  IN.  (The caller
212f0 0a 2a 2a 20 20 20 20 20 20 20 65 6e 66 6f 72 63  .**       enforc
21300 65 73 20 74 68 69 73 20 72 65 73 74 72 69 63 74  es this restrict
21310 69 6f 6e 20 73 69 6e 63 65 20 74 68 69 73 20 72  ion since this r
21320 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20  outine does not 
21330 68 61 76 65 20 65 6e 6f 75 67 68 0a 2a 2a 20 20  have enough.**  
21340 20 20 20 20 20 69 6e 66 6f 72 6d 61 74 69 6f 6e       information
21350 20 74 6f 20 6b 6e 6f 77 2e 29 0a 2a 2a 0a 2a 2a   to know.).**.**
21360 20 20 20 28 35 29 20 54 68 65 20 57 48 45 52 45     (5) The WHERE
21370 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 69   clause expressi
21380 6f 6e 20 6f 72 69 67 69 6e 61 74 65 73 20 69 6e  on originates in
21390 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
213a0 20 63 6c 61 75 73 65 0a 2a 2a 20 20 20 20 20 20   clause.**      
213b0 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e   of a LEFT JOIN.
213c0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20  .**.** Return 0 
213d0 69 66 20 6e 6f 20 63 68 61 6e 67 65 73 20 61 72  if no changes ar
213e0 65 20 6d 61 64 65 20 61 6e 64 20 6e 6f 6e 2d 7a  e made and non-z
213f0 65 72 6f 20 69 66 20 6f 6e 65 20 6f 72 20 6d 6f  ero if one or mo
21400 72 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a  re WHERE clause.
21410 2a 2a 20 74 65 72 6d 73 20 61 72 65 20 64 75 70  ** terms are dup
21420 6c 69 63 61 74 65 64 20 69 6e 74 6f 20 74 68 65  licated into the
21430 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74   subquery..*/.st
21440 61 74 69 63 20 69 6e 74 20 70 75 73 68 44 6f 77  atic int pushDow
21450 6e 57 68 65 72 65 54 65 72 6d 73 28 0a 20 20 73  nWhereTerms(.  s
21460 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
21470 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
21480 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
21490 28 66 6f 72 20 6d 61 6c 6c 6f 63 28 29 29 20 2a  (for malloc()) *
214a0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62  /.  Select *pSub
214b0 71 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  q,        /* The
214c0 20 73 75 62 71 75 65 72 79 20 77 68 6f 73 65 20   subquery whose 
214d0 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20  WHERE clause is 
214e0 74 6f 20 62 65 20 61 75 67 6d 65 6e 74 65 64 20  to be augmented 
214f0 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72  */.  Expr *pWher
21500 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e,         /* Th
21510 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f  e WHERE clause o
21520 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
21530 79 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 73  y */.  int iCurs
21540 6f 72 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  or           /* 
21550 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  Cursor number of
21560 20 74 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f   the subquery */
21570 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77  .){.  Expr *pNew
21580 3b 0a 20 20 69 6e 74 20 6e 43 68 6e 67 20 3d 20  ;.  int nChng = 
21590 30 3b 0a 20 20 69 66 28 20 70 57 68 65 72 65 3d  0;.  if( pWhere=
215a0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
215b0 20 69 66 28 20 28 70 53 75 62 71 2d 3e 73 65 6c   if( (pSubq->sel
215c0 46 6c 61 67 73 20 26 20 28 53 46 5f 41 67 67 72  Flags & (SF_Aggr
215d0 65 67 61 74 65 7c 53 46 5f 52 65 63 75 72 73 69  egate|SF_Recursi
215e0 76 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ve))!=0 ){.     
215f0 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72 65 73  return 0; /* res
21600 74 72 69 63 74 69 6f 6e 73 20 28 31 29 20 61 6e  trictions (1) an
21610 64 20 28 32 29 20 2a 2f 0a 20 20 7d 0a 20 20 69  d (2) */.  }.  i
21620 66 28 20 70 53 75 62 71 2d 3e 70 4c 69 6d 69 74  f( pSubq->pLimit
21630 21 3d 30 20 29 7b 0a 20 20 20 20 20 72 65 74 75  !=0 ){.     retu
21640 72 6e 20 30 3b 20 2f 2a 20 72 65 73 74 72 69 63  rn 0; /* restric
21650 74 69 6f 6e 20 28 33 29 20 2a 2f 0a 20 20 7d 0a  tion (3) */.  }.
21660 20 20 77 68 69 6c 65 28 20 70 57 68 65 72 65 2d    while( pWhere-
21670 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20  >op==TK_AND ){. 
21680 20 20 20 6e 43 68 6e 67 20 2b 3d 20 70 75 73 68     nChng += push
21690 44 6f 77 6e 57 68 65 72 65 54 65 72 6d 73 28 64  DownWhereTerms(d
216a0 62 2c 20 70 53 75 62 71 2c 20 70 57 68 65 72 65  b, pSubq, pWhere
216b0 2d 3e 70 52 69 67 68 74 2c 20 69 43 75 72 73 6f  ->pRight, iCurso
216c0 72 29 3b 0a 20 20 20 20 70 57 68 65 72 65 20 3d  r);.    pWhere =
216d0 20 70 57 68 65 72 65 2d 3e 70 4c 65 66 74 3b 0a   pWhere->pLeft;.
216e0 20 20 7d 0a 20 20 69 66 28 20 45 78 70 72 48 61    }.  if( ExprHa
216f0 73 50 72 6f 70 65 72 74 79 28 70 57 68 65 72 65  sProperty(pWhere
21700 2c 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20  ,EP_FromJoin) ) 
21710 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72 65 73  return 0; /* res
21720 74 72 69 63 74 69 6f 6e 20 35 20 2a 2f 0a 20 20  triction 5 */.  
21730 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
21740 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 70  sTableConstant(p
21750 57 68 65 72 65 2c 20 69 43 75 72 73 6f 72 29 20  Where, iCursor) 
21760 29 7b 0a 20 20 20 20 6e 43 68 6e 67 2b 2b 3b 0a  ){.    nChng++;.
21770 20 20 20 20 77 68 69 6c 65 28 20 70 53 75 62 71      while( pSubq
21780 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d   ){.      pNew =
21790 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
217a0 64 62 2c 20 70 57 68 65 72 65 2c 20 30 29 3b 0a  db, pWhere, 0);.
217b0 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 75 62        pNew = sub
217c0 73 74 45 78 70 72 28 64 62 2c 20 70 4e 65 77 2c  stExpr(db, pNew,
217d0 20 69 43 75 72 73 6f 72 2c 20 70 53 75 62 71 2d   iCursor, pSubq-
217e0 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  >pEList);.      
217f0 70 53 75 62 71 2d 3e 70 57 68 65 72 65 20 3d 20  pSubq->pWhere = 
21800 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64  sqlite3ExprAnd(d
21810 62 2c 20 70 53 75 62 71 2d 3e 70 57 68 65 72 65  b, pSubq->pWhere
21820 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 70  , pNew);.      p
21830 53 75 62 71 20 3d 20 70 53 75 62 71 2d 3e 70 50  Subq = pSubq->pP
21840 72 69 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rior;.    }.  }.
21850 20 20 72 65 74 75 72 6e 20 6e 43 68 6e 67 3b 0a    return nChng;.
21860 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
21870 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
21880 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
21890 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
218a0 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 2f 2a 0a  IT_VIEW) */../*.
218b0 2a 2a 20 42 61 73 65 64 20 6f 6e 20 74 68 65 20  ** Based on the 
218c0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
218d0 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72  AggInfo structur
218e0 65 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 74  e indicated by t
218f0 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75  he first.** argu
21900 6d 65 6e 74 2c 20 74 68 69 73 20 66 75 6e 63 74  ment, this funct
21910 69 6f 6e 20 63 68 65 63 6b 73 20 69 66 20 74 68  ion checks if th
21920 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
21930 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  true:.**.**    *
21940 20 74 68 65 20 71 75 65 72 79 20 63 6f 6e 74 61   the query conta
21950 69 6e 73 20 6a 75 73 74 20 61 20 73 69 6e 67 6c  ins just a singl
21960 65 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  e aggregate func
21970 74 69 6f 6e 2c 0a 2a 2a 20 20 20 20 2a 20 74 68  tion,.**    * th
21980 65 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  e aggregate func
21990 74 69 6f 6e 20 69 73 20 65 69 74 68 65 72 20 6d  tion is either m
219a0 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 2c 20 61  in() or max(), a
219b0 6e 64 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 61  nd.**    * the a
219c0 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 61  rgument to the a
219d0 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
219e0 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61  n is a column va
219f0 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c  lue..**.** If al
21a00 6c 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20 61  l of the above a
21a10 72 65 20 74 72 75 65 2c 20 74 68 65 6e 20 57 48  re true, then WH
21a20 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20  ERE_ORDERBY_MIN 
21a30 6f 72 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59  or WHERE_ORDERBY
21a40 5f 4d 41 58 0a 2a 2a 20 69 73 20 72 65 74 75 72  _MAX.** is retur
21a50 6e 65 64 20 61 73 20 61 70 70 72 6f 70 72 69 61  ned as appropria
21a60 74 65 2e 20 41 6c 73 6f 2c 20 2a 70 70 4d 69 6e  te. Also, *ppMin
21a70 4d 61 78 20 69 73 20 73 65 74 20 74 6f 20 70 6f  Max is set to po
21a80 69 6e 74 20 74 6f 20 74 68 65 20 0a 2a 2a 20 6c  int to the .** l
21a90 69 73 74 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ist of arguments
21aa0 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 61   passed to the a
21ab0 67 67 72 65 67 61 74 65 20 62 65 66 6f 72 65 20  ggregate before 
21ac0 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  returning..**.**
21ad0 20 4f 72 2c 20 69 66 20 74 68 65 20 63 6f 6e 64   Or, if the cond
21ae0 69 74 69 6f 6e 73 20 61 62 6f 76 65 20 61 72 65  itions above are
21af0 20 6e 6f 74 20 6d 65 74 2c 20 2a 70 70 4d 69 6e   not met, *ppMin
21b00 4d 61 78 20 69 73 20 73 65 74 20 74 6f 20 30 20  Max is set to 0 
21b10 61 6e 64 0a 2a 2a 20 57 48 45 52 45 5f 4f 52 44  and.** WHERE_ORD
21b20 45 52 42 59 5f 4e 4f 52 4d 41 4c 20 69 73 20 72  ERBY_NORMAL is r
21b30 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
21b40 69 63 20 75 38 20 6d 69 6e 4d 61 78 51 75 65 72  ic u8 minMaxQuer
21b50 79 28 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49  y(AggInfo *pAggI
21b60 6e 66 6f 2c 20 45 78 70 72 4c 69 73 74 20 2a 2a  nfo, ExprList **
21b70 70 70 4d 69 6e 4d 61 78 29 7b 0a 20 20 69 6e 74  ppMinMax){.  int
21b80 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52   eRet = WHERE_OR
21b90 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 20 20 20  DERBY_NORMAL;   
21ba0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
21bb0 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 2a 70 70   value */..  *pp
21bc0 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a 20 20 69 66  MinMax = 0;.  if
21bd0 28 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  ( pAggInfo->nFun
21be0 63 3d 3d 31 20 29 7b 0a 20 20 20 20 45 78 70 72  c==1 ){.    Expr
21bf0 20 2a 70 45 78 70 72 20 3d 20 70 41 67 67 49 6e   *pExpr = pAggIn
21c00 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70 45 78  fo->aFunc[0].pEx
21c10 70 72 3b 20 2f 2a 20 41 67 67 72 65 67 61 74 65  pr; /* Aggregate
21c20 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20   function */.   
21c30 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
21c40 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
21c50 73 74 3b 20 20 20 20 20 20 2f 2a 20 41 72 67 75  st;      /* Argu
21c60 6d 65 6e 74 73 20 74 6f 20 61 67 67 20 66 75 6e  ments to agg fun
21c70 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20 61 73  ction */..    as
21c80 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d  sert( pExpr->op=
21c90 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
21ca0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69   );.    if( pELi
21cb0 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45  st && pEList->nE
21cc0 78 70 72 3d 3d 31 20 26 26 20 70 45 4c 69 73 74  xpr==1 && pEList
21cd0 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70  ->a[0].pExpr->op
21ce0 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  ==TK_AGG_COLUMN 
21cf0 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
21d00 68 61 72 20 2a 7a 46 75 6e 63 20 3d 20 70 45 78  har *zFunc = pEx
21d10 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  pr->u.zToken;.  
21d20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
21d30 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c 20 22 6d  trICmp(zFunc, "m
21d40 69 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  in")==0 ){.     
21d50 20 20 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f     eRet = WHERE_
21d60 4f 52 44 45 52 42 59 5f 4d 49 4e 3b 0a 20 20 20  ORDERBY_MIN;.   
21d70 20 20 20 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d       *ppMinMax =
21d80 20 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d   pEList;.      }
21d90 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
21da0 53 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c 20 22  StrICmp(zFunc, "
21db0 6d 61 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  max")==0 ){.    
21dc0 20 20 20 20 65 52 65 74 20 3d 20 57 48 45 52 45      eRet = WHERE
21dd0 5f 4f 52 44 45 52 42 59 5f 4d 41 58 3b 0a 20 20  _ORDERBY_MAX;.  
21de0 20 20 20 20 20 20 2a 70 70 4d 69 6e 4d 61 78 20        *ppMinMax 
21df0 3d 20 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20  = pEList;.      
21e00 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61  }.    }.  }..  a
21e10 73 73 65 72 74 28 20 2a 70 70 4d 69 6e 4d 61 78  ssert( *ppMinMax
21e20 3d 3d 30 20 7c 7c 20 28 2a 70 70 4d 69 6e 4d 61  ==0 || (*ppMinMa
21e30 78 29 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a  x)->nExpr==1 );.
21e40 20 20 72 65 74 75 72 6e 20 65 52 65 74 3b 0a 7d    return eRet;.}
21e50 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65  ../*.** The sele
21e60 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73  ct statement pas
21e70 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
21e80 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20   argument is an 
21e90 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79 2e  aggregate query.
21ea0 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61  .** The second a
21eb0 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 61  rgument is the a
21ec0 73 73 6f 63 69 61 74 65 64 20 61 67 67 72 65 67  ssociated aggreg
21ed0 61 74 65 2d 69 6e 66 6f 20 6f 62 6a 65 63 74 2e  ate-info object.
21ee0 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   This .** functi
21ef0 6f 6e 20 74 65 73 74 73 20 69 66 20 74 68 65 20  on tests if the 
21f00 53 45 4c 45 43 54 20 69 73 20 6f 66 20 74 68 65  SELECT is of the
21f10 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 53   form:.**.**   S
21f20 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
21f30 52 4f 4d 20 3c 74 62 6c 3e 0a 2a 2a 0a 2a 2a 20  ROM <tbl>.**.** 
21f40 77 68 65 72 65 20 74 61 62 6c 65 20 69 73 20 61  where table is a
21f50 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2c   database table,
21f60 20 6e 6f 74 20 61 20 73 75 62 2d 73 65 6c 65 63   not a sub-selec
21f70 74 20 6f 72 20 76 69 65 77 2e 20 49 66 20 74 68  t or view. If th
21f80 65 20 71 75 65 72 79 0a 2a 2a 20 64 6f 65 73 20  e query.** does 
21f90 6d 61 74 63 68 20 74 68 69 73 20 70 61 74 74 65  match this patte
21fa0 72 6e 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74  rn, then a point
21fb0 65 72 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20  er to the Table 
21fc0 6f 62 6a 65 63 74 20 72 65 70 72 65 73 65 6e 74  object represent
21fd0 69 6e 67 0a 2a 2a 20 3c 74 62 6c 3e 20 69 73 20  ing.** <tbl> is 
21fe0 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
21ff0 69 73 65 2c 20 30 20 69 73 20 72 65 74 75 72 6e  ise, 0 is return
22000 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 61  ed..*/.static Ta
22010 62 6c 65 20 2a 69 73 53 69 6d 70 6c 65 43 6f 75  ble *isSimpleCou
22020 6e 74 28 53 65 6c 65 63 74 20 2a 70 2c 20 41 67  nt(Select *p, Ag
22030 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29  gInfo *pAggInfo)
22040 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  {.  Table *pTab;
22050 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a  .  Expr *pExpr;.
22060 0a 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 70  .  assert( !p->p
22070 47 72 6f 75 70 42 79 20 29 3b 0a 0a 20 20 69 66  GroupBy );..  if
22080 28 20 70 2d 3e 70 57 68 65 72 65 20 7c 7c 20 70  ( p->pWhere || p
22090 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  ->pEList->nExpr!
220a0 3d 31 20 0a 20 20 20 7c 7c 20 70 2d 3e 70 53 72  =1 .   || p->pSr
220b0 63 2d 3e 6e 53 72 63 21 3d 31 20 7c 7c 20 70 2d  c->nSrc!=1 || p-
220c0 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c  >pSrc->a[0].pSel
220d0 65 63 74 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  ect.  ){.    ret
220e0 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61  urn 0;.  }.  pTa
220f0 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30  b = p->pSrc->a[0
22100 5d 2e 70 54 61 62 3b 0a 20 20 70 45 78 70 72 20  ].pTab;.  pExpr 
22110 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30  = p->pEList->a[0
22120 5d 2e 70 45 78 70 72 3b 0a 20 20 61 73 73 65 72  ].pExpr;.  asser
22130 74 28 20 70 54 61 62 20 26 26 20 21 70 54 61 62  t( pTab && !pTab
22140 2d 3e 70 53 65 6c 65 63 74 20 26 26 20 70 45 78  ->pSelect && pEx
22150 70 72 20 29 3b 0a 0a 20 20 69 66 28 20 49 73 56  pr );..  if( IsV
22160 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 20 72  irtual(pTab) ) r
22170 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
22180 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47  Expr->op!=TK_AGG
22190 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72 65 74 75  _FUNCTION ) retu
221a0 72 6e 20 30 3b 0a 20 20 69 66 28 20 4e 45 56 45  rn 0;.  if( NEVE
221b0 52 28 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  R(pAggInfo->nFun
221c0 63 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30  c==0) ) return 0
221d0 3b 0a 20 20 69 66 28 20 28 70 41 67 67 49 6e 66  ;.  if( (pAggInf
221e0 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70 46 75 6e  o->aFunc[0].pFun
221f0 63 2d 3e 66 75 6e 63 46 6c 61 67 73 26 53 51 4c  c->funcFlags&SQL
22200 49 54 45 5f 46 55 4e 43 5f 43 4f 55 4e 54 29 3d  ITE_FUNC_COUNT)=
22210 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
22220 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67   if( pExpr->flag
22230 73 26 45 50 5f 44 69 73 74 69 6e 63 74 20 29 20  s&EP_Distinct ) 
22240 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 72 65 74  return 0;..  ret
22250 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a  urn pTab;.}../*.
22260 2a 2a 20 49 66 20 74 68 65 20 73 6f 75 72 63 65  ** If the source
22270 2d 6c 69 73 74 20 69 74 65 6d 20 70 61 73 73 65  -list item passe
22280 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  d as an argument
22290 20 77 61 73 20 61 75 67 6d 65 6e 74 65 64 20 77   was augmented w
222a0 69 74 68 20 61 6e 0a 2a 2a 20 49 4e 44 45 58 45  ith an.** INDEXE
222b0 44 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65  D BY clause, the
222c0 6e 20 74 72 79 20 74 6f 20 6c 6f 63 61 74 65 20  n try to locate 
222d0 74 68 65 20 73 70 65 63 69 66 69 65 64 20 69 6e  the specified in
222e0 64 65 78 2e 20 49 66 20 74 68 65 72 65 0a 2a 2a  dex. If there.**
222f0 20 77 61 73 20 73 75 63 68 20 61 20 63 6c 61 75   was such a clau
22300 73 65 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 64  se and the named
22310 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20 62 65   index cannot be
22320 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 0a   found, return .
22330 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  ** SQLITE_ERROR 
22340 61 6e 64 20 6c 65 61 76 65 20 61 6e 20 65 72 72  and leave an err
22350 6f 72 20 69 6e 20 70 50 61 72 73 65 2e 20 4f 74  or in pParse. Ot
22360 68 65 72 77 69 73 65 2c 20 70 6f 70 75 6c 61 74  herwise, populat
22370 65 20 0a 2a 2a 20 70 46 72 6f 6d 2d 3e 70 49 6e  e .** pFrom->pIn
22380 64 65 78 20 61 6e 64 20 72 65 74 75 72 6e 20 53  dex and return S
22390 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74  QLITE_OK..*/.int
223a0 20 73 71 6c 69 74 65 33 49 6e 64 65 78 65 64 42   sqlite3IndexedB
223b0 79 4c 6f 6f 6b 75 70 28 50 61 72 73 65 20 2a 70  yLookup(Parse *p
223c0 50 61 72 73 65 2c 20 73 74 72 75 63 74 20 53 72  Parse, struct Sr
223d0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f  cList_item *pFro
223e0 6d 29 7b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d  m){.  if( pFrom-
223f0 3e 70 54 61 62 20 26 26 20 70 46 72 6f 6d 2d 3e  >pTab && pFrom->
22400 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79 20 29  fg.isIndexedBy )
22410 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
22420 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b  b = pFrom->pTab;
22430 0a 20 20 20 20 63 68 61 72 20 2a 7a 49 6e 64 65  .    char *zInde
22440 78 65 64 42 79 20 3d 20 70 46 72 6f 6d 2d 3e 75  xedBy = pFrom->u
22450 31 2e 7a 49 6e 64 65 78 65 64 42 79 3b 0a 20 20  1.zIndexedBy;.  
22460 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
22470 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
22480 2d 3e 70 49 6e 64 65 78 3b 20 0a 20 20 20 20 20  ->pIndex; .     
22490 20 20 20 70 49 64 78 20 26 26 20 73 71 6c 69 74     pIdx && sqlit
224a0 65 33 53 74 72 49 43 6d 70 28 70 49 64 78 2d 3e  e3StrICmp(pIdx->
224b0 7a 4e 61 6d 65 2c 20 7a 49 6e 64 65 78 65 64 42  zName, zIndexedB
224c0 79 29 3b 20 0a 20 20 20 20 20 20 20 20 70 49 64  y); .        pId
224d0 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 0a 20 20  x=pIdx->pNext.  
224e0 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70 49    );.    if( !pI
224f0 64 78 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  dx ){.      sqli
22500 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
22510 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64  se, "no such ind
22520 65 78 3a 20 25 73 22 2c 20 7a 49 6e 64 65 78 65  ex: %s", zIndexe
22530 64 42 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  dBy, 0);.      p
22540 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65  Parse->checkSche
22550 6d 61 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65  ma = 1;.      re
22560 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
22570 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 72  R;.    }.    pFr
22580 6f 6d 2d 3e 70 49 42 49 6e 64 65 78 20 3d 20 70  om->pIBIndex = p
22590 49 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Idx;.  }.  retur
225a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f  n SQLITE_OK;.}./
225b0 2a 0a 2a 2a 20 44 65 74 65 63 74 20 63 6f 6d 70  *.** Detect comp
225c0 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74  ound SELECT stat
225d0 65 6d 65 6e 74 73 20 74 68 61 74 20 75 73 65 20  ements that use 
225e0 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
225f0 73 65 20 77 69 74 68 20 0a 2a 2a 20 61 6e 20 61  se with .** an a
22600 6c 74 65 72 6e 61 74 69 76 65 20 63 6f 6c 6c 61  lternative colla
22610 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a  ting sequence..*
22620 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2e  *.**    SELECT .
22630 2e 2e 20 46 52 4f 4d 20 74 31 20 45 58 43 45 50  .. FROM t1 EXCEP
22640 54 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f  T SELECT ... FRO
22650 4d 20 74 32 20 4f 52 44 45 52 20 42 59 20 2e 2e  M t2 ORDER BY ..
22660 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a   COLLATE ....**.
22670 2a 2a 20 54 68 65 73 65 20 61 72 65 20 72 65 77  ** These are rew
22680 72 69 74 74 65 6e 20 61 73 20 61 20 73 75 62 71  ritten as a subq
22690 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53  uery:.**.**    S
226a0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28 53 45  ELECT * FROM (SE
226b0 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31  LECT ... FROM t1
226c0 20 45 58 43 45 50 54 20 53 45 4c 45 43 54 20 2e   EXCEPT SELECT .
226d0 2e 2e 20 46 52 4f 4d 20 74 32 29 0a 2a 2a 20 20  .. FROM t2).**  
226e0 20 20 20 4f 52 44 45 52 20 42 59 20 2e 2e 2e 20     ORDER BY ... 
226f0 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a  COLLATE ....**.*
22700 2a 20 54 68 69 73 20 74 72 61 6e 73 66 6f 72 6d  * This transform
22710 61 74 69 6f 6e 20 69 73 20 6e 65 63 65 73 73 61  ation is necessa
22720 72 79 20 62 65 63 61 75 73 65 20 74 68 65 20 6d  ry because the m
22730 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
22740 79 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61  y() routine.** a
22750 62 6f 76 65 20 74 68 61 74 20 67 65 6e 65 72 61  bove that genera
22760 74 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72  tes the code for
22770 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   a compound SELE
22780 43 54 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52  CT with an ORDER
22790 20 42 59 20 63 6c 61 75 73 65 0a 2a 2a 20 75 73   BY clause.** us
227a0 65 73 20 61 20 6d 65 72 67 65 20 61 6c 67 6f 72  es a merge algor
227b0 69 74 68 6d 20 74 68 61 74 20 72 65 71 75 69 72  ithm that requir
227c0 65 73 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 6c  es the same coll
227d0 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f  ating sequence o
227e0 6e 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20  n the.** result 
227f0 63 6f 6c 75 6d 6e 73 20 61 73 20 6f 6e 20 74 68  columns as on th
22800 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
22810 65 2e 20 20 53 65 65 20 74 69 63 6b 65 74 0a 2a  e.  See ticket.*
22820 2a 20 68 74 74 70 3a 2f 2f 77 77 77 2e 73 71 6c  * http://www.sql
22830 69 74 65 2e 6f 72 67 2f 73 72 63 2f 69 6e 66 6f  ite.org/src/info
22840 2f 36 37 30 39 35 37 34 64 32 61 0a 2a 2a 0a 2a  /6709574d2a.**.*
22850 2a 20 54 68 69 73 20 74 72 61 6e 73 66 6f 72 6d  * This transform
22860 61 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 6e 65  ation is only ne
22870 65 64 65 64 20 66 6f 72 20 45 58 43 45 50 54 2c  eded for EXCEPT,
22880 20 49 4e 54 45 52 53 45 43 54 2c 20 61 6e 64 20   INTERSECT, and 
22890 55 4e 49 4f 4e 2e 0a 2a 2a 20 54 68 65 20 55 4e  UNION..** The UN
228a0 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72  ION ALL operator
228b0 20 77 6f 72 6b 73 20 66 69 6e 65 20 77 69 74 68   works fine with
228c0 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65   multiSelectOrde
228d0 72 42 79 28 29 20 65 76 65 6e 20 77 68 65 6e 0a  rBy() even when.
228e0 2a 2a 20 74 68 65 72 65 20 61 72 65 20 43 4f 4c  ** there are COL
228f0 4c 41 54 45 20 74 65 72 6d 73 20 69 6e 20 74 68  LATE terms in th
22900 65 20 4f 52 44 45 52 20 42 59 2e 0a 2a 2f 0a 73  e ORDER BY..*/.s
22910 74 61 74 69 63 20 69 6e 74 20 63 6f 6e 76 65 72  tatic int conver
22920 74 43 6f 6d 70 6f 75 6e 64 53 65 6c 65 63 74 54  tCompoundSelectT
22930 6f 53 75 62 71 75 65 72 79 28 57 61 6c 6b 65 72  oSubquery(Walker
22940 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63   *pWalker, Selec
22950 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  t *p){.  int i;.
22960 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a    Select *pNew;.
22970 20 20 53 65 6c 65 63 74 20 2a 70 58 3b 0a 20 20    Select *pX;.  
22980 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 73  sqlite3 *db;.  s
22990 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
229a0 74 65 6d 20 2a 61 3b 0a 20 20 53 72 63 4c 69 73  tem *a;.  SrcLis
229b0 74 20 2a 70 4e 65 77 53 72 63 3b 0a 20 20 50 61  t *pNewSrc;.  Pa
229c0 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 20 20 54  rse *pParse;.  T
229d0 6f 6b 65 6e 20 64 75 6d 6d 79 3b 0a 0a 20 20 69  oken dummy;..  i
229e0 66 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  f( p->pPrior==0 
229f0 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e  ) return WRC_Con
22a00 74 69 6e 75 65 3b 0a 20 20 69 66 28 20 70 2d 3e  tinue;.  if( p->
22a10 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 72 65  pOrderBy==0 ) re
22a20 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
22a30 65 3b 0a 20 20 66 6f 72 28 70 58 3d 70 3b 20 70  e;.  for(pX=p; p
22a40 58 20 26 26 20 28 70 58 2d 3e 6f 70 3d 3d 54 4b  X && (pX->op==TK
22a50 5f 41 4c 4c 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d  _ALL || pX->op==
22a60 54 4b 5f 53 45 4c 45 43 54 29 3b 20 70 58 3d 70  TK_SELECT); pX=p
22a70 58 2d 3e 70 50 72 69 6f 72 29 7b 7d 0a 20 20 69  X->pPrior){}.  i
22a80 66 28 20 70 58 3d 3d 30 20 29 20 72 65 74 75 72  f( pX==0 ) retur
22a90 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
22aa0 20 20 61 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42    a = p->pOrderB
22ab0 79 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 70 2d  y->a;.  for(i=p-
22ac0 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
22ad0 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  -1; i>=0; i--){.
22ae0 20 20 20 20 69 66 28 20 61 5b 69 5d 2e 70 45 78      if( a[i].pEx
22af0 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43  pr->flags & EP_C
22b00 6f 6c 6c 61 74 65 20 29 20 62 72 65 61 6b 3b 0a  ollate ) break;.
22b10 20 20 7d 0a 20 20 69 66 28 20 69 3c 30 20 29 20    }.  if( i<0 ) 
22b20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
22b30 6e 75 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65  nue;..  /* If we
22b40 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
22b50 74 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  t, that means th
22b60 65 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e  e transformation
22b70 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 2a 2f   is required. */
22b80 0a 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 61  ..  pParse = pWa
22b90 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20  lker->pParse;.  
22ba0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
22bb0 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
22bc0 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
22bd0 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20  , sizeof(*pNew) 
22be0 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
22bf0 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
22c00 6f 72 74 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64  ort;.  memset(&d
22c10 75 6d 6d 79 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ummy, 0, sizeof(
22c20 64 75 6d 6d 79 29 29 3b 0a 20 20 70 4e 65 77 53  dummy));.  pNewS
22c30 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c  rc = sqlite3SrcL
22c40 69 73 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72  istAppendFromTer
22c50 6d 28 70 50 61 72 73 65 2c 30 2c 30 2c 30 2c 26  m(pParse,0,0,0,&
22c60 64 75 6d 6d 79 2c 70 4e 65 77 2c 30 2c 30 29 3b  dummy,pNew,0,0);
22c70 0a 20 20 69 66 28 20 70 4e 65 77 53 72 63 3d 3d  .  if( pNewSrc==
22c80 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41  0 ) return WRC_A
22c90 62 6f 72 74 3b 0a 20 20 2a 70 4e 65 77 20 3d 20  bort;.  *pNew = 
22ca0 2a 70 3b 0a 20 20 70 2d 3e 70 53 72 63 20 3d 20  *p;.  p->pSrc = 
22cb0 70 4e 65 77 53 72 63 3b 0a 20 20 70 2d 3e 70 45  pNewSrc;.  p->pE
22cc0 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
22cd0 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
22ce0 72 73 65 2c 20 30 2c 20 73 71 6c 69 74 65 33 45  rse, 0, sqlite3E
22cf0 78 70 72 28 64 62 2c 20 54 4b 5f 41 53 54 45 52  xpr(db, TK_ASTER
22d00 49 53 4b 2c 20 30 29 29 3b 0a 20 20 70 2d 3e 6f  ISK, 0));.  p->o
22d10 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20  p = TK_SELECT;. 
22d20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 30 3b 0a   p->pWhere = 0;.
22d30 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79    pNew->pGroupBy
22d40 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 48   = 0;.  pNew->pH
22d50 61 76 69 6e 67 20 3d 20 30 3b 0a 20 20 70 4e 65  aving = 0;.  pNe
22d60 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  w->pOrderBy = 0;
22d70 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30  .  p->pPrior = 0
22d80 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 30  ;.  p->pNext = 0
22d90 3b 0a 20 20 70 2d 3e 70 57 69 74 68 20 3d 20 30  ;.  p->pWith = 0
22da0 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  ;.  p->selFlags 
22db0 26 3d 20 7e 53 46 5f 43 6f 6d 70 6f 75 6e 64 3b  &= ~SF_Compound;
22dc0 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73  .  assert( (p->s
22dd0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 43 6f 6e  elFlags & SF_Con
22de0 76 65 72 74 65 64 29 3d 3d 30 20 29 3b 0a 20 20  verted)==0 );.  
22df0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  p->selFlags |= S
22e00 46 5f 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 61  F_Converted;.  a
22e10 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 50 72  ssert( pNew->pPr
22e20 69 6f 72 21 3d 30 20 29 3b 0a 20 20 70 4e 65 77  ior!=0 );.  pNew
22e30 2d 3e 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20  ->pPrior->pNext 
22e40 3d 20 70 4e 65 77 3b 0a 20 20 70 4e 65 77 2d 3e  = pNew;.  pNew->
22e50 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70 4e  pLimit = 0;.  pN
22e60 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b  ew->pOffset = 0;
22e70 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
22e80 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ntinue;.}../*.**
22e90 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
22ea0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
22eb0 20 74 65 72 6d 20 70 46 72 6f 6d 20 68 61 73 20   term pFrom has 
22ec0 74 61 62 6c 65 2d 76 61 6c 75 65 64 20 66 75 6e  table-valued fun
22ed0 63 74 69 6f 6e 0a 2a 2a 20 61 72 67 75 6d 65 6e  ction.** argumen
22ee0 74 73 2e 20 20 49 66 20 69 74 20 64 6f 65 73 2c  ts.  If it does,
22ef0 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
22f00 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73  message in pPars
22f10 65 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20  e and return.** 
22f20 6e 6f 6e 2d 7a 65 72 6f 2c 20 73 69 6e 63 65 20  non-zero, since 
22f30 70 46 72 6f 6d 20 69 73 20 6e 6f 74 20 61 6c 6c  pFrom is not all
22f40 6f 77 65 64 20 74 6f 20 62 65 20 61 20 74 61 62  owed to be a tab
22f50 6c 65 2d 76 61 6c 75 65 64 20 66 75 6e 63 74 69  le-valued functi
22f60 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
22f70 74 20 63 61 6e 6e 6f 74 42 65 46 75 6e 63 74 69  t cannotBeFuncti
22f80 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
22f90 2c 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74  , struct SrcList
22fa0 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20  _item *pFrom){. 
22fb0 20 69 66 28 20 70 46 72 6f 6d 2d 3e 66 67 2e 69   if( pFrom->fg.i
22fc0 73 54 61 62 46 75 6e 63 20 29 7b 0a 20 20 20 20  sTabFunc ){.    
22fd0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
22fe0 70 50 61 72 73 65 2c 20 22 27 25 73 27 20 69 73  pParse, "'%s' is
22ff0 20 6e 6f 74 20 61 20 66 75 6e 63 74 69 6f 6e 22   not a function"
23000 2c 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 29 3b  , pFrom->zName);
23010 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
23020 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
23030 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
23040 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20  _OMIT_CTE./*.** 
23050 41 72 67 75 6d 65 6e 74 20 70 57 69 74 68 20 28  Argument pWith (
23060 77 68 69 63 68 20 6d 61 79 20 62 65 20 4e 55 4c  which may be NUL
23070 4c 29 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 6c  L) points to a l
23080 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6e 65  inked list of ne
23090 73 74 65 64 20 0a 2a 2a 20 57 49 54 48 20 63 6f  sted .** WITH co
230a0 6e 74 65 78 74 73 2c 20 66 72 6f 6d 20 69 6e 6e  ntexts, from inn
230b0 65 72 20 74 6f 20 6f 75 74 65 72 6d 6f 73 74 2e  er to outermost.
230c0 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 69 64   If the table id
230d0 65 6e 74 69 66 69 65 64 20 62 79 20 0a 2a 2a 20  entified by .** 
230e0 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d  FROM clause elem
230f0 65 6e 74 20 70 49 74 65 6d 20 69 73 20 72 65 61  ent pItem is rea
23100 6c 6c 79 20 61 20 63 6f 6d 6d 6f 6e 2d 74 61 62  lly a common-tab
23110 6c 65 2d 65 78 70 72 65 73 73 69 6f 6e 20 28 43  le-expression (C
23120 54 45 29 20 0a 2a 2a 20 74 68 65 6e 20 72 65 74  TE) .** then ret
23130 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
23140 20 74 68 65 20 43 54 45 20 64 65 66 69 6e 69 74   the CTE definit
23150 69 6f 6e 20 66 6f 72 20 74 68 61 74 20 74 61 62  ion for that tab
23160 6c 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a  le. Otherwise.**
23170 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a   return NULL..**
23180 0a 2a 2a 20 49 66 20 61 20 6e 6f 6e 2d 4e 55 4c  .** If a non-NUL
23190 4c 20 76 61 6c 75 65 20 69 73 20 72 65 74 75 72  L value is retur
231a0 6e 65 64 2c 20 73 65 74 20 2a 70 70 43 6f 6e 74  ned, set *ppCont
231b0 65 78 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  ext to point to 
231c0 74 68 65 20 57 69 74 68 0a 2a 2a 20 6f 62 6a 65  the With.** obje
231d0 63 74 20 74 68 61 74 20 74 68 65 20 72 65 74 75  ct that the retu
231e0 72 6e 65 64 20 43 54 45 20 62 65 6c 6f 6e 67 73  rned CTE belongs
231f0 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73   to..*/.static s
23200 74 72 75 63 74 20 43 74 65 20 2a 73 65 61 72 63  truct Cte *searc
23210 68 57 69 74 68 28 0a 20 20 57 69 74 68 20 2a 70  hWith(.  With *p
23220 57 69 74 68 2c 20 20 20 20 20 20 20 20 20 20 20  With,           
23230 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
23240 65 6e 74 20 69 6e 6e 65 72 6d 6f 73 74 20 57 49  ent innermost WI
23250 54 48 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73  TH clause */.  s
23260 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
23270 65 6d 20 2a 70 49 74 65 6d 2c 20 20 20 20 20 2f  em *pItem,     /
23280 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c  * FROM clause el
23290 65 6d 65 6e 74 20 74 6f 20 72 65 73 6f 6c 76 65  ement to resolve
232a0 20 2a 2f 0a 20 20 57 69 74 68 20 2a 2a 70 70 43   */.  With **ppC
232b0 6f 6e 74 65 78 74 20 20 20 20 20 20 20 20 20 20  ontext          
232c0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 57 49        /* OUT: WI
232d0 54 48 20 63 6c 61 75 73 65 20 72 65 74 75 72 6e  TH clause return
232e0 20 76 61 6c 75 65 20 62 65 6c 6f 6e 67 73 20 74   value belongs t
232f0 6f 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  o */.){.  const 
23300 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69  char *zName;.  i
23310 66 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62  f( pItem->zDatab
23320 61 73 65 3d 3d 30 20 26 26 20 28 7a 4e 61 6d 65  ase==0 && (zName
23330 20 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29   = pItem->zName)
23340 21 3d 30 20 29 7b 0a 20 20 20 20 57 69 74 68 20  !=0 ){.    With 
23350 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 57  *p;.    for(p=pW
23360 69 74 68 3b 20 70 3b 20 70 3d 70 2d 3e 70 4f 75  ith; p; p=p->pOu
23370 74 65 72 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ter){.      int 
23380 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  i;.      for(i=0
23390 3b 20 69 3c 70 2d 3e 6e 43 74 65 3b 20 69 2b 2b  ; i<p->nCte; i++
233a0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
233b0 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 4e  qlite3StrICmp(zN
233c0 61 6d 65 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61  ame, p->a[i].zNa
233d0 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
233e0 20 20 20 20 2a 70 70 43 6f 6e 74 65 78 74 20 3d      *ppContext =
233f0 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65   p;.          re
23400 74 75 72 6e 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20  turn &p->a[i];. 
23410 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
23420 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
23430 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 54 68 65  urn 0;.}../* The
23440 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20   code generator 
23450 6d 61 69 6e 74 61 69 6e 73 20 61 20 73 74 61 63  maintains a stac
23460 6b 20 6f 66 20 61 63 74 69 76 65 20 57 49 54 48  k of active WITH
23470 20 63 6c 61 75 73 65 73 0a 2a 2a 20 77 69 74 68   clauses.** with
23480 20 74 68 65 20 69 6e 6e 65 72 2d 6d 6f 73 74 20   the inner-most 
23490 57 49 54 48 20 63 6c 61 75 73 65 20 62 65 69 6e  WITH clause bein
234a0 67 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20  g at the top of 
234b0 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a  the stack..**.**
234c0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70 75   This routine pu
234d0 73 68 65 73 20 74 68 65 20 57 49 54 48 20 63 6c  shes the WITH cl
234e0 61 75 73 65 20 70 61 73 73 65 64 20 61 73 20 74  ause passed as t
234f0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
23500 6e 74 0a 2a 2a 20 6f 6e 74 6f 20 74 68 65 20 74  nt.** onto the t
23510 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e  op of the stack.
23520 20 49 66 20 61 72 67 75 6d 65 6e 74 20 62 46 72   If argument bFr
23530 65 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  ee is true, then
23540 20 74 68 69 73 0a 2a 2a 20 57 49 54 48 20 63 6c   this.** WITH cl
23550 61 75 73 65 20 77 69 6c 6c 20 6e 65 76 65 72 20  ause will never 
23560 62 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74  be popped from t
23570 68 65 20 73 74 61 63 6b 2e 20 49 6e 20 74 68 69  he stack. In thi
23580 73 20 63 61 73 65 20 69 74 0a 2a 2a 20 73 68 6f  s case it.** sho
23590 75 6c 64 20 62 65 20 66 72 65 65 64 20 61 6c 6f  uld be freed alo
235a0 6e 67 20 77 69 74 68 20 74 68 65 20 50 61 72 73  ng with the Pars
235b0 65 20 6f 62 6a 65 63 74 2e 20 49 6e 20 6f 74 68  e object. In oth
235c0 65 72 20 63 61 73 65 73 2c 20 77 68 65 6e 0a 2a  er cases, when.*
235d0 2a 20 62 46 72 65 65 3d 3d 30 2c 20 74 68 65 20  * bFree==0, the 
235e0 57 69 74 68 20 6f 62 6a 65 63 74 20 77 69 6c 6c  With object will
235f0 20 62 65 20 66 72 65 65 64 20 61 6c 6f 6e 67 20   be freed along 
23600 77 69 74 68 20 74 68 65 20 53 45 4c 45 43 54 20  with the SELECT 
23610 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 69  .** statement wi
23620 74 68 20 77 68 69 63 68 20 69 74 20 69 73 20 61  th which it is a
23630 73 73 6f 63 69 61 74 65 64 2e 0a 2a 2f 0a 76 6f  ssociated..*/.vo
23640 69 64 20 73 71 6c 69 74 65 33 57 69 74 68 50 75  id sqlite3WithPu
23650 73 68 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  sh(Parse *pParse
23660 2c 20 57 69 74 68 20 2a 70 57 69 74 68 2c 20 75  , With *pWith, u
23670 38 20 62 46 72 65 65 29 7b 0a 20 20 61 73 73 65  8 bFree){.  asse
23680 72 74 28 20 62 46 72 65 65 3d 3d 30 20 7c 7c 20  rt( bFree==0 || 
23690 28 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3d 3d  (pParse->pWith==
236a0 30 20 26 26 20 70 50 61 72 73 65 2d 3e 70 57 69  0 && pParse->pWi
236b0 74 68 54 6f 46 72 65 65 3d 3d 30 29 20 29 3b 0a  thToFree==0) );.
236c0 20 20 69 66 28 20 70 57 69 74 68 20 29 7b 0a 20    if( pWith ){. 
236d0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
236e0 65 2d 3e 70 57 69 74 68 21 3d 70 57 69 74 68 20  e->pWith!=pWith 
236f0 29 3b 0a 20 20 20 20 70 57 69 74 68 2d 3e 70 4f  );.    pWith->pO
23700 75 74 65 72 20 3d 20 70 50 61 72 73 65 2d 3e 70  uter = pParse->p
23710 57 69 74 68 3b 0a 20 20 20 20 70 50 61 72 73 65  With;.    pParse
23720 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68 3b  ->pWith = pWith;
23730 0a 20 20 20 20 69 66 28 20 62 46 72 65 65 20 29  .    if( bFree )
23740 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 54 6f   pParse->pWithTo
23750 46 72 65 65 20 3d 20 70 57 69 74 68 3b 0a 20 20  Free = pWith;.  
23760 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
23770 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20  function checks 
23780 69 66 20 61 72 67 75 6d 65 6e 74 20 70 46 72 6f  if argument pFro
23790 6d 20 72 65 66 65 72 73 20 74 6f 20 61 20 43 54  m refers to a CT
237a0 45 20 64 65 63 6c 61 72 65 64 20 62 79 20 0a 2a  E declared by .*
237b0 2a 20 61 20 57 49 54 48 20 63 6c 61 75 73 65 20  * a WITH clause 
237c0 6f 6e 20 74 68 65 20 73 74 61 63 6b 20 63 75 72  on the stack cur
237d0 72 65 6e 74 6c 79 20 6d 61 69 6e 74 61 69 6e 65  rently maintaine
237e0 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 2e  d by the parser.
237f0 20 41 6e 64 2c 0a 2a 2a 20 69 66 20 63 75 72 72   And,.** if curr
23800 65 6e 74 6c 79 20 70 72 6f 63 65 73 73 69 6e 67  ently processing
23810 20 61 20 43 54 45 20 65 78 70 72 65 73 73 69 6f   a CTE expressio
23820 6e 2c 20 69 66 20 69 74 20 69 73 20 61 20 72 65  n, if it is a re
23830 63 75 72 73 69 76 65 0a 2a 2a 20 72 65 66 65 72  cursive.** refer
23840 65 6e 63 65 20 74 6f 20 74 68 65 20 63 75 72 72  ence to the curr
23850 65 6e 74 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 49  ent CTE..**.** I
23860 66 20 70 46 72 6f 6d 20 66 61 6c 6c 73 20 69 6e  f pFrom falls in
23870 74 6f 20 65 69 74 68 65 72 20 6f 66 20 74 68 65  to either of the
23880 20 74 77 6f 20 63 61 74 65 67 6f 72 69 65 73 20   two categories 
23890 61 62 6f 76 65 2c 20 70 46 72 6f 6d 2d 3e 70 54  above, pFrom->pT
238a0 61 62 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72 20  ab.** and other 
238b0 66 69 65 6c 64 73 20 61 72 65 20 70 6f 70 75 6c  fields are popul
238c0 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79  ated accordingly
238d0 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 73 68 6f  . The caller sho
238e0 75 6c 64 20 63 68 65 63 6b 0a 2a 2a 20 28 70 46  uld check.** (pF
238f0 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 29 20 74 6f  rom->pTab!=0) to
23900 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68   determine wheth
23910 65 72 20 6f 72 20 6e 6f 74 20 61 20 73 75 63 63  er or not a succ
23920 65 73 73 66 75 6c 20 6d 61 74 63 68 0a 2a 2a 20  essful match.** 
23930 77 61 73 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a  was found..**.**
23940 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   Whether or not 
23950 61 20 6d 61 74 63 68 20 69 73 20 66 6f 75 6e 64  a match is found
23960 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
23970 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72  eturned if no er
23980 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 49  ror.** occurs. I
23990 66 20 61 6e 20 65 72 72 6f 72 20 64 6f 65 73 20  f an error does 
239a0 6f 63 63 75 72 2c 20 61 6e 20 65 72 72 6f 72 20  occur, an error 
239b0 6d 65 73 73 61 67 65 20 69 73 20 73 74 6f 72 65  message is store
239c0 64 20 69 6e 20 74 68 65 0a 2a 2a 20 70 61 72 73  d in the.** pars
239d0 65 72 20 61 6e 64 20 73 6f 6d 65 20 65 72 72 6f  er and some erro
239e0 72 20 63 6f 64 65 20 6f 74 68 65 72 20 74 68 61  r code other tha
239f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  n SQLITE_OK retu
23a00 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
23a10 69 6e 74 20 77 69 74 68 45 78 70 61 6e 64 28 0a  int withExpand(.
23a20 20 20 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65    Walker *pWalke
23a30 72 2c 20 0a 20 20 73 74 72 75 63 74 20 53 72 63  r, .  struct Src
23a40 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d  List_item *pFrom
23a50 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  .){.  Parse *pPa
23a60 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70  rse = pWalker->p
23a70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33  Parse;.  sqlite3
23a80 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
23a90 62 3b 0a 20 20 73 74 72 75 63 74 20 43 74 65 20  b;.  struct Cte 
23aa0 2a 70 43 74 65 3b 20 20 20 20 20 20 20 20 20 20  *pCte;          
23ab0 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 65 64 20       /* Matched 
23ac0 43 54 45 20 28 6f 72 20 4e 55 4c 4c 20 69 66 20  CTE (or NULL if 
23ad0 6e 6f 20 6d 61 74 63 68 29 20 2a 2f 0a 20 20 57  no match) */.  W
23ae0 69 74 68 20 2a 70 57 69 74 68 3b 20 20 20 20 20  ith *pWith;     
23af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23b00 2a 20 57 49 54 48 20 63 6c 61 75 73 65 20 74 68  * WITH clause th
23b10 61 74 20 70 43 74 65 20 62 65 6c 6f 6e 67 73 20  at pCte belongs 
23b20 74 6f 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  to */..  assert(
23b30 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20   pFrom->pTab==0 
23b40 29 3b 0a 0a 20 20 70 43 74 65 20 3d 20 73 65 61  );..  pCte = sea
23b50 72 63 68 57 69 74 68 28 70 50 61 72 73 65 2d 3e  rchWith(pParse->
23b60 70 57 69 74 68 2c 20 70 46 72 6f 6d 2c 20 26 70  pWith, pFrom, &p
23b70 57 69 74 68 29 3b 0a 20 20 69 66 28 20 70 43 74  With);.  if( pCt
23b80 65 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  e ){.    Table *
23b90 70 54 61 62 3b 0a 20 20 20 20 45 78 70 72 4c 69  pTab;.    ExprLi
23ba0 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20  st *pEList;.    
23bb0 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 20 20  Select *pSel;.  
23bc0 20 20 53 65 6c 65 63 74 20 2a 70 4c 65 66 74 3b    Select *pLeft;
23bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23be0 2f 2a 20 4c 65 66 74 2d 6d 6f 73 74 20 53 45 4c  /* Left-most SEL
23bf0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
23c00 0a 20 20 20 20 69 6e 74 20 62 4d 61 79 52 65 63  .    int bMayRec
23c10 75 72 73 69 76 65 3b 20 20 20 20 20 20 20 20 20  ursive;         
23c20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63 6f     /* True if co
23c30 6d 70 6f 75 6e 64 20 6a 6f 69 6e 65 64 20 62 79  mpound joined by
23c40 20 55 4e 49 4f 4e 20 5b 41 4c 4c 5d 20 2a 2f 0a   UNION [ALL] */.
23c50 20 20 20 20 57 69 74 68 20 2a 70 53 61 76 65 64      With *pSaved
23c60 57 69 74 68 3b 20 20 20 20 20 20 20 20 20 20 20  With;           
23c70 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 76 61 6c    /* Initial val
23c80 75 65 20 6f 66 20 70 50 61 72 73 65 2d 3e 70 57  ue of pParse->pW
23c90 69 74 68 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49  ith */..    /* I
23ca0 66 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20  f pCte->zCteErr 
23cb0 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 74 20 74  is non-NULL at t
23cc0 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20  his point, then 
23cd0 74 68 69 73 20 69 73 20 61 6e 20 69 6c 6c 65 67  this is an illeg
23ce0 61 6c 0a 20 20 20 20 2a 2a 20 72 65 63 75 72 73  al.    ** recurs
23cf0 69 76 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f  ive reference to
23d00 20 43 54 45 20 70 43 74 65 2e 20 4c 65 61 76 65   CTE pCte. Leave
23d10 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61   an error in pPa
23d20 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 0a 20  rse and return. 
23d30 20 20 20 2a 2a 20 65 61 72 6c 79 2e 20 49 66 20     ** early. If 
23d40 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 69 73  pCte->zCteErr is
23d50 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73   NULL, then this
23d60 20 69 73 20 6e 6f 74 20 61 20 72 65 63 75 72 73   is not a recurs
23d70 69 76 65 20 72 65 66 65 72 65 6e 63 65 2e 0a 20  ive reference.. 
23d80 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61     ** In this ca
23d90 73 65 2c 20 70 72 6f 63 65 65 64 2e 20 20 2a 2f  se, proceed.  */
23da0 0a 20 20 20 20 69 66 28 20 70 43 74 65 2d 3e 7a  .    if( pCte->z
23db0 43 74 65 45 72 72 20 29 7b 0a 20 20 20 20 20 20  CteErr ){.      
23dc0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
23dd0 70 50 61 72 73 65 2c 20 70 43 74 65 2d 3e 7a 43  pParse, pCte->zC
23de0 74 65 45 72 72 2c 20 70 43 74 65 2d 3e 7a 4e 61  teErr, pCte->zNa
23df0 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  me);.      retur
23e00 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
23e10 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 61      }.    if( ca
23e20 6e 6e 6f 74 42 65 46 75 6e 63 74 69 6f 6e 28 70  nnotBeFunction(p
23e30 50 61 72 73 65 2c 20 70 46 72 6f 6d 29 20 29 20  Parse, pFrom) ) 
23e40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
23e50 52 4f 52 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  ROR;..    assert
23e60 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30  ( pFrom->pTab==0
23e70 20 29 3b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70   );.    pFrom->p
23e80 54 61 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c  Tab = pTab = sql
23e90 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
23ea0 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c  (db, sizeof(Tabl
23eb0 65 29 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  e));.    if( pTa
23ec0 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52  b==0 ) return WR
23ed0 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 70 54 61  C_Abort;.    pTa
23ee0 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  b->nRef = 1;.   
23ef0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73   pTab->zName = s
23f00 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
23f10 62 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b  b, pCte->zName);
23f20 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79  .    pTab->iPKey
23f30 20 3d 20 2d 31 3b 0a 20 20 20 20 70 54 61 62 2d   = -1;.    pTab-
23f40 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30  >nRowLogEst = 20
23f50 30 3b 20 61 73 73 65 72 74 28 20 32 30 30 3d 3d  0; assert( 200==
23f60 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30  sqlite3LogEst(10
23f70 34 38 35 37 36 29 20 29 3b 0a 20 20 20 20 70 54  48576) );.    pT
23f80 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20  ab->tabFlags |= 
23f90 54 46 5f 45 70 68 65 6d 65 72 61 6c 20 7c 20 54  TF_Ephemeral | T
23fa0 46 5f 4e 6f 56 69 73 69 62 6c 65 52 6f 77 69 64  F_NoVisibleRowid
23fb0 3b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65  ;.    pFrom->pSe
23fc0 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65  lect = sqlite3Se
23fd0 6c 65 63 74 44 75 70 28 64 62 2c 20 70 43 74 65  lectDup(db, pCte
23fe0 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20  ->pSelect, 0);. 
23ff0 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
24000 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
24010 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
24020 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  PT;.    assert( 
24030 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 29  pFrom->pSelect )
24040 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
24050 69 66 20 74 68 69 73 20 69 73 20 61 20 72 65 63  if this is a rec
24060 75 72 73 69 76 65 20 43 54 45 2e 20 2a 2f 0a 20  ursive CTE. */. 
24070 20 20 20 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d     pSel = pFrom-
24080 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 62 4d  >pSelect;.    bM
24090 61 79 52 65 63 75 72 73 69 76 65 20 3d 20 28 20  ayRecursive = ( 
240a0 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c  pSel->op==TK_ALL
240b0 20 7c 7c 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b   || pSel->op==TK
240c0 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 69 66  _UNION );.    if
240d0 28 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 20  ( bMayRecursive 
240e0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
240f0 20 20 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70        SrcList *p
24100 53 72 63 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65  Src = pFrom->pSe
24110 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 20 20  lect->pSrc;.    
24120 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72    for(i=0; i<pSr
24130 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  c->nSrc; i++){. 
24140 20 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72         struct Sr
24150 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
24160 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69 5d 3b  m = &pSrc->a[i];
24170 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74  .        if( pIt
24180 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30  em->zDatabase==0
24190 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 49   .         && pI
241a0 74 65 6d 2d 3e 7a 4e 61 6d 65 21 3d 30 20 0a 20  tem->zName!=0 . 
241b0 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73 71          && 0==sq
241c0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 49 74  lite3StrICmp(pIt
241d0 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 43 74 65 2d  em->zName, pCte-
241e0 3e 7a 4e 61 6d 65 29 0a 20 20 20 20 20 20 20 20  >zName).        
241f0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70    ){.          p
24200 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61  Item->pTab = pTa
24210 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  b;.          pIt
24220 65 6d 2d 3e 66 67 2e 69 73 52 65 63 75 72 73 69  em->fg.isRecursi
24230 76 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ve = 1;.        
24240 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a    pTab->nRef++;.
24250 20 20 20 20 20 20 20 20 20 20 70 53 65 6c 2d 3e            pSel->
24260 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 52  selFlags |= SF_R
24270 65 63 75 72 73 69 76 65 3b 0a 20 20 20 20 20 20  ecursive;.      
24280 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
24290 7d 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 6f  }..    /* Only o
242a0 6e 65 20 72 65 63 75 72 73 69 76 65 20 72 65 66  ne recursive ref
242b0 65 72 65 6e 63 65 20 69 73 20 70 65 72 6d 69 74  erence is permit
242c0 74 65 64 2e 20 2a 2f 20 0a 20 20 20 20 69 66 28  ted. */ .    if(
242d0 20 70 54 61 62 2d 3e 6e 52 65 66 3e 32 20 29 7b   pTab->nRef>2 ){
242e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
242f0 72 6f 72 4d 73 67 28 0a 20 20 20 20 20 20 20 20  rorMsg(.        
24300 20 20 70 50 61 72 73 65 2c 20 22 6d 75 6c 74 69    pParse, "multi
24310 70 6c 65 20 72 65 66 65 72 65 6e 63 65 73 20 74  ple references t
24320 6f 20 72 65 63 75 72 73 69 76 65 20 74 61 62 6c  o recursive tabl
24330 65 3a 20 25 73 22 2c 20 70 43 74 65 2d 3e 7a 4e  e: %s", pCte->zN
24340 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ame.      );.   
24350 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
24360 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
24370 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e    assert( pTab->
24380 6e 52 65 66 3d 3d 31 20 7c 7c 20 28 28 70 53 65  nRef==1 || ((pSe
24390 6c 2d 3e 73 65 6c 46 6c 61 67 73 26 53 46 5f 52  l->selFlags&SF_R
243a0 65 63 75 72 73 69 76 65 29 20 26 26 20 70 54 61  ecursive) && pTa
243b0 62 2d 3e 6e 52 65 66 3d 3d 32 20 29 29 3b 0a 0a  b->nRef==2 ));..
243c0 20 20 20 20 70 43 74 65 2d 3e 7a 43 74 65 45 72      pCte->zCteEr
243d0 72 20 3d 20 22 63 69 72 63 75 6c 61 72 20 72 65  r = "circular re
243e0 66 65 72 65 6e 63 65 3a 20 25 73 22 3b 0a 20 20  ference: %s";.  
243f0 20 20 70 53 61 76 65 64 57 69 74 68 20 3d 20 70    pSavedWith = p
24400 50 61 72 73 65 2d 3e 70 57 69 74 68 3b 0a 20 20  Parse->pWith;.  
24410 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20    pParse->pWith 
24420 3d 20 70 57 69 74 68 3b 0a 20 20 20 20 73 71 6c  = pWith;.    sql
24430 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70  ite3WalkSelect(p
24440 57 61 6c 6b 65 72 2c 20 62 4d 61 79 52 65 63 75  Walker, bMayRecu
24450 72 73 69 76 65 20 3f 20 70 53 65 6c 2d 3e 70 50  rsive ? pSel->pP
24460 72 69 6f 72 20 3a 20 70 53 65 6c 29 3b 0a 20 20  rior : pSel);.  
24470 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20    pParse->pWith 
24480 3d 20 70 57 69 74 68 3b 0a 0a 20 20 20 20 66 6f  = pWith;..    fo
24490 72 28 70 4c 65 66 74 3d 70 53 65 6c 3b 20 70 4c  r(pLeft=pSel; pL
244a0 65 66 74 2d 3e 70 50 72 69 6f 72 3b 20 70 4c 65  eft->pPrior; pLe
244b0 66 74 3d 70 4c 65 66 74 2d 3e 70 50 72 69 6f 72  ft=pLeft->pPrior
244c0 29 3b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20  );.    pEList = 
244d0 70 4c 65 66 74 2d 3e 70 45 4c 69 73 74 3b 0a 20  pLeft->pEList;. 
244e0 20 20 20 69 66 28 20 70 43 74 65 2d 3e 70 43 6f     if( pCte->pCo
244f0 6c 73 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ls ){.      if( 
24500 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74  pEList && pEList
24510 2d 3e 6e 45 78 70 72 21 3d 70 43 74 65 2d 3e 70  ->nExpr!=pCte->p
24520 43 6f 6c 73 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  Cols->nExpr ){. 
24530 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
24540 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
24550 74 61 62 6c 65 20 25 73 20 68 61 73 20 25 64 20  table %s has %d 
24560 76 61 6c 75 65 73 20 66 6f 72 20 25 64 20 63 6f  values for %d co
24570 6c 75 6d 6e 73 22 2c 0a 20 20 20 20 20 20 20 20  lumns",.        
24580 20 20 20 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 2c      pCte->zName,
24590 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20   pEList->nExpr, 
245a0 70 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78  pCte->pCols->nEx
245b0 70 72 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  pr.        );.  
245c0 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57        pParse->pW
245d0 69 74 68 20 3d 20 70 53 61 76 65 64 57 69 74 68  ith = pSavedWith
245e0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
245f0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
24600 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 45 4c       }.      pEL
24610 69 73 74 20 3d 20 70 43 74 65 2d 3e 70 43 6f 6c  ist = pCte->pCol
24620 73 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71  s;.    }..    sq
24630 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d  lite3ColumnsFrom
24640 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
24650 20 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e   pEList, &pTab->
24660 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f  nCol, &pTab->aCo
24670 6c 29 3b 0a 20 20 20 20 69 66 28 20 62 4d 61 79  l);.    if( bMay
24680 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20  Recursive ){.   
24690 20 20 20 69 66 28 20 70 53 65 6c 2d 3e 73 65 6c     if( pSel->sel
246a0 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72  Flags & SF_Recur
246b0 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 20 20  sive ){.        
246c0 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20  pCte->zCteErr = 
246d0 22 6d 75 6c 74 69 70 6c 65 20 72 65 63 75 72 73  "multiple recurs
246e0 69 76 65 20 72 65 66 65 72 65 6e 63 65 73 3a 20  ive references: 
246f0 25 73 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  %s";.      }else
24700 7b 0a 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e  {.        pCte->
24710 7a 43 74 65 45 72 72 20 3d 20 22 72 65 63 75 72  zCteErr = "recur
24720 73 69 76 65 20 72 65 66 65 72 65 6e 63 65 20 69  sive reference i
24730 6e 20 61 20 73 75 62 71 75 65 72 79 3a 20 25 73  n a subquery: %s
24740 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ";.      }.     
24750 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
24760 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c  ct(pWalker, pSel
24770 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 74  );.    }.    pCt
24780 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20 30 3b 0a  e->zCteErr = 0;.
24790 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74      pParse->pWit
247a0 68 20 3d 20 70 53 61 76 65 64 57 69 74 68 3b 0a  h = pSavedWith;.
247b0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
247c0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
247d0 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
247e0 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a  E_OMIT_CTE./*.**
247f0 20 49 66 20 74 68 65 20 53 45 4c 45 43 54 20 70   If the SELECT p
24800 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
24810 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 68 61 73  ond argument has
24820 20 61 6e 20 61 73 73 6f 63 69 61 74 65 64 20 57   an associated W
24830 49 54 48 20 0a 2a 2a 20 63 6c 61 75 73 65 2c 20  ITH .** clause, 
24840 70 6f 70 20 69 74 20 66 72 6f 6d 20 74 68 65 20  pop it from the 
24850 73 74 61 63 6b 20 73 74 6f 72 65 64 20 61 73 20  stack stored as 
24860 70 61 72 74 20 6f 66 20 74 68 65 20 50 61 72 73  part of the Pars
24870 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20  e object..**.** 
24880 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
24890 20 75 73 65 64 20 61 73 20 74 68 65 20 78 53 65   used as the xSe
248a0 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 28 29 20  lectCallback2() 
248b0 63 61 6c 6c 62 61 63 6b 20 62 79 0a 2a 2a 20 73  callback by.** s
248c0 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61  qlite3SelectExpa
248d0 6e 64 28 29 20 77 68 65 6e 20 77 61 6c 6b 69 6e  nd() when walkin
248e0 67 20 61 20 53 45 4c 45 43 54 20 74 72 65 65 20  g a SELECT tree 
248f0 74 6f 20 72 65 73 6f 6c 76 65 20 74 61 62 6c 65  to resolve table
24900 0a 2a 2a 20 6e 61 6d 65 73 20 61 6e 64 20 6f 74  .** names and ot
24910 68 65 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  her FROM clause 
24920 65 6c 65 6d 65 6e 74 73 2e 20 0a 2a 2f 0a 73 74  elements. .*/.st
24930 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74  atic void select
24940 50 6f 70 57 69 74 68 28 57 61 6c 6b 65 72 20 2a  PopWith(Walker *
24950 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20  pWalker, Select 
24960 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  *p){.  Parse *pP
24970 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  arse = pWalker->
24980 70 50 61 72 73 65 3b 0a 20 20 57 69 74 68 20 2a  pParse;.  With *
24990 70 57 69 74 68 20 3d 20 66 69 6e 64 52 69 67 68  pWith = findRigh
249a0 74 6d 6f 73 74 28 70 29 2d 3e 70 57 69 74 68 3b  tmost(p)->pWith;
249b0 0a 20 20 69 66 28 20 70 57 69 74 68 21 3d 30 20  .  if( pWith!=0 
249c0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
249d0 50 61 72 73 65 2d 3e 70 57 69 74 68 3d 3d 70 57  Parse->pWith==pW
249e0 69 74 68 20 29 3b 0a 20 20 20 20 70 50 61 72 73  ith );.    pPars
249f0 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68  e->pWith = pWith
24a00 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 7d 0a 7d 0a  ->pOuter;.  }.}.
24a10 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 73 65  #else.#define se
24a20 6c 65 63 74 50 6f 70 57 69 74 68 20 30 0a 23 65  lectPopWith 0.#e
24a30 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
24a40 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 57 61   routine is a Wa
24a50 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20 66 6f  lker callback fo
24a60 72 20 22 65 78 70 61 6e 64 69 6e 67 22 20 61 20  r "expanding" a 
24a70 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
24a80 2e 0a 2a 2a 20 22 45 78 70 61 6e 64 69 6e 67 22  ..** "Expanding"
24a90 20 6d 65 61 6e 73 20 74 6f 20 64 6f 20 74 68 65   means to do the
24aa0 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
24ab0 2a 20 20 20 20 28 31 29 20 20 4d 61 6b 65 20 73  *    (1)  Make s
24ac0 75 72 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  ure VDBE cursor 
24ad0 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62 65 65  numbers have bee
24ae0 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65 76  n assigned to ev
24af0 65 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 65  ery.**         e
24b00 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 46 52  lement of the FR
24b10 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  OM clause..**.**
24b20 20 20 20 20 28 32 29 20 20 46 69 6c 6c 20 69 6e      (2)  Fill in
24b30 20 74 68 65 20 70 54 61 62 4c 69 73 74 2d 3e 61   the pTabList->a
24b40 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64 73 20 69  [].pTab fields i
24b50 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20 74 68  n the SrcList th
24b60 61 74 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 64  at .**         d
24b70 65 66 69 6e 65 73 20 46 52 4f 4d 20 63 6c 61 75  efines FROM clau
24b80 73 65 2e 20 20 57 68 65 6e 20 76 69 65 77 73 20  se.  When views 
24b90 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 46 52  appear in the FR
24ba0 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a 2a 20 20 20  OM clause,.**   
24bb0 20 20 20 20 20 20 66 69 6c 6c 20 70 54 61 62 4c        fill pTabL
24bc0 69 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74  ist->a[].pSelect
24bd0 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20   with a copy of 
24be0 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
24bf0 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  ment.**         
24c00 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  that implements 
24c10 74 68 65 20 76 69 65 77 2e 20 20 41 20 63 6f 70  the view.  A cop
24c20 79 20 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65  y is made of the
24c30 20 76 69 65 77 27 73 20 53 45 4c 45 43 54 0a 2a   view's SELECT.*
24c40 2a 20 20 20 20 20 20 20 20 20 73 74 61 74 65 6d  *         statem
24c50 65 6e 74 20 73 6f 20 74 68 61 74 20 77 65 20 63  ent so that we c
24c60 61 6e 20 66 72 65 65 6c 79 20 6d 6f 64 69 66 79  an freely modify
24c70 20 6f 72 20 64 65 6c 65 74 65 20 74 68 61 74 20   or delete that 
24c80 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20  statement.**    
24c90 20 20 20 20 20 77 69 74 68 6f 75 74 20 77 6f 72       without wor
24ca0 72 79 69 6e 67 20 61 62 6f 75 74 20 6d 65 73 73  rying about mess
24cb0 69 6e 67 20 75 70 20 74 68 65 20 70 65 72 73 69  ing up the persi
24cc0 73 74 65 6e 74 20 72 65 70 72 65 73 65 6e 74 61  stent representa
24cd0 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20  tion.**         
24ce0 6f 66 20 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a  of the view..**.
24cf0 2a 2a 20 20 20 20 28 33 29 20 20 41 64 64 20 74  **    (3)  Add t
24d00 65 72 6d 73 20 74 6f 20 74 68 65 20 57 48 45 52  erms to the WHER
24d10 45 20 63 6c 61 75 73 65 20 74 6f 20 61 63 63 6f  E clause to acco
24d20 6d 6d 6f 64 61 74 65 20 74 68 65 20 4e 41 54 55  mmodate the NATU
24d30 52 41 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a 20 20  RAL keyword.**  
24d40 20 20 20 20 20 20 20 6f 6e 20 6a 6f 69 6e 73 20         on joins 
24d50 61 6e 64 20 74 68 65 20 4f 4e 20 61 6e 64 20 55  and the ON and U
24d60 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 6a  SING clause of j
24d70 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  oins..**.**    (
24d80 34 29 20 20 53 63 61 6e 20 74 68 65 20 6c 69 73  4)  Scan the lis
24d90 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  t of columns in 
24da0 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 28  the result set (
24db0 70 45 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a  pEList) looking.
24dc0 2a 2a 20 20 20 20 20 20 20 20 20 66 6f 72 20 69  **         for i
24dd0 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20  nstances of the 
24de0 22 2a 22 20 6f 70 65 72 61 74 6f 72 20 6f 72 20  "*" operator or 
24df0 74 68 65 20 54 41 42 4c 45 2e 2a 20 6f 70 65 72  the TABLE.* oper
24e00 61 74 6f 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20  ator..**        
24e10 20 49 66 20 66 6f 75 6e 64 2c 20 65 78 70 61 6e   If found, expan
24e20 64 20 65 61 63 68 20 22 2a 22 20 74 6f 20 62 65  d each "*" to be
24e30 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e   every column in
24e40 20 65 76 65 72 79 20 74 61 62 6c 65 0a 2a 2a 20   every table.** 
24e50 20 20 20 20 20 20 20 20 61 6e 64 20 54 41 42 4c          and TABL
24e60 45 2e 2a 20 74 6f 20 62 65 20 65 76 65 72 79 20  E.* to be every 
24e70 63 6f 6c 75 6d 6e 20 69 6e 20 54 41 42 4c 45 2e  column in TABLE.
24e80 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  .**.*/.static in
24e90 74 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72  t selectExpander
24ea0 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
24eb0 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
24ec0 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
24ed0 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b  pWalker->pParse;
24ee0 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a  .  int i, j, k;.
24ef0 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
24f00 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  ist;.  ExprList 
24f10 2a 70 45 4c 69 73 74 3b 0a 20 20 73 74 72 75 63  *pEList;.  struc
24f20 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
24f30 70 46 72 6f 6d 3b 0a 20 20 73 71 6c 69 74 65 33  pFrom;.  sqlite3
24f40 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
24f50 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 2c 20 2a  b;.  Expr *pE, *
24f60 70 52 69 67 68 74 2c 20 2a 70 45 78 70 72 3b 0a  pRight, *pExpr;.
24f70 20 20 75 31 36 20 73 65 6c 46 6c 61 67 73 20 3d    u16 selFlags =
24f80 20 70 2d 3e 73 65 6c 46 6c 61 67 73 3b 0a 0a 20   p->selFlags;.. 
24f90 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20   p->selFlags |= 
24fa0 53 46 5f 45 78 70 61 6e 64 65 64 3b 0a 20 20 69  SF_Expanded;.  i
24fb0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
24fc0 6c 65 64 20 20 29 7b 0a 20 20 20 20 72 65 74 75  led  ){.    retu
24fd0 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
24fe0 7d 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d  }.  if( NEVER(p-
24ff0 3e 70 53 72 63 3d 3d 30 29 20 7c 7c 20 28 73 65  >pSrc==0) || (se
25000 6c 46 6c 61 67 73 20 26 20 53 46 5f 45 78 70 61  lFlags & SF_Expa
25010 6e 64 65 64 29 21 3d 30 20 29 7b 0a 20 20 20 20  nded)!=0 ){.    
25020 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
25030 3b 0a 20 20 7d 0a 20 20 70 54 61 62 4c 69 73 74  ;.  }.  pTabList
25040 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45   = p->pSrc;.  pE
25050 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
25060 3b 0a 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d  ;.  if( pWalker-
25070 3e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  >xSelectCallback
25080 32 3d 3d 73 65 6c 65 63 74 50 6f 70 57 69 74 68  2==selectPopWith
25090 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 57   ){.    sqlite3W
250a0 69 74 68 50 75 73 68 28 70 50 61 72 73 65 2c 20  ithPush(pParse, 
250b0 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29  findRightmost(p)
250c0 2d 3e 70 57 69 74 68 2c 20 30 29 3b 0a 20 20 7d  ->pWith, 0);.  }
250d0 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
250e0 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   cursor numbers 
250f0 68 61 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e  have been assign
25100 65 64 20 74 6f 20 61 6c 6c 20 65 6e 74 72 69 65  ed to all entrie
25110 73 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20 46 52  s in.  ** the FR
25120 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
25130 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
25140 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  t..  */.  sqlite
25150 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75  3SrcListAssignCu
25160 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 54  rsors(pParse, pT
25170 61 62 4c 69 73 74 29 3b 0a 0a 20 20 2f 2a 20 4c  abList);..  /* L
25180 6f 6f 6b 20 75 70 20 65 76 65 72 79 20 74 61 62  ook up every tab
25190 6c 65 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20  le named in the 
251a0 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
251b0 68 65 20 73 65 6c 65 63 74 2e 20 20 49 66 0a 20  he select.  If. 
251c0 20 2a 2a 20 61 6e 20 65 6e 74 72 79 20 6f 66 20   ** an entry of 
251d0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
251e0 69 73 20 61 20 73 75 62 71 75 65 72 79 20 69 6e  is a subquery in
251f0 73 74 65 61 64 20 6f 66 20 61 20 74 61 62 6c 65  stead of a table
25200 20 6f 72 20 76 69 65 77 2c 0a 20 20 2a 2a 20 74   or view,.  ** t
25210 68 65 6e 20 63 72 65 61 74 65 20 61 20 74 72 61  hen create a tra
25220 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72  nsient table str
25230 75 63 74 75 72 65 20 74 6f 20 64 65 73 63 72 69  ucture to descri
25240 62 65 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  be the subquery.
25250 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c  .  */.  for(i=0,
25260 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d   pFrom=pTabList-
25270 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e  >a; i<pTabList->
25280 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d  nSrc; i++, pFrom
25290 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  ++){.    Table *
252a0 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74  pTab;.    assert
252b0 28 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73 52 65  ( pFrom->fg.isRe
252c0 63 75 72 73 69 76 65 3d 3d 30 20 7c 7c 20 70 46  cursive==0 || pF
252d0 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 20 29 3b 0a  rom->pTab!=0 );.
252e0 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 66      if( pFrom->f
252f0 67 2e 69 73 52 65 63 75 72 73 69 76 65 20 29 20  g.isRecursive ) 
25300 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73  continue;.    as
25310 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61  sert( pFrom->pTa
25320 62 3d 3d 30 20 29 3b 0a 23 69 66 6e 64 65 66 20  b==0 );.#ifndef 
25330 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
25340 20 20 20 20 69 66 28 20 77 69 74 68 45 78 70 61      if( withExpa
25350 6e 64 28 70 57 61 6c 6b 65 72 2c 20 70 46 72 6f  nd(pWalker, pFro
25360 6d 29 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  m) ) return WRC_
25370 41 62 6f 72 74 3b 0a 20 20 20 20 69 66 28 20 70  Abort;.    if( p
25380 46 72 6f 6d 2d 3e 70 54 61 62 20 29 20 7b 7d 20  From->pTab ) {} 
25390 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
253a0 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65  if( pFrom->zName
253b0 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  ==0 ){.#ifndef S
253c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
253d0 45 52 59 0a 20 20 20 20 20 20 53 65 6c 65 63 74  ERY.      Select
253e0 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e   *pSel = pFrom->
253f0 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 2f  pSelect;.      /
25400 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e  * A sub-query in
25410 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
25420 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a   of a SELECT */.
25430 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
25440 65 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  el!=0 );.      a
25450 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54  ssert( pFrom->pT
25460 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ab==0 );.      i
25470 66 28 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65  f( sqlite3WalkSe
25480 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53  lect(pWalker, pS
25490 65 6c 29 20 29 20 72 65 74 75 72 6e 20 57 52 43  el) ) return WRC
254a0 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 70 46  _Abort;.      pF
254b0 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62  rom->pTab = pTab
254c0 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
254d0 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
254e0 66 28 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 20  f(Table));.     
254f0 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72   if( pTab==0 ) r
25500 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
25510 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65  .      pTab->nRe
25520 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 54 61  f = 1;.      pTa
25530 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  b->zName = sqlit
25540 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 73  e3MPrintf(db, "s
25550 71 6c 69 74 65 5f 73 71 5f 25 70 22 2c 20 28 76  qlite_sq_%p", (v
25560 6f 69 64 2a 29 70 54 61 62 29 3b 0a 20 20 20 20  oid*)pTab);.    
25570 20 20 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70    while( pSel->p
25580 50 72 69 6f 72 20 29 7b 20 70 53 65 6c 20 3d 20  Prior ){ pSel = 
25590 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 20 7d 0a  pSel->pPrior; }.
255a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c        sqlite3Col
255b0 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74  umnsFromExprList
255c0 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70  (pParse, pSel->p
255d0 45 4c 69 73 74 2c 26 70 54 61 62 2d 3e 6e 43 6f  EList,&pTab->nCo
255e0 6c 2c 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a  l,&pTab->aCol);.
255f0 20 20 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65        pTab->iPKe
25600 79 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 54  y = -1;.      pT
25610 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d  ab->nRowLogEst =
25620 20 32 30 30 3b 20 61 73 73 65 72 74 28 20 32 30   200; assert( 20
25630 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  0==sqlite3LogEst
25640 28 31 30 34 38 35 37 36 29 20 29 3b 0a 20 20 20  (1048576) );.   
25650 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67     pTab->tabFlag
25660 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65 72 61  s |= TF_Ephemera
25670 6c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65  l;.#endif.    }e
25680 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e  lse{.      /* An
25690 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65 20   ordinary table 
256a0 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 69 6e 20  or view name in 
256b0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
256c0 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
256d0 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20   pFrom->pTab==0 
256e0 29 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e  );.      pFrom->
256f0 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 73 71  pTab = pTab = sq
25700 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
25710 49 74 65 6d 28 70 50 61 72 73 65 2c 20 30 2c 20  Item(pParse, 0, 
25720 70 46 72 6f 6d 29 3b 0a 20 20 20 20 20 20 69 66  pFrom);.      if
25730 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75  ( pTab==0 ) retu
25740 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
25750 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 52      if( pTab->nR
25760 65 66 3d 3d 30 78 66 66 66 66 20 29 7b 0a 20 20  ef==0xffff ){.  
25770 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
25780 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
25790 6f 6f 20 6d 61 6e 79 20 72 65 66 65 72 65 6e 63  oo many referenc
257a0 65 73 20 74 6f 20 5c 22 25 73 5c 22 3a 20 6d 61  es to \"%s\": ma
257b0 78 20 36 35 35 33 35 22 2c 0a 20 20 20 20 20 20  x 65535",.      
257c0 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65       pTab->zName
257d0 29 3b 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d  );.        pFrom
257e0 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20  ->pTab = 0;.    
257f0 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
25800 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  bort;.      }.  
25810 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b      pTab->nRef++
25820 3b 0a 20 20 20 20 20 20 69 66 28 20 21 49 73 56  ;.      if( !IsV
25830 69 72 74 75 61 6c 28 70 54 61 62 29 20 26 26 20  irtual(pTab) && 
25840 63 61 6e 6e 6f 74 42 65 46 75 6e 63 74 69 6f 6e  cannotBeFunction
25850 28 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 29 20  (pParse, pFrom) 
25860 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
25870 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
25880 20 20 20 7d 0a 23 69 66 20 21 64 65 66 69 6e 65     }.#if !define
25890 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
258a0 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 20  EW) || !defined 
258b0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
258c0 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 20 20 20  TUALTABLE).     
258d0 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
258e0 54 61 62 29 20 7c 7c 20 70 54 61 62 2d 3e 70 53  Tab) || pTab->pS
258f0 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20  elect ){.       
25900 20 69 31 36 20 6e 43 6f 6c 3b 0a 20 20 20 20 20   i16 nCol;.     
25910 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 69     if( sqlite3Vi
25920 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ewGetColumnNames
25930 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 20 29  (pParse, pTab) )
25940 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
25950 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  t;.        asser
25960 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63  t( pFrom->pSelec
25970 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t==0 );.        
25980 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d  pFrom->pSelect =
25990 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
259a0 70 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 65 6c  p(db, pTab->pSel
259b0 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ect, 0);.       
259c0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 53 65   sqlite3SelectSe
259d0 74 4e 61 6d 65 28 70 46 72 6f 6d 2d 3e 70 53 65  tName(pFrom->pSe
259e0 6c 65 63 74 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  lect, pTab->zNam
259f0 65 29 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c  e);.        nCol
25a00 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20   = pTab->nCol;. 
25a10 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f         pTab->nCo
25a20 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  l = -1;.        
25a30 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
25a40 74 28 70 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d  t(pWalker, pFrom
25a50 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  ->pSelect);.    
25a60 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d      pTab->nCol =
25a70 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 23   nCol;.      }.#
25a80 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20  endif.    }..   
25a90 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69   /* Locate the i
25aa0 6e 64 65 78 20 6e 61 6d 65 64 20 62 79 20 74 68  ndex named by th
25ab0 65 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  e INDEXED BY cla
25ac0 75 73 65 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a  use, if any. */.
25ad0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
25ae0 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28 70  ndexedByLookup(p
25af0 50 61 72 73 65 2c 20 70 46 72 6f 6d 29 20 29 7b  Parse, pFrom) ){
25b00 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
25b10 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20  C_Abort;.    }. 
25b20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73   }..  /* Process
25b30 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64   NATURAL keyword
25b40 73 2c 20 61 6e 64 20 4f 4e 20 61 6e 64 20 55 53  s, and ON and US
25b50 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 6a  ING clauses of j
25b60 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  oins..  */.  if(
25b70 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
25b80 64 20 7c 7c 20 73 71 6c 69 74 65 50 72 6f 63 65  d || sqliteProce
25b90 73 73 4a 6f 69 6e 28 70 50 61 72 73 65 2c 20 70  ssJoin(pParse, p
25ba0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
25bb0 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a  WRC_Abort;.  }..
25bc0 20 20 2f 2a 20 46 6f 72 20 65 76 65 72 79 20 22    /* For every "
25bd0 2a 22 20 74 68 61 74 20 6f 63 63 75 72 73 20 69  *" that occurs i
25be0 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73  n the column lis
25bf0 74 2c 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61  t, insert the na
25c00 6d 65 73 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20  mes of.  ** all 
25c10 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74  columns in all t
25c20 61 62 6c 65 73 2e 20 20 41 6e 64 20 66 6f 72 20  ables.  And for 
25c30 65 76 65 72 79 20 54 41 42 4c 45 2e 2a 20 69 6e  every TABLE.* in
25c40 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 0a 20  sert the names. 
25c50 20 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d   ** of all colum
25c60 6e 73 20 69 6e 20 54 41 42 4c 45 2e 20 20 54 68  ns in TABLE.  Th
25c70 65 20 70 61 72 73 65 72 20 69 6e 73 65 72 74 65  e parser inserte
25c80 64 20 61 20 73 70 65 63 69 61 6c 20 65 78 70 72  d a special expr
25c90 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68  ession.  ** with
25ca0 20 74 68 65 20 54 4b 5f 41 53 54 45 52 49 53 4b   the TK_ASTERISK
25cb0 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 65 61   operator for ea
25cc0 63 68 20 22 2a 22 20 74 68 61 74 20 69 74 20 66  ch "*" that it f
25cd0 6f 75 6e 64 20 69 6e 20 74 68 65 20 63 6f 6c 75  ound in the colu
25ce0 6d 6e 0a 20 20 2a 2a 20 6c 69 73 74 2e 20 20 54  mn.  ** list.  T
25cf0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64  he following cod
25d00 65 20 6a 75 73 74 20 68 61 73 20 74 6f 20 6c 6f  e just has to lo
25d10 63 61 74 65 20 74 68 65 20 54 4b 5f 41 53 54 45  cate the TK_ASTE
25d20 52 49 53 4b 0a 20 20 2a 2a 20 65 78 70 72 65 73  RISK.  ** expres
25d30 73 69 6f 6e 73 20 61 6e 64 20 65 78 70 61 6e 64  sions and expand
25d40 20 65 61 63 68 20 6f 6e 65 20 74 6f 20 74 68 65   each one to the
25d50 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c   list of all col
25d60 75 6d 6e 73 20 69 6e 0a 20 20 2a 2a 20 61 6c 6c  umns in.  ** all
25d70 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20   tables..  **.  
25d80 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6c 6f 6f  ** The first loo
25d90 70 20 6a 75 73 74 20 63 68 65 63 6b 73 20 74 6f  p just checks to
25da0 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61 72   see if there ar
25db0 65 20 61 6e 79 20 22 2a 22 20 6f 70 65 72 61 74  e any "*" operat
25dc0 6f 72 73 0a 20 20 2a 2a 20 74 68 61 74 20 6e 65  ors.  ** that ne
25dd0 65 64 20 65 78 70 61 6e 64 69 6e 67 2e 0a 20 20  ed expanding..  
25de0 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c  */.  for(k=0; k<
25df0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b  pEList->nExpr; k
25e00 2b 2b 29 7b 0a 20 20 20 20 70 45 20 3d 20 70 45  ++){.    pE = pE
25e10 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72  List->a[k].pExpr
25e20 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70  ;.    if( pE->op
25e30 3d 3d 54 4b 5f 41 53 54 45 52 49 53 4b 20 29 20  ==TK_ASTERISK ) 
25e40 62 72 65 61 6b 3b 0a 20 20 20 20 61 73 73 65 72  break;.    asser
25e50 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f  t( pE->op!=TK_DO
25e60 54 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 21  T || pE->pRight!
25e70 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
25e80 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54  ( pE->op!=TK_DOT
25e90 20 7c 7c 20 28 70 45 2d 3e 70 4c 65 66 74 21 3d   || (pE->pLeft!=
25ea0 30 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e  0 && pE->pLeft->
25eb0 6f 70 3d 3d 54 4b 5f 49 44 29 20 29 3b 0a 20 20  op==TK_ID) );.  
25ec0 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b    if( pE->op==TK
25ed0 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70 52 69 67  _DOT && pE->pRig
25ee0 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 53 54 45 52  ht->op==TK_ASTER
25ef0 49 53 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  ISK ) break;.  }
25f00 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69 73 74 2d  .  if( k<pEList-
25f10 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 2f 2a  >nExpr ){.    /*
25f20 0a 20 20 20 20 2a 2a 20 49 66 20 77 65 20 67 65  .    ** If we ge
25f30 74 20 68 65 72 65 20 69 74 20 6d 65 61 6e 73 20  t here it means 
25f40 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 63  the result set c
25f50 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d  ontains one or m
25f60 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a 20 6f  ore "*".    ** o
25f70 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 6e 65  perators that ne
25f80 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65  ed to be expande
25f90 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68  d.  Loop through
25fa0 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e   each expression
25fb0 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72  .    ** in the r
25fc0 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20 65 78  esult set and ex
25fd0 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20 62 79  pand them one by
25fe0 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   one..    */.   
25ff0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
26000 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c 69 73  _item *a = pELis
26010 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72 4c 69  t->a;.    ExprLi
26020 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20  st *pNew = 0;.  
26030 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 50    int flags = pP
26040 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 3b  arse->db->flags;
26050 0a 20 20 20 20 69 6e 74 20 6c 6f 6e 67 4e 61 6d  .    int longNam
26060 65 73 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51  es = (flags & SQ
26070 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65  LITE_FullColName
26080 73 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20  s)!=0.          
26090 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
260a0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53  flags & SQLITE_S
260b0 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30  hortColNames)==0
260c0 3b 0a 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20  ;..    for(k=0; 
260d0 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  k<pEList->nExpr;
260e0 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 70 45 20   k++){.      pE 
260f0 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20  = a[k].pExpr;.  
26100 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 45 2d      pRight = pE-
26110 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 61  >pRight;.      a
26120 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54  ssert( pE->op!=T
26130 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67 68 74 21  K_DOT || pRight!
26140 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
26150 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 53 54 45 52  pE->op!=TK_ASTER
26160 49 53 4b 0a 20 20 20 20 20 20 20 26 26 20 28 70  ISK.       && (p
26170 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c  E->op!=TK_DOT ||
26180 20 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f   pRight->op!=TK_
26190 41 53 54 45 52 49 53 4b 29 0a 20 20 20 20 20 20  ASTERISK).      
261a0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
261b0 69 73 20 70 61 72 74 69 63 75 6c 61 72 20 65 78  is particular ex
261c0 70 72 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e 6f  pression does no
261d0 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70  t need to be exp
261e0 61 6e 64 65 64 2e 0a 20 20 20 20 20 20 20 20 2a  anded..        *
261f0 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d  /.        pNew =
26200 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
26210 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70  Append(pParse, p
26220 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78 70 72 29  New, a[k].pExpr)
26230 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  ;.        if( pN
26240 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ew ){.          
26250 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45  pNew->a[pNew->nE
26260 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61  xpr-1].zName = a
26270 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [k].zName;.     
26280 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65       pNew->a[pNe
26290 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 53 70 61  w->nExpr-1].zSpa
262a0 6e 20 3d 20 61 5b 6b 5d 2e 7a 53 70 61 6e 3b 0a  n = a[k].zSpan;.
262b0 20 20 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a            a[k].z
262c0 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Name = 0;.      
262d0 20 20 20 20 61 5b 6b 5d 2e 7a 53 70 61 6e 20 3d      a[k].zSpan =
262e0 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
262f0 20 20 20 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72        a[k].pExpr
26300 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
26310 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e{.        /* Th
26320 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  is expression is
26330 20 61 20 22 2a 22 20 6f 72 20 61 20 22 54 41 42   a "*" or a "TAB
26340 4c 45 2e 2a 22 20 61 6e 64 20 6e 65 65 64 73 20  LE.*" and needs 
26350 74 6f 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a  to be.        **
26360 20 65 78 70 61 6e 64 65 64 2e 20 2a 2f 0a 20 20   expanded. */.  
26370 20 20 20 20 20 20 69 6e 74 20 74 61 62 6c 65 53        int tableS
26380 65 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  een = 0;      /*
26390 20 53 65 74 20 74 6f 20 31 20 77 68 65 6e 20 54   Set to 1 when T
263a0 41 42 4c 45 20 6d 61 74 63 68 65 73 20 2a 2f 0a  ABLE matches */.
263b0 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54          char *zT
263c0 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20  Name = 0;       
263d0 2f 2a 20 74 65 78 74 20 6f 66 20 6e 61 6d 65 20  /* text of name 
263e0 6f 66 20 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20  of TABLE */.    
263f0 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d      if( pE->op==
26400 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20 20 20 20  TK_DOT ){.      
26410 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e      assert( pE->
26420 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 20 20  pLeft!=0 );.    
26430 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
26440 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
26450 45 2d 3e 70 4c 65 66 74 2c 20 45 50 5f 49 6e 74  E->pLeft, EP_Int
26460 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
26470 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20 70 45 2d      zTName = pE-
26480 3e 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e  >pLeft->u.zToken
26490 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
264a0 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72      for(i=0, pFr
264b0 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20  om=pTabList->a; 
264c0 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
264d0 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b  ; i++, pFrom++){
264e0 0a 20 20 20 20 20 20 20 20 20 20 54 61 62 6c 65  .          Table
264f0 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e   *pTab = pFrom->
26500 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pTab;.          
26510 53 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70  Select *pSub = p
26520 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  From->pSelect;. 
26530 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
26540 54 61 62 4e 61 6d 65 20 3d 20 70 46 72 6f 6d 2d  TabName = pFrom-
26550 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20  >zAlias;.       
26560 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
26570 53 63 68 65 6d 61 4e 61 6d 65 20 3d 20 30 3b 0a  SchemaName = 0;.
26580 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 44            int iD
26590 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  b;.          if(
265a0 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 29 7b 0a   zTabName==0 ){.
265b0 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 61 62              zTab
265c0 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61  Name = pTab->zNa
265d0 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  me;.          }.
265e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64 62            if( db
265f0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
26600 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
26610 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20 7c 7c    if( pSub==0 ||
26620 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73   (pSub->selFlags
26630 20 26 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d   & SF_NestedFrom
26640 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
26650 20 20 20 20 70 53 75 62 20 3d 20 30 3b 0a 20 20      pSub = 0;.  
26660 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54            if( zT
26670 4e 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33 53  Name && sqlite3S
26680 74 72 49 43 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a  trICmp(zTName, z
26690 54 61 62 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20  TabName)!=0 ){. 
266a0 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
266b0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
266c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
266d0 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
266e0 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
266f0 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
26700 20 20 20 20 20 20 20 20 20 20 20 20 7a 53 63 68              zSch
26710 65 6d 61 4e 61 6d 65 20 3d 20 69 44 62 3e 3d 30  emaName = iDb>=0
26720 20 3f 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   ? db->aDb[iDb].
26730 7a 4e 61 6d 65 20 3a 20 22 2a 22 3b 0a 20 20 20  zName : "*";.   
26740 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
26750 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54     for(j=0; j<pT
26760 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  ab->nCol; j++){.
26770 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72              char
26780 20 2a 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e   *zName = pTab->
26790 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20  aCol[j].zName;. 
267a0 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20             char 
267b0 2a 7a 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 54  *zColname;  /* T
267c0 68 65 20 63 6f 6d 70 75 74 65 64 20 63 6f 6c 75  he computed colu
267d0 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20  mn name */.     
267e0 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 6f         char *zTo
267f0 46 72 65 65 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f  Free;   /* Mallo
26800 63 65 64 20 73 74 72 69 6e 67 20 74 68 61 74 20  ced string that 
26810 6e 65 65 64 73 20 74 6f 20 62 65 20 66 72 65 65  needs to be free
26820 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  d */.           
26830 20 54 6f 6b 65 6e 20 73 43 6f 6c 6e 61 6d 65 3b   Token sColname;
26840 20 20 2f 2a 20 43 6f 6d 70 75 74 65 64 20 63 6f    /* Computed co
26850 6c 75 6d 6e 20 6e 61 6d 65 20 61 73 20 61 20 74  lumn name as a t
26860 6f 6b 65 6e 20 2a 2f 0a 0a 20 20 20 20 20 20 20  oken */..       
26870 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 4e 61       assert( zNa
26880 6d 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  me );.          
26890 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20    if( zTName && 
268a0 70 53 75 62 0a 20 20 20 20 20 20 20 20 20 20 20  pSub.           
268b0 20 20 26 26 20 73 71 6c 69 74 65 33 4d 61 74 63    && sqlite3Matc
268c0 68 53 70 61 6e 4e 61 6d 65 28 70 53 75 62 2d 3e  hSpanName(pSub->
268d0 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70  pEList->a[j].zSp
268e0 61 6e 2c 20 30 2c 20 7a 54 4e 61 6d 65 2c 20 30  an, 0, zTName, 0
268f0 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )==0.           
26900 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
26910 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
26920 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
26930 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 63         /* If a c
26940 6f 6c 75 6d 6e 20 69 73 20 6d 61 72 6b 65 64 20  olumn is marked 
26950 61 73 20 27 68 69 64 64 65 6e 27 2c 20 6f 6d 69  as 'hidden', omi
26960 74 20 69 74 20 66 72 6f 6d 20 74 68 65 20 65 78  t it from the ex
26970 70 61 6e 64 65 64 0a 20 20 20 20 20 20 20 20 20  panded.         
26980 20 20 20 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74     ** result-set
26990 20 6c 69 73 74 20 75 6e 6c 65 73 73 20 74 68 65   list unless the
269a0 20 53 45 4c 45 43 54 20 68 61 73 20 74 68 65 20   SELECT has the 
269b0 53 46 5f 49 6e 63 6c 75 64 65 48 69 64 64 65 6e  SF_IncludeHidden
269c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
269d0 62 69 74 20 73 65 74 2e 0a 20 20 20 20 20 20 20  bit set..       
269e0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
269f0 20 20 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46      if( (p->selF
26a00 6c 61 67 73 20 26 20 53 46 5f 49 6e 63 6c 75 64  lags & SF_Includ
26a10 65 48 69 64 64 65 6e 29 3d 3d 30 0a 20 20 20 20  eHidden)==0.    
26a20 20 20 20 20 20 20 20 20 20 26 26 20 49 73 48 69           && IsHi
26a30 64 64 65 6e 43 6f 6c 75 6d 6e 28 26 70 54 61 62  ddenColumn(&pTab
26a40 2d 3e 61 43 6f 6c 5b 6a 5d 29 20 0a 20 20 20 20  ->aCol[j]) .    
26a50 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
26a60 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
26a70 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
26a80 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 61 62  .            tab
26a90 6c 65 53 65 65 6e 20 3d 20 31 3b 0a 0a 20 20 20  leSeen = 1;..   
26aa0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 30           if( i>0
26ab0 20 26 26 20 7a 54 4e 61 6d 65 3d 3d 30 20 29 7b   && zTName==0 ){
26ac0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
26ad0 66 28 20 28 70 46 72 6f 6d 2d 3e 66 67 2e 6a 6f  f( (pFrom->fg.jo
26ae0 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55  intype & JT_NATU
26af0 52 41 4c 29 21 3d 30 0a 20 20 20 20 20 20 20 20  RAL)!=0.        
26b00 20 20 20 20 20 20 20 20 26 26 20 74 61 62 6c 65          && table
26b10 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70  AndColumnIndex(p
26b20 54 61 62 4c 69 73 74 2c 20 69 2c 20 7a 4e 61 6d  TabList, i, zNam
26b30 65 2c 20 30 2c 20 30 29 0a 20 20 20 20 20 20 20  e, 0, 0).       
26b40 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
26b50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20            /* In 
26b60 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c 20  a NATURAL join, 
26b70 6f 6d 69 74 20 74 68 65 20 6a 6f 69 6e 20 63 6f  omit the join co
26b80 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 0a  lumns from the .
26b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ba0 2a 2a 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20  ** table to the 
26bb0 72 69 67 68 74 20 6f 66 20 74 68 65 20 6a 6f 69  right of the joi
26bc0 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  n */.           
26bd0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
26be0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
26bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
26c00 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e   sqlite3IdListIn
26c10 64 65 78 28 70 46 72 6f 6d 2d 3e 70 55 73 69 6e  dex(pFrom->pUsin
26c20 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a  g, zName)>=0 ){.
26c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c40 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74  /* In a join wit
26c50 68 20 61 20 55 53 49 4e 47 20 63 6c 61 75 73 65  h a USING clause
26c60 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69  , omit columns i
26c70 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  n the.          
26c80 20 20 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 63        ** using c
26c90 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20 74  lause from the t
26ca0 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68  able on the righ
26cb0 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  t. */.          
26cc0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
26cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
26ce0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
26cf0 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74            pRight
26d00 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64   = sqlite3Expr(d
26d10 62 2c 20 54 4b 5f 49 44 2c 20 7a 4e 61 6d 65 29  b, TK_ID, zName)
26d20 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 43  ;.            zC
26d30 6f 6c 6e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a  olname = zName;.
26d40 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 6f 46              zToF
26d50 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ree = 0;.       
26d60 20 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d       if( longNam
26d70 65 73 20 7c 7c 20 70 54 61 62 4c 69 73 74 2d 3e  es || pTabList->
26d80 6e 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20  nSrc>1 ){.      
26d90 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c          Expr *pL
26da0 65 66 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eft;.           
26db0 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74     pLeft = sqlit
26dc0 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44  e3Expr(db, TK_ID
26dd0 2c 20 7a 54 61 62 4e 61 6d 65 29 3b 0a 20 20 20  , zTabName);.   
26de0 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
26df0 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
26e00 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20  pParse, TK_DOT, 
26e10 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 30  pLeft, pRight, 0
26e20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
26e30 20 69 66 28 20 7a 53 63 68 65 6d 61 4e 61 6d 65   if( zSchemaName
26e40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
26e50 20 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c 69      pLeft = sqli
26e60 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49  te3Expr(db, TK_I
26e70 44 2c 20 7a 53 63 68 65 6d 61 4e 61 6d 65 29 3b  D, zSchemaName);
26e80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26e90 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33   pExpr = sqlite3
26ea0 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
26eb0 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 45 78  _DOT, pLeft, pEx
26ec0 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  pr, 0);.        
26ed0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
26ee0 20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61        if( longNa
26ef0 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  mes ){.         
26f00 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65 20         zColname 
26f10 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
26f20 28 64 62 2c 20 22 25 73 2e 25 73 22 2c 20 7a 54  (db, "%s.%s", zT
26f30 61 62 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a  abName, zName);.
26f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f50 7a 54 6f 46 72 65 65 20 3d 20 7a 43 6f 6c 6e 61  zToFree = zColna
26f60 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  me;.            
26f70 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
26f80 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
26f90 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 52 69       pExpr = pRi
26fa0 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ght;.           
26fb0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70   }.            p
26fc0 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
26fd0 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
26fe0 73 65 2c 20 70 4e 65 77 2c 20 70 45 78 70 72 29  se, pNew, pExpr)
26ff0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
27000 6c 69 74 65 33 54 6f 6b 65 6e 49 6e 69 74 28 26  lite3TokenInit(&
27010 73 43 6f 6c 6e 61 6d 65 2c 20 7a 43 6f 6c 6e 61  sColname, zColna
27020 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
27030 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
27040 53 65 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  SetName(pParse, 
27050 70 4e 65 77 2c 20 26 73 43 6f 6c 6e 61 6d 65 2c  pNew, &sColname,
27060 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
27070 20 69 66 28 20 70 4e 65 77 20 26 26 20 28 70 2d   if( pNew && (p-
27080 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e  >selFlags & SF_N
27090 65 73 74 65 64 46 72 6f 6d 29 21 3d 30 20 29 7b  estedFrom)!=0 ){
270a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
270b0 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
270c0 74 65 6d 20 2a 70 58 20 3d 20 26 70 4e 65 77 2d  tem *pX = &pNew-
270d0 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31  >a[pNew->nExpr-1
270e0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ];.             
270f0 20 69 66 28 20 70 53 75 62 20 29 7b 0a 20 20 20   if( pSub ){.   
27100 20 20 20 20 20 20 20 20 20 20 20 20 20 70 58 2d               pX-
27110 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33  >zSpan = sqlite3
27120 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 53 75  DbStrDup(db, pSu
27130 62 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e  b->pEList->a[j].
27140 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20 20 20 20  zSpan);.        
27150 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
27160 28 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29  ( pX->zSpan==0 )
27170 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
27180 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
27190 20 20 20 20 20 20 20 70 58 2d 3e 7a 53 70 61 6e         pX->zSpan
271a0 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
271b0 66 28 64 62 2c 20 22 25 73 2e 25 73 2e 25 73 22  f(db, "%s.%s.%s"
271c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
271d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
271e0 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 53 63               zSc
271f0 68 65 6d 61 4e 61 6d 65 2c 20 7a 54 61 62 4e 61  hemaName, zTabNa
27200 6d 65 2c 20 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20  me, zColname);. 
27210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
27220 65 73 74 63 61 73 65 28 20 70 58 2d 3e 7a 53 70  estcase( pX->zSp
27230 61 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  an==0 );.       
27240 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27250 20 20 20 20 20 20 20 70 58 2d 3e 62 53 70 61 6e         pX->bSpan
27260 49 73 54 61 62 20 3d 20 31 3b 0a 20 20 20 20 20  IsTab = 1;.     
27270 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27280 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
27290 65 65 28 64 62 2c 20 7a 54 6f 46 72 65 65 29 3b  ee(db, zToFree);
272a0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
272b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
272c0 66 28 20 21 74 61 62 6c 65 53 65 65 6e 20 29 7b  f( !tableSeen ){
272d0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a  .          if( z
272e0 54 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  TName ){.       
272f0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
27300 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
27310 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25 73 22   such table: %s"
27320 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20  , zTName);.     
27330 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
27340 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
27350 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
27360 22 6e 6f 20 74 61 62 6c 65 73 20 73 70 65 63 69  "no tables speci
27370 66 69 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20  fied");.        
27380 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
27390 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
273a0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
273b0 65 6c 65 74 65 28 64 62 2c 20 70 45 4c 69 73 74  elete(db, pEList
273c0 29 3b 0a 20 20 20 20 70 2d 3e 70 45 4c 69 73 74  );.    p->pEList
273d0 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 23 69 66   = pNew;.  }.#if
273e0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55   SQLITE_MAX_COLU
273f0 4d 4e 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69  MN.  if( p->pELi
27400 73 74 20 26 26 20 70 2d 3e 70 45 4c 69 73 74 2d  st && p->pEList-
27410 3e 6e 45 78 70 72 3e 64 62 2d 3e 61 4c 69 6d 69  >nExpr>db->aLimi
27420 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43  t[SQLITE_LIMIT_C
27430 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71  OLUMN] ){.    sq
27440 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
27450 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  arse, "too many 
27460 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c  columns in resul
27470 74 20 73 65 74 22 29 3b 0a 20 20 20 20 72 65 74  t set");.    ret
27480 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
27490 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
274a0 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
274b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20  .}../*.** No-op 
274c0 72 6f 75 74 69 6e 65 20 66 6f 72 20 74 68 65 20  routine for the 
274d0 70 61 72 73 65 2d 74 72 65 65 20 77 61 6c 6b 65  parse-tree walke
274e0 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  r..**.** When th
274f0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68  is routine is th
27500 65 20 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61  e Walker.xExprCa
27510 6c 6c 62 61 63 6b 20 74 68 65 6e 20 65 78 70 72  llback then expr
27520 65 73 73 69 6f 6e 20 74 72 65 65 73 0a 2a 2a 20  ession trees.** 
27530 61 72 65 20 77 61 6c 6b 65 64 20 77 69 74 68 6f  are walked witho
27540 75 74 20 61 6e 79 20 61 63 74 69 6f 6e 73 20 62  ut any actions b
27550 65 69 6e 67 20 74 61 6b 65 6e 20 61 74 20 65 61  eing taken at ea
27560 63 68 20 6e 6f 64 65 2e 20 20 50 72 65 73 75 6d  ch node.  Presum
27570 61 62 6c 79 2c 0a 2a 2a 20 77 68 65 6e 20 74 68  ably,.** when th
27580 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
27590 65 64 20 66 6f 72 20 57 61 6c 6b 65 72 2e 78 45  ed for Walker.xE
275a0 78 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e  xprCallback then
275b0 20 0a 2a 2a 20 57 61 6c 6b 65 72 2e 78 53 65 6c   .** Walker.xSel
275c0 65 63 74 43 61 6c 6c 62 61 63 6b 20 69 73 20 73  ectCallback is s
275d0 65 74 20 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69  et to do somethi
275e0 6e 67 20 75 73 65 66 75 6c 20 66 6f 72 20 65 76  ng useful for ev
275f0 65 72 79 20 0a 2a 2a 20 73 75 62 71 75 65 72 79  ery .** subquery
27600 20 69 6e 20 74 68 65 20 70 61 72 73 65 72 20 74   in the parser t
27610 72 65 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ree..*/.int sqli
27620 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 28  te3ExprWalkNoop(
27630 57 61 6c 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c  Walker *NotUsed,
27640 20 45 78 70 72 20 2a 4e 6f 74 55 73 65 64 32 29   Expr *NotUsed2)
27650 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
27660 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e  ETER2(NotUsed, N
27670 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75  otUsed2);.  retu
27680 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
27690 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
276a0 6f 75 74 69 6e 65 20 22 65 78 70 61 6e 64 73 22  outine "expands"
276b0 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
276c0 65 6e 74 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69  ent and all of i
276d0 74 73 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a  ts subqueries..*
276e0 2a 20 46 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  * For additional
276f0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20   information on 
27700 77 68 61 74 20 69 74 20 6d 65 61 6e 73 20 74 6f  what it means to
27710 20 22 65 78 70 61 6e 64 22 20 61 20 53 45 4c 45   "expand" a SELE
27720 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2c  CT.** statement,
27730 20 73 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74   see the comment
27740 20 6f 6e 20 74 68 65 20 73 65 6c 65 63 74 45 78   on the selectEx
27750 70 61 6e 64 20 77 6f 72 6b 65 72 20 63 61 6c 6c  pand worker call
27760 62 61 63 6b 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a  back above..**.*
27770 2a 20 45 78 70 61 6e 64 69 6e 67 20 61 20 53 45  * Expanding a SE
27780 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69  LECT statement i
27790 73 20 74 68 65 20 66 69 72 73 74 20 73 74 65 70  s the first step
277a0 20 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61   in processing a
277b0 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65  .** SELECT state
277c0 6d 65 6e 74 2e 20 20 54 68 65 20 53 45 4c 45 43  ment.  The SELEC
277d0 54 20 73 74 61 74 65 6d 65 6e 74 20 6d 75 73 74  T statement must
277e0 20 62 65 20 65 78 70 61 6e 64 65 64 20 62 65 66   be expanded bef
277f0 6f 72 65 0a 2a 2a 20 6e 61 6d 65 20 72 65 73 6f  ore.** name reso
27800 6c 75 74 69 6f 6e 20 69 73 20 70 65 72 66 6f 72  lution is perfor
27810 6d 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  med..**.** If an
27820 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ything goes wron
27830 67 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  g, an error mess
27840 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69  age is written i
27850 6e 74 6f 20 70 50 61 72 73 65 2e 0a 2a 2a 20 54  nto pParse..** T
27860 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
27870 69 6f 6e 20 63 61 6e 20 64 65 74 65 63 74 20 74  ion can detect t
27880 68 65 20 70 72 6f 62 6c 65 6d 20 62 79 20 6c 6f  he problem by lo
27890 6f 6b 69 6e 67 20 61 74 20 70 50 61 72 73 65 2d  oking at pParse-
278a0 3e 6e 45 72 72 0a 2a 2a 20 61 6e 64 2f 6f 72 20  >nErr.** and/or 
278b0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
278c0 6f 63 46 61 69 6c 65 64 2e 0a 2a 2f 0a 73 74 61  ocFailed..*/.sta
278d0 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
278e0 53 65 6c 65 63 74 45 78 70 61 6e 64 28 50 61 72  SelectExpand(Par
278f0 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
27900 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20  ct *pSelect){.  
27910 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73  Walker w;.  mems
27920 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66  et(&w, 0, sizeof
27930 28 77 29 29 3b 0a 20 20 77 2e 78 45 78 70 72 43  (w));.  w.xExprC
27940 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65  allback = sqlite
27950 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20  3ExprWalkNoop;. 
27960 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72   w.pParse = pPar
27970 73 65 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  se;.  if( pParse
27980 2d 3e 68 61 73 43 6f 6d 70 6f 75 6e 64 20 29 7b  ->hasCompound ){
27990 0a 20 20 20 20 77 2e 78 53 65 6c 65 63 74 43 61  .    w.xSelectCa
279a0 6c 6c 62 61 63 6b 20 3d 20 63 6f 6e 76 65 72 74  llback = convert
279b0 43 6f 6d 70 6f 75 6e 64 53 65 6c 65 63 74 54 6f  CompoundSelectTo
279c0 53 75 62 71 75 65 72 79 3b 0a 20 20 20 20 73 71  Subquery;.    sq
279d0 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28  lite3WalkSelect(
279e0 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20  &w, pSelect);.  
279f0 7d 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  }.  w.xSelectCal
27a00 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 45 78  lback = selectEx
27a10 70 61 6e 64 65 72 3b 0a 20 20 69 66 28 20 28 70  pander;.  if( (p
27a20 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73  Select->selFlags
27a30 20 26 20 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65   & SF_MultiValue
27a40 29 3d 3d 30 20 29 7b 0a 20 20 20 20 77 2e 78 53  )==0 ){.    w.xS
27a50 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d  electCallback2 =
27a60 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68 3b 0a   selectPopWith;.
27a70 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 57 61 6c    }.  sqlite3Wal
27a80 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c  kSelect(&w, pSel
27a90 65 63 74 29 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65  ect);.}...#ifnde
27aa0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
27ab0 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68 69  BQUERY./*.** Thi
27ac0 73 20 69 73 20 61 20 57 61 6c 6b 65 72 2e 78 53  s is a Walker.xS
27ad0 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 63 61  electCallback ca
27ae0 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68 65 20 73  llback for the s
27af0 71 6c 69 74 65 33 53 65 6c 65 63 74 54 79 70 65  qlite3SelectType
27b00 49 6e 66 6f 28 29 0a 2a 2a 20 69 6e 74 65 72 66  Info().** interf
27b10 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65  ace..**.** For e
27b20 61 63 68 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20  ach FROM-clause 
27b30 73 75 62 71 75 65 72 79 2c 20 61 64 64 20 43 6f  subquery, add Co
27b40 6c 75 6d 6e 2e 7a 54 79 70 65 20 61 6e 64 20 43  lumn.zType and C
27b50 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 0a 2a 2a 20 69  olumn.zColl.** i
27b60 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68  nformation to th
27b70 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
27b80 65 20 74 68 61 74 20 72 65 70 72 65 73 65 6e 74  e that represent
27b90 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  s the result set
27ba0 0a 2a 2a 20 6f 66 20 74 68 61 74 20 73 75 62 71  .** of that subq
27bb0 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  uery..**.** The 
27bc0 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
27bd0 74 68 61 74 20 72 65 70 72 65 73 65 6e 74 73 20  that represents 
27be0 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 77  the result set w
27bf0 61 73 20 63 6f 6e 73 74 72 75 63 74 65 64 0a 2a  as constructed.*
27c00 2a 20 62 79 20 73 65 6c 65 63 74 45 78 70 61 6e  * by selectExpan
27c10 64 65 72 28 29 20 62 75 74 20 74 68 65 20 74 79  der() but the ty
27c20 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e  pe and collation
27c30 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 61 73   information was
27c40 20 6f 6d 69 74 74 65 64 0a 2a 2a 20 61 74 20 74   omitted.** at t
27c50 68 61 74 20 70 6f 69 6e 74 20 62 65 63 61 75 73  hat point becaus
27c60 65 20 69 64 65 6e 74 69 66 69 65 72 73 20 68 61  e identifiers ha
27c70 64 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 72  d not yet been r
27c80 65 73 6f 6c 76 65 64 2e 20 20 54 68 69 73 0a 2a  esolved.  This.*
27c90 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  * routine is cal
27ca0 6c 65 64 20 61 66 74 65 72 20 69 64 65 6e 74 69  led after identi
27cb0 66 69 65 72 20 72 65 73 6f 6c 75 74 69 6f 6e 2e  fier resolution.
27cc0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
27cd0 73 65 6c 65 63 74 41 64 64 53 75 62 71 75 65 72  selectAddSubquer
27ce0 79 54 79 70 65 49 6e 66 6f 28 57 61 6c 6b 65 72  yTypeInfo(Walker
27cf0 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63   *pWalker, Selec
27d00 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a  t *p){.  Parse *
27d10 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 3b  pParse;.  int i;
27d20 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
27d30 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53  List;.  struct S
27d40 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72  rcList_item *pFr
27d50 6f 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  om;..  assert( p
27d60 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
27d70 52 65 73 6f 6c 76 65 64 20 29 3b 0a 20 20 61 73  Resolved );.  as
27d80 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61  sert( (p->selFla
27d90 67 73 20 26 20 53 46 5f 48 61 73 54 79 70 65 49  gs & SF_HasTypeI
27da0 6e 66 6f 29 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e  nfo)==0 );.  p->
27db0 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 48  selFlags |= SF_H
27dc0 61 73 54 79 70 65 49 6e 66 6f 3b 0a 20 20 70 50  asTypeInfo;.  pP
27dd0 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  arse = pWalker->
27de0 70 50 61 72 73 65 3b 0a 20 20 70 54 61 62 4c 69  pParse;.  pTabLi
27df0 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  st = p->pSrc;.  
27e00 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70  for(i=0, pFrom=p
27e10 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54  TabList->a; i<pT
27e20 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
27e30 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20  +, pFrom++){.   
27e40 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
27e50 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  From->pTab;.    
27e60 61 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20  assert( pTab!=0 
27e70 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 61 62  );.    if( (pTab
27e80 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
27e90 45 70 68 65 6d 65 72 61 6c 29 21 3d 30 20 29 7b  Ephemeral)!=0 ){
27ea0 0a 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d  .      /* A sub-
27eb0 71 75 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f  query in the FRO
27ec0 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45  M clause of a SE
27ed0 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 53 65  LECT */.      Se
27ee0 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70 46 72  lect *pSel = pFr
27ef0 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20  om->pSelect;.   
27f00 20 20 20 69 66 28 20 70 53 65 6c 20 29 7b 0a 20     if( pSel ){. 
27f10 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53         while( pS
27f20 65 6c 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65  el->pPrior ) pSe
27f30 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72  l = pSel->pPrior
27f40 3b 0a 20 20 20 20 20 20 20 20 73 65 6c 65 63 74  ;.        select
27f50 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64  AddColumnTypeAnd
27f60 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65  Collation(pParse
27f70 2c 20 70 54 61 62 2c 20 70 53 65 6c 29 3b 0a 20  , pTab, pSel);. 
27f80 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
27f90 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
27fa0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
27fb0 64 64 73 20 64 61 74 61 74 79 70 65 20 61 6e 64  dds datatype and
27fc0 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
27fd0 6e 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  nce information 
27fe0 74 6f 0a 2a 2a 20 74 68 65 20 54 61 62 6c 65 20  to.** the Table 
27ff0 73 74 72 75 63 74 75 72 65 73 20 6f 66 20 61 6c  structures of al
28000 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75  l FROM-clause su
28010 62 71 75 65 72 69 65 73 20 69 6e 20 61 0a 2a 2a  bqueries in a.**
28020 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
28030 74 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 69  t..**.** Use thi
28040 73 20 72 6f 75 74 69 6e 65 20 61 66 74 65 72 20  s routine after 
28050 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 2e  name resolution.
28060 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
28070 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64  sqlite3SelectAdd
28080 54 79 70 65 49 6e 66 6f 28 50 61 72 73 65 20 2a  TypeInfo(Parse *
28090 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
280a0 70 53 65 6c 65 63 74 29 7b 0a 23 69 66 6e 64 65  pSelect){.#ifnde
280b0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
280c0 42 51 55 45 52 59 0a 20 20 57 61 6c 6b 65 72 20  BQUERY.  Walker 
280d0 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20  w;.  memset(&w, 
280e0 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20  0, sizeof(w));. 
280f0 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
28100 63 6b 32 20 3d 20 73 65 6c 65 63 74 41 64 64 53  ck2 = selectAddS
28110 75 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f 3b  ubqueryTypeInfo;
28120 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61  .  w.xExprCallba
28130 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ck = sqlite3Expr
28140 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50  WalkNoop;.  w.pP
28150 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
28160 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
28170 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b  ct(&w, pSelect);
28180 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a  .#endif.}.../*.*
28190 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
281a0 65 74 73 20 75 70 20 61 20 53 45 4c 45 43 54 20  ets up a SELECT 
281b0 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 70 72  statement for pr
281c0 6f 63 65 73 73 69 6e 67 2e 20 20 54 68 65 0a 2a  ocessing.  The.*
281d0 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61  * following is a
281e0 63 63 6f 6d 70 6c 69 73 68 65 64 3a 0a 2a 2a 0a  ccomplished:.**.
281f0 2a 2a 20 20 20 20 20 2a 20 20 56 44 42 45 20 43  **     *  VDBE C
28200 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 61 72  ursor numbers ar
28210 65 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c  e assigned to al
28220 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 74 65  l FROM-clause te
28230 72 6d 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 45  rms..**     *  E
28240 70 68 65 6d 65 72 61 6c 20 54 61 62 6c 65 20 6f  phemeral Table o
28250 62 6a 65 63 74 73 20 61 72 65 20 63 72 65 61 74  bjects are creat
28260 65 64 20 66 6f 72 20 61 6c 6c 20 46 52 4f 4d 2d  ed for all FROM-
28270 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 69 65  clause subquerie
28280 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 4f 4e 20  s..**     *  ON 
28290 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65  and USING clause
282a0 73 20 61 72 65 20 73 68 69 66 74 65 64 20 69 6e  s are shifted in
282b0 74 6f 20 57 48 45 52 45 20 73 74 61 74 65 6d 65  to WHERE stateme
282c0 6e 74 73 0a 2a 2a 20 20 20 20 20 2a 20 20 57 69  nts.**     *  Wi
282d0 6c 64 63 61 72 64 73 20 22 2a 22 20 61 6e 64 20  ldcards "*" and 
282e0 22 54 41 42 4c 45 2e 2a 22 20 69 6e 20 72 65 73  "TABLE.*" in res
282f0 75 6c 74 20 73 65 74 73 20 61 72 65 20 65 78 70  ult sets are exp
28300 61 6e 64 65 64 2e 0a 2a 2a 20 20 20 20 20 2a 20  anded..**     * 
28310 20 49 64 65 6e 74 69 66 69 65 72 73 20 69 6e 20   Identifiers in 
28320 65 78 70 72 65 73 73 69 6f 6e 20 61 72 65 20 6d  expression are m
28330 61 74 63 68 65 64 20 74 6f 20 74 61 62 6c 65 73  atched to tables
28340 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
28350 74 69 6e 65 20 61 63 74 73 20 72 65 63 75 72 73  tine acts recurs
28360 69 76 65 6c 79 20 6f 6e 20 61 6c 6c 20 73 75 62  ively on all sub
28370 71 75 65 72 69 65 73 20 77 69 74 68 69 6e 20 74  queries within t
28380 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f  he SELECT..*/.vo
28390 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  id sqlite3Select
283a0 50 72 65 70 28 0a 20 20 50 61 72 73 65 20 2a 70  Prep(.  Parse *p
283b0 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
283c0 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
283d0 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
283e0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
283f0 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
28400 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63  tatement being c
28410 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43  oded. */.  NameC
28420 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65 72 4e 43  ontext *pOuterNC
28430 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78    /* Name contex
28440 74 20 66 6f 72 20 63 6f 6e 74 61 69 6e 65 72 20  t for container 
28450 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
28460 2a 64 62 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  *db;.  if( NEVER
28470 28 70 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b  (p==0) ) return;
28480 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
28490 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  db;.  if( db->ma
284a0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
284b0 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 73 65  urn;.  if( p->se
284c0 6c 46 6c 61 67 73 20 26 20 53 46 5f 48 61 73 54  lFlags & SF_HasT
284d0 79 70 65 49 6e 66 6f 20 29 20 72 65 74 75 72 6e  ypeInfo ) return
284e0 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
284f0 74 45 78 70 61 6e 64 28 70 50 61 72 73 65 2c 20  tExpand(pParse, 
28500 70 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  p);.  if( pParse
28510 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61  ->nErr || db->ma
28520 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
28530 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  urn;.  sqlite3Re
28540 73 6f 6c 76 65 53 65 6c 65 63 74 4e 61 6d 65 73  solveSelectNames
28550 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4f 75 74  (pParse, p, pOut
28560 65 72 4e 43 29 3b 0a 20 20 69 66 28 20 70 50 61  erNC);.  if( pPa
28570 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d  rse->nErr || db-
28580 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
28590 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65  return;.  sqlite
285a0 33 53 65 6c 65 63 74 41 64 64 54 79 70 65 49 6e  3SelectAddTypeIn
285b0 66 6f 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 7d  fo(pParse, p);.}
285c0 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68  ../*.** Reset th
285d0 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75  e aggregate accu
285e0 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  mulator..**.** T
285f0 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63  he aggregate acc
28600 75 6d 75 6c 61 74 6f 72 20 69 73 20 61 20 73 65  umulator is a se
28610 74 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  t of memory cell
28620 73 20 74 68 61 74 20 68 6f 6c 64 0a 2a 2a 20 69  s that hold.** i
28630 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75  ntermediate resu
28640 6c 74 73 20 77 68 69 6c 65 20 63 61 6c 63 75 6c  lts while calcul
28650 61 74 69 6e 67 20 61 6e 20 61 67 67 72 65 67 61  ating an aggrega
28660 74 65 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75  te.  This.** rou
28670 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63  tine generates c
28680 6f 64 65 20 74 68 61 74 20 73 74 6f 72 65 73 20  ode that stores 
28690 4e 55 4c 4c 73 20 69 6e 20 61 6c 6c 20 6f 66 20  NULLs in all of 
286a0 74 68 6f 73 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20  those memory.** 
286b0 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  cells..*/.static
286c0 20 76 6f 69 64 20 72 65 73 65 74 41 63 63 75 6d   void resetAccum
286d0 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50  ulator(Parse *pP
286e0 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70  arse, AggInfo *p
286f0 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65  AggInfo){.  Vdbe
28700 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
28710 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
28720 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66  struct AggInfo_f
28730 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20 69 6e  unc *pFunc;.  in
28740 74 20 6e 52 65 67 20 3d 20 70 41 67 67 49 6e 66  t nReg = pAggInf
28750 6f 2d 3e 6e 46 75 6e 63 20 2b 20 70 41 67 67 49  o->nFunc + pAggI
28760 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  nfo->nColumn;.  
28770 69 66 28 20 6e 52 65 67 3d 3d 30 20 29 20 72 65  if( nReg==0 ) re
28780 74 75 72 6e 3b 0a 23 69 66 64 65 66 20 53 51 4c  turn;.#ifdef SQL
28790 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 56  ITE_DEBUG.  /* V
287a0 65 72 69 66 79 20 74 68 61 74 20 61 6c 6c 20 41  erify that all A
287b0 67 67 49 6e 66 6f 20 72 65 67 69 73 74 65 72 73  ggInfo registers
287c0 20 61 72 65 20 77 69 74 68 69 6e 20 74 68 65 20   are within the 
287d0 72 61 6e 67 65 20 73 70 65 63 69 66 69 65 64 20  range specified 
287e0 62 79 0a 20 20 2a 2a 20 41 67 67 49 6e 66 6f 2e  by.  ** AggInfo.
287f0 6d 6e 52 65 67 2e 2e 41 67 67 49 6e 66 6f 2e 6d  mnReg..AggInfo.m
28800 78 52 65 67 20 2a 2f 0a 20 20 61 73 73 65 72 74  xReg */.  assert
28810 28 20 6e 52 65 67 3d 3d 70 41 67 67 49 6e 66 6f  ( nReg==pAggInfo
28820 2d 3e 6d 78 52 65 67 2d 70 41 67 67 49 6e 66 6f  ->mxReg-pAggInfo
28830 2d 3e 6d 6e 52 65 67 2b 31 20 29 3b 0a 20 20 66  ->mnReg+1 );.  f
28840 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e  or(i=0; i<pAggIn
28850 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  fo->nColumn; i++
28860 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
28870 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d  AggInfo->aCol[i]
28880 2e 69 4d 65 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d  .iMem>=pAggInfo-
28890 3e 6d 6e 52 65 67 0a 20 20 20 20 20 20 20 20 20  >mnReg.         
288a0 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  && pAggInfo->aCo
288b0 6c 5b 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67 49  l[i].iMem<=pAggI
288c0 6e 66 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a 20 20  nfo->mxReg );.  
288d0 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  }.  for(i=0; i<p
288e0 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20  AggInfo->nFunc; 
288f0 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  i++){.    assert
28900 28 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  ( pAggInfo->aFun
28910 63 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41 67 67 49  c[i].iMem>=pAggI
28920 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20 20 20 20  nfo->mnReg.     
28930 20 20 20 20 26 26 20 70 41 67 67 49 6e 66 6f 2d      && pAggInfo-
28940 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d 3c 3d  >aFunc[i].iMem<=
28950 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 20  pAggInfo->mxReg 
28960 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
28970 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
28980 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  3(v, OP_Null, 0,
28990 20 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67   pAggInfo->mnReg
289a0 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65  , pAggInfo->mxRe
289b0 67 29 3b 0a 20 20 66 6f 72 28 70 46 75 6e 63 3d  g);.  for(pFunc=
289c0 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c  pAggInfo->aFunc,
289d0 20 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f   i=0; i<pAggInfo
289e0 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46  ->nFunc; i++, pF
289f0 75 6e 63 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  unc++){.    if( 
28a00 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74  pFunc->iDistinct
28a10 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70  >=0 ){.      Exp
28a20 72 20 2a 70 45 20 3d 20 70 46 75 6e 63 2d 3e 70  r *pE = pFunc->p
28a30 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65  Expr;.      asse
28a40 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
28a50 65 72 74 79 28 70 45 2c 20 45 50 5f 78 49 73 53  erty(pE, EP_xIsS
28a60 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
28a70 69 66 28 20 70 45 2d 3e 78 2e 70 4c 69 73 74 3d  if( pE->x.pList=
28a80 3d 30 20 7c 7c 20 70 45 2d 3e 78 2e 70 4c 69 73  =0 || pE->x.pLis
28a90 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20  t->nExpr!=1 ){. 
28aa0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
28ab0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
28ac0 44 49 53 54 49 4e 43 54 20 61 67 67 72 65 67 61  DISTINCT aggrega
28ad0 74 65 73 20 6d 75 73 74 20 68 61 76 65 20 65 78  tes must have ex
28ae0 61 63 74 6c 79 20 6f 6e 65 20 22 0a 20 20 20 20  actly one ".    
28af0 20 20 20 20 20 20 20 22 61 72 67 75 6d 65 6e 74         "argument
28b00 22 29 3b 0a 20 20 20 20 20 20 20 20 70 46 75 6e  ");.        pFun
28b10 63 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d  c->iDistinct = -
28b20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
28b30 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20          KeyInfo 
28b40 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49  *pKeyInfo = keyI
28b50 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
28b60 70 50 61 72 73 65 2c 20 70 45 2d 3e 78 2e 70 4c  pParse, pE->x.pL
28b70 69 73 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ist, 0, 0);.    
28b80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
28b90 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp4(v, OP_Open
28ba0 45 70 68 65 6d 65 72 61 6c 2c 20 70 46 75 6e 63  Ephemeral, pFunc
28bb0 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 30 2c 20  ->iDistinct, 0, 
28bc0 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
28bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
28be0 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  ar*)pKeyInfo, P4
28bf0 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20  _KEYINFO);.     
28c00 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
28c10 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  /*.** Invoke the
28c20 20 4f 50 5f 41 67 67 46 69 6e 61 6c 69 7a 65 20   OP_AggFinalize 
28c30 6f 70 63 6f 64 65 20 66 6f 72 20 65 76 65 72 79  opcode for every
28c40 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
28c50 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 41 67  ion.** in the Ag
28c60 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  gInfo structure.
28c70 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
28c80 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74  finalizeAggFunct
28c90 69 6f 6e 73 28 50 61 72 73 65 20 2a 70 50 61 72  ions(Parse *pPar
28ca0 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67  se, AggInfo *pAg
28cb0 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a  gInfo){.  Vdbe *
28cc0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
28cd0 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  e;.  int i;.  st
28ce0 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e  ruct AggInfo_fun
28cf0 63 20 2a 70 46 3b 0a 20 20 66 6f 72 28 69 3d 30  c *pF;.  for(i=0
28d00 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61  , pF=pAggInfo->a
28d10 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f  Func; i<pAggInfo
28d20 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46  ->nFunc; i++, pF
28d30 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73  ++){.    ExprLis
28d40 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70  t *pList = pF->p
28d50 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
28d60 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
28d70 48 61 73 50 72 6f 70 65 72 74 79 28 70 46 2d 3e  HasProperty(pF->
28d80 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
28d90 65 63 74 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  ect) );.    sqli
28da0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
28db0 20 4f 50 5f 41 67 67 46 69 6e 61 6c 2c 20 70 46   OP_AggFinal, pF
28dc0 2d 3e 69 4d 65 6d 2c 20 70 4c 69 73 74 20 3f 20  ->iMem, pList ? 
28dd0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30  pList->nExpr : 0
28de0 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
28df0 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
28e00 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f  *)pF->pFunc, P4_
28e10 46 55 4e 43 44 45 46 29 3b 0a 20 20 7d 0a 7d 0a  FUNCDEF);.  }.}.
28e20 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68  ./*.** Update th
28e30 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 6d 65  e accumulator me
28e40 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20 61  mory cells for a
28e50 6e 20 61 67 67 72 65 67 61 74 65 20 62 61 73 65  n aggregate base
28e60 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 75 72 72  d on.** the curr
28e70 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74  ent cursor posit
28e80 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
28e90 6f 69 64 20 75 70 64 61 74 65 41 63 63 75 6d 75  oid updateAccumu
28ea0 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61  lator(Parse *pPa
28eb0 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41  rse, AggInfo *pA
28ec0 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20  ggInfo){.  Vdbe 
28ed0 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
28ee0 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  be;.  int i;.  i
28ef0 6e 74 20 72 65 67 48 69 74 20 3d 20 30 3b 0a 20  nt regHit = 0;. 
28f00 20 69 6e 74 20 61 64 64 72 48 69 74 54 65 73 74   int addrHitTest
28f10 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74 20 41   = 0;.  struct A
28f20 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b  ggInfo_func *pF;
28f30 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66  .  struct AggInf
28f40 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20 70 41  o_col *pC;..  pA
28f50 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f  ggInfo->directMo
28f60 64 65 20 3d 20 31 3b 0a 20 20 66 6f 72 28 69 3d  de = 1;.  for(i=
28f70 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e  0, pF=pAggInfo->
28f80 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66  aFunc; i<pAggInf
28f90 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70  o->nFunc; i++, p
28fa0 46 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41  F++){.    int nA
28fb0 72 67 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72  rg;.    int addr
28fc0 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e  Next = 0;.    in
28fd0 74 20 72 65 67 41 67 67 3b 0a 20 20 20 20 45 78  t regAgg;.    Ex
28fe0 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
28ff0 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69  pF->pExpr->x.pLi
29000 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  st;.    assert( 
29010 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
29020 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78  (pF->pExpr, EP_x
29030 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
29040 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
29050 20 20 20 20 6e 41 72 67 20 3d 20 70 4c 69 73 74      nArg = pList
29060 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 72  ->nExpr;.      r
29070 65 67 41 67 67 20 3d 20 73 71 6c 69 74 65 33 47  egAgg = sqlite3G
29080 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
29090 73 65 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 20  se, nArg);.     
290a0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
290b0 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
290c0 20 70 4c 69 73 74 2c 20 72 65 67 41 67 67 2c 20   pList, regAgg, 
290d0 30 2c 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44  0, SQLITE_ECEL_D
290e0 55 50 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  UP);.    }else{.
290f0 20 20 20 20 20 20 6e 41 72 67 20 3d 20 30 3b 0a        nArg = 0;.
29100 20 20 20 20 20 20 72 65 67 41 67 67 20 3d 20 30        regAgg = 0
29110 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
29120 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30  pF->iDistinct>=0
29130 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 4e 65   ){.      addrNe
29140 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  xt = sqlite3Vdbe
29150 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
29160 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 41      testcase( nA
29170 72 67 3d 3d 30 20 29 3b 20 20 2f 2a 20 45 72 72  rg==0 );  /* Err
29180 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 2a 2f 0a  or condition */.
29190 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
291a0 6e 41 72 67 3e 31 20 29 3b 20 20 20 2f 2a 20 41  nArg>1 );   /* A
291b0 6c 73 6f 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a  lso an error */.
291c0 20 20 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e        codeDistin
291d0 63 74 28 70 50 61 72 73 65 2c 20 70 46 2d 3e 69  ct(pParse, pF->i
291e0 44 69 73 74 69 6e 63 74 2c 20 61 64 64 72 4e 65  Distinct, addrNe
291f0 78 74 2c 20 31 2c 20 72 65 67 41 67 67 29 3b 0a  xt, 1, regAgg);.
29200 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46      }.    if( pF
29210 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61  ->pFunc->funcFla
29220 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
29230 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20  _NEEDCOLL ){.   
29240 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
29250 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 72  l = 0;.      str
29260 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
29270 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20  m *pItem;.      
29280 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 61 73 73  int j;.      ass
29290 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b  ert( pList!=0 );
292a0 20 20 2f 2a 20 70 4c 69 73 74 21 3d 30 20 69 66    /* pList!=0 if
292b0 20 70 46 2d 3e 70 46 75 6e 63 20 68 61 73 20 4e   pF->pFunc has N
292c0 45 45 44 43 4f 4c 4c 20 2a 2f 0a 20 20 20 20 20  EEDCOLL */.     
292d0 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d   for(j=0, pItem=
292e0 70 4c 69 73 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c  pList->a; !pColl
292f0 20 26 26 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c   && j<nArg; j++,
29300 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
29310 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
29320 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
29330 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78  arse, pItem->pEx
29340 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  pr);.      }.   
29350 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b     if( !pColl ){
29360 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
29370 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66   pParse->db->pDf
29380 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  ltColl;.      }.
29390 20 20 20 20 20 20 69 66 28 20 72 65 67 48 69 74        if( regHit
293a0 3d 3d 30 20 26 26 20 70 41 67 67 49 6e 66 6f 2d  ==0 && pAggInfo-
293b0 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 29 20  >nAccumulator ) 
293c0 72 65 67 48 69 74 20 3d 20 2b 2b 70 50 61 72 73  regHit = ++pPars
293d0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73  e->nMem;.      s
293e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
293f0 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20  (v, OP_CollSeq, 
29400 72 65 67 48 69 74 2c 20 30 2c 20 30 2c 20 28 63  regHit, 0, 0, (c
29410 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f  har *)pColl, P4_
29420 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 7d 0a  COLLSEQ);.    }.
29430 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
29440 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67 53  ddOp4(v, OP_AggS
29450 74 65 70 30 2c 20 30 2c 20 72 65 67 41 67 67 2c  tep0, 0, regAgg,
29460 20 70 46 2d 3e 69 4d 65 6d 2c 0a 20 20 20 20 20   pF->iMem,.     
29470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29480 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e   (void*)pF->pFun
29490 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a  c, P4_FUNCDEF);.
294a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
294b0 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29 6e  hangeP5(v, (u8)n
294c0 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Arg);.    sqlite
294d0 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
294e0 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
294f0 20 72 65 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a   regAgg, nArg);.
29500 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
29510 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  seTempRange(pPar
29520 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41 72 67  se, regAgg, nArg
29530 29 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72 4e  );.    if( addrN
29540 65 78 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ext ){.      sql
29550 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
29560 61 62 65 6c 28 76 2c 20 61 64 64 72 4e 65 78 74  abel(v, addrNext
29570 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
29580 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
29590 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Parse);.    }.  
295a0 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 70  }..  /* Before p
295b0 6f 70 75 6c 61 74 69 6e 67 20 74 68 65 20 61 63  opulating the ac
295c0 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69 73 74  cumulator regist
295d0 65 72 73 2c 20 63 6c 65 61 72 20 74 68 65 20 63  ers, clear the c
295e0 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 20 20 2a  olumn cache..  *
295f0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
29600 61 6e 79 20 6f 66 20 74 68 65 20 72 65 71 75 69  any of the requi
29610 72 65 64 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  red column value
29620 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 70 72  s are already pr
29630 65 73 65 6e 74 20 0a 20 20 2a 2a 20 69 6e 20 72  esent .  ** in r
29640 65 67 69 73 74 65 72 73 2c 20 73 71 6c 69 74 65  egisters, sqlite
29650 33 45 78 70 72 43 6f 64 65 28 29 20 6d 61 79 20  3ExprCode() may 
29660 75 73 65 20 4f 50 5f 53 43 6f 70 79 20 74 6f 20  use OP_SCopy to 
29670 63 6f 70 79 20 74 68 65 20 76 61 6c 75 65 0a 20  copy the value. 
29680 20 2a 2a 20 74 6f 20 70 43 2d 3e 69 4d 65 6d 2e   ** to pC->iMem.
29690 20 42 75 74 20 62 79 20 74 68 65 20 74 69 6d 65   But by the time
296a0 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 75 73   the value is us
296b0 65 64 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  ed, the original
296c0 20 72 65 67 69 73 74 65 72 0a 20 20 2a 2a 20 6d   register.  ** m
296d0 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 73 65  ay have been use
296e0 64 2c 20 69 6e 76 61 6c 69 64 61 74 69 6e 67 20  d, invalidating 
296f0 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 62  the underlying b
29700 75 66 66 65 72 20 68 6f 6c 64 69 6e 67 20 74 68  uffer holding th
29710 65 0a 20 20 2a 2a 20 74 65 78 74 20 6f 72 20 62  e.  ** text or b
29720 6c 6f 62 20 76 61 6c 75 65 2e 20 53 65 65 20 74  lob value. See t
29730 69 63 6b 65 74 20 5b 38 38 33 30 33 34 64 63 62  icket [883034dcb
29740 35 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e  5]..  **.  ** An
29750 6f 74 68 65 72 20 73 6f 6c 75 74 69 6f 6e 20 77  other solution w
29760 6f 75 6c 64 20 62 65 20 74 6f 20 63 68 61 6e 67  ould be to chang
29770 65 20 74 68 65 20 4f 50 5f 53 43 6f 70 79 20 75  e the OP_SCopy u
29780 73 65 64 20 74 6f 20 63 6f 70 79 20 63 61 63 68  sed to copy cach
29790 65 64 0a 20 20 2a 2a 20 76 61 6c 75 65 73 20 74  ed.  ** values t
297a0 6f 20 61 6e 20 4f 50 5f 43 6f 70 79 2e 0a 20 20  o an OP_Copy..  
297b0 2a 2f 0a 20 20 69 66 28 20 72 65 67 48 69 74 20  */.  if( regHit 
297c0 29 7b 0a 20 20 20 20 61 64 64 72 48 69 74 54 65  ){.    addrHitTe
297d0 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  st = sqlite3Vdbe
297e0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c  AddOp1(v, OP_If,
297f0 20 72 65 67 48 69 74 29 3b 20 56 64 62 65 43 6f   regHit); VdbeCo
29800 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20  verage(v);.  }. 
29810 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
29820 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
29830 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 3d 70 41    for(i=0, pC=pA
29840 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c  ggInfo->aCol; i<
29850 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d  pAggInfo->nAccum
29860 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b  ulator; i++, pC+
29870 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  +){.    sqlite3E
29880 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
29890 70 43 2d 3e 70 45 78 70 72 2c 20 70 43 2d 3e 69  pC->pExpr, pC->i
298a0 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 70 41 67 67  Mem);.  }.  pAgg
298b0 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65  Info->directMode
298c0 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45   = 0;.  sqlite3E
298d0 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
298e0 61 72 73 65 29 3b 0a 20 20 69 66 28 20 61 64 64  arse);.  if( add
298f0 72 48 69 74 54 65 73 74 20 29 7b 0a 20 20 20 20  rHitTest ){.    
29900 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
29910 65 72 65 28 76 2c 20 61 64 64 72 48 69 74 54 65  ere(v, addrHitTe
29920 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  st);.  }.}../*.*
29930 2a 20 41 64 64 20 61 20 73 69 6e 67 6c 65 20 4f  * Add a single O
29940 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72 75  P_Explain instru
29950 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 56 44 42  ction to the VDB
29960 45 20 74 6f 20 65 78 70 6c 61 69 6e 20 61 20 73  E to explain a s
29970 69 6d 70 6c 65 0a 2a 2a 20 63 6f 75 6e 74 28 2a  imple.** count(*
29980 29 20 71 75 65 72 79 20 28 22 53 45 4c 45 43 54  ) query ("SELECT
29990 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 70   count(*) FROM p
299a0 54 61 62 22 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65  Tab")..*/.#ifnde
299b0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
299c0 50 4c 41 49 4e 0a 73 74 61 74 69 63 20 76 6f 69  PLAIN.static voi
299d0 64 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43  d explainSimpleC
299e0 6f 75 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70  ount(.  Parse *p
299f0 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
29a00 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
29a10 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61   context */.  Ta
29a20 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20  ble *pTab,      
29a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29a40 20 54 61 62 6c 65 20 62 65 69 6e 67 20 71 75 65   Table being que
29a50 72 69 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20  ried */.  Index 
29a60 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 20 20  *pIdx           
29a70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
29a80 65 78 20 75 73 65 64 20 74 6f 20 6f 70 74 69 6d  ex used to optim
29a90 69 7a 65 20 73 63 61 6e 2c 20 6f 72 20 4e 55 4c  ize scan, or NUL
29aa0 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 50  L */.){.  if( pP
29ab0 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  arse->explain==2
29ac0 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 43 6f 76   ){.    int bCov
29ad0 65 72 20 3d 20 28 70 49 64 78 21 3d 30 20 26 26  er = (pIdx!=0 &&
29ae0 20 28 48 61 73 52 6f 77 69 64 28 70 54 61 62 29   (HasRowid(pTab)
29af0 20 7c 7c 20 21 49 73 50 72 69 6d 61 72 79 4b 65   || !IsPrimaryKe
29b00 79 49 6e 64 65 78 28 70 49 64 78 29 29 29 3b 0a  yIndex(pIdx)));.
29b10 20 20 20 20 63 68 61 72 20 2a 7a 45 71 70 20 3d      char *zEqp =
29b20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
29b30 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 53 43 41  pParse->db, "SCA
29b40 4e 20 54 41 42 4c 45 20 25 73 25 73 25 73 22 2c  N TABLE %s%s%s",
29b50 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a  .        pTab->z
29b60 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 62 43  Name,.        bC
29b70 6f 76 65 72 20 3f 20 22 20 55 53 49 4e 47 20 43  over ? " USING C
29b80 4f 56 45 52 49 4e 47 20 49 4e 44 45 58 20 22 20  OVERING INDEX " 
29b90 3a 20 22 22 2c 0a 20 20 20 20 20 20 20 20 62 43  : "",.        bC
29ba0 6f 76 65 72 20 3f 20 70 49 64 78 2d 3e 7a 4e 61  over ? pIdx->zNa
29bb0 6d 65 20 3a 20 22 22 0a 20 20 20 20 29 3b 0a 20  me : "".    );. 
29bc0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
29bd0 64 4f 70 34 28 0a 20 20 20 20 20 20 20 20 70 50  dOp4(.        pP
29be0 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f  arse->pVdbe, OP_
29bf0 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d  Explain, pParse-
29c00 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30  >iSelectId, 0, 0
29c10 2c 20 7a 45 71 70 2c 20 50 34 5f 44 59 4e 41 4d  , zEqp, P4_DYNAM
29c20 49 43 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a  IC.    );.  }.}.
29c30 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 65  #else.# define e
29c40 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e  xplainSimpleCoun
29c50 74 28 61 2c 62 2c 63 29 0a 23 65 6e 64 69 66 0a  t(a,b,c).#endif.
29c60 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
29c70 63 6f 64 65 20 66 6f 72 20 74 68 65 20 53 45 4c  code for the SEL
29c80 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 67 69  ECT statement gi
29c90 76 65 6e 20 69 6e 20 74 68 65 20 70 20 61 72 67  ven in the p arg
29ca0 75 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 54  ument.  .**.** T
29cb0 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 72  he results are r
29cc0 65 74 75 72 6e 65 64 20 61 63 63 6f 72 64 69 6e  eturned accordin
29cd0 67 20 74 6f 20 74 68 65 20 53 65 6c 65 63 74 44  g to the SelectD
29ce0 65 73 74 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  est structure..*
29cf0 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 69  * See comments i
29d00 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68 20 66 6f  n sqliteInt.h fo
29d10 72 20 66 75 72 74 68 65 72 20 69 6e 66 6f 72 6d  r further inform
29d20 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ation..**.** Thi
29d30 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
29d40 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
29d50 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 79 20  errors.  If any 
29d60 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65 6e  errors are.** en
29d70 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20  countered, then 
29d80 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
29d90 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20  rror message is 
29da0 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72 73  left in.** pPars
29db0 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a  e->zErrMsg..**.*
29dc0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
29dd0 6f 65 73 20 4e 4f 54 20 66 72 65 65 20 74 68 65  oes NOT free the
29de0 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72   Select structur
29df0 65 20 70 61 73 73 65 64 20 69 6e 2e 20 20 54 68  e passed in.  Th
29e00 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75 6e  e.** calling fun
29e10 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 64  ction needs to d
29e20 6f 20 74 68 61 74 2e 0a 2a 2f 0a 69 6e 74 20 73  o that..*/.int s
29e30 71 6c 69 74 65 33 53 65 6c 65 63 74 28 0a 20 20  qlite3Select(.  
29e40 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
29e50 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
29e60 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
29e70 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
29e80 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
29e90 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
29ea0 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f   being coded. */
29eb0 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
29ec0 44 65 73 74 20 20 20 20 20 20 2f 2a 20 57 68 61  Dest      /* Wha
29ed0 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65  t to do with the
29ee0 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
29ef0 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  /.){.  int i, j;
29f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29f10 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
29f20 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  /.  WhereInfo *p
29f30 57 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 52 65  WInfo;     /* Re
29f40 74 75 72 6e 20 66 72 6f 6d 20 73 71 6c 69 74 65  turn from sqlite
29f50 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 2a 2f  3WhereBegin() */
29f60 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
29f70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
29f80 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
29f90 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
29fa0 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41  ion */.  int isA
29fb0 67 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gg;             
29fc0 2f 2a 20 54 72 75 65 20 66 6f 72 20 73 65 6c 65  /* True for sele
29fd0 63 74 20 6c 69 73 74 73 20 6c 69 6b 65 20 22 63  ct lists like "c
29fe0 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78  ount(*)" */.  Ex
29ff0 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d  prList *pEList =
2a000 20 30 3b 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20   0;  /* List of 
2a010 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72 61  columns to extra
2a020 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ct. */.  SrcList
2a030 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20   *pTabList;     
2a040 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65  /* List of table
2a050 73 20 74 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d  s to select from
2a060 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
2a070 72 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  re;          /* 
2a080 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
2a090 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  .  May be NULL *
2a0a0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47  /.  ExprList *pG
2a0b0 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20 54 68  roupBy;    /* Th
2a0c0 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  e GROUP BY claus
2a0d0 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
2a0e0 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69  */.  Expr *pHavi
2a0f0 6e 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ng;         /* T
2a100 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65  he HAVING clause
2a110 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  .  May be NULL *
2a120 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 31 3b 20  /.  int rc = 1; 
2a130 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
2a140 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 66 72  lue to return fr
2a150 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  om this function
2a160 20 2a 2f 0a 20 20 44 69 73 74 69 6e 63 74 43 74   */.  DistinctCt
2a170 78 20 73 44 69 73 74 69 6e 63 74 3b 20 2f 2a 20  x sDistinct; /* 
2a180 49 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 63  Info on how to c
2a190 6f 64 65 20 74 68 65 20 44 49 53 54 49 4e 43 54  ode the DISTINCT
2a1a0 20 6b 65 79 77 6f 72 64 20 2a 2f 0a 20 20 53 6f   keyword */.  So
2a1b0 72 74 43 74 78 20 73 53 6f 72 74 3b 20 20 20 20  rtCtx sSort;    
2a1c0 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20       /* Info on 
2a1d0 68 6f 77 20 74 6f 20 63 6f 64 65 20 74 68 65 20  how to code the 
2a1e0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
2a1f0 2a 2f 0a 20 20 41 67 67 49 6e 66 6f 20 73 41 67  */.  AggInfo sAg
2a200 67 49 6e 66 6f 3b 20 20 20 20 20 20 2f 2a 20 49  gInfo;      /* I
2a210 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64 20  nformation used 
2a220 62 79 20 61 67 67 72 65 67 61 74 65 20 71 75 65  by aggregate que
2a230 72 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45  ries */.  int iE
2a240 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nd;             
2a250 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
2a260 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 71 75  he end of the qu
2a270 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ery */.  sqlite3
2a280 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
2a290 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
2a2a0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 23  connection */..#
2a2b0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2a2c0 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74  IT_EXPLAIN.  int
2a2d0 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63 74 49   iRestoreSelectI
2a2e0 64 20 3d 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  d = pParse->iSel
2a2f0 65 63 74 49 64 3b 0a 20 20 70 50 61 72 73 65 2d  ectId;.  pParse-
2a300 3e 69 53 65 6c 65 63 74 49 64 20 3d 20 70 50 61  >iSelectId = pPa
2a310 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
2a320 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  Id++;.#endif..  
2a330 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
2a340 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 64  .  if( p==0 || d
2a350 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2a360 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
2a370 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
2a380 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
2a390 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
2a3a0 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43  se, SQLITE_SELEC
2a3b0 54 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72 65  T, 0, 0, 0) ) re
2a3c0 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 73 65 74  turn 1;.  memset
2a3d0 28 26 73 41 67 67 49 6e 66 6f 2c 20 30 2c 20 73  (&sAggInfo, 0, s
2a3e0 69 7a 65 6f 66 28 73 41 67 67 49 6e 66 6f 29 29  izeof(sAggInfo))
2a3f0 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  ;.#if SELECTTRAC
2a400 45 5f 45 4e 41 42 4c 45 44 0a 20 20 70 50 61 72  E_ENABLED.  pPar
2a410 73 65 2d 3e 6e 53 65 6c 65 63 74 49 6e 64 65 6e  se->nSelectInden
2a420 74 2b 2b 3b 0a 20 20 53 45 4c 45 43 54 54 52 41  t++;.  SELECTTRA
2a430 43 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 20 28  CE(1,pParse,p, (
2a440 22 62 65 67 69 6e 20 70 72 6f 63 65 73 73 69 6e  "begin processin
2a450 67 3a 5c 6e 22 29 29 3b 0a 20 20 69 66 28 20 73  g:\n"));.  if( s
2a460 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
2a470 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20 20 20  e & 0x100 ){.   
2a480 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
2a490 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b  Select(0, p, 0);
2a4a0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61  .  }.#endif..  a
2a4b0 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
2a4c0 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e  By==0 || pDest->
2a4d0 65 44 65 73 74 21 3d 53 52 54 5f 44 69 73 74 46  eDest!=SRT_DistF
2a4e0 69 66 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ifo );.  assert(
2a4f0 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20   p->pOrderBy==0 
2a500 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21  || pDest->eDest!
2a510 3d 53 52 54 5f 46 69 66 6f 20 29 3b 0a 20 20 61  =SRT_Fifo );.  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 44 69 73 74 51  eDest!=SRT_DistQ
2a550 75 65 75 65 20 29 3b 0a 20 20 61 73 73 65 72 74  ueue );.  assert
2a560 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
2a570 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74   || pDest->eDest
2a580 21 3d 53 52 54 5f 51 75 65 75 65 20 29 3b 0a 20  !=SRT_Queue );. 
2a590 20 69 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72   if( IgnorableOr
2a5a0 64 65 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a  derby(pDest) ){.
2a5b0 20 20 20 20 61 73 73 65 72 74 28 70 44 65 73 74      assert(pDest
2a5c0 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 69  ->eDest==SRT_Exi
2a5d0 73 74 73 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44  sts || pDest->eD
2a5e0 65 73 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20 7c  est==SRT_Union |
2a5f0 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 70 44  | .           pD
2a600 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
2a610 45 78 63 65 70 74 20 7c 7c 20 70 44 65 73 74 2d  Except || pDest-
2a620 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63  >eDest==SRT_Disc
2a630 61 72 64 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ard ||.         
2a640 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d    pDest->eDest==
2a650 53 52 54 5f 51 75 65 75 65 20 20 7c 7c 20 70 44  SRT_Queue  || pD
2a660 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
2a670 44 69 73 74 46 69 66 6f 20 7c 7c 0a 20 20 20 20  DistFifo ||.    
2a680 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44         pDest->eD
2a690 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 51 75 65  est==SRT_DistQue
2a6a0 75 65 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65  ue || pDest->eDe
2a6b0 73 74 3d 3d 53 52 54 5f 46 69 66 6f 29 3b 0a 20  st==SRT_Fifo);. 
2a6c0 20 20 20 2f 2a 20 49 66 20 4f 52 44 45 52 20 42     /* If ORDER B
2a6d0 59 20 6d 61 6b 65 73 20 6e 6f 20 64 69 66 66 65  Y makes no diffe
2a6e0 72 65 6e 63 65 20 69 6e 20 74 68 65 20 6f 75 74  rence in the out
2a6f0 70 75 74 20 74 68 65 6e 20 6e 65 69 74 68 65 72  put then neither
2a700 20 64 6f 65 73 0a 20 20 20 20 2a 2a 20 44 49 53   does.    ** DIS
2a710 54 49 4e 43 54 20 73 6f 20 69 74 20 63 61 6e 20  TINCT so it can 
2a720 62 65 20 72 65 6d 6f 76 65 64 20 74 6f 6f 2e 20  be removed too. 
2a730 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  */.    sqlite3Ex
2a740 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
2a750 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20   p->pOrderBy);. 
2a760 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
2a770 20 30 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c   0;.    p->selFl
2a780 61 67 73 20 26 3d 20 7e 53 46 5f 44 69 73 74 69  ags &= ~SF_Disti
2a790 6e 63 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  nct;.  }.  sqlit
2a7a0 65 33 53 65 6c 65 63 74 50 72 65 70 28 70 50 61  e3SelectPrep(pPa
2a7b0 72 73 65 2c 20 70 2c 20 30 29 3b 0a 20 20 6d 65  rse, p, 0);.  me
2a7c0 6d 73 65 74 28 26 73 53 6f 72 74 2c 20 30 2c 20  mset(&sSort, 0, 
2a7d0 73 69 7a 65 6f 66 28 73 53 6f 72 74 29 29 3b 0a  sizeof(sSort));.
2a7e0 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79    sSort.pOrderBy
2a7f0 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
2a800 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
2a810 70 53 72 63 3b 0a 20 20 69 66 28 20 70 50 61 72  pSrc;.  if( pPar
2a820 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e  se->nErr || db->
2a830 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
2a840 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
2a850 65 6e 64 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  end;.  }.  asser
2a860 74 28 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20  t( p->pEList!=0 
2a870 29 3b 0a 20 20 69 73 41 67 67 20 3d 20 28 70 2d  );.  isAgg = (p-
2a880 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41  >selFlags & SF_A
2a890 67 67 72 65 67 61 74 65 29 21 3d 30 3b 0a 23 69  ggregate)!=0;.#i
2a8a0 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e  f SELECTTRACE_EN
2a8b0 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69  ABLED.  if( sqli
2a8c0 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26  te3SelectTrace &
2a8d0 20 30 78 31 30 30 20 29 7b 0a 20 20 20 20 53 45   0x100 ){.    SE
2a8e0 4c 45 43 54 54 52 41 43 45 28 30 78 31 30 30 2c  LECTTRACE(0x100,
2a8f0 70 50 61 72 73 65 2c 70 2c 20 28 22 61 66 74 65  pParse,p, ("afte
2a900 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f  r name resolutio
2a910 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c  n:\n"));.    sql
2a920 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65  ite3TreeViewSele
2a930 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d  ct(0, p, 0);.  }
2a940 0a 23 65 6e 64 69 66 0a 0a 0a 20 20 2f 2a 20 49  .#endif...  /* I
2a950 66 20 77 72 69 74 69 6e 67 20 74 6f 20 6d 65 6d  f writing to mem
2a960 6f 72 79 20 6f 72 20 67 65 6e 65 72 61 74 69 6e  ory or generatin
2a970 67 20 61 20 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c  g a set.  ** onl
2a980 79 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  y a single colum
2a990 6e 20 6d 61 79 20 62 65 20 6f 75 74 70 75 74 2e  n may be output.
2a9a0 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .  */.#ifndef SQ
2a9b0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
2a9c0 52 59 0a 20 20 69 66 28 20 63 68 65 63 6b 46 6f  RY.  if( checkFo
2a9d0 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c 65  rMultiColumnSele
2a9e0 63 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20  ctError(pParse, 
2a9f0 70 44 65 73 74 2c 20 70 2d 3e 70 45 4c 69 73 74  pDest, p->pEList
2aa00 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ->nExpr) ){.    
2aa10 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
2aa20 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
2aa30 2a 20 54 72 79 20 74 6f 20 66 6c 61 74 74 65 6e  * Try to flatten
2aa40 20 73 75 62 71 75 65 72 69 65 73 20 69 6e 20 74   subqueries in t
2aa50 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 75  he FROM clause u
2aa60 70 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20  p into the main 
2aa70 71 75 65 72 79 0a 20 20 2a 2f 0a 23 69 66 20 21  query.  */.#if !
2aa80 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
2aa90 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
2aaa0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
2aab0 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 66 6f  _OMIT_VIEW).  fo
2aac0 72 28 69 3d 30 3b 20 21 70 2d 3e 70 50 72 69 6f  r(i=0; !p->pPrio
2aad0 72 20 26 26 20 69 3c 70 54 61 62 4c 69 73 74 2d  r && i<pTabList-
2aae0 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
2aaf0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
2ab00 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
2ab10 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20  TabList->a[i];. 
2ab20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 20     Select *pSub 
2ab30 3d 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  = pItem->pSelect
2ab40 3b 0a 20 20 20 20 69 6e 74 20 69 73 41 67 67 53  ;.    int isAggS
2ab50 75 62 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  ub;.    Table *p
2ab60 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61  Tab = pItem->pTa
2ab70 62 3b 0a 20 20 20 20 69 66 28 20 70 53 75 62 3d  b;.    if( pSub=
2ab80 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a  =0 ) continue;..
2ab90 20 20 20 20 2f 2a 20 43 61 74 63 68 20 6d 69 73      /* Catch mis
2aba0 6d 61 74 63 68 20 69 6e 20 74 68 65 20 64 65 63  match in the dec
2abb0 6c 61 72 65 64 20 63 6f 6c 75 6d 6e 73 20 6f 66  lared columns of
2abc0 20 61 20 76 69 65 77 20 61 6e 64 20 74 68 65 20   a view and the 
2abd0 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a  number of.    **
2abe0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
2abf0 53 45 4c 45 43 54 20 6f 6e 20 74 68 65 20 52 48  SELECT on the RH
2ac00 53 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 61  S */.    if( pTa
2ac10 62 2d 3e 6e 43 6f 6c 21 3d 70 53 75 62 2d 3e 70  b->nCol!=pSub->p
2ac20 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  EList->nExpr ){.
2ac30 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
2ac40 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 65  orMsg(pParse, "e
2ac50 78 70 65 63 74 65 64 20 25 64 20 63 6f 6c 75 6d  xpected %d colum
2ac60 6e 73 20 66 6f 72 20 27 25 73 27 20 62 75 74 20  ns for '%s' but 
2ac70 67 6f 74 20 25 64 22 2c 0a 20 20 20 20 20 20 20  got %d",.       
2ac80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2ac90 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62 2d  Tab->nCol, pTab-
2aca0 3e 7a 4e 61 6d 65 2c 20 70 53 75 62 2d 3e 70 45  >zName, pSub->pE
2acb0 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
2acc0 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
2acd0 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  end;.    }..    
2ace0 69 73 41 67 67 53 75 62 20 3d 20 28 70 53 75 62  isAggSub = (pSub
2acf0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
2ad00 41 67 67 72 65 67 61 74 65 29 21 3d 30 3b 0a 20  Aggregate)!=0;. 
2ad10 20 20 20 69 66 28 20 66 6c 61 74 74 65 6e 53 75     if( flattenSu
2ad20 62 71 75 65 72 79 28 70 50 61 72 73 65 2c 20 70  bquery(pParse, p
2ad30 2c 20 69 2c 20 69 73 41 67 67 2c 20 69 73 41 67  , i, isAgg, isAg
2ad40 67 53 75 62 29 20 29 7b 0a 20 20 20 20 20 20 2f  gSub) ){.      /
2ad50 2a 20 54 68 69 73 20 73 75 62 71 75 65 72 79 20  * This subquery 
2ad60 63 61 6e 20 62 65 20 61 62 73 6f 72 62 65 64 20  can be absorbed 
2ad70 69 6e 74 6f 20 69 74 73 20 70 61 72 65 6e 74 2e  into its parent.
2ad80 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73   */.      if( is
2ad90 41 67 67 53 75 62 20 29 7b 0a 20 20 20 20 20 20  AggSub ){.      
2ada0 20 20 69 73 41 67 67 20 3d 20 31 3b 0a 20 20 20    isAgg = 1;.   
2adb0 20 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73       p->selFlags
2adc0 20 7c 3d 20 53 46 5f 41 67 67 72 65 67 61 74 65   |= SF_Aggregate
2add0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2ade0 69 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  i = -1;.    }.  
2adf0 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
2ae00 70 53 72 63 3b 0a 20 20 20 20 69 66 28 20 64 62  pSrc;.    if( db
2ae10 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
2ae20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
2ae30 3b 0a 20 20 20 20 69 66 28 20 21 49 67 6e 6f 72  ;.    if( !Ignor
2ae40 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73  ableOrderby(pDes
2ae50 74 29 20 29 7b 0a 20 20 20 20 20 20 73 53 6f 72  t) ){.      sSor
2ae60 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e  t.pOrderBy = p->
2ae70 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a  pOrderBy;.    }.
2ae80 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
2ae90 20 47 65 74 20 61 20 70 6f 69 6e 74 65 72 20 74   Get a pointer t
2aea0 68 65 20 56 44 42 45 20 75 6e 64 65 72 20 63 6f  he VDBE under co
2aeb0 6e 73 74 72 75 63 74 69 6f 6e 2c 20 61 6c 6c 6f  nstruction, allo
2aec0 63 61 74 69 6e 67 20 61 20 6e 65 77 20 56 44 42  cating a new VDB
2aed0 45 20 69 66 20 6f 6e 65 0a 20 20 2a 2a 20 64 6f  E if one.  ** do
2aee0 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65  es not already e
2aef0 78 69 73 74 20 2a 2f 0a 20 20 76 20 3d 20 73 71  xist */.  v = sq
2af00 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
2af10 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30  rse);.  if( v==0
2af20 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
2af30 6e 64 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  nd;..#ifndef SQL
2af40 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
2af50 44 5f 53 45 4c 45 43 54 0a 20 20 2f 2a 20 48 61  D_SELECT.  /* Ha
2af60 6e 64 6c 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45  ndle compound SE
2af70 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
2af80 75 73 69 6e 67 20 74 68 65 20 73 65 70 61 72 61  using the separa
2af90 74 65 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 29  te multiSelect()
2afa0 0a 20 20 2a 2a 20 70 72 6f 63 65 64 75 72 65 2e  .  ** procedure.
2afb0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
2afc0 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 72 63 20  Prior ){.    rc 
2afd0 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 70 50  = multiSelect(pP
2afe0 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b  arse, p, pDest);
2aff0 0a 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49  .    explainSetI
2b000 6e 74 65 67 65 72 28 70 50 61 72 73 65 2d 3e 69  nteger(pParse->i
2b010 53 65 6c 65 63 74 49 64 2c 20 69 52 65 73 74 6f  SelectId, iResto
2b020 72 65 53 65 6c 65 63 74 49 64 29 3b 0a 23 69 66  reSelectId);.#if
2b030 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
2b040 42 4c 45 44 0a 20 20 20 20 53 45 4c 45 43 54 54  BLED.    SELECTT
2b050 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70 2c  RACE(1,pParse,p,
2b060 28 22 65 6e 64 20 63 6f 6d 70 6f 75 6e 64 2d 73  ("end compound-s
2b070 65 6c 65 63 74 20 70 72 6f 63 65 73 73 69 6e 67  elect processing
2b080 5c 6e 22 29 29 3b 0a 20 20 20 20 70 50 61 72 73  \n"));.    pPars
2b090 65 2d 3e 6e 53 65 6c 65 63 74 49 6e 64 65 6e 74  e->nSelectIndent
2b0a0 2d 2d 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72  --;.#endif.    r
2b0b0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65  eturn rc;.  }.#e
2b0c0 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  ndif..  /* Gener
2b0d0 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c  ate code for all
2b0e0 20 73 75 62 2d 71 75 65 72 69 65 73 20 69 6e 20   sub-queries in 
2b0f0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a  the FROM clause.
2b100 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65    */.#if !define
2b110 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
2b120 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69  BQUERY) || !defi
2b130 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
2b140 56 49 45 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b  VIEW).  for(i=0;
2b150 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
2b160 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  c; i++){.    str
2b170 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
2b180 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c   *pItem = &pTabL
2b190 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 53  ist->a[i];.    S
2b1a0 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a  electDest dest;.
2b1b0 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62      Select *pSub
2b1c0 20 3d 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63   = pItem->pSelec
2b1d0 74 3b 0a 20 20 20 20 69 66 28 20 70 53 75 62 3d  t;.    if( pSub=
2b1e0 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a  =0 ) continue;..
2b1f0 20 20 20 20 2f 2a 20 53 6f 6d 65 74 69 6d 65 73      /* Sometimes
2b200 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20 61 20   the code for a 
2b210 73 75 62 71 75 65 72 79 20 77 69 6c 6c 20 62 65  subquery will be
2b220 20 67 65 6e 65 72 61 74 65 64 20 6d 6f 72 65 20   generated more 
2b230 74 68 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e 63 65  than.    ** once
2b240 2c 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72  , if the subquer
2b250 79 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  y is part of the
2b260 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e   WHERE clause in
2b270 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 0a 20 20   a LEFT JOIN,.  
2b280 20 20 2a 2a 20 66 6f 72 20 65 78 61 6d 70 6c 65    ** for example
2b290 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c  .  In that case,
2b2a0 20 64 6f 20 6e 6f 74 20 72 65 67 65 6e 65 72 61   do not regenera
2b2b0 74 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20 6d  te the code to m
2b2c0 61 6e 69 66 65 73 74 0a 20 20 20 20 2a 2a 20 61  anifest.    ** a
2b2d0 20 76 69 65 77 20 6f 72 20 74 68 65 20 63 6f 2d   view or the co-
2b2e0 72 6f 75 74 69 6e 65 20 74 6f 20 69 6d 70 6c 65  routine to imple
2b2f0 6d 65 6e 74 20 61 20 76 69 65 77 2e 20 20 54 68  ment a view.  Th
2b300 65 20 66 69 72 73 74 20 69 6e 73 74 61 6e 63 65  e first instance
2b310 0a 20 20 20 20 2a 2a 20 69 73 20 73 75 66 66 69  .    ** is suffi
2b320 63 69 65 6e 74 2c 20 74 68 6f 75 67 68 20 74 68  cient, though th
2b330 65 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20  e subroutine to 
2b340 6d 61 6e 69 66 65 73 74 20 74 68 65 20 76 69 65  manifest the vie
2b350 77 20 64 6f 65 73 20 6e 65 65 64 0a 20 20 20 20  w does need.    
2b360 2a 2a 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64  ** to be invoked
2b370 20 61 67 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 69   again. */.    i
2b380 66 28 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69  f( pItem->addrFi
2b390 6c 6c 53 75 62 20 29 7b 0a 20 20 20 20 20 20 69  llSub ){.      i
2b3a0 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 76 69 61  f( pItem->fg.via
2b3b0 43 6f 72 6f 75 74 69 6e 65 3d 3d 30 20 29 7b 0a  Coroutine==0 ){.
2b3c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2b3d0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2b3e0 47 6f 73 75 62 2c 20 70 49 74 65 6d 2d 3e 72 65  Gosub, pItem->re
2b3f0 67 52 65 74 75 72 6e 2c 20 70 49 74 65 6d 2d 3e  gReturn, pItem->
2b400 61 64 64 72 46 69 6c 6c 53 75 62 29 3b 0a 20 20  addrFillSub);.  
2b410 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6f 6e 74      }.      cont
2b420 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  inue;.    }..   
2b430 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 50 61   /* Increment Pa
2b440 72 73 65 2e 6e 48 65 69 67 68 74 20 62 79 20 74  rse.nHeight by t
2b450 68 65 20 68 65 69 67 68 74 20 6f 66 20 74 68 65  he height of the
2b460 20 6c 61 72 67 65 73 74 20 65 78 70 72 65 73 73   largest express
2b470 69 6f 6e 0a 20 20 20 20 2a 2a 20 74 72 65 65 20  ion.    ** tree 
2b480 72 65 66 65 72 72 65 64 20 74 6f 20 62 79 20 74  referred to by t
2b490 68 69 73 2c 20 74 68 65 20 70 61 72 65 6e 74 20  his, the parent 
2b4a0 73 65 6c 65 63 74 2e 20 54 68 65 20 63 68 69 6c  select. The chil
2b4b0 64 20 73 65 6c 65 63 74 0a 20 20 20 20 2a 2a 20  d select.    ** 
2b4c0 6d 61 79 20 63 6f 6e 74 61 69 6e 20 65 78 70 72  may contain expr
2b4d0 65 73 73 69 6f 6e 20 74 72 65 65 73 20 6f 66 20  ession trees of 
2b4e0 61 74 20 6d 6f 73 74 0a 20 20 20 20 2a 2a 20 28  at most.    ** (
2b4f0 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f  SQLITE_MAX_EXPR_
2b500 44 45 50 54 48 2d 50 61 72 73 65 2e 6e 48 65 69  DEPTH-Parse.nHei
2b510 67 68 74 29 20 68 65 69 67 68 74 2e 20 54 68 69  ght) height. Thi
2b520 73 20 69 73 20 61 20 62 69 74 0a 20 20 20 20 2a  s is a bit.    *
2b530 2a 20 6d 6f 72 65 20 63 6f 6e 73 65 72 76 61 74  * more conservat
2b540 69 76 65 20 74 68 61 6e 20 6e 65 63 65 73 73 61  ive than necessa
2b550 72 79 2c 20 62 75 74 20 6d 75 63 68 20 65 61 73  ry, but much eas
2b560 69 65 72 20 74 68 61 6e 20 65 6e 66 6f 72 63 69  ier than enforci
2b570 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 20 65 78 61  ng.    ** an exa
2b580 63 74 20 6c 69 6d 69 74 2e 0a 20 20 20 20 2a 2f  ct limit..    */
2b590 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65  .    pParse->nHe
2b5a0 69 67 68 74 20 2b 3d 20 73 71 6c 69 74 65 33 53  ight += sqlite3S
2b5b0 65 6c 65 63 74 45 78 70 72 48 65 69 67 68 74 28  electExprHeight(
2b5c0 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65  p);..    /* Make
2b5d0 20 63 6f 70 69 65 73 20 6f 66 20 63 6f 6e 73 74   copies of const
2b5e0 61 6e 74 20 57 48 45 52 45 2d 63 6c 61 75 73 65  ant WHERE-clause
2b5f0 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 6f 75   terms in the ou
2b600 74 65 72 20 71 75 65 72 79 20 64 6f 77 6e 0a 20  ter query down. 
2b610 20 20 20 2a 2a 20 69 6e 73 69 64 65 20 74 68 65     ** inside the
2b620 20 73 75 62 71 75 65 72 79 2e 20 20 54 68 69 73   subquery.  This
2b630 20 63 61 6e 20 68 65 6c 70 20 74 68 65 20 73 75   can help the su
2b640 62 71 75 65 72 79 20 74 6f 20 72 75 6e 20 6d 6f  bquery to run mo
2b650 72 65 20 65 66 66 69 63 69 65 6e 74 6c 79 2e 0a  re efficiently..
2b660 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
2b670 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79  pItem->fg.jointy
2b680 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 3d 3d  pe & JT_OUTER)==
2b690 30 0a 20 20 20 20 20 26 26 20 70 75 73 68 44 6f  0.     && pushDo
2b6a0 77 6e 57 68 65 72 65 54 65 72 6d 73 28 64 62 2c  wnWhereTerms(db,
2b6b0 20 70 53 75 62 2c 20 70 2d 3e 70 57 68 65 72 65   pSub, p->pWhere
2b6c0 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  , pItem->iCursor
2b6d0 29 0a 20 20 20 20 29 7b 0a 23 69 66 20 53 45 4c  ).    ){.#if SEL
2b6e0 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ECTTRACE_ENABLED
2b6f0 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
2b700 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20  e3SelectTrace & 
2b710 30 78 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20  0x100 ){.       
2b720 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 31   SELECTTRACE(0x1
2b730 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 41 66  00,pParse,p,("Af
2b740 74 65 72 20 57 48 45 52 45 2d 63 6c 61 75 73 65  ter WHERE-clause
2b750 20 70 75 73 68 2d 64 6f 77 6e 3a 5c 6e 22 29 29   push-down:\n"))
2b760 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2b770 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28  3TreeViewSelect(
2b780 30 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, p, 0);.      
2b790 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a  }.#endif.    }..
2b7a0 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
2b7b0 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  code to implemen
2b7c0 74 20 74 68 65 20 73 75 62 71 75 65 72 79 0a 20  t the subquery. 
2b7d0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54     */.    if( pT
2b7e0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 31 0a  abList->nSrc==1.
2b7f0 20 20 20 20 20 26 26 20 28 70 2d 3e 73 65 6c 46       && (p->selF
2b800 6c 61 67 73 20 26 20 53 46 5f 41 6c 6c 29 3d 3d  lags & SF_All)==
2b810 30 0a 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69  0.     && Optimi
2b820 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62  zationEnabled(db
2b830 2c 20 53 51 4c 49 54 45 5f 53 75 62 71 43 6f 72  , SQLITE_SubqCor
2b840 6f 75 74 69 6e 65 29 0a 20 20 20 20 29 7b 0a 20  outine).    ){. 
2b850 20 20 20 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e       /* Implemen
2b860 74 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74  t a co-routine t
2b870 68 61 74 20 77 69 6c 6c 20 72 65 74 75 72 6e 20  hat will return 
2b880 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20  a single row of 
2b890 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20  the result.     
2b8a0 20 2a 2a 20 73 65 74 20 6f 6e 20 65 61 63 68 20   ** set on each 
2b8b0 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a 20 20 20 20  invocation..    
2b8c0 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61    */.      int a
2b8d0 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33  ddrTop = sqlite3
2b8e0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
2b8f0 76 29 2b 31 3b 0a 20 20 20 20 20 20 70 49 74 65  v)+1;.      pIte
2b900 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b  m->regReturn = +
2b910 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
2b920 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2b930 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69  AddOp3(v, OP_Ini
2b940 74 43 6f 72 6f 75 74 69 6e 65 2c 20 70 49 74 65  tCoroutine, pIte
2b950 6d 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 30 2c  m->regReturn, 0,
2b960 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 20 20 20   addrTop);.     
2b970 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
2b980 20 22 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54   "%s", pItem->pT
2b990 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  ab->zName));.   
2b9a0 20 20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69     pItem->addrFi
2b9b0 6c 6c 53 75 62 20 3d 20 61 64 64 72 54 6f 70 3b  llSub = addrTop;
2b9c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
2b9d0 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65  lectDestInit(&de
2b9e0 73 74 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st, SRT_Coroutin
2b9f0 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74  e, pItem->regRet
2ba00 75 72 6e 29 3b 0a 20 20 20 20 20 20 65 78 70 6c  urn);.      expl
2ba10 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 70 49  ainSetInteger(pI
2ba20 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20  tem->iSelectId, 
2ba30 28 75 38 29 70 50 61 72 73 65 2d 3e 69 4e 65 78  (u8)pParse->iNex
2ba40 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20  tSelectId);.    
2ba50 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
2ba60 70 50 61 72 73 65 2c 20 70 53 75 62 2c 20 26 64  pParse, pSub, &d
2ba70 65 73 74 29 3b 0a 20 20 20 20 20 20 70 49 74 65  est);.      pIte
2ba80 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67  m->pTab->nRowLog
2ba90 45 73 74 20 3d 20 70 53 75 62 2d 3e 6e 53 65 6c  Est = pSub->nSel
2baa0 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 70 49  ectRow;.      pI
2bab0 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75  tem->fg.viaCorou
2bac0 74 69 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  tine = 1;.      
2bad0 70 49 74 65 6d 2d 3e 72 65 67 52 65 73 75 6c 74  pItem->regResult
2bae0 20 3d 20 64 65 73 74 2e 69 53 64 73 74 3b 0a 20   = dest.iSdst;. 
2baf0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2bb00 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28 76 2c 20  EndCoroutine(v, 
2bb10 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
2bb20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2bb30 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
2bb40 61 64 64 72 54 6f 70 2d 31 29 3b 0a 20 20 20 20  addrTop-1);.    
2bb50 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65    sqlite3ClearTe
2bb60 6d 70 52 65 67 43 61 63 68 65 28 70 50 61 72 73  mpRegCache(pPars
2bb70 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
2bb80 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
2bb90 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68   a subroutine th
2bba0 61 74 20 77 69 6c 6c 20 66 69 6c 6c 20 61 6e 20  at will fill an 
2bbb0 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  ephemeral table 
2bbc0 77 69 74 68 0a 20 20 20 20 20 20 2a 2a 20 74 68  with.      ** th
2bbd0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69  e content of thi
2bbe0 73 20 73 75 62 71 75 65 72 79 2e 20 20 70 49 74  s subquery.  pIt
2bbf0 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20  em->addrFillSub 
2bc00 77 69 6c 6c 20 70 6f 69 6e 74 0a 20 20 20 20 20  will point.     
2bc10 20 2a 2a 20 74 6f 20 74 68 65 20 61 64 64 72 65   ** to the addre
2bc20 73 73 20 6f 66 20 74 68 65 20 67 65 6e 65 72 61  ss of the genera
2bc30 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65 2e 20  ted subroutine. 
2bc40 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72   pItem->regRetur
2bc50 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61 20  n.      ** is a 
2bc60 72 65 67 69 73 74 65 72 20 61 6c 6c 6f 63 61 74  register allocat
2bc70 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 73  ed to hold the s
2bc80 75 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  ubroutine return
2bc90 20 61 64 64 72 65 73 73 0a 20 20 20 20 20 20 2a   address.      *
2bca0 2f 0a 20 20 20 20 20 20 69 6e 74 20 74 6f 70 41  /.      int topA
2bcb0 64 64 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f  ddr;.      int o
2bcc0 6e 63 65 41 64 64 72 20 3d 20 30 3b 0a 20 20 20  nceAddr = 0;.   
2bcd0 20 20 20 69 6e 74 20 72 65 74 41 64 64 72 3b 0a     int retAddr;.
2bce0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
2bcf0 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
2bd00 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 49 74  ==0 );.      pIt
2bd10 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20  em->regReturn = 
2bd20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
2bd30 20 20 20 20 20 20 74 6f 70 41 64 64 72 20 3d 20        topAddr = 
2bd40 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2bd50 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
2bd60 20 30 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65   0, pItem->regRe
2bd70 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 70 49 74  turn);.      pIt
2bd80 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20  em->addrFillSub 
2bd90 3d 20 74 6f 70 41 64 64 72 2b 31 3b 0a 20 20 20  = topAddr+1;.   
2bda0 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67     if( pItem->fg
2bdb0 2e 69 73 43 6f 72 72 65 6c 61 74 65 64 3d 3d 30  .isCorrelated==0
2bdc0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
2bdd0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
2bde0 73 20 6e 6f 74 20 63 6f 72 72 65 6c 61 74 65 64  s not correlated
2bdf0 20 61 6e 64 20 69 66 20 77 65 20 61 72 65 20 6e   and if we are n
2be00 6f 74 20 69 6e 73 69 64 65 20 6f 66 0a 20 20 20  ot inside of.   
2be10 20 20 20 20 20 2a 2a 20 61 20 74 72 69 67 67 65       ** a trigge
2be20 72 2c 20 74 68 65 6e 20 77 65 20 6f 6e 6c 79 20  r, then we only 
2be30 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20  need to compute 
2be40 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
2be50 20 73 75 62 71 75 65 72 79 0a 20 20 20 20 20 20   subquery.      
2be60 20 20 2a 2a 20 6f 6e 63 65 2e 20 2a 2f 0a 20 20    ** once. */.  
2be70 20 20 20 20 20 20 6f 6e 63 65 41 64 64 72 20 3d        onceAddr =
2be80 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65   sqlite3CodeOnce
2be90 28 70 50 61 72 73 65 29 3b 20 56 64 62 65 43 6f  (pParse); VdbeCo
2bea0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
2beb0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
2bec0 76 2c 20 22 6d 61 74 65 72 69 61 6c 69 7a 65 20  v, "materialize 
2bed0 5c 22 25 73 5c 22 22 2c 20 70 49 74 65 6d 2d 3e  \"%s\"", pItem->
2bee0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  pTab->zName));. 
2bef0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2bf00 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d      VdbeNoopComm
2bf10 65 6e 74 28 28 76 2c 20 22 6d 61 74 65 72 69 61  ent((v, "materia
2bf20 6c 69 7a 65 20 5c 22 25 73 5c 22 22 2c 20 70 49  lize \"%s\"", pI
2bf30 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  tem->pTab->zName
2bf40 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
2bf50 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
2bf60 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53  estInit(&dest, S
2bf70 52 54 5f 45 70 68 65 6d 54 61 62 2c 20 70 49 74  RT_EphemTab, pIt
2bf80 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  em->iCursor);.  
2bf90 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
2bfa0 74 65 67 65 72 28 70 49 74 65 6d 2d 3e 69 53 65  teger(pItem->iSe
2bfb0 6c 65 63 74 49 64 2c 20 28 75 38 29 70 50 61 72  lectId, (u8)pPar
2bfc0 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
2bfd0 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
2bfe0 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
2bff0 70 53 75 62 2c 20 26 64 65 73 74 29 3b 0a 20 20  pSub, &dest);.  
2c000 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d      pItem->pTab-
2c010 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 70 53  >nRowLogEst = pS
2c020 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a  ub->nSelectRow;.
2c030 20 20 20 20 20 20 69 66 28 20 6f 6e 63 65 41 64        if( onceAd
2c040 64 72 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  dr ) sqlite3Vdbe
2c050 4a 75 6d 70 48 65 72 65 28 76 2c 20 6f 6e 63 65  JumpHere(v, once
2c060 41 64 64 72 29 3b 0a 20 20 20 20 20 20 72 65 74  Addr);.      ret
2c070 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  Addr = sqlite3Vd
2c080 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
2c090 65 74 75 72 6e 2c 20 70 49 74 65 6d 2d 3e 72 65  eturn, pItem->re
2c0a0 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20  gReturn);.      
2c0b0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
2c0c0 22 65 6e 64 20 25 73 22 2c 20 70 49 74 65 6d 2d  "end %s", pItem-
2c0d0 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  >pTab->zName));.
2c0e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2c0f0 65 43 68 61 6e 67 65 50 31 28 76 2c 20 74 6f 70  eChangeP1(v, top
2c100 41 64 64 72 2c 20 72 65 74 41 64 64 72 29 3b 0a  Addr, retAddr);.
2c110 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65        sqlite3Cle
2c120 61 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 70  arTempRegCache(p
2c130 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Parse);.    }.  
2c140 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
2c150 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65  Failed ) goto se
2c160 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 70 50  lect_end;.    pP
2c170 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2d 3d  arse->nHeight -=
2c180 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
2c190 70 72 48 65 69 67 68 74 28 70 29 3b 0a 20 20 7d  prHeight(p);.  }
2c1a0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 56 61  .#endif..  /* Va
2c1b0 72 69 6f 75 73 20 65 6c 65 6d 65 6e 74 73 20 6f  rious elements o
2c1c0 66 20 74 68 65 20 53 45 4c 45 43 54 20 63 6f 70  f the SELECT cop
2c1d0 69 65 64 20 69 6e 74 6f 20 6c 6f 63 61 6c 20 76  ied into local v
2c1e0 61 72 69 61 62 6c 65 73 20 66 6f 72 0a 20 20 2a  ariables for.  *
2c1f0 2a 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20 2a 2f  * convenience */
2c200 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  .  pEList = p->p
2c210 45 4c 69 73 74 3b 0a 20 20 70 57 68 65 72 65 20  EList;.  pWhere 
2c220 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70  = p->pWhere;.  p
2c230 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72  GroupBy = p->pGr
2c240 6f 75 70 42 79 3b 0a 20 20 70 48 61 76 69 6e 67  oupBy;.  pHaving
2c250 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20   = p->pHaving;. 
2c260 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63   sDistinct.isTnc
2c270 74 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  t = (p->selFlags
2c280 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21   & SF_Distinct)!
2c290 3d 30 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54 54  =0;..#if SELECTT
2c2a0 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69  RACE_ENABLED.  i
2c2b0 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
2c2c0 54 72 61 63 65 20 26 20 30 78 34 30 30 20 29 7b  Trace & 0x400 ){
2c2d0 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45  .    SELECTTRACE
2c2e0 28 30 78 34 30 30 2c 70 50 61 72 73 65 2c 70 2c  (0x400,pParse,p,
2c2f0 28 22 41 66 74 65 72 20 61 6c 6c 20 46 52 4f 4d  ("After all FROM
2c300 2d 63 6c 61 75 73 65 20 61 6e 61 6c 79 73 69 73  -clause analysis
2c310 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c 69  :\n"));.    sqli
2c320 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63  te3TreeViewSelec
2c330 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a  t(0, p, 0);.  }.
2c340 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
2c350 74 68 65 20 71 75 65 72 79 20 69 73 20 44 49 53  the query is DIS
2c360 54 49 4e 43 54 20 77 69 74 68 20 61 6e 20 4f 52  TINCT with an OR
2c370 44 45 52 20 42 59 20 62 75 74 20 69 73 20 6e 6f  DER BY but is no
2c380 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 2c 20  t an aggregate, 
2c390 61 6e 64 20 0a 20 20 2a 2a 20 69 66 20 74 68 65  and .  ** if the
2c3a0 20 73 65 6c 65 63 74 2d 6c 69 73 74 20 69 73 20   select-list is 
2c3b0 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
2c3c0 4f 52 44 45 52 20 42 59 20 6c 69 73 74 2c 20 74  ORDER BY list, t
2c3d0 68 65 6e 20 74 68 69 73 20 71 75 65 72 79 0a 20  hen this query. 
2c3e0 20 2a 2a 20 63 61 6e 20 62 65 20 72 65 77 72 69   ** can be rewri
2c3f0 74 74 65 6e 20 61 73 20 61 20 47 52 4f 55 50 20  tten as a GROUP 
2c400 42 59 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  BY. In other wor
2c410 64 73 2c 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20  ds, this:.  **. 
2c420 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 44   **     SELECT D
2c430 49 53 54 49 4e 43 54 20 78 79 7a 20 46 52 4f 4d  ISTINCT xyz FROM
2c440 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20 78 79   ... ORDER BY xy
2c450 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 74  z.  **.  ** is t
2c460 72 61 6e 73 66 6f 72 6d 65 64 20 74 6f 3a 0a 20  ransformed to:. 
2c470 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c   **.  **     SEL
2c480 45 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e  ECT xyz FROM ...
2c490 20 47 52 4f 55 50 20 42 59 20 78 79 7a 20 4f 52   GROUP BY xyz OR
2c4a0 44 45 52 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a  DER BY xyz.  **.
2c4b0 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20    ** The second 
2c4c0 66 6f 72 6d 20 69 73 20 70 72 65 66 65 72 72 65  form is preferre
2c4d0 64 20 61 73 20 61 20 73 69 6e 67 6c 65 20 69 6e  d as a single in
2c4e0 64 65 78 20 28 6f 72 20 74 65 6d 70 2d 74 61 62  dex (or temp-tab
2c4f0 6c 65 29 20 6d 61 79 20 62 65 20 0a 20 20 2a 2a  le) may be .  **
2c500 20 75 73 65 64 20 66 6f 72 20 62 6f 74 68 20 74   used for both t
2c510 68 65 20 4f 52 44 45 52 20 42 59 20 61 6e 64 20  he ORDER BY and 
2c520 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73 73  DISTINCT process
2c530 69 6e 67 2e 20 41 73 20 6f 72 69 67 69 6e 61 6c  ing. As original
2c540 6c 79 20 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e  ly .  ** written
2c550 20 74 68 65 20 71 75 65 72 79 20 6d 75 73 74 20   the query must 
2c560 75 73 65 20 61 20 74 65 6d 70 2d 74 61 62 6c 65  use a temp-table
2c570 20 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6f 6e   for at least on
2c580 65 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 0a  e of the ORDER .
2c590 20 20 2a 2a 20 42 59 20 61 6e 64 20 44 49 53 54    ** BY and DIST
2c5a0 49 4e 43 54 2c 20 61 6e 64 20 61 6e 20 69 6e 64  INCT, and an ind
2c5b0 65 78 20 6f 72 20 73 65 70 61 72 61 74 65 20 74  ex or separate t
2c5c0 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20 74 68  emp-table for th
2c5d0 65 20 6f 74 68 65 72 2e 0a 20 20 2a 2f 0a 20 20  e other..  */.  
2c5e0 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  if( (p->selFlags
2c5f0 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c   & (SF_Distinct|
2c600 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d  SF_Aggregate))==
2c610 53 46 5f 44 69 73 74 69 6e 63 74 20 0a 20 20 20  SF_Distinct .   
2c620 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  && sqlite3ExprLi
2c630 73 74 43 6f 6d 70 61 72 65 28 73 53 6f 72 74 2e  stCompare(sSort.
2c640 70 4f 72 64 65 72 42 79 2c 20 70 45 4c 69 73 74  pOrderBy, pEList
2c650 2c 20 2d 31 29 3d 3d 30 0a 20 20 29 7b 0a 20 20  , -1)==0.  ){.  
2c660 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d    p->selFlags &=
2c670 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20   ~SF_Distinct;. 
2c680 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d     pGroupBy = p-
2c690 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69  >pGroupBy = sqli
2c6a0 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
2c6b0 62 2c 20 70 45 4c 69 73 74 2c 20 30 29 3b 0a 20  b, pEList, 0);. 
2c6c0 20 20 20 2f 2a 20 4e 6f 74 69 63 65 20 74 68 61     /* Notice tha
2c6d0 74 20 65 76 65 6e 20 74 68 6f 75 67 68 74 20 53  t even thought S
2c6e0 46 5f 44 69 73 74 69 6e 63 74 20 68 61 73 20 62  F_Distinct has b
2c6f0 65 65 6e 20 63 6c 65 61 72 65 64 20 66 72 6f 6d  een cleared from
2c700 20 70 2d 3e 73 65 6c 46 6c 61 67 73 2c 0a 20 20   p->selFlags,.  
2c710 20 20 2a 2a 20 74 68 65 20 73 44 69 73 74 69 6e    ** the sDistin
2c720 63 74 2e 69 73 54 6e 63 74 20 69 73 20 73 74 69  ct.isTnct is sti
2c730 6c 6c 20 73 65 74 2e 20 20 48 65 6e 63 65 2c 20  ll set.  Hence, 
2c740 69 73 54 6e 63 74 20 72 65 70 72 65 73 65 6e 74  isTnct represent
2c750 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 72 69  s the.    ** ori
2c760 67 69 6e 61 6c 20 73 65 74 74 69 6e 67 20 6f 66  ginal setting of
2c770 20 74 68 65 20 53 46 5f 44 69 73 74 69 6e 63 74   the SF_Distinct
2c780 20 66 6c 61 67 2c 20 6e 6f 74 20 74 68 65 20 63   flag, not the c
2c790 75 72 72 65 6e 74 20 73 65 74 74 69 6e 67 20 2a  urrent setting *
2c7a0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 44  /.    assert( sD
2c7b0 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 29  istinct.isTnct )
2c7c0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
2c7d0 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52  here is an ORDER
2c7e0 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e   BY clause, then
2c7f0 20 63 72 65 61 74 65 20 61 6e 20 65 70 68 65 6d   create an ephem
2c800 65 72 61 6c 20 69 6e 64 65 78 20 74 6f 0a 20 20  eral index to.  
2c810 2a 2a 20 64 6f 20 74 68 65 20 73 6f 72 74 69 6e  ** do the sortin
2c820 67 2e 20 20 42 75 74 20 74 68 69 73 20 73 6f 72  g.  But this sor
2c830 74 69 6e 67 20 65 70 68 65 6d 65 72 61 6c 20 69  ting ephemeral i
2c840 6e 64 65 78 20 6d 69 67 68 74 20 65 6e 64 20 75  ndex might end u
2c850 70 0a 20 20 2a 2a 20 62 65 69 6e 67 20 75 6e 75  p.  ** being unu
2c860 73 65 64 20 69 66 20 74 68 65 20 64 61 74 61 20  sed if the data 
2c870 63 61 6e 20 62 65 20 65 78 74 72 61 63 74 65 64  can be extracted
2c880 20 69 6e 20 70 72 65 2d 73 6f 72 74 65 64 20 6f   in pre-sorted o
2c890 72 64 65 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68  rder..  ** If th
2c8a0 61 74 20 69 73 20 74 68 65 20 63 61 73 65 2c 20  at is the case, 
2c8b0 74 68 65 6e 20 74 68 65 20 4f 50 5f 4f 70 65 6e  then the OP_Open
2c8c0 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75  Ephemeral instru
2c8d0 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 20 20  ction will be.  
2c8e0 2a 2a 20 63 68 61 6e 67 65 64 20 74 6f 20 61 6e  ** changed to an
2c8f0 20 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65 20 77 65   OP_Noop once we
2c900 20 66 69 67 75 72 65 20 6f 75 74 20 74 68 61 74   figure out that
2c910 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64   the sorting ind
2c920 65 78 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6e  ex is.  ** not n
2c930 65 65 64 65 64 2e 20 20 54 68 65 20 73 53 6f 72  eeded.  The sSor
2c940 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20  t.addrSortIndex 
2c950 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
2c960 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65 0a 20   to facilitate. 
2c970 20 2a 2a 20 74 68 61 74 20 63 68 61 6e 67 65 2e   ** that change.
2c980 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 53 6f 72  .  */.  if( sSor
2c990 74 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  t.pOrderBy ){.  
2c9a0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
2c9b0 6e 66 6f 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66  nfo;.    pKeyInf
2c9c0 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  o = keyInfoFromE
2c9d0 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
2c9e0 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 20  sSort.pOrderBy, 
2c9f0 30 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  0, pEList->nExpr
2ca00 29 3b 0a 20 20 20 20 73 53 6f 72 74 2e 69 45 43  );.    sSort.iEC
2ca10 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e  ursor = pParse->
2ca20 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 53 6f 72  nTab++;.    sSor
2ca30 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20  t.addrSortIndex 
2ca40 3d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  =.      sqlite3V
2ca50 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
2ca60 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20  OpenEphemeral,. 
2ca70 20 20 20 20 20 20 20 20 20 73 53 6f 72 74 2e 69           sSort.i
2ca80 45 43 75 72 73 6f 72 2c 20 73 53 6f 72 74 2e 70  ECursor, sSort.p
2ca90 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31  OrderBy->nExpr+1
2caa0 2b 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20  +pEList->nExpr, 
2cab0 30 2c 0a 20 20 20 20 20 20 20 20 20 20 28 63 68  0,.          (ch
2cac0 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  ar*)pKeyInfo, P4
2cad0 5f 4b 45 59 49 4e 46 4f 0a 20 20 20 20 20 20 29  _KEYINFO.      )
2cae0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
2caf0 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64  Sort.addrSortInd
2cb00 65 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20  ex = -1;.  }..  
2cb10 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75 74  /* If the output
2cb20 20 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72   is destined for
2cb30 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
2cb40 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74 20 74 61  le, open that ta
2cb50 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
2cb60 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
2cb70 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20  T_EphemTab ){.  
2cb80 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2cb90 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
2cba0 68 65 6d 65 72 61 6c 2c 20 70 44 65 73 74 2d 3e  hemeral, pDest->
2cbb0 69 53 44 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d  iSDParm, pEList-
2cbc0 3e 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20  >nExpr);.  }..  
2cbd0 2f 2a 20 53 65 74 20 74 68 65 20 6c 69 6d 69 74  /* Set the limit
2cbe0 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e 64 20  er..  */.  iEnd 
2cbf0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
2cc00 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 70 2d 3e  eLabel(v);.  p->
2cc10 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 33 32 30  nSelectRow = 320
2cc20 3b 20 20 2f 2a 20 34 20 62 69 6c 6c 69 6f 6e 20  ;  /* 4 billion 
2cc30 72 6f 77 73 20 2a 2f 0a 20 20 63 6f 6d 70 75 74  rows */.  comput
2cc40 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
2cc50 70 50 61 72 73 65 2c 20 70 2c 20 69 45 6e 64 29  pParse, p, iEnd)
2cc60 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69  ;.  if( p->iLimi
2cc70 74 3d 3d 30 20 26 26 20 73 53 6f 72 74 2e 61 64  t==0 && sSort.ad
2cc80 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 29  drSortIndex>=0 )
2cc90 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
2cca0 65 43 68 61 6e 67 65 4f 70 63 6f 64 65 28 76 2c  eChangeOpcode(v,
2ccb0 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49   sSort.addrSortI
2ccc0 6e 64 65 78 2c 20 4f 50 5f 53 6f 72 74 65 72 4f  ndex, OP_SorterO
2ccd0 70 65 6e 29 3b 0a 20 20 20 20 73 53 6f 72 74 2e  pen);.    sSort.
2cce0 73 6f 72 74 46 6c 61 67 73 20 7c 3d 20 53 4f 52  sortFlags |= SOR
2ccf0 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 3b  TFLAG_UseSorter;
2cd00 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  .  }..  /* Open 
2cd10 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64  an ephemeral ind
2cd20 65 78 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68  ex to use for th
2cd30 65 20 64 69 73 74 69 6e 63 74 20 73 65 74 2e 0a  e distinct set..
2cd40 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65    */.  if( p->se
2cd50 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74  lFlags & SF_Dist
2cd60 69 6e 63 74 20 29 7b 0a 20 20 20 20 73 44 69 73  inct ){.    sDis
2cd70 74 69 6e 63 74 2e 74 61 62 54 6e 63 74 20 3d 20  tinct.tabTnct = 
2cd80 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
2cd90 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 61 64      sDistinct.ad
2cda0 64 72 54 6e 63 74 20 3d 20 73 71 6c 69 74 65 33  drTnct = sqlite3
2cdb0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
2cdc0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a  _OpenEphemeral,.
2cdd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cde0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 44 69               sDi
2cdf0 73 74 69 6e 63 74 2e 74 61 62 54 6e 63 74 2c 20  stinct.tabTnct, 
2ce00 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  0, 0,.          
2ce10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ce20 20 20 20 28 63 68 61 72 2a 29 6b 65 79 49 6e 66     (char*)keyInf
2ce30 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  oFromExprList(pP
2ce40 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  arse, p->pEList,
2ce50 30 2c 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20  0,0),.          
2ce60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ce70 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a     P4_KEYINFO);.
2ce80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
2ce90 68 61 6e 67 65 50 35 28 76 2c 20 42 54 52 45 45  hangeP5(v, BTREE
2cea0 5f 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20 20 20  _UNORDERED);.   
2ceb0 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74   sDistinct.eTnct
2cec0 54 79 70 65 20 3d 20 57 48 45 52 45 5f 44 49 53  Type = WHERE_DIS
2ced0 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 3b  TINCT_UNORDERED;
2cee0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 44  .  }else{.    sD
2cef0 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70  istinct.eTnctTyp
2cf00 65 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e  e = WHERE_DISTIN
2cf10 43 54 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20 20  CT_NOOP;.  }..  
2cf20 69 66 28 20 21 69 73 41 67 67 20 26 26 20 70 47  if( !isAgg && pG
2cf30 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20  roupBy==0 ){.   
2cf40 20 2f 2a 20 4e 6f 20 61 67 67 72 65 67 61 74 65   /* No aggregate
2cf50 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6e   functions and n
2cf60 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  o GROUP BY claus
2cf70 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 77 63 74  e */.    u16 wct
2cf80 72 6c 46 6c 61 67 73 20 3d 20 28 73 44 69 73 74  rlFlags = (sDist
2cf90 69 6e 63 74 2e 69 73 54 6e 63 74 20 3f 20 57 48  inct.isTnct ? WH
2cfa0 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43  ERE_WANT_DISTINC
2cfb0 54 20 3a 20 30 29 3b 0a 20 20 20 20 61 73 73 65  T : 0);.    asse
2cfc0 72 74 28 20 57 48 45 52 45 5f 55 53 45 5f 4c 49  rt( WHERE_USE_LI
2cfd0 4d 49 54 3d 3d 53 46 5f 46 69 78 65 64 4c 69 6d  MIT==SF_FixedLim
2cfe0 69 74 20 29 3b 0a 20 20 20 20 77 63 74 72 6c 46  it );.    wctrlF
2cff0 6c 61 67 73 20 7c 3d 20 70 2d 3e 73 65 6c 46 6c  lags |= p->selFl
2d000 61 67 73 20 26 20 53 46 5f 46 69 78 65 64 4c 69  ags & SF_FixedLi
2d010 6d 69 74 3b 0a 0a 20 20 20 20 2f 2a 20 42 65 67  mit;..    /* Beg
2d020 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
2d030 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20 70 57 49  scan. */.    pWI
2d040 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65  nfo = sqlite3Whe
2d050 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20  reBegin(pParse, 
2d060 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65  pTabList, pWhere
2d070 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79  , sSort.pOrderBy
2d080 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2d090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d0a0 20 70 2d 3e 70 45 4c 69 73 74 2c 20 77 63 74 72   p->pEList, wctr
2d0b0 6c 46 6c 61 67 73 2c 20 70 2d 3e 6e 53 65 6c 65  lFlags, p->nSele
2d0c0 63 74 52 6f 77 29 3b 0a 20 20 20 20 69 66 28 20  ctRow);.    if( 
2d0d0 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f  pWInfo==0 ) goto
2d0e0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
2d0f0 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
2d100 65 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28  eOutputRowCount(
2d110 70 57 49 6e 66 6f 29 20 3c 20 70 2d 3e 6e 53 65  pWInfo) < p->nSe
2d120 6c 65 63 74 52 6f 77 20 29 7b 0a 20 20 20 20 20  lectRow ){.     
2d130 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
2d140 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f 75 74   sqlite3WhereOut
2d150 70 75 74 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e  putRowCount(pWIn
2d160 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  fo);.    }.    i
2d170 66 28 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54  f( sDistinct.isT
2d180 6e 63 74 20 26 26 20 73 71 6c 69 74 65 33 57 68  nct && sqlite3Wh
2d190 65 72 65 49 73 44 69 73 74 69 6e 63 74 28 70 57  ereIsDistinct(pW
2d1a0 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 20 20 73  Info) ){.      s
2d1b0 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79  Distinct.eTnctTy
2d1c0 70 65 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  pe = sqlite3Wher
2d1d0 65 49 73 44 69 73 74 69 6e 63 74 28 70 57 49 6e  eIsDistinct(pWIn
2d1e0 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  fo);.    }.    i
2d1f0 66 28 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  f( sSort.pOrderB
2d200 79 20 29 7b 0a 20 20 20 20 20 20 73 53 6f 72 74  y ){.      sSort
2d210 2e 6e 4f 42 53 61 74 20 3d 20 73 71 6c 69 74 65  .nOBSat = sqlite
2d220 33 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28  3WhereIsOrdered(
2d230 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69  pWInfo);.      i
2d240 66 28 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74 3d  f( sSort.nOBSat=
2d250 3d 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2d  =sSort.pOrderBy-
2d260 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
2d270 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79    sSort.pOrderBy
2d280 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
2d290 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73    }..    /* If s
2d2a0 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61  orting index tha
2d2b0 74 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79  t was created by
2d2c0 20 61 20 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e   a prior OP_Open
2d2d0 45 70 68 65 6d 65 72 61 6c 20 0a 20 20 20 20 2a  Ephemeral .    *
2d2e0 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e  * instruction en
2d2f0 64 65 64 20 75 70 20 6e 6f 74 20 62 65 69 6e 67  ded up not being
2d300 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 63 68   needed, then ch
2d310 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e  ange the OP_Open
2d320 45 70 68 65 6d 65 72 61 6c 0a 20 20 20 20 2a 2a  Ephemeral.    **
2d330 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70   into an OP_Noop
2d340 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
2d350 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49   sSort.addrSortI
2d360 6e 64 65 78 3e 3d 30 20 26 26 20 73 53 6f 72 74  ndex>=0 && sSort
2d370 2e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a  .pOrderBy==0 ){.
2d380 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2d390 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c  eChangeToNoop(v,
2d3a0 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49   sSort.addrSortI
2d3b0 6e 64 65 78 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ndex);.    }..  
2d3c0 20 20 2f 2a 20 55 73 65 20 74 68 65 20 73 74 61    /* Use the sta
2d3d0 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70  ndard inner loop
2d3e0 2e 20 2a 2f 0a 20 20 20 20 73 65 6c 65 63 74 49  . */.    selectI
2d3f0 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
2d400 20 70 2c 20 70 45 4c 69 73 74 2c 20 2d 31 2c 20   p, pEList, -1, 
2d410 26 73 53 6f 72 74 2c 20 26 73 44 69 73 74 69 6e  &sSort, &sDistin
2d420 63 74 2c 20 70 44 65 73 74 2c 0a 20 20 20 20 20  ct, pDest,.     
2d430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
2d440 71 6c 69 74 65 33 57 68 65 72 65 43 6f 6e 74 69  qlite3WhereConti
2d450 6e 75 65 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29  nueLabel(pWInfo)
2d460 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2d470 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
2d480 72 65 42 72 65 61 6b 4c 61 62 65 6c 28 70 57 49  reBreakLabel(pWI
2d490 6e 66 6f 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45  nfo));..    /* E
2d4a0 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
2d4b0 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a  scan loop..    *
2d4c0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 57 68 65  /.    sqlite3Whe
2d4d0 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20  reEnd(pWInfo);. 
2d4e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
2d4f0 68 69 73 20 63 61 73 65 20 77 68 65 6e 20 74 68  his case when th
2d500 65 72 65 20 65 78 69 73 74 20 61 67 67 72 65 67  ere exist aggreg
2d510 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72  ate functions or
2d520 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75   a GROUP BY clau
2d530 73 65 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74  se.    ** or bot
2d540 68 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e  h */.    NameCon
2d550 74 65 78 74 20 73 4e 43 3b 20 20 20 20 2f 2a 20  text sNC;    /* 
2d560 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72  Name context for
2d570 20 70 72 6f 63 65 73 73 69 6e 67 20 61 67 67 72   processing aggr
2d580 65 67 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f  egate informatio
2d590 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 4d  n */.    int iAM
2d5a0 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  em;          /* 
2d5b0 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73  First Mem addres
2d5c0 73 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 63 75  s for storing cu
2d5d0 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 2a  rrent GROUP BY *
2d5e0 2f 0a 20 20 20 20 69 6e 74 20 69 42 4d 65 6d 3b  /.    int iBMem;
2d5f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
2d600 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66  st Mem address f
2d610 6f 72 20 70 72 65 76 69 6f 75 73 20 47 52 4f 55  or previous GROU
2d620 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20  P BY */.    int 
2d630 69 55 73 65 46 6c 61 67 3b 20 20 20 20 20 20 20  iUseFlag;       
2d640 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20 68  /* Mem address h
2d650 6f 6c 64 69 6e 67 20 66 6c 61 67 20 69 6e 64 69  olding flag indi
2d660 63 61 74 69 6e 67 20 74 68 61 74 20 61 74 20 6c  cating that at l
2d670 65 61 73 74 0a 20 20 20 20 20 20 20 20 20 20 20  east.           
2d680 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
2d690 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20 69  one row of the i
2d6a0 6e 70 75 74 20 74 6f 20 74 68 65 20 61 67 67 72  nput to the aggr
2d6b0 65 67 61 74 6f 72 20 68 61 73 20 62 65 65 6e 0a  egator has been.
2d6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d6d0 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65          ** proce
2d6e0 73 73 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ssed */.    int 
2d6f0 69 41 62 6f 72 74 46 6c 61 67 3b 20 20 20 20 20  iAbortFlag;     
2d700 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20 77  /* Mem address w
2d710 68 69 63 68 20 63 61 75 73 65 73 20 71 75 65 72  hich causes quer
2d720 79 20 61 62 6f 72 74 20 69 66 20 70 6f 73 69 74  y abort if posit
2d730 69 76 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 67  ive */.    int g
2d740 72 6f 75 70 42 79 53 6f 72 74 3b 20 20 20 20 2f  roupBySort;    /
2d750 2a 20 52 6f 77 73 20 63 6f 6d 65 20 66 72 6f 6d  * Rows come from
2d760 20 73 6f 75 72 63 65 20 69 6e 20 47 52 4f 55 50   source in GROUP
2d770 20 42 59 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20   BY order */.   
2d780 20 69 6e 74 20 61 64 64 72 45 6e 64 3b 20 20 20   int addrEnd;   
2d790 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70       /* End of p
2d7a0 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 74 68  rocessing for th
2d7b0 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20  is SELECT */.   
2d7c0 20 69 6e 74 20 73 6f 72 74 50 54 61 62 20 3d 20   int sortPTab = 
2d7d0 30 3b 20 20 20 2f 2a 20 50 73 65 75 64 6f 74 61  0;   /* Pseudota
2d7e0 62 6c 65 20 75 73 65 64 20 74 6f 20 64 65 63 6f  ble used to deco
2d7f0 64 65 20 73 6f 72 74 69 6e 67 20 72 65 73 75 6c  de sorting resul
2d800 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f  ts */.    int so
2d810 72 74 4f 75 74 20 3d 20 30 3b 20 20 20 20 2f 2a  rtOut = 0;    /*
2d820 20 4f 75 74 70 75 74 20 72 65 67 69 73 74 65 72   Output register
2d830 20 66 72 6f 6d 20 74 68 65 20 73 6f 72 74 65 72   from the sorter
2d840 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 72 64 65   */.    int orde
2d850 72 42 79 47 72 70 20 3d 20 30 3b 20 2f 2a 20 54  rByGrp = 0; /* T
2d860 72 75 65 20 69 66 20 74 68 65 20 47 52 4f 55 50  rue if the GROUP
2d870 20 42 59 20 61 6e 64 20 4f 52 44 45 52 20 42 59   BY and ORDER BY
2d880 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 2a 2f   are the same */
2d890 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20  ..    /* Remove 
2d8a0 61 6e 79 20 61 6e 64 20 61 6c 6c 20 61 6c 69 61  any and all alia
2d8b0 73 65 73 20 62 65 74 77 65 65 6e 20 74 68 65 20  ses between the 
2d8c0 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20 74  result set and t
2d8d0 68 65 0a 20 20 20 20 2a 2a 20 47 52 4f 55 50 20  he.    ** GROUP 
2d8e0 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a  BY clause..    *
2d8f0 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70  /.    if( pGroup
2d900 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  By ){.      int 
2d910 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
2d920 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
2d930 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
2d940 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
2d950 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20  st_item *pItem; 
2d960 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
2d970 6f 76 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20  over expression 
2d980 69 6e 20 61 20 6c 69 73 74 20 2a 2f 0a 0a 20 20  in a list */..  
2d990 20 20 20 20 66 6f 72 28 6b 3d 70 2d 3e 70 45 4c      for(k=p->pEL
2d9a0 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65  ist->nExpr, pIte
2d9b0 6d 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 20  m=p->pEList->a; 
2d9c0 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b  k>0; k--, pItem+
2d9d0 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65  +){.        pIte
2d9e0 6d 2d 3e 75 2e 78 2e 69 41 6c 69 61 73 20 3d 20  m->u.x.iAlias = 
2d9f0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
2da00 20 66 6f 72 28 6b 3d 70 47 72 6f 75 70 42 79 2d   for(k=pGroupBy-
2da10 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 47  >nExpr, pItem=pG
2da20 72 6f 75 70 42 79 2d 3e 61 3b 20 6b 3e 30 3b 20  roupBy->a; k>0; 
2da30 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  k--, pItem++){. 
2da40 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e         pItem->u.
2da50 78 2e 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20  x.iAlias = 0;.  
2da60 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
2da70 72 74 28 20 36 36 3d 3d 73 71 6c 69 74 65 33 4c  rt( 66==sqlite3L
2da80 6f 67 45 73 74 28 31 30 30 29 20 29 3b 0a 20 20  ogEst(100) );.  
2da90 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65      if( p->nSele
2daa0 63 74 52 6f 77 3e 36 36 20 29 20 70 2d 3e 6e 53  ctRow>66 ) p->nS
2dab0 65 6c 65 63 74 52 6f 77 20 3d 20 36 36 3b 0a 20  electRow = 66;. 
2dac0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2dad0 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74  assert( 0==sqlit
2dae0 65 33 4c 6f 67 45 73 74 28 31 29 20 29 3b 0a 20  e3LogEst(1) );. 
2daf0 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52       p->nSelectR
2db00 6f 77 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  ow = 0;.    }.. 
2db10 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69     /* If there i
2db20 73 20 62 6f 74 68 20 61 20 47 52 4f 55 50 20 42  s both a GROUP B
2db30 59 20 61 6e 64 20 61 6e 20 4f 52 44 45 52 20 42  Y and an ORDER B
2db40 59 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65  Y clause and the
2db50 79 20 61 72 65 0a 20 20 20 20 2a 2a 20 69 64 65  y are.    ** ide
2db60 6e 74 69 63 61 6c 2c 20 74 68 65 6e 20 69 74 20  ntical, then it 
2db70 6d 61 79 20 62 65 20 70 6f 73 73 69 62 6c 65 20  may be possible 
2db80 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65 20 4f  to disable the O
2db90 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 0a  RDER BY clause .
2dba0 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 67 72      ** on the gr
2dbb0 6f 75 6e 64 73 20 74 68 61 74 20 74 68 65 20 47  ounds that the G
2dbc0 52 4f 55 50 20 42 59 20 77 69 6c 6c 20 63 61 75  ROUP BY will cau
2dbd0 73 65 20 65 6c 65 6d 65 6e 74 73 20 74 6f 20 63  se elements to c
2dbe0 6f 6d 65 20 6f 75 74 20 0a 20 20 20 20 2a 2a 20  ome out .    ** 
2dbf0 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f  in the correct o
2dc00 72 64 65 72 2e 20 49 74 20 61 6c 73 6f 20 6d 61  rder. It also ma
2dc10 79 20 6e 6f 74 20 2d 20 74 68 65 20 47 52 4f 55  y not - the GROU
2dc20 50 20 42 59 20 6d 69 67 68 74 20 75 73 65 20 61  P BY might use a
2dc30 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
2dc40 20 69 6e 64 65 78 20 74 68 61 74 20 63 61 75 73   index that caus
2dc50 65 73 20 72 6f 77 73 20 74 6f 20 62 65 20 67 72  es rows to be gr
2dc60 6f 75 70 65 64 20 74 6f 67 65 74 68 65 72 20 61  ouped together a
2dc70 73 20 72 65 71 75 69 72 65 64 0a 20 20 20 20 2a  s required.    *
2dc80 2a 20 62 75 74 20 6e 6f 74 20 61 63 74 75 61 6c  * but not actual
2dc90 6c 79 20 73 6f 72 74 65 64 2e 20 45 69 74 68 65  ly sorted. Eithe
2dca0 72 20 77 61 79 2c 20 72 65 63 6f 72 64 20 74 68  r way, record th
2dcb0 65 20 66 61 63 74 20 74 68 61 74 20 74 68 65 0a  e fact that the.
2dcc0 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20      ** ORDER BY 
2dcd0 61 6e 64 20 47 52 4f 55 50 20 42 59 20 63 6c 61  and GROUP BY cla
2dce0 75 73 65 73 20 61 72 65 20 74 68 65 20 73 61 6d  uses are the sam
2dcf0 65 20 62 79 20 73 65 74 74 69 6e 67 20 74 68 65  e by setting the
2dd00 20 6f 72 64 65 72 42 79 47 72 70 0a 20 20 20 20   orderByGrp.    
2dd10 2a 2a 20 76 61 72 69 61 62 6c 65 2e 20 20 2a 2f  ** variable.  */
2dd20 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
2dd30 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28  ExprListCompare(
2dd40 70 47 72 6f 75 70 42 79 2c 20 73 53 6f 72 74 2e  pGroupBy, sSort.
2dd50 70 4f 72 64 65 72 42 79 2c 20 2d 31 29 3d 3d 30  pOrderBy, -1)==0
2dd60 20 29 7b 0a 20 20 20 20 20 20 6f 72 64 65 72 42   ){.      orderB
2dd70 79 47 72 70 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  yGrp = 1;.    }.
2dd80 20 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20   .    /* Create 
2dd90 61 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20  a label to jump 
2dda0 74 6f 20 77 68 65 6e 20 77 65 20 77 61 6e 74 20  to when we want 
2ddb0 74 6f 20 61 62 6f 72 74 20 74 68 65 20 71 75 65  to abort the que
2ddc0 72 79 20 2a 2f 0a 20 20 20 20 61 64 64 72 45 6e  ry */.    addrEn
2ddd0 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  d = sqlite3VdbeM
2dde0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20  akeLabel(v);..  
2ddf0 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 54 4b 5f    /* Convert TK_
2de00 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 69 6e 74  COLUMN nodes int
2de10 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  o TK_AGG_COLUMN 
2de20 61 6e 64 20 6d 61 6b 65 20 65 6e 74 72 69 65 73  and make entries
2de30 20 69 6e 0a 20 20 20 20 2a 2a 20 73 41 67 67 49   in.    ** sAggI
2de40 6e 66 6f 20 66 6f 72 20 61 6c 6c 20 54 4b 5f 41  nfo for all TK_A
2de50 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65  GG_FUNCTION node
2de60 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 73  s in expressions
2de70 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 53   of the.    ** S
2de80 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
2de90 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  .    */.    mems
2dea0 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65  et(&sNC, 0, size
2deb0 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e  of(sNC));.    sN
2dec0 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  C.pParse = pPars
2ded0 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72 63 4c  e;.    sNC.pSrcL
2dee0 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a  ist = pTabList;.
2def0 20 20 20 20 73 4e 43 2e 70 41 67 67 49 6e 66 6f      sNC.pAggInfo
2df00 20 3d 20 26 73 41 67 67 49 6e 66 6f 3b 0a 20 20   = &sAggInfo;.  
2df10 20 20 73 41 67 67 49 6e 66 6f 2e 6d 6e 52 65 67    sAggInfo.mnReg
2df20 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
2df30 31 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e  1;.    sAggInfo.
2df40 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 20 3d  nSortingColumn =
2df50 20 70 47 72 6f 75 70 42 79 20 3f 20 70 47 72 6f   pGroupBy ? pGro
2df60 75 70 42 79 2d 3e 6e 45 78 70 72 20 3a 20 30 3b  upBy->nExpr : 0;
2df70 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 70 47  .    sAggInfo.pG
2df80 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42  roupBy = pGroupB
2df90 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  y;.    sqlite3Ex
2dfa0 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74  prAnalyzeAggList
2dfb0 28 26 73 4e 43 2c 20 70 45 4c 69 73 74 29 3b 0a  (&sNC, pEList);.
2dfc0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
2dfd0 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73  nalyzeAggList(&s
2dfe0 4e 43 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72  NC, sSort.pOrder
2dff0 42 79 29 3b 0a 20 20 20 20 69 66 28 20 70 48 61  By);.    if( pHa
2e000 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71  ving ){.      sq
2e010 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
2e020 41 67 67 72 65 67 61 74 65 73 28 26 73 4e 43 2c  Aggregates(&sNC,
2e030 20 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 7d   pHaving);.    }
2e040 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 41  .    sAggInfo.nA
2e050 63 63 75 6d 75 6c 61 74 6f 72 20 3d 20 73 41 67  ccumulator = sAg
2e060 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20  gInfo.nColumn;. 
2e070 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41     for(i=0; i<sA
2e080 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b  ggInfo.nFunc; i+
2e090 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
2e0a0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
2e0b0 74 79 28 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e  ty(sAggInfo.aFun
2e0c0 63 5b 69 5d 2e 70 45 78 70 72 2c 20 45 50 5f 78  c[i].pExpr, EP_x
2e0d0 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
2e0e0 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 7c     sNC.ncFlags |
2e0f0 3d 20 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a  = NC_InAggFunc;.
2e100 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2e110 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28  rAnalyzeAggList(
2e120 26 73 4e 43 2c 20 73 41 67 67 49 6e 66 6f 2e 61  &sNC, sAggInfo.a
2e130 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2d 3e 78  Func[i].pExpr->x
2e140 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 73  .pList);.      s
2e150 4e 43 2e 6e 63 46 6c 61 67 73 20 26 3d 20 7e 4e  NC.ncFlags &= ~N
2e160 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a 20 20 20  C_InAggFunc;.   
2e170 20 7d 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e   }.    sAggInfo.
2e180 6d 78 52 65 67 20 3d 20 70 50 61 72 73 65 2d 3e  mxReg = pParse->
2e190 6e 4d 65 6d 3b 0a 20 20 20 20 69 66 28 20 64 62  nMem;.    if( db
2e1a0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
2e1b0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
2e1c0 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 63 65 73  ;..    /* Proces
2e1d0 73 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61  sing for aggrega
2e1e0 74 65 73 20 77 69 74 68 20 47 52 4f 55 50 20 42  tes with GROUP B
2e1f0 59 20 69 73 20 76 65 72 79 20 64 69 66 66 65 72  Y is very differ
2e200 65 6e 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20 6d  ent and.    ** m
2e210 75 63 68 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78  uch more complex
2e220 20 74 68 61 6e 20 61 67 67 72 65 67 61 74 65 73   than aggregates
2e230 20 77 69 74 68 6f 75 74 20 61 20 47 52 4f 55 50   without a GROUP
2e240 20 42 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   BY..    */.    
2e250 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a  if( pGroupBy ){.
2e260 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70        KeyInfo *p
2e270 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a 20 4b 65 79  KeyInfo;  /* Key
2e280 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
2e290 66 6f 72 20 74 68 65 20 67 72 6f 75 70 20 62 79  for the group by
2e2a0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
2e2b0 20 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20 20   int addr1;     
2e2c0 20 20 20 20 20 2f 2a 20 41 2d 76 73 2d 42 20 63       /* A-vs-B c
2e2d0 6f 6d 70 61 72 69 73 69 6f 6e 20 6a 75 6d 70 20  omparision jump 
2e2e0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
2e2f0 72 4f 75 74 70 75 74 52 6f 77 3b 20 20 2f 2a 20  rOutputRow;  /* 
2e300 53 74 61 72 74 20 6f 66 20 73 75 62 72 6f 75 74  Start of subrout
2e310 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73  ine that outputs
2e320 20 61 20 72 65 73 75 6c 74 20 72 6f 77 20 2a 2f   a result row */
2e330 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 4f 75  .      int regOu
2e340 74 70 75 74 52 6f 77 3b 20 20 20 2f 2a 20 52 65  tputRow;   /* Re
2e350 74 75 72 6e 20 61 64 64 72 65 73 73 20 72 65 67  turn address reg
2e360 69 73 74 65 72 20 66 6f 72 20 6f 75 74 70 75 74  ister for output
2e370 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
2e380 20 20 20 20 20 69 6e 74 20 61 64 64 72 53 65 74       int addrSet
2e390 41 62 6f 72 74 3b 20 20 20 2f 2a 20 53 65 74 20  Abort;   /* Set 
2e3a0 74 68 65 20 61 62 6f 72 74 20 66 6c 61 67 20 61  the abort flag a
2e3b0 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 20  nd return */.   
2e3c0 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70 4f 66     int addrTopOf
2e3d0 4c 6f 6f 70 3b 20 20 2f 2a 20 54 6f 70 20 6f 66  Loop;  /* Top of
2e3e0 20 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20   the input loop 
2e3f0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
2e400 72 53 6f 72 74 69 6e 67 49 64 78 3b 20 2f 2a 20  rSortingIdx; /* 
2e410 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  The OP_OpenEphem
2e420 65 72 61 6c 20 66 6f 72 20 74 68 65 20 73 6f 72  eral for the sor
2e430 74 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20  ting index */.  
2e440 20 20 20 20 69 6e 74 20 61 64 64 72 52 65 73 65      int addrRese
2e450 74 3b 20 20 20 20 20 20 2f 2a 20 53 75 62 72 6f  t;      /* Subro
2e460 75 74 69 6e 65 20 66 6f 72 20 72 65 73 65 74 74  utine for resett
2e470 69 6e 67 20 74 68 65 20 61 63 63 75 6d 75 6c 61  ing the accumula
2e480 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  tor */.      int
2e490 20 72 65 67 52 65 73 65 74 3b 20 20 20 20 20 20   regReset;      
2e4a0 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65   /* Return addre
2e4b0 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ss register for 
2e4c0 72 65 73 65 74 20 73 75 62 72 6f 75 74 69 6e 65  reset subroutine
2e4d0 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66   */..      /* If
2e4e0 20 74 68 65 72 65 20 69 73 20 61 20 47 52 4f 55   there is a GROU
2e4f0 50 20 42 59 20 63 6c 61 75 73 65 20 77 65 20 6d  P BY clause we m
2e500 69 67 68 74 20 6e 65 65 64 20 61 20 73 6f 72 74  ight need a sort
2e510 69 6e 67 20 69 6e 64 65 78 20 74 6f 0a 20 20 20  ing index to.   
2e520 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20     ** implement 
2e530 69 74 2e 20 20 41 6c 6c 6f 63 61 74 65 20 74 68  it.  Allocate th
2e540 61 74 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  at sorting index
2e550 20 6e 6f 77 2e 20 20 49 66 20 69 74 20 74 75 72   now.  If it tur
2e560 6e 73 20 6f 75 74 0a 20 20 20 20 20 20 2a 2a 20  ns out.      ** 
2e570 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 6e  that we do not n
2e580 65 65 64 20 69 74 20 61 66 74 65 72 20 61 6c 6c  eed it after all
2e590 2c 20 74 68 65 20 4f 50 5f 53 6f 72 74 65 72 4f  , the OP_SorterO
2e5a0 70 65 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a  pen instruction.
2e5b0 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65        ** will be
2e5c0 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20   converted into 
2e5d0 61 20 4e 6f 6f 70 2e 20 20 0a 20 20 20 20 20 20  a Noop.  .      
2e5e0 2a 2f 0a 20 20 20 20 20 20 73 41 67 67 49 6e 66  */.      sAggInf
2e5f0 6f 2e 73 6f 72 74 69 6e 67 49 64 78 20 3d 20 70  o.sortingIdx = p
2e600 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
2e610 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20       pKeyInfo = 
2e620 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
2e630 69 73 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f  ist(pParse, pGro
2e640 75 70 42 79 2c 20 30 2c 20 73 41 67 67 49 6e 66  upBy, 0, sAggInf
2e650 6f 2e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  o.nColumn);.    
2e660 20 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78    addrSortingIdx
2e670 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
2e680 64 4f 70 34 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp4(v, OP_Sorte
2e690 72 4f 70 65 6e 2c 20 0a 20 20 20 20 20 20 20 20  rOpen, .        
2e6a0 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69    sAggInfo.sorti
2e6b0 6e 67 49 64 78 2c 20 73 41 67 67 49 6e 66 6f 2e  ngIdx, sAggInfo.
2e6c0 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2c 20  nSortingColumn, 
2e6d0 0a 20 20 20 20 20 20 20 20 20 20 30 2c 20 28 63  .          0, (c
2e6e0 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  har*)pKeyInfo, P
2e6f0 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 0a 20 20 20  4_KEYINFO);..   
2e700 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65     /* Initialize
2e710 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
2e720 73 20 75 73 65 64 20 62 79 20 47 52 4f 55 50 20  s used by GROUP 
2e730 42 59 20 61 67 67 72 65 67 61 74 65 20 70 72 6f  BY aggregate pro
2e740 63 65 73 73 69 6e 67 0a 20 20 20 20 20 20 2a 2f  cessing.      */
2e750 0a 20 20 20 20 20 20 69 55 73 65 46 6c 61 67 20  .      iUseFlag 
2e760 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
2e770 3b 0a 20 20 20 20 20 20 69 41 62 6f 72 74 46 6c  ;.      iAbortFl
2e780 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ag = ++pParse->n
2e790 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 4f 75  Mem;.      regOu
2e7a0 74 70 75 74 52 6f 77 20 3d 20 2b 2b 70 50 61 72  tputRow = ++pPar
2e7b0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
2e7c0 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20  addrOutputRow = 
2e7d0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
2e7e0 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 72  abel(v);.      r
2e7f0 65 67 52 65 73 65 74 20 3d 20 2b 2b 70 50 61 72  egReset = ++pPar
2e800 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
2e810 61 64 64 72 52 65 73 65 74 20 3d 20 73 71 6c 69  addrReset = sqli
2e820 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
2e830 28 76 29 3b 0a 20 20 20 20 20 20 69 41 4d 65 6d  (v);.      iAMem
2e840 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20   = pParse->nMem 
2e850 2b 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73  + 1;.      pPars
2e860 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75  e->nMem += pGrou
2e870 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  pBy->nExpr;.    
2e880 20 20 69 42 4d 65 6d 20 3d 20 70 50 61 72 73 65    iBMem = pParse
2e890 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20  ->nMem + 1;.    
2e8a0 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
2e8b0 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  = pGroupBy->nExp
2e8c0 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
2e8d0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2e8e0 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 41 62  _Integer, 0, iAb
2e8f0 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20  ortFlag);.      
2e900 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
2e910 22 63 6c 65 61 72 20 61 62 6f 72 74 20 66 6c 61  "clear abort fla
2e920 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  g"));.      sqli
2e930 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2e940 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
2e950 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20  iUseFlag);.     
2e960 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
2e970 20 22 69 6e 64 69 63 61 74 65 20 61 63 63 75 6d   "indicate accum
2e980 75 6c 61 74 6f 72 20 65 6d 70 74 79 22 29 29 3b  ulator empty"));
2e990 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2e9a0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e  beAddOp3(v, OP_N
2e9b0 75 6c 6c 2c 20 30 2c 20 69 41 4d 65 6d 2c 20 69  ull, 0, iAMem, i
2e9c0 41 4d 65 6d 2b 70 47 72 6f 75 70 42 79 2d 3e 6e  AMem+pGroupBy->n
2e9d0 45 78 70 72 2d 31 29 3b 0a 0a 20 20 20 20 20 20  Expr-1);..      
2e9e0 2f 2a 20 42 65 67 69 6e 20 61 20 6c 6f 6f 70 20  /* Begin a loop 
2e9f0 74 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63  that will extrac
2ea00 74 20 61 6c 6c 20 73 6f 75 72 63 65 20 72 6f 77  t all source row
2ea10 73 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72  s in GROUP BY or
2ea20 64 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68  der..      ** Th
2ea30 69 73 20 6d 69 67 68 74 20 69 6e 76 6f 6c 76 65  is might involve
2ea40 20 74 77 6f 20 73 65 70 61 72 61 74 65 20 6c 6f   two separate lo
2ea50 6f 70 73 20 77 69 74 68 20 61 6e 20 4f 50 5f 53  ops with an OP_S
2ea60 6f 72 74 20 69 6e 20 62 65 74 77 65 65 6e 2c 20  ort in between, 
2ea70 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 6d  or.      ** it m
2ea80 69 67 68 74 20 62 65 20 61 20 73 69 6e 67 6c 65  ight be a single
2ea90 20 6c 6f 6f 70 20 74 68 61 74 20 75 73 65 73 20   loop that uses 
2eaa0 61 6e 20 69 6e 64 65 78 20 74 6f 20 65 78 74 72  an index to extr
2eab0 61 63 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  act information.
2eac0 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20        ** in the 
2ead0 72 69 67 68 74 20 6f 72 64 65 72 20 74 6f 20 62  right order to b
2eae0 65 67 69 6e 20 77 69 74 68 2e 0a 20 20 20 20 20  egin with..     
2eaf0 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
2eb00 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2eb10 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 73 65  P_Gosub, regRese
2eb20 74 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20  t, addrReset);. 
2eb30 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71       pWInfo = sq
2eb40 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
2eb50 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
2eb60 2c 20 70 57 68 65 72 65 2c 20 70 47 72 6f 75 70  , pWhere, pGroup
2eb70 42 79 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  By, 0,.         
2eb80 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 7c   WHERE_GROUPBY |
2eb90 20 28 6f 72 64 65 72 42 79 47 72 70 20 3f 20 57   (orderByGrp ? W
2eba0 48 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50  HERE_SORTBYGROUP
2ebb0 20 3a 20 30 29 2c 20 30 0a 20 20 20 20 20 20 29   : 0), 0.      )
2ebc0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e  ;.      if( pWIn
2ebd0 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c  fo==0 ) goto sel
2ebe0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 69  ect_end;.      i
2ebf0 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 49  f( sqlite3WhereI
2ec00 73 4f 72 64 65 72 65 64 28 70 57 49 6e 66 6f 29  sOrdered(pWInfo)
2ec10 3d 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  ==pGroupBy->nExp
2ec20 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  r ){.        /* 
2ec30 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 69 73  The optimizer is
2ec40 20 61 62 6c 65 20 74 6f 20 64 65 6c 69 76 65 72   able to deliver
2ec50 20 72 6f 77 73 20 69 6e 20 67 72 6f 75 70 20 62   rows in group b
2ec60 79 20 6f 72 64 65 72 20 73 6f 0a 20 20 20 20 20  y order so.     
2ec70 20 20 20 2a 2a 20 77 65 20 64 6f 20 6e 6f 74 20     ** we do not 
2ec80 68 61 76 65 20 74 6f 20 73 6f 72 74 2e 20 20 54  have to sort.  T
2ec90 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  he OP_OpenEpheme
2eca0 72 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c 20 62  ral table will b
2ecb0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e  e.        ** can
2ecc0 63 65 6c 6c 65 64 20 6c 61 74 65 72 20 62 65 63  celled later bec
2ecd0 61 75 73 65 20 77 65 20 73 74 69 6c 6c 20 6e 65  ause we still ne
2ece0 65 64 20 74 6f 20 75 73 65 20 74 68 65 20 70 4b  ed to use the pK
2ecf0 65 79 49 6e 66 6f 0a 20 20 20 20 20 20 20 20 2a  eyInfo.        *
2ed00 2f 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70 42  /.        groupB
2ed10 79 53 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20 20  ySort = 0;.     
2ed20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2ed30 2f 2a 20 52 6f 77 73 20 61 72 65 20 63 6f 6d 69  /* Rows are comi
2ed40 6e 67 20 6f 75 74 20 69 6e 20 75 6e 64 65 74 65  ng out in undete
2ed50 72 6d 69 6e 65 64 20 6f 72 64 65 72 2e 20 20 57  rmined order.  W
2ed60 65 20 68 61 76 65 20 74 6f 20 70 75 73 68 0a 20  e have to push. 
2ed70 20 20 20 20 20 20 20 2a 2a 20 65 61 63 68 20 72         ** each r
2ed80 6f 77 20 69 6e 74 6f 20 61 20 73 6f 72 74 69 6e  ow into a sortin
2ed90 67 20 69 6e 64 65 78 2c 20 74 65 72 6d 69 6e 61  g index, termina
2eda0 74 65 20 74 68 65 20 66 69 72 73 74 20 6c 6f 6f  te the first loo
2edb0 70 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  p,.        ** th
2edc0 65 6e 20 6c 6f 6f 70 20 6f 76 65 72 20 74 68 65  en loop over the
2edd0 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69   sorting index i
2ede0 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74  n order to get t
2edf0 68 65 20 6f 75 74 70 75 74 0a 20 20 20 20 20 20  he output.      
2ee00 20 20 2a 2a 20 69 6e 20 73 6f 72 74 65 64 20 6f    ** in sorted o
2ee10 72 64 65 72 0a 20 20 20 20 20 20 20 20 2a 2f 0a  rder.        */.
2ee20 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 67 42          int regB
2ee30 61 73 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  ase;.        int
2ee40 20 72 65 67 52 65 63 6f 72 64 3b 0a 20 20 20 20   regRecord;.    
2ee50 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20      int nCol;.  
2ee60 20 20 20 20 20 20 69 6e 74 20 6e 47 72 6f 75 70        int nGroup
2ee70 42 79 3b 0a 0a 20 20 20 20 20 20 20 20 65 78 70  By;..        exp
2ee80 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 70 50  lainTempTable(pP
2ee90 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
2eea0 20 20 20 28 73 44 69 73 74 69 6e 63 74 2e 69 73     (sDistinct.is
2eeb0 54 6e 63 74 20 26 26 20 28 70 2d 3e 73 65 6c 46  Tnct && (p->selF
2eec0 6c 61 67 73 26 53 46 5f 44 69 73 74 69 6e 63 74  lags&SF_Distinct
2eed0 29 3d 3d 30 29 20 3f 0a 20 20 20 20 20 20 20 20  )==0) ?.        
2eee0 20 20 20 20 20 20 20 20 20 20 20 20 22 44 49 53              "DIS
2eef0 54 49 4e 43 54 22 20 3a 20 22 47 52 4f 55 50 20  TINCT" : "GROUP 
2ef00 42 59 22 29 3b 0a 0a 20 20 20 20 20 20 20 20 67  BY");..        g
2ef10 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 31 3b 0a  roupBySort = 1;.
2ef20 20 20 20 20 20 20 20 20 6e 47 72 6f 75 70 42 79          nGroupBy
2ef30 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   = pGroupBy->nEx
2ef40 70 72 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c  pr;.        nCol
2ef50 20 3d 20 6e 47 72 6f 75 70 42 79 3b 0a 20 20 20   = nGroupBy;.   
2ef60 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42       j = nGroupB
2ef70 79 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  y;.        for(i
2ef80 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e  =0; i<sAggInfo.n
2ef90 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
2efa0 20 20 20 20 20 20 20 20 69 66 28 20 73 41 67 67          if( sAgg
2efb0 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 2e 69 53 6f  Info.aCol[i].iSo
2efc0 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b  rterColumn>=j ){
2efd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 43 6f  .            nCo
2efe0 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  l++;.           
2eff0 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20   j++;.          
2f000 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2f010 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 73 71      regBase = sq
2f020 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
2f030 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c 29 3b  e(pParse, nCol);
2f040 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2f050 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
2f060 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
2f070 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
2f080 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
2f090 70 47 72 6f 75 70 42 79 2c 20 72 65 67 42 61 73  pGroupBy, regBas
2f0a0 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  e, 0, 0);.      
2f0b0 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 3b 0a    j = nGroupBy;.
2f0c0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
2f0d0 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c   i<sAggInfo.nCol
2f0e0 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  umn; i++){.     
2f0f0 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49       struct AggI
2f100 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20  nfo_col *pCol = 
2f110 26 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69  &sAggInfo.aCol[i
2f120 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ];.          if(
2f130 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
2f140 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20  lumn>=j ){.     
2f150 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20         int r1 = 
2f160 6a 20 2b 20 72 65 67 42 61 73 65 3b 0a 20 20 20  j + regBase;.   
2f170 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2f180 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
2f190 6e 54 6f 52 65 67 28 70 50 61 72 73 65 2c 20 0a  nToReg(pParse, .
2f1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2f1c0 43 6f 6c 2d 3e 70 54 61 62 2c 20 70 43 6f 6c 2d  Col->pTab, pCol-
2f1d0 3e 69 43 6f 6c 75 6d 6e 2c 20 70 43 6f 6c 2d 3e  >iColumn, pCol->
2f1e0 69 54 61 62 6c 65 2c 20 72 31 29 3b 0a 20 20 20  iTable, r1);.   
2f1f0 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20           j++;.  
2f200 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2f210 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67 52    }.        regR
2f220 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47  ecord = sqlite3G
2f230 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
2f240 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2f250 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
2f260 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
2f270 65 67 42 61 73 65 2c 20 6e 43 6f 6c 2c 20 72 65  egBase, nCol, re
2f280 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20  gRecord);.      
2f290 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2f2a0 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op2(v, OP_Sorter
2f2b0 49 6e 73 65 72 74 2c 20 73 41 67 67 49 6e 66 6f  Insert, sAggInfo
2f2c0 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 72 65 67  .sortingIdx, reg
2f2d0 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20  Record);.       
2f2e0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
2f2f0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
2f300 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20  egRecord);.     
2f310 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
2f320 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
2f330 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c  e, regBase, nCol
2f340 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2f350 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66  e3WhereEnd(pWInf
2f360 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 41 67 67  o);.        sAgg
2f370 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 50  Info.sortingIdxP
2f380 54 61 62 20 3d 20 73 6f 72 74 50 54 61 62 20 3d  Tab = sortPTab =
2f390 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
2f3a0 0a 20 20 20 20 20 20 20 20 73 6f 72 74 4f 75 74  .        sortOut
2f3b0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
2f3c0 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
2f3d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2f3e0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70  eAddOp3(v, OP_Op
2f3f0 65 6e 50 73 65 75 64 6f 2c 20 73 6f 72 74 50 54  enPseudo, sortPT
2f400 61 62 2c 20 73 6f 72 74 4f 75 74 2c 20 6e 43 6f  ab, sortOut, nCo
2f410 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
2f420 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2f430 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20   OP_SorterSort, 
2f440 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
2f450 49 64 78 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20  Idx, addrEnd);. 
2f460 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
2f470 6e 74 28 28 76 2c 20 22 47 52 4f 55 50 20 42 59  nt((v, "GROUP BY
2f480 20 73 6f 72 74 22 29 29 3b 20 56 64 62 65 43 6f   sort")); VdbeCo
2f490 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
2f4a0 20 20 20 73 41 67 67 49 6e 66 6f 2e 75 73 65 53     sAggInfo.useS
2f4b0 6f 72 74 69 6e 67 49 64 78 20 3d 20 31 3b 0a 20  ortingIdx = 1;. 
2f4c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
2f4d0 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
2f4e0 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 7d 0a 0a  rse);..      }..
2f4f0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
2f500 69 6e 64 65 78 20 6f 72 20 74 65 6d 70 6f 72 61  index or tempora
2f510 72 79 20 74 61 62 6c 65 20 75 73 65 64 20 62 79  ry table used by
2f520 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 73 6f   the GROUP BY so
2f530 72 74 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c  rt.      ** will
2f540 20 6e 61 74 75 72 61 6c 6c 79 20 64 65 6c 69 76   naturally deliv
2f550 65 72 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6f  er rows in the o
2f560 72 64 65 72 20 72 65 71 75 69 72 65 64 20 62 79  rder required by
2f570 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20   the ORDER BY.  
2f580 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 2c 20 63      ** clause, c
2f590 61 6e 63 65 6c 20 74 68 65 20 65 70 68 65 6d 65  ancel the epheme
2f5a0 72 61 6c 20 74 61 62 6c 65 20 6f 70 65 6e 20 63  ral table open c
2f5b0 6f 64 65 64 20 65 61 72 6c 69 65 72 2e 0a 20 20  oded earlier..  
2f5c0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
2f5d0 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d  This is an optim
2f5e0 69 7a 61 74 69 6f 6e 20 2d 20 74 68 65 20 63 6f  ization - the co
2f5f0 72 72 65 63 74 20 61 6e 73 77 65 72 20 73 68 6f  rrect answer sho
2f600 75 6c 64 20 72 65 73 75 6c 74 20 72 65 67 61 72  uld result regar
2f610 64 6c 65 73 73 2e 0a 20 20 20 20 20 20 2a 2a 20  dless..      ** 
2f620 55 73 65 20 74 68 65 20 53 51 4c 49 54 45 5f 47  Use the SQLITE_G
2f630 72 6f 75 70 42 79 4f 72 64 65 72 20 66 6c 61 67  roupByOrder flag
2f640 20 77 69 74 68 20 53 51 4c 49 54 45 5f 54 45 53   with SQLITE_TES
2f650 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 45 52 20  TCTRL_OPTIMIZER 
2f660 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 64 69 73  to .      ** dis
2f670 61 62 6c 65 20 74 68 69 73 20 6f 70 74 69 6d 69  able this optimi
2f680 7a 61 74 69 6f 6e 20 66 6f 72 20 74 65 73 74 69  zation for testi
2f690 6e 67 20 70 75 72 70 6f 73 65 73 2e 20 20 2a 2f  ng purposes.  */
2f6a0 0a 20 20 20 20 20 20 69 66 28 20 6f 72 64 65 72  .      if( order
2f6b0 42 79 47 72 70 20 26 26 20 4f 70 74 69 6d 69 7a  ByGrp && Optimiz
2f6c0 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c  ationEnabled(db,
2f6d0 20 53 51 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f   SQLITE_GroupByO
2f6e0 72 64 65 72 29 20 0a 20 20 20 20 20 20 20 26 26  rder) .       &&
2f6f0 20 28 67 72 6f 75 70 42 79 53 6f 72 74 20 7c 7c   (groupBySort ||
2f700 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 53   sqlite3WhereIsS
2f710 6f 72 74 65 64 28 70 57 49 6e 66 6f 29 29 0a 20  orted(pWInfo)). 
2f720 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2f730 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d  sSort.pOrderBy =
2f740 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   0;.        sqli
2f750 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
2f760 6f 6f 70 28 76 2c 20 73 53 6f 72 74 2e 61 64 64  oop(v, sSort.add
2f770 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20 20  rSortIndex);.   
2f780 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 45     }..      /* E
2f790 76 61 6c 75 61 74 65 20 74 68 65 20 63 75 72 72  valuate the curr
2f7a0 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65 72  ent GROUP BY ter
2f7b0 6d 73 20 61 6e 64 20 73 74 6f 72 65 20 69 6e 20  ms and store in 
2f7c0 62 30 2c 20 62 31 2c 20 62 32 2e 2e 2e 0a 20 20  b0, b1, b2....  
2f7d0 20 20 20 20 2a 2a 20 28 62 30 20 69 73 20 6d 65      ** (b0 is me
2f7e0 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 69 42  mory location iB
2f7f0 4d 65 6d 2b 30 2c 20 62 31 20 69 73 20 69 42 4d  Mem+0, b1 is iBM
2f800 65 6d 2b 31 2c 20 61 6e 64 20 73 6f 20 66 6f 72  em+1, and so for
2f810 74 68 29 0a 20 20 20 20 20 20 2a 2a 20 54 68 65  th).      ** The
2f820 6e 20 63 6f 6d 70 61 72 65 20 74 68 65 20 63 75  n compare the cu
2f830 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74  rrent GROUP BY t
2f840 65 72 6d 73 20 61 67 61 69 6e 73 74 20 74 68 65  erms against the
2f850 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 0a   GROUP BY terms.
2f860 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68        ** from th
2f870 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20 63  e previous row c
2f880 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20  urrently stored 
2f890 69 6e 20 61 30 2c 20 61 31 2c 20 61 32 2e 2e 2e  in a0, a1, a2...
2f8a0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2f8b0 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 20 3d 20  addrTopOfLoop = 
2f8c0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
2f8d0 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
2f8e0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
2f8f0 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
2f900 20 20 20 20 20 20 69 66 28 20 67 72 6f 75 70 42        if( groupB
2f910 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  ySort ){.       
2f920 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2f930 70 33 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44  p3(v, OP_SorterD
2f940 61 74 61 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  ata, sAggInfo.so
2f950 72 74 69 6e 67 49 64 78 2c 0a 20 20 20 20 20 20  rtingIdx,.      
2f960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f970 20 20 20 20 73 6f 72 74 4f 75 74 2c 20 73 6f 72      sortOut, sor
2f980 74 50 54 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a  tPTab);.      }.
2f990 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
2f9a0 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72  <pGroupBy->nExpr
2f9b0 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
2f9c0 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20  if( groupBySort 
2f9d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
2f9e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
2f9f0 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 6f 72  , OP_Column, sor
2fa00 74 50 54 61 62 2c 20 6a 2c 20 69 42 4d 65 6d 2b  tPTab, j, iBMem+
2fa10 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  j);.        }els
2fa20 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 41 67  e{.          sAg
2fa30 67 49 6e 66 6f 2e 64 69 72 65 63 74 4d 6f 64 65  gInfo.directMode
2fa40 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
2fa50 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
2fa60 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79  pParse, pGroupBy
2fa70 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c 20 69 42  ->a[j].pExpr, iB
2fa80 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20  Mem+j);.        
2fa90 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
2faa0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2fab0 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c  4(v, OP_Compare,
2fac0 20 69 41 4d 65 6d 2c 20 69 42 4d 65 6d 2c 20 70   iAMem, iBMem, p
2fad0 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c 0a  GroupBy->nExpr,.
2fae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2faf0 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
2fb00 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52  )sqlite3KeyInfoR
2fb10 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c 20 50 34  ef(pKeyInfo), P4
2fb20 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20  _KEYINFO);.     
2fb30 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
2fb40 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
2fb50 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
2fb60 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
2fb70 50 5f 4a 75 6d 70 2c 20 61 64 64 72 31 2b 31 2c  P_Jump, addr1+1,
2fb80 20 30 2c 20 61 64 64 72 31 2b 31 29 3b 20 56 64   0, addr1+1); Vd
2fb90 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a  beCoverage(v);..
2fba0 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
2fbb0 65 20 63 6f 64 65 20 74 68 61 74 20 72 75 6e 73  e code that runs
2fbc0 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 47 52   whenever the GR
2fbd0 4f 55 50 20 42 59 20 63 68 61 6e 67 65 73 2e 0a  OUP BY changes..
2fbe0 20 20 20 20 20 20 2a 2a 20 43 68 61 6e 67 65 73        ** Changes
2fbf0 20 69 6e 20 74 68 65 20 47 52 4f 55 50 20 42 59   in the GROUP BY
2fc00 20 61 72 65 20 64 65 74 65 63 74 65 64 20 62 79   are detected by
2fc10 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 6f   the previous co
2fc20 64 65 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f 63  de.      ** bloc
2fc30 6b 2e 20 20 49 66 20 74 68 65 72 65 20 77 65 72  k.  If there wer
2fc40 65 20 6e 6f 20 63 68 61 6e 67 65 73 2c 20 74 68  e no changes, th
2fc50 69 73 20 62 6c 6f 63 6b 20 69 73 20 73 6b 69 70  is block is skip
2fc60 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ped..      **.  
2fc70 20 20 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65      ** This code
2fc80 20 63 6f 70 69 65 73 20 63 75 72 72 65 6e 74 20   copies current 
2fc90 67 72 6f 75 70 20 62 79 20 74 65 72 6d 73 20 69  group by terms i
2fca0 6e 20 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a 20  n b0,b1,b2,.... 
2fcb0 20 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 6f 20       ** over to 
2fcc0 61 30 2c 61 31 2c 61 32 2e 20 20 49 74 20 74 68  a0,a1,a2.  It th
2fcd0 65 6e 20 63 61 6c 6c 73 20 74 68 65 20 6f 75 74  en calls the out
2fce0 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 0a 20  put subroutine. 
2fcf0 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65       ** and rese
2fd00 74 73 20 74 68 65 20 61 67 67 72 65 67 61 74 65  ts the aggregate
2fd10 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67   accumulator reg
2fd20 69 73 74 65 72 73 20 69 6e 20 70 72 65 70 61 72  isters in prepar
2fd30 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 66  ation.      ** f
2fd40 6f 72 20 74 68 65 20 6e 65 78 74 20 47 52 4f 55  or the next GROU
2fd50 50 20 42 59 20 62 61 74 63 68 2e 0a 20 20 20 20  P BY batch..    
2fd60 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
2fd70 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70  e3ExprCodeMove(p
2fd80 50 61 72 73 65 2c 20 69 42 4d 65 6d 2c 20 69 41  Parse, iBMem, iA
2fd90 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e  Mem, pGroupBy->n
2fda0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  Expr);.      sql
2fdb0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2fdc0 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
2fdd0 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72 4f 75  utputRow, addrOu
2fde0 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  tputRow);.      
2fdf0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
2fe00 22 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 22  "output one row"
2fe10 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
2fe20 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2fe30 50 5f 49 66 50 6f 73 2c 20 69 41 62 6f 72 74 46  P_IfPos, iAbortF
2fe40 6c 61 67 2c 20 61 64 64 72 45 6e 64 29 3b 20 56  lag, addrEnd); V
2fe50 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
2fe60 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
2fe70 74 28 28 76 2c 20 22 63 68 65 63 6b 20 61 62 6f  t((v, "check abo
2fe80 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20  rt flag"));.    
2fe90 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2fea0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
2feb0 20 72 65 67 52 65 73 65 74 2c 20 61 64 64 72 52   regReset, addrR
2fec0 65 73 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62  eset);.      Vdb
2fed0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65  eComment((v, "re
2fee0 73 65 74 20 61 63 63 75 6d 75 6c 61 74 6f 72 22  set accumulator"
2fef0 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70  ));..      /* Up
2ff00 64 61 74 65 20 74 68 65 20 61 67 67 72 65 67 61  date the aggrega
2ff10 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 73 20  te accumulators 
2ff20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e  based on the con
2ff30 74 65 6e 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a  tent of.      **
2ff40 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
2ff50 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2ff60 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
2ff70 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20  ere(v, addr1);. 
2ff80 20 20 20 20 20 75 70 64 61 74 65 41 63 63 75 6d       updateAccum
2ff90 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26  ulator(pParse, &
2ffa0 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
2ffb0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2ffc0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
2ffd0 2c 20 31 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a  , 1, iUseFlag);.
2ffe0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
2fff0 74 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20  t((v, "indicate 
30000 64 61 74 61 20 69 6e 20 61 63 63 75 6d 75 6c 61  data in accumula
30010 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f  tor"));..      /
30020 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f  * End of the loo
30030 70 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  p.      */.     
30040 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74   if( groupBySort
30050 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
30060 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
30070 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20   OP_SorterNext, 
30080 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
30090 49 64 78 2c 20 61 64 64 72 54 6f 70 4f 66 4c 6f  Idx, addrTopOfLo
300a0 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  op);.        Vdb
300b0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
300c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
300d0 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
300e0 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  nd(pWInfo);.    
300f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
30100 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61  hangeToNoop(v, a
30110 64 64 72 53 6f 72 74 69 6e 67 49 64 78 29 3b 0a  ddrSortingIdx);.
30120 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
30130 2a 20 4f 75 74 70 75 74 20 74 68 65 20 66 69 6e  * Output the fin
30140 61 6c 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74  al row of result
30150 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
30160 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
30170 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
30180 65 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64  egOutputRow, add
30190 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20  rOutputRow);.   
301a0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
301b0 76 2c 20 22 6f 75 74 70 75 74 20 66 69 6e 61 6c  v, "output final
301c0 20 72 6f 77 22 29 29 3b 0a 0a 20 20 20 20 20 20   row"));..      
301d0 2f 2a 20 4a 75 6d 70 20 6f 76 65 72 20 74 68 65  /* Jump over the
301e0 20 73 75 62 72 6f 75 74 69 6e 65 73 0a 20 20 20   subroutines.   
301f0 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
30200 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61  te3VdbeGoto(v, a
30210 64 64 72 45 6e 64 29 3b 0a 0a 20 20 20 20 20 20  ddrEnd);..      
30220 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
30230 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75  broutine that ou
30240 74 70 75 74 73 20 61 20 73 69 6e 67 6c 65 20 72  tputs a single r
30250 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  ow of the result
30260 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 2e 20 20  .      ** set.  
30270 54 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20  This subroutine 
30280 66 69 72 73 74 20 6c 6f 6f 6b 73 20 61 74 20 74  first looks at t
30290 68 65 20 69 55 73 65 46 6c 61 67 2e 20 20 49 66  he iUseFlag.  If
302a0 20 69 55 73 65 46 6c 61 67 0a 20 20 20 20 20 20   iUseFlag.      
302b0 2a 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ** is less than 
302c0 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f  or equal to zero
302d0 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  , the subroutine
302e0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66   is a no-op.  If
302f0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72  .      ** the pr
30300 6f 63 65 73 73 69 6e 67 20 63 61 6c 6c 73 20 66  ocessing calls f
30310 6f 72 20 74 68 65 20 71 75 65 72 79 20 74 6f 20  or the query to 
30320 61 62 6f 72 74 2c 20 74 68 69 73 20 73 75 62 72  abort, this subr
30330 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20  outine.      ** 
30340 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20 69  increments the i
30350 41 62 6f 72 74 46 6c 61 67 20 6d 65 6d 6f 72 79  AbortFlag memory
30360 20 6c 6f 63 61 74 69 6f 6e 20 62 65 66 6f 72 65   location before
30370 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 0a 20 20   returning in.  
30380 20 20 20 20 2a 2a 20 6f 72 64 65 72 20 74 6f 20      ** order to 
30390 73 69 67 6e 61 6c 20 74 68 65 20 63 61 6c 6c 65  signal the calle
303a0 72 20 74 6f 20 61 62 6f 72 74 2e 0a 20 20 20 20  r to abort..    
303b0 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 53    */.      addrS
303c0 65 74 41 62 6f 72 74 20 3d 20 73 71 6c 69 74 65  etAbort = sqlite
303d0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
303e0 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
303f0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
30400 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69  OP_Integer, 1, i
30410 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20  AbortFlag);.    
30420 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
30430 2c 20 22 73 65 74 20 61 62 6f 72 74 20 66 6c 61  , "set abort fla
30440 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  g"));.      sqli
30450 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
30460 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f   OP_Return, regO
30470 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
30480 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
30490 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
304a0 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
304b0 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20    addrOutputRow 
304c0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
304d0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
304e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
304f0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73  dOp2(v, OP_IfPos
30500 2c 20 69 55 73 65 46 6c 61 67 2c 20 61 64 64 72  , iUseFlag, addr
30510 4f 75 74 70 75 74 52 6f 77 2b 32 29 3b 0a 20 20  OutputRow+2);.  
30520 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
30530 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  (v);.      VdbeC
30540 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 72 6f 75  omment((v, "Grou
30550 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72  pby result gener
30560 61 74 6f 72 20 65 6e 74 72 79 20 70 6f 69 6e 74  ator entry point
30570 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
30580 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
30590 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75  OP_Return, regOu
305a0 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  tputRow);.      
305b0 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74  finalizeAggFunct
305c0 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41  ions(pParse, &sA
305d0 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73  ggInfo);.      s
305e0 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
305f0 65 28 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e  e(pParse, pHavin
30600 67 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  g, addrOutputRow
30610 2b 31 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  +1, SQLITE_JUMPI
30620 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 65  FNULL);.      se
30630 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
30640 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69  arse, p, p->pELi
30650 73 74 2c 20 2d 31 2c 20 26 73 53 6f 72 74 2c 0a  st, -1, &sSort,.
30660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30670 20 20 20 20 20 20 26 73 44 69 73 74 69 6e 63 74        &sDistinct
30680 2c 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20  , pDest,.       
30690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
306a0 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20  ddrOutputRow+1, 
306b0 61 64 64 72 53 65 74 41 62 6f 72 74 29 3b 0a 20  addrSetAbort);. 
306c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
306d0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74  AddOp1(v, OP_Ret
306e0 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f  urn, regOutputRo
306f0 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  w);.      VdbeCo
30700 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 67  mment((v, "end g
30710 72 6f 75 70 62 79 20 72 65 73 75 6c 74 20 67 65  roupby result ge
30720 6e 65 72 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20  nerator"));..   
30730 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61     /* Generate a
30740 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
30750 20 77 69 6c 6c 20 72 65 73 65 74 20 74 68 65 20   will reset the 
30760 67 72 6f 75 70 2d 62 79 20 61 63 63 75 6d 75 6c  group-by accumul
30770 61 74 6f 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ator.      */.  
30780 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
30790 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
307a0 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20  ddrReset);.     
307b0 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f   resetAccumulato
307c0 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49  r(pParse, &sAggI
307d0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  nfo);.      sqli
307e0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
307f0 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 52   OP_Return, regR
30800 65 73 65 74 29 3b 0a 20 20 20 20 20 0a 20 20 20  eset);.     .   
30810 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70 47 72 6f   } /* endif pGro
30820 75 70 42 79 2e 20 20 42 65 67 69 6e 20 61 67 67  upBy.  Begin agg
30830 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20 77  regate queries w
30840 69 74 68 6f 75 74 20 47 52 4f 55 50 20 42 59 3a  ithout GROUP BY:
30850 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 7b 0a 20   */.    else {. 
30860 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
30870 44 65 6c 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  Del = 0;.#ifndef
30880 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52   SQLITE_OMIT_BTR
30890 45 45 43 4f 55 4e 54 0a 20 20 20 20 20 20 54 61  EECOUNT.      Ta
308a0 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20  ble *pTab;.     
308b0 20 69 66 28 20 28 70 54 61 62 20 3d 20 69 73 53   if( (pTab = isS
308c0 69 6d 70 6c 65 43 6f 75 6e 74 28 70 2c 20 26 73  impleCount(p, &s
308d0 41 67 67 49 6e 66 6f 29 29 21 3d 30 20 29 7b 0a  AggInfo))!=0 ){.
308e0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69 73          /* If is
308f0 53 69 6d 70 6c 65 43 6f 75 6e 74 28 29 20 72 65  SimpleCount() re
30900 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  turns a pointer 
30910 74 6f 20 61 20 54 61 62 6c 65 20 73 74 72 75 63  to a Table struc
30920 74 75 72 65 2c 20 74 68 65 6e 0a 20 20 20 20 20  ture, then.     
30930 20 20 20 2a 2a 20 74 68 65 20 53 51 4c 20 73 74     ** the SQL st
30940 61 74 65 6d 65 6e 74 20 69 73 20 6f 66 20 74 68  atement is of th
30950 65 20 66 6f 72 6d 3a 0a 20 20 20 20 20 20 20 20  e form:.        
30960 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
30970 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
30980 46 52 4f 4d 20 3c 74 62 6c 3e 0a 20 20 20 20 20  FROM <tbl>.     
30990 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
309a0 20 77 68 65 72 65 20 74 68 65 20 54 61 62 6c 65   where the Table
309b0 20 73 74 72 75 63 74 75 72 65 20 72 65 74 75 72   structure retur
309c0 6e 65 64 20 72 65 70 72 65 73 65 6e 74 73 20 74  ned represents t
309d0 61 62 6c 65 20 3c 74 62 6c 3e 2e 0a 20 20 20 20  able <tbl>..    
309e0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
309f0 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74  * This statement
30a00 20 69 73 20 73 6f 20 63 6f 6d 6d 6f 6e 20 74 68   is so common th
30a10 61 74 20 69 74 20 69 73 20 6f 70 74 69 6d 69 7a  at it is optimiz
30a20 65 64 20 73 70 65 63 69 61 6c 6c 79 2e 20 54 68  ed specially. Th
30a30 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 50 5f  e.        ** OP_
30a40 43 6f 75 6e 74 20 69 6e 73 74 72 75 63 74 69 6f  Count instructio
30a50 6e 20 69 73 20 65 78 65 63 75 74 65 64 20 65 69  n is executed ei
30a60 74 68 65 72 20 6f 6e 20 74 68 65 20 69 6e 74 6b  ther on the intk
30a70 65 79 20 74 61 62 6c 65 20 74 68 61 74 0a 20 20  ey table that.  
30a80 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e        ** contain
30a90 73 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74  s the data for t
30aa0 61 62 6c 65 20 3c 74 62 6c 3e 20 6f 72 20 6f 6e  able <tbl> or on
30ab0 20 6f 6e 65 20 6f 66 20 69 74 73 20 69 6e 64 65   one of its inde
30ac0 78 65 73 2e 20 49 74 0a 20 20 20 20 20 20 20 20  xes. It.        
30ad0 2a 2a 20 69 73 20 62 65 74 74 65 72 20 74 6f 20  ** is better to 
30ae0 65 78 65 63 75 74 65 20 74 68 65 20 6f 70 20 6f  execute the op o
30af0 6e 20 61 6e 20 69 6e 64 65 78 2c 20 61 73 20 69  n an index, as i
30b00 6e 64 65 78 65 73 20 61 72 65 20 61 6c 6d 6f 73  ndexes are almos
30b10 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77  t.        ** alw
30b20 61 79 73 20 73 70 72 65 61 64 20 61 63 72 6f 73  ays spread acros
30b30 73 20 6c 65 73 73 20 70 61 67 65 73 20 74 68 61  s less pages tha
30b40 6e 20 74 68 65 69 72 20 63 6f 72 72 65 73 70 6f  n their correspo
30b50 6e 64 69 6e 67 20 74 61 62 6c 65 73 2e 0a 20 20  nding tables..  
30b60 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
30b70 20 63 6f 6e 73 74 20 69 6e 74 20 69 44 62 20 3d   const int iDb =
30b80 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
30b90 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62  Index(pParse->db
30ba0 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
30bb0 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  ;.        const 
30bc0 69 6e 74 20 69 43 73 72 20 3d 20 70 50 61 72 73  int iCsr = pPars
30bd0 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f  e->nTab++;     /
30be0 2a 20 43 75 72 73 6f 72 20 74 6f 20 73 63 61 6e  * Cursor to scan
30bf0 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 20 20 20   b-tree */.     
30c00 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20     Index *pIdx; 
30c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30c20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
30c30 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  tor variable */.
30c40 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20          KeyInfo 
30c50 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 20 20  *pKeyInfo = 0;  
30c60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30c70 4b 65 79 69 6e 66 6f 20 66 6f 72 20 73 63 61 6e  Keyinfo for scan
30c80 6e 65 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  ned index */.   
30c90 20 20 20 20 20 49 6e 64 65 78 20 2a 70 42 65 73       Index *pBes
30ca0 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
30cb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 73            /* Bes
30cc0 74 20 69 6e 64 65 78 20 66 6f 75 6e 64 20 73 6f  t index found so
30cd0 20 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20   far */.        
30ce0 69 6e 74 20 69 52 6f 6f 74 20 3d 20 70 54 61 62  int iRoot = pTab
30cf0 2d 3e 74 6e 75 6d 3b 20 20 20 20 20 20 20 20 20  ->tnum;         
30d00 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
30d10 65 20 6f 66 20 73 63 61 6e 6e 65 64 20 62 2d 74  e of scanned b-t
30d20 72 65 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  ree */..        
30d30 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
30d40 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
30d50 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71  iDb);.        sq
30d60 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70  lite3TableLock(p
30d70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62  Parse, iDb, pTab
30d80 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d  ->tnum, 0, pTab-
30d90 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 20 20  >zName);..      
30da0 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20    /* Search for 
30db0 74 68 65 20 69 6e 64 65 78 20 74 68 61 74 20 68  the index that h
30dc0 61 73 20 74 68 65 20 6c 6f 77 65 73 74 20 73 63  as the lowest sc
30dd0 61 6e 20 63 6f 73 74 2e 0a 20 20 20 20 20 20 20  an cost..       
30de0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 28   **.        ** (
30df0 32 30 31 31 2d 30 34 2d 31 35 29 20 44 6f 20 6e  2011-04-15) Do n
30e00 6f 74 20 64 6f 20 61 20 66 75 6c 6c 20 73 63 61  ot do a full sca
30e10 6e 20 6f 66 20 61 6e 20 75 6e 6f 72 64 65 72 65  n of an unordere
30e20 64 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20  d index..       
30e30 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 28   **.        ** (
30e40 32 30 31 33 2d 31 30 2d 30 33 29 20 44 6f 20 6e  2013-10-03) Do n
30e50 6f 74 20 63 6f 75 6e 74 20 74 68 65 20 65 6e 74  ot count the ent
30e60 72 69 65 73 20 69 6e 20 61 20 70 61 72 74 69 61  ries in a partia
30e70 6c 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20  l index..       
30e80 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49   **.        ** I
30e90 6e 20 70 72 61 63 74 69 63 65 20 74 68 65 20 4b  n practice the K
30ea0 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
30eb0 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65   will not be use
30ec0 64 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20 0a 20  d. It is only . 
30ed0 20 20 20 20 20 20 20 2a 2a 20 70 61 73 73 65 64         ** passed
30ee0 20 74 6f 20 6b 65 65 70 20 4f 50 5f 4f 70 65 6e   to keep OP_Open
30ef0 52 65 61 64 20 68 61 70 70 79 2e 0a 20 20 20 20  Read happy..    
30f00 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
30f10 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61  f( !HasRowid(pTa
30f20 62 29 20 29 20 70 42 65 73 74 20 3d 20 73 71 6c  b) ) pBest = sql
30f30 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e  ite3PrimaryKeyIn
30f40 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20 20  dex(pTab);.     
30f50 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
30f60 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
30f70 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
30f80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
30f90 20 70 49 64 78 2d 3e 62 55 6e 6f 72 64 65 72 65   pIdx->bUnordere
30fa0 64 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  d==0.           
30fb0 26 26 20 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f  && pIdx->szIdxRo
30fc0 77 3c 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77  w<pTab->szTabRow
30fd0 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70  .           && p
30fe0 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65  Idx->pPartIdxWhe
30ff0 72 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  re==0.          
31000 20 26 26 20 28 21 70 42 65 73 74 20 7c 7c 20 70   && (!pBest || p
31010 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 42  Idx->szIdxRow<pB
31020 65 73 74 2d 3e 73 7a 49 64 78 52 6f 77 29 0a 20  est->szIdxRow). 
31030 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
31040 20 20 20 20 20 20 20 20 70 42 65 73 74 20 3d 20          pBest = 
31050 70 49 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20  pIdx;.          
31060 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
31070 20 20 20 20 69 66 28 20 70 42 65 73 74 20 29 7b      if( pBest ){
31080 0a 20 20 20 20 20 20 20 20 20 20 69 52 6f 6f 74  .          iRoot
31090 20 3d 20 70 42 65 73 74 2d 3e 74 6e 75 6d 3b 0a   = pBest->tnum;.
310a0 20 20 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e            pKeyIn
310b0 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  fo = sqlite3KeyI
310c0 6e 66 6f 4f 66 49 6e 64 65 78 28 70 50 61 72 73  nfoOfIndex(pPars
310d0 65 2c 20 70 42 65 73 74 29 3b 0a 20 20 20 20 20  e, pBest);.     
310e0 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
310f0 20 4f 70 65 6e 20 61 20 72 65 61 64 2d 6f 6e 6c   Open a read-onl
31100 79 20 63 75 72 73 6f 72 2c 20 65 78 65 63 75 74  y cursor, execut
31110 65 20 74 68 65 20 4f 50 5f 43 6f 75 6e 74 2c 20  e the OP_Count, 
31120 63 6c 6f 73 65 20 74 68 65 20 63 75 72 73 6f 72  close the cursor
31130 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c  . */.        sql
31140 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
31150 74 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  t(v, OP_OpenRead
31160 2c 20 69 43 73 72 2c 20 69 52 6f 6f 74 2c 20 69  , iCsr, iRoot, i
31170 44 62 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  Db, 1);.        
31180 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a  if( pKeyInfo ){.
31190 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
311a0 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
311b0 20 2d 31 2c 20 28 63 68 61 72 20 2a 29 70 4b 65   -1, (char *)pKe
311c0 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
311d0 4f 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  O);.        }.  
311e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
311f0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f  eAddOp2(v, OP_Co
31200 75 6e 74 2c 20 69 43 73 72 2c 20 73 41 67 67 49  unt, iCsr, sAggI
31210 6e 66 6f 2e 61 46 75 6e 63 5b 30 5d 2e 69 4d 65  nfo.aFunc[0].iMe
31220 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  m);.        sqli
31230 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
31240 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 43 73 72 29   OP_Close, iCsr)
31250 3b 0a 20 20 20 20 20 20 20 20 65 78 70 6c 61 69  ;.        explai
31260 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 70 50 61  nSimpleCount(pPa
31270 72 73 65 2c 20 70 54 61 62 2c 20 70 42 65 73 74  rse, pTab, pBest
31280 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23  );.      }else.#
31290 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
312a0 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 20  OMIT_BTREECOUNT 
312b0 2a 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  */.      {.     
312c0 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74     /* Check if t
312d0 68 65 20 71 75 65 72 79 20 69 73 20 6f 66 20 6f  he query is of o
312e0 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ne of the follow
312f0 69 6e 67 20 66 6f 72 6d 73 3a 0a 20 20 20 20 20  ing forms:.     
31300 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
31310 20 20 20 53 45 4c 45 43 54 20 6d 69 6e 28 78 29     SELECT min(x)
31320 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20   FROM ....      
31330 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d 61    **   SELECT ma
31340 78 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20  x(x) FROM ....  
31350 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
31360 20 2a 2a 20 49 66 20 69 74 20 69 73 2c 20 74 68   ** If it is, th
31370 65 6e 20 61 73 6b 20 74 68 65 20 63 6f 64 65 20  en ask the code 
31380 69 6e 20 77 68 65 72 65 2e 63 20 74 6f 20 61 74  in where.c to at
31390 74 65 6d 70 74 20 74 6f 20 73 6f 72 74 20 72 65  tempt to sort re
313a0 73 75 6c 74 73 0a 20 20 20 20 20 20 20 20 2a 2a  sults.        **
313b0 20 61 73 20 69 66 20 74 68 65 72 65 20 77 61 73   as if there was
313c0 20 61 6e 20 22 4f 52 44 45 52 20 4f 4e 20 78 22   an "ORDER ON x"
313d0 20 6f 72 20 22 4f 52 44 45 52 20 4f 4e 20 78 20   or "ORDER ON x 
313e0 44 45 53 43 22 20 63 6c 61 75 73 65 2e 20 0a 20  DESC" clause. . 
313f0 20 20 20 20 20 20 20 2a 2a 20 49 66 20 77 68 65         ** If whe
31400 72 65 2e 63 20 69 73 20 61 62 6c 65 20 74 6f 20  re.c is able to 
31410 70 72 6f 64 75 63 65 20 72 65 73 75 6c 74 73 20  produce results 
31420 73 6f 72 74 65 64 20 69 6e 20 74 68 69 73 20 6f  sorted in this o
31430 72 64 65 72 2c 20 74 68 65 6e 0a 20 20 20 20 20  rder, then.     
31440 20 20 20 2a 2a 20 61 64 64 20 76 64 62 65 20 63     ** add vdbe c
31450 6f 64 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74  ode to break out
31460 20 6f 66 20 74 68 65 20 70 72 6f 63 65 73 73 69   of the processi
31470 6e 67 20 6c 6f 6f 70 20 61 66 74 65 72 20 74 68  ng loop after th
31480 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69  e .        ** fi
31490 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 28 73  rst iteration (s
314a0 69 6e 63 65 20 74 68 65 20 66 69 72 73 74 20 69  ince the first i
314b0 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
314c0 6c 6f 6f 70 20 69 73 20 0a 20 20 20 20 20 20 20  loop is .       
314d0 20 2a 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74   ** guaranteed t
314e0 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65  o operate on the
314f0 20 72 6f 77 20 77 69 74 68 20 74 68 65 20 6d 69   row with the mi
31500 6e 69 6d 75 6d 20 6f 72 20 6d 61 78 69 6d 75 6d  nimum or maximum
31510 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c   .        ** val
31520 75 65 20 6f 66 20 78 2c 20 74 68 65 20 6f 6e 6c  ue of x, the onl
31530 79 20 72 6f 77 20 72 65 71 75 69 72 65 64 29 2e  y row required).
31540 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
31550 20 20 20 20 2a 2a 20 41 20 73 70 65 63 69 61 6c      ** A special
31560 20 66 6c 61 67 20 6d 75 73 74 20 62 65 20 70 61   flag must be pa
31570 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57  ssed to sqlite3W
31580 68 65 72 65 42 65 67 69 6e 28 29 20 74 6f 20 73  hereBegin() to s
31590 6c 69 67 68 74 6c 79 0a 20 20 20 20 20 20 20 20  lightly.        
315a0 2a 2a 20 6d 6f 64 69 66 79 20 62 65 68 61 76 69  ** modify behavi
315b0 6f 72 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20  or as follows:. 
315c0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
315d0 20 20 2a 2a 20 20 20 2b 20 49 66 20 74 68 65 20    **   + If the 
315e0 71 75 65 72 79 20 69 73 20 61 20 22 53 45 4c 45  query is a "SELE
315f0 43 54 20 6d 69 6e 28 78 29 22 2c 20 74 68 65 6e  CT min(x)", then
31600 20 74 68 65 20 6c 6f 6f 70 20 63 6f 64 65 64 20   the loop coded 
31610 62 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  by.        **   
31620 20 20 77 68 65 72 65 2e 63 20 73 68 6f 75 6c 64    where.c should
31630 20 6e 6f 74 20 69 74 65 72 61 74 65 20 6f 76 65   not iterate ove
31640 72 20 61 6e 79 20 76 61 6c 75 65 73 20 77 69 74  r any values wit
31650 68 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 0a 20  h a NULL value. 
31660 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 66 6f         **     fo
31670 72 20 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  r x..        **.
31680 20 20 20 20 20 20 20 20 2a 2a 20 20 20 2b 20 54          **   + T
31690 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 63 6f 64  he optimizer cod
316a0 65 20 69 6e 20 77 68 65 72 65 2e 63 20 28 74 68  e in where.c (th
316b0 65 20 74 68 69 6e 67 20 74 68 61 74 20 64 65 63  e thing that dec
316c0 69 64 65 73 20 77 68 69 63 68 0a 20 20 20 20 20  ides which.     
316d0 20 20 20 2a 2a 20 20 20 20 20 69 6e 64 65 78 20     **     index 
316e0 6f 72 20 69 6e 64 69 63 65 73 20 74 6f 20 75 73  or indices to us
316f0 65 29 20 73 68 6f 75 6c 64 20 70 6c 61 63 65 20  e) should place 
31700 61 20 64 69 66 66 65 72 65 6e 74 20 70 72 69 6f  a different prio
31710 72 69 74 79 20 6f 6e 20 0a 20 20 20 20 20 20 20  rity on .       
31720 20 2a 2a 20 20 20 20 20 73 61 74 69 73 66 79 69   **     satisfyi
31730 6e 67 20 74 68 65 20 27 4f 52 44 45 52 20 42 59  ng the 'ORDER BY
31740 27 20 63 6c 61 75 73 65 20 74 68 61 6e 20 69 74  ' clause than it
31750 20 64 6f 65 73 20 69 6e 20 6f 74 68 65 72 20 63   does in other c
31760 61 73 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a  ases..        **
31770 20 20 20 20 20 52 65 66 65 72 20 74 6f 20 63 6f       Refer to co
31780 64 65 20 61 6e 64 20 63 6f 6d 6d 65 6e 74 73 20  de and comments 
31790 69 6e 20 77 68 65 72 65 2e 63 20 66 6f 72 20 64  in where.c for d
317a0 65 74 61 69 6c 73 2e 0a 20 20 20 20 20 20 20 20  etails..        
317b0 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c  */.        ExprL
317c0 69 73 74 20 2a 70 4d 69 6e 4d 61 78 20 3d 20 30  ist *pMinMax = 0
317d0 3b 0a 20 20 20 20 20 20 20 20 75 38 20 66 6c 61  ;.        u8 fla
317e0 67 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42  g = WHERE_ORDERB
317f0 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 20 20  Y_NORMAL;.      
31800 20 20 0a 20 20 20 20 20 20 20 20 61 73 73 65 72    .        asser
31810 74 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d  t( p->pGroupBy==
31820 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  0 );.        ass
31830 65 72 74 28 20 66 6c 61 67 3d 3d 30 20 29 3b 0a  ert( flag==0 );.
31840 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70          if( p->p
31850 48 61 76 69 6e 67 3d 3d 30 20 29 7b 0a 20 20 20  Having==0 ){.   
31860 20 20 20 20 20 20 20 66 6c 61 67 20 3d 20 6d 69         flag = mi
31870 6e 4d 61 78 51 75 65 72 79 28 26 73 41 67 67 49  nMaxQuery(&sAggI
31880 6e 66 6f 2c 20 26 70 4d 69 6e 4d 61 78 29 3b 0a  nfo, &pMinMax);.
31890 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
318a0 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 3d 3d    assert( flag==
318b0 30 20 7c 7c 20 28 70 4d 69 6e 4d 61 78 21 3d 30  0 || (pMinMax!=0
318c0 20 26 26 20 70 4d 69 6e 4d 61 78 2d 3e 6e 45 78   && pMinMax->nEx
318d0 70 72 3d 3d 31 29 20 29 3b 0a 0a 20 20 20 20 20  pr==1) );..     
318e0 20 20 20 69 66 28 20 66 6c 61 67 20 29 7b 0a 20     if( flag ){. 
318f0 20 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78           pMinMax
31900 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
31910 73 74 44 75 70 28 64 62 2c 20 70 4d 69 6e 4d 61  stDup(db, pMinMa
31920 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  x, 0);.         
31930 20 70 44 65 6c 20 3d 20 70 4d 69 6e 4d 61 78 3b   pDel = pMinMax;
31940 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
31950 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  t( db->mallocFai
31960 6c 65 64 20 7c 7c 20 70 4d 69 6e 4d 61 78 21 3d  led || pMinMax!=
31970 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  0 );.          i
31980 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
31990 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  iled ){.        
319a0 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30      pMinMax->a[0
319b0 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 66 6c  ].sortOrder = fl
319c0 61 67 21 3d 57 48 45 52 45 5f 4f 52 44 45 52 42  ag!=WHERE_ORDERB
319d0 59 5f 4d 49 4e 20 3f 31 3a 30 3b 0a 20 20 20 20  Y_MIN ?1:0;.    
319e0 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d          pMinMax-
319f0 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 20  >a[0].pExpr->op 
31a00 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20  = TK_COLUMN;.   
31a10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
31a20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 2f 2a   }.  .        /*
31a30 20 54 68 69 73 20 63 61 73 65 20 72 75 6e 73 20   This case runs 
31a40 69 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65  if the aggregate
31a50 20 68 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59   has no GROUP BY
31a60 20 63 6c 61 75 73 65 2e 20 20 54 68 65 0a 20 20   clause.  The.  
31a70 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73        ** process
31a80 69 6e 67 20 69 73 20 6d 75 63 68 20 73 69 6d 70  ing is much simp
31a90 6c 65 72 20 73 69 6e 63 65 20 74 68 65 72 65 20  ler since there 
31aa0 69 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  is only a single
31ab0 20 72 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20   row.        ** 
31ac0 6f 66 20 6f 75 74 70 75 74 2e 0a 20 20 20 20 20  of output..     
31ad0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65     */.        re
31ae0 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70  setAccumulator(p
31af0 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
31b00 29 3b 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66  );.        pWInf
31b10 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  o = sqlite3Where
31b20 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54  Begin(pParse, pT
31b30 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20  abList, pWhere, 
31b40 70 4d 69 6e 4d 61 78 2c 30 2c 66 6c 61 67 2c 30  pMinMax,0,flag,0
31b50 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
31b60 57 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  WInfo==0 ){.    
31b70 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
31b80 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
31b90 70 44 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  pDel);.         
31ba0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
31bb0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
31bc0 20 20 20 20 75 70 64 61 74 65 41 63 63 75 6d 75      updateAccumu
31bd0 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73  lator(pParse, &s
31be0 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
31bf0 20 20 61 73 73 65 72 74 28 20 70 4d 69 6e 4d 61    assert( pMinMa
31c00 78 3d 3d 30 20 7c 7c 20 70 4d 69 6e 4d 61 78 2d  x==0 || pMinMax-
31c10 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20 20  >nExpr==1 );.   
31c20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
31c30 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28 70  WhereIsOrdered(p
31c40 57 49 6e 66 6f 29 3e 30 20 29 7b 0a 20 20 20 20  WInfo)>0 ){.    
31c50 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
31c60 65 47 6f 74 6f 28 76 2c 20 73 71 6c 69 74 65 33  eGoto(v, sqlite3
31c70 57 68 65 72 65 42 72 65 61 6b 4c 61 62 65 6c 28  WhereBreakLabel(
31c80 70 57 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20  pWInfo));.      
31c90 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
31ca0 28 76 2c 20 22 25 73 28 29 20 62 79 20 69 6e 64  (v, "%s() by ind
31cb0 65 78 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ex",.           
31cc0 20 20 20 20 20 28 66 6c 61 67 3d 3d 57 48 45 52       (flag==WHER
31cd0 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3f 22 6d  E_ORDERBY_MIN?"m
31ce0 69 6e 22 3a 22 6d 61 78 22 29 29 29 3b 0a 20 20  in":"max")));.  
31cf0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
31d00 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
31d10 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  pWInfo);.       
31d20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63   finalizeAggFunc
31d30 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73  tions(pParse, &s
31d40 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
31d50 7d 0a 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 70  }..      sSort.p
31d60 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
31d70 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
31d80 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48  False(pParse, pH
31d90 61 76 69 6e 67 2c 20 61 64 64 72 45 6e 64 2c 20  aving, addrEnd, 
31da0 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
31db0 4c 29 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74  L);.      select
31dc0 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
31dd0 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  , p, p->pEList, 
31de0 2d 31 2c 20 30 2c 20 30 2c 20 0a 20 20 20 20 20  -1, 0, 0, .     
31df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31e00 20 70 44 65 73 74 2c 20 61 64 64 72 45 6e 64 2c   pDest, addrEnd,
31e10 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 20   addrEnd);.     
31e20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
31e30 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 29  Delete(db, pDel)
31e40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
31e50 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
31e60 62 65 6c 28 76 2c 20 61 64 64 72 45 6e 64 29 3b  bel(v, addrEnd);
31e70 0a 20 20 20 20 0a 20 20 7d 20 2f 2a 20 65 6e 64  .    .  } /* end
31e80 69 66 20 61 67 67 72 65 67 61 74 65 20 71 75 65  if aggregate que
31e90 72 79 20 2a 2f 0a 0a 20 20 69 66 28 20 73 44 69  ry */..  if( sDi
31ea0 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65  stinct.eTnctType
31eb0 3d 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  ==WHERE_DISTINCT
31ec0 5f 55 4e 4f 52 44 45 52 45 44 20 29 7b 0a 20 20  _UNORDERED ){.  
31ed0 20 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62    explainTempTab
31ee0 6c 65 28 70 50 61 72 73 65 2c 20 22 44 49 53 54  le(pParse, "DIST
31ef0 49 4e 43 54 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f  INCT");.  }..  /
31f00 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  * If there is an
31f10 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
31f20 2c 20 74 68 65 6e 20 77 65 20 6e 65 65 64 20 74  , then we need t
31f30 6f 20 73 6f 72 74 20 74 68 65 20 72 65 73 75 6c  o sort the resul
31f40 74 73 0a 20 20 2a 2a 20 61 6e 64 20 73 65 6e 64  ts.  ** and send
31f50 20 74 68 65 6d 20 74 6f 20 74 68 65 20 63 61 6c   them to the cal
31f60 6c 62 61 63 6b 20 6f 6e 65 20 62 79 20 6f 6e 65  lback one by one
31f70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 53 6f  ..  */.  if( sSo
31f80 72 74 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  rt.pOrderBy ){. 
31f90 20 20 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61     explainTempTa
31fa0 62 6c 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  ble(pParse,.    
31fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31fc0 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74 3e 30 20   sSort.nOBSat>0 
31fd0 3f 20 22 52 49 47 48 54 20 50 41 52 54 20 4f 46  ? "RIGHT PART OF
31fe0 20 4f 52 44 45 52 20 42 59 22 3a 22 4f 52 44 45   ORDER BY":"ORDE
31ff0 52 20 42 59 22 29 3b 0a 20 20 20 20 67 65 6e 65  R BY");.    gene
32000 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70 50 61  rateSortTail(pPa
32010 72 73 65 2c 20 70 2c 20 26 73 53 6f 72 74 2c 20  rse, p, &sSort, 
32020 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70  pEList->nExpr, p
32030 44 65 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Dest);.  }..  /*
32040 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b   Jump here to sk
32050 69 70 20 74 68 69 73 20 71 75 65 72 79 0a 20 20  ip this query.  
32060 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
32070 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
32080 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  iEnd);..  /* The
32090 20 53 45 4c 45 43 54 20 68 61 73 20 62 65 65 6e   SELECT has been
320a0 20 63 6f 64 65 64 2e 20 49 66 20 74 68 65 72 65   coded. If there
320b0 20 69 73 20 61 6e 20 65 72 72 6f 72 20 69 6e 20   is an error in 
320c0 74 68 65 20 50 61 72 73 65 20 73 74 72 75 63 74  the Parse struct
320d0 75 72 65 2c 0a 20 20 2a 2a 20 73 65 74 20 74 68  ure,.  ** set th
320e0 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 74 6f  e return code to
320f0 20 31 2e 20 4f 74 68 65 72 77 69 73 65 20 30 2e   1. Otherwise 0.
32100 20 2a 2f 0a 20 20 72 63 20 3d 20 28 70 50 61 72   */.  rc = (pPar
32110 73 65 2d 3e 6e 45 72 72 3e 30 29 3b 0a 0a 20 20  se->nErr>0);..  
32120 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73  /* Control jumps
32130 20 74 6f 20 68 65 72 65 20 69 66 20 61 6e 20 65   to here if an e
32140 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
32150 72 65 64 20 61 62 6f 76 65 2c 20 6f 72 20 75 70  red above, or up
32160 6f 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66  on.  ** successf
32170 75 6c 20 63 6f 64 69 6e 67 20 6f 66 20 74 68 65  ul coding of the
32180 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a 73 65   SELECT..  */.se
32190 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 65 78 70 6c  lect_end:.  expl
321a0 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 70 50  ainSetInteger(pP
321b0 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c  arse->iSelectId,
321c0 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63 74 49   iRestoreSelectI
321d0 64 29 3b 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69  d);..  /* Identi
321e0 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  fy column names 
321f0 69 66 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  if results of th
32200 65 20 53 45 4c 45 43 54 20 61 72 65 20 74 6f 20  e SELECT are to 
32210 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a  be output..  */.
32220 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
32230 5f 4f 4b 20 26 26 20 70 44 65 73 74 2d 3e 65 44  _OK && pDest->eD
32240 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
32250 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43  ){.    generateC
32260 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
32270 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c  e, pTabList, pEL
32280 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c  ist);.  }..  sql
32290 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 73  ite3DbFree(db, s
322a0 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 29 3b 0a 20  AggInfo.aCol);. 
322b0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
322c0 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e  b, sAggInfo.aFun
322d0 63 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52  c);.#if SELECTTR
322e0 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 53 45  ACE_ENABLED.  SE
322f0 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50 61 72  LECTTRACE(1,pPar
32300 73 65 2c 70 2c 28 22 65 6e 64 20 70 72 6f 63 65  se,p,("end proce
32310 73 73 69 6e 67 5c 6e 22 29 29 3b 0a 20 20 70 50  ssing\n"));.  pP
32320 61 72 73 65 2d 3e 6e 53 65 6c 65 63 74 49 6e 64  arse->nSelectInd
32330 65 6e 74 2d 2d 3b 0a 23 65 6e 64 69 66 0a 20 20  ent--;.#endif.  
32340 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a           return rc;.}.