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

Artifact 7922b1e1aaceb8eea4b921d0e6d062e32cfef8d897c6b30015fdd546c9b9f57f:


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 28 53 29 2d 3e 7a 53 65 6c  2-2,"",(S)->zSel
02e0: 4e 61 6d 65 2c 28 53 29 29 2c 5c 0a 20 20 20 20  Name,(S)),\.    
02f0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
0300: 74 66 20 58 0a 23 65 6c 73 65 0a 23 20 64 65 66  tf X.#else.# def
0310: 69 6e 65 20 53 45 4c 45 43 54 54 52 41 43 45 28  ine SELECTTRACE(
0320: 4b 2c 50 2c 53 2c 58 29 0a 23 65 6e 64 69 66 0a  K,P,S,X).#endif.
0330: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
0340: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
0350: 77 69 6e 67 20 6f 62 6a 65 63 74 20 69 73 20 75  wing object is u
0360: 73 65 64 20 74 6f 20 72 65 63 6f 72 64 20 69 6e  sed to record in
0370: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 0a  formation about.
0380: 2a 2a 20 68 6f 77 20 74 6f 20 70 72 6f 63 65 73  ** how to proces
0390: 73 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b  s the DISTINCT k
03a0: 65 79 77 6f 72 64 2c 20 74 6f 20 73 69 6d 70 6c  eyword, to simpl
03b0: 69 66 79 20 70 61 73 73 69 6e 67 20 74 68 61 74  ify passing that
03c0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20   information.** 
03d0: 69 6e 74 6f 20 74 68 65 20 73 65 6c 65 63 74 49  into the selectI
03e0: 6e 6e 65 72 4c 6f 6f 70 28 29 20 72 6f 75 74 69  nnerLoop() routi
03f0: 6e 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  ne..*/.typedef s
0400: 74 72 75 63 74 20 44 69 73 74 69 6e 63 74 43 74  truct DistinctCt
0410: 78 20 44 69 73 74 69 6e 63 74 43 74 78 3b 0a 73  x DistinctCtx;.s
0420: 74 72 75 63 74 20 44 69 73 74 69 6e 63 74 43 74  truct DistinctCt
0430: 78 20 7b 0a 20 20 75 38 20 69 73 54 6e 63 74 3b  x {.  u8 isTnct;
0440: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
0450: 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65   the DISTINCT ke
0460: 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74  yword is present
0470: 20 2a 2f 0a 20 20 75 38 20 65 54 6e 63 74 54 79   */.  u8 eTnctTy
0480: 70 65 3b 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20  pe;   /* One of 
0490: 74 68 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e  the WHERE_DISTIN
04a0: 43 54 5f 2a 20 6f 70 65 72 61 74 6f 72 73 20 2a  CT_* operators *
04b0: 2f 0a 20 20 69 6e 74 20 74 61 62 54 6e 63 74 3b  /.  int tabTnct;
04c0: 20 20 20 20 2f 2a 20 45 70 68 65 6d 65 72 61 6c      /* Ephemeral
04d0: 20 74 61 62 6c 65 20 75 73 65 64 20 66 6f 72 20   table used for 
04e0: 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73 73  DISTINCT process
04f0: 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ing */.  int add
0500: 72 54 6e 63 74 3b 20 20 20 2f 2a 20 41 64 64 72  rTnct;   /* Addr
0510: 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 45 70  ess of OP_OpenEp
0520: 68 65 6d 65 72 61 6c 20 6f 70 63 6f 64 65 20 66  hemeral opcode f
0530: 6f 72 20 74 61 62 54 6e 63 74 20 2a 2f 0a 7d 3b  or tabTnct */.};
0540: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
0550: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
0560: 77 69 6e 67 20 6f 62 6a 65 63 74 20 69 73 20 75  wing object is u
0570: 73 65 64 20 74 6f 20 72 65 63 6f 72 64 20 69 6e  sed to record in
0580: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 0a  formation about.
0590: 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  ** the ORDER BY 
05a0: 28 6f 72 20 47 52 4f 55 50 20 42 59 29 20 63 6c  (or GROUP BY) cl
05b0: 61 75 73 65 20 6f 66 20 71 75 65 72 79 20 69 73  ause of query is
05c0: 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 0a 2a 2f   being coded..*/
05d0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
05e0: 53 6f 72 74 43 74 78 20 53 6f 72 74 43 74 78 3b  SortCtx SortCtx;
05f0: 0a 73 74 72 75 63 74 20 53 6f 72 74 43 74 78 20  .struct SortCtx 
0600: 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  {.  ExprList *pO
0610: 72 64 65 72 42 79 3b 20 20 20 2f 2a 20 54 68 65  rderBy;   /* The
0620: 20 4f 52 44 45 52 20 42 59 20 28 6f 72 20 47 52   ORDER BY (or GR
0630: 4f 55 50 20 42 59 20 63 6c 61 75 73 65 29 20 2a  OUP BY clause) *
0640: 2f 0a 20 20 69 6e 74 20 6e 4f 42 53 61 74 3b 20  /.  int nOBSat; 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
0660: 62 65 72 20 6f 66 20 4f 52 44 45 52 20 42 59 20  ber of ORDER BY 
0670: 74 65 72 6d 73 20 73 61 74 69 73 66 69 65 64 20  terms satisfied 
0680: 62 79 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20  by indices */.  
0690: 69 6e 74 20 69 45 43 75 72 73 6f 72 3b 20 20 20  int iECursor;   
06a0: 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
06b0: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 73  number for the s
06c0: 6f 72 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  orter */.  int r
06d0: 65 67 52 65 74 75 72 6e 3b 20 20 20 20 20 20 20  egReturn;       
06e0: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
06f0: 64 69 6e 67 20 62 6c 6f 63 6b 2d 6f 75 74 70 75  ding block-outpu
0700: 74 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73  t return address
0710: 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 42   */.  int labelB
0720: 6b 4f 75 74 3b 20 20 20 20 20 20 20 2f 2a 20 53  kOut;       /* S
0730: 74 61 72 74 20 6c 61 62 65 6c 20 66 6f 72 20 74  tart label for t
0740: 68 65 20 62 6c 6f 63 6b 2d 6f 75 74 70 75 74 20  he block-output 
0750: 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
0760: 69 6e 74 20 61 64 64 72 53 6f 72 74 49 6e 64 65  int addrSortInde
0770: 78 3b 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73  x;    /* Address
0780: 20 6f 66 20 74 68 65 20 4f 50 5f 53 6f 72 74 65   of the OP_Sorte
0790: 72 4f 70 65 6e 20 6f 72 20 4f 50 5f 4f 70 65 6e  rOpen or OP_Open
07a0: 45 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 69  Ephemeral */.  i
07b0: 6e 74 20 6c 61 62 65 6c 44 6f 6e 65 3b 20 20 20  nt labelDone;   
07c0: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
07d0: 65 20 77 68 65 6e 20 64 6f 6e 65 2c 20 65 78 3a  e when done, ex:
07e0: 20 4c 49 4d 49 54 20 72 65 61 63 68 65 64 20 2a   LIMIT reached *
07f0: 2f 0a 20 20 75 38 20 73 6f 72 74 46 6c 61 67 73  /.  u8 sortFlags
0800: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 5a 65 72  ;         /* Zer
0810: 6f 20 6f 72 20 6d 6f 72 65 20 53 4f 52 54 46 4c  o or more SORTFL
0820: 41 47 5f 2a 20 62 69 74 73 20 2a 2f 0a 20 20 75  AG_* bits */.  u
0830: 38 20 62 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c  8 bOrderedInnerL
0840: 6f 6f 70 3b 20 2f 2a 20 4f 52 44 45 52 20 42 59  oop; /* ORDER BY
0850: 20 63 6f 72 72 65 63 74 6c 79 20 73 6f 72 74 73   correctly sorts
0860: 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20   the inner loop 
0870: 2a 2f 0a 7d 3b 0a 23 64 65 66 69 6e 65 20 53 4f  */.};.#define SO
0880: 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72  RTFLAG_UseSorter
0890: 20 20 30 78 30 31 20 20 20 2f 2a 20 55 73 65 20    0x01   /* Use 
08a0: 53 6f 72 74 65 72 4f 70 65 6e 20 69 6e 73 74 65  SorterOpen inste
08b0: 61 64 20 6f 66 20 4f 70 65 6e 45 70 68 65 6d 65  ad of OpenEpheme
08c0: 72 61 6c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 65  ral */../*.** De
08d0: 6c 65 74 65 20 61 6c 6c 20 74 68 65 20 63 6f 6e  lete all the con
08e0: 74 65 6e 74 20 6f 66 20 61 20 53 65 6c 65 63 74  tent of a Select
08f0: 20 73 74 72 75 63 74 75 72 65 2e 20 20 44 65 61   structure.  Dea
0900: 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 74 72 75  llocate the stru
0910: 63 74 75 72 65 0a 2a 2a 20 69 74 73 65 6c 66 20  cture.** itself 
0920: 6f 6e 6c 79 20 69 66 20 62 46 72 65 65 20 69 73  only if bFree is
0930: 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   true..*/.static
0940: 20 76 6f 69 64 20 63 6c 65 61 72 53 65 6c 65 63   void clearSelec
0950: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53  t(sqlite3 *db, S
0960: 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 62 46  elect *p, int bF
0970: 72 65 65 29 7b 0a 20 20 77 68 69 6c 65 28 20 70  ree){.  while( p
0980: 20 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a   ){.    Select *
0990: 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69  pPrior = p->pPri
09a0: 6f 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  or;.    sqlite3E
09b0: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
09c0: 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  , p->pEList);.  
09d0: 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
09e0: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 53  Delete(db, p->pS
09f0: 72 63 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rc);.    sqlite3
0a00: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
0a10: 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 73  ->pWhere);.    s
0a20: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
0a30: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 47 72 6f  lete(db, p->pGro
0a40: 75 70 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74  upBy);.    sqlit
0a50: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
0a60: 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20   p->pHaving);.  
0a70: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
0a80: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
0a90: 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 73 71  OrderBy);.    sq
0aa0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
0ab0: 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a  db, p->pLimit);.
0ac0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
0ad0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 66  elete(db, p->pOf
0ae0: 66 73 65 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  fset);.    sqlit
0af0: 65 33 57 69 74 68 44 65 6c 65 74 65 28 64 62 2c  e3WithDelete(db,
0b00: 20 70 2d 3e 70 57 69 74 68 29 3b 0a 20 20 20 20   p->pWith);.    
0b10: 69 66 28 20 62 46 72 65 65 20 29 20 73 71 6c 69  if( bFree ) sqli
0b20: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29  te3DbFree(db, p)
0b30: 3b 0a 20 20 20 20 70 20 3d 20 70 50 72 69 6f 72  ;.    p = pPrior
0b40: 3b 0a 20 20 20 20 62 46 72 65 65 20 3d 20 31 3b  ;.    bFree = 1;
0b50: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  .  }.}../*.** In
0b60: 69 74 69 61 6c 69 7a 65 20 61 20 53 65 6c 65 63  itialize a Selec
0b70: 74 44 65 73 74 20 73 74 72 75 63 74 75 72 65 2e  tDest structure.
0b80: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
0b90: 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 53  SelectDestInit(S
0ba0: 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
0bb0: 2c 20 69 6e 74 20 65 44 65 73 74 2c 20 69 6e 74  , int eDest, int
0bc0: 20 69 50 61 72 6d 29 7b 0a 20 20 70 44 65 73 74   iParm){.  pDest
0bd0: 2d 3e 65 44 65 73 74 20 3d 20 28 75 38 29 65 44  ->eDest = (u8)eD
0be0: 65 73 74 3b 0a 20 20 70 44 65 73 74 2d 3e 69 53  est;.  pDest->iS
0bf0: 44 50 61 72 6d 20 3d 20 69 50 61 72 6d 3b 0a 20  DParm = iParm;. 
0c00: 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 20   pDest->affSdst 
0c10: 3d 20 30 3b 0a 20 20 70 44 65 73 74 2d 3e 69 53  = 0;.  pDest->iS
0c20: 64 73 74 20 3d 20 30 3b 0a 20 20 70 44 65 73 74  dst = 0;.  pDest
0c30: 2d 3e 6e 53 64 73 74 20 3d 20 30 3b 0a 7d 0a 0a  ->nSdst = 0;.}..
0c40: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
0c50: 61 20 6e 65 77 20 53 65 6c 65 63 74 20 73 74 72  a new Select str
0c60: 75 63 74 75 72 65 20 61 6e 64 20 72 65 74 75 72  ucture and retur
0c70: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
0c80: 68 61 74 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  hat.** structure
0c90: 2e 0a 2a 2f 0a 53 65 6c 65 63 74 20 2a 73 71 6c  ..*/.Select *sql
0ca0: 69 74 65 33 53 65 6c 65 63 74 4e 65 77 28 0a 20  ite3SelectNew(. 
0cb0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
0cc0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
0cd0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
0ce0: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c  xprList *pEList,
0cf0: 20 20 20 20 20 2f 2a 20 77 68 69 63 68 20 63 6f       /* which co
0d00: 6c 75 6d 6e 73 20 74 6f 20 69 6e 63 6c 75 64 65  lumns to include
0d10: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a   in the result *
0d20: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  /.  SrcList *pSr
0d30: 63 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65  c,        /* the
0d40: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2d 2d 20   FROM clause -- 
0d50: 77 68 69 63 68 20 74 61 62 6c 65 73 20 74 6f 20  which tables to 
0d60: 73 63 61 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a  scan */.  Expr *
0d70: 70 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20  pWhere,         
0d80: 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  /* the WHERE cla
0d90: 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  use */.  ExprLis
0da0: 74 20 2a 70 47 72 6f 75 70 42 79 2c 20 20 20 2f  t *pGroupBy,   /
0db0: 2a 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63  * the GROUP BY c
0dc0: 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 20  lause */.  Expr 
0dd0: 2a 70 48 61 76 69 6e 67 2c 20 20 20 20 20 20 20  *pHaving,       
0de0: 20 2f 2a 20 74 68 65 20 48 41 56 49 4e 47 20 63   /* the HAVING c
0df0: 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c  lause */.  ExprL
0e00: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20  ist *pOrderBy,  
0e10: 20 2f 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59   /* the ORDER BY
0e20: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 75 31 36   clause */.  u16
0e30: 20 73 65 6c 46 6c 61 67 73 2c 20 20 20 20 20 20   selFlags,      
0e40: 20 20 20 2f 2a 20 46 6c 61 67 20 70 61 72 61 6d     /* Flag param
0e50: 65 74 65 72 73 2c 20 73 75 63 68 20 61 73 20 53  eters, such as S
0e60: 46 5f 44 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20  F_Distinct */.  
0e70: 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 20 20  Expr *pLimit,   
0e80: 20 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54 20 76        /* LIMIT v
0e90: 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e  alue.  NULL mean
0ea0: 73 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20  s not used */.  
0eb0: 45 78 70 72 20 2a 70 4f 66 66 73 65 74 20 20 20  Expr *pOffset   
0ec0: 20 20 20 20 20 20 2f 2a 20 4f 46 46 53 45 54 20        /* OFFSET 
0ed0: 76 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65 61  value.  NULL mea
0ee0: 6e 73 20 6e 6f 20 6f 66 66 73 65 74 20 2a 2f 0a  ns no offset */.
0ef0: 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65  ){.  Select *pNe
0f00: 77 3b 0a 20 20 53 65 6c 65 63 74 20 73 74 61 6e  w;.  Select stan
0f10: 64 69 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  din;.  sqlite3 *
0f20: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
0f30: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
0f40: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
0f50: 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20  , sizeof(*pNew) 
0f60: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  );.  assert( db-
0f70: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
0f80: 20 21 70 4f 66 66 73 65 74 20 7c 7c 20 70 4c 69   !pOffset || pLi
0f90: 6d 69 74 20 29 3b 20 2f 2a 20 4f 46 46 53 45 54  mit ); /* OFFSET
0fa0: 20 69 6d 70 6c 69 65 73 20 4c 49 4d 49 54 20 2a   implies LIMIT *
0fb0: 2f 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  /.  if( pNew==0 
0fc0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  ){.    assert( d
0fd0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
0fe0: 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 26 73  );.    pNew = &s
0ff0: 74 61 6e 64 69 6e 3b 0a 20 20 20 20 6d 65 6d 73  tandin;.    mems
1000: 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65  et(pNew, 0, size
1010: 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20 7d 0a  of(*pNew));.  }.
1020: 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20    if( pEList==0 
1030: 29 7b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20  ){.    pEList = 
1040: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
1050: 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c  ppend(pParse, 0,
1060: 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
1070: 54 4b 5f 41 4c 4c 2c 30 29 29 3b 0a 20 20 7d 0a  TK_ALL,0));.  }.
1080: 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d    pNew->pEList =
1090: 20 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70   pEList;.  if( p
10a0: 53 72 63 3d 3d 30 20 29 20 70 53 72 63 20 3d 20  Src==0 ) pSrc = 
10b0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
10c0: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  ero(db, sizeof(*
10d0: 70 53 72 63 29 29 3b 0a 20 20 70 4e 65 77 2d 3e  pSrc));.  pNew->
10e0: 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 70  pSrc = pSrc;.  p
10f0: 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 70 57  New->pWhere = pW
1100: 68 65 72 65 3b 0a 20 20 70 4e 65 77 2d 3e 70 47  here;.  pNew->pG
1110: 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42  roupBy = pGroupB
1120: 79 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69  y;.  pNew->pHavi
1130: 6e 67 20 3d 20 70 48 61 76 69 6e 67 3b 0a 20 20  ng = pHaving;.  
1140: 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d  pNew->pOrderBy =
1150: 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 4e 65   pOrderBy;.  pNe
1160: 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20 73 65  w->selFlags = se
1170: 6c 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e  lFlags;.  pNew->
1180: 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a  op = TK_SELECT;.
1190: 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d    pNew->pLimit =
11a0: 20 70 4c 69 6d 69 74 3b 0a 20 20 70 4e 65 77 2d   pLimit;.  pNew-
11b0: 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73  >pOffset = pOffs
11c0: 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f  et;.  assert( pO
11d0: 66 66 73 65 74 3d 3d 30 20 7c 7c 20 70 4c 69 6d  ffset==0 || pLim
11e0: 69 74 21 3d 30 20 29 3b 0a 20 20 70 4e 65 77 2d  it!=0 );.  pNew-
11f0: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
1200: 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61   = -1;.  pNew->a
1210: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d  ddrOpenEphm[1] =
1220: 20 2d 31 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d   -1;.  if( db->m
1230: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 7b 0a  allocFailed ) {.
1240: 20 20 20 20 63 6c 65 61 72 53 65 6c 65 63 74 28      clearSelect(
1250: 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77 21 3d  db, pNew, pNew!=
1260: 26 73 74 61 6e 64 69 6e 29 3b 0a 20 20 20 20 70  &standin);.    p
1270: 4e 65 77 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  New = 0;.  }else
1280: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  {.    assert( pN
1290: 65 77 2d 3e 70 53 72 63 21 3d 30 20 7c 7c 20 70  ew->pSrc!=0 || p
12a0: 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 3b  Parse->nErr>0 );
12b0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
12c0: 4e 65 77 21 3d 26 73 74 61 6e 64 69 6e 20 29 3b  New!=&standin );
12d0: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
12e0: 7d 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  }..#if SELECTTRA
12f0: 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a  CE_ENABLED./*.**
1300: 20 53 65 74 20 74 68 65 20 6e 61 6d 65 20 6f 66   Set the name of
1310: 20 61 20 53 65 6c 65 63 74 20 6f 62 6a 65 63 74   a Select object
1320: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1330: 53 65 6c 65 63 74 53 65 74 4e 61 6d 65 28 53 65  SelectSetName(Se
1340: 6c 65 63 74 20 2a 70 2c 20 63 6f 6e 73 74 20 63  lect *p, const c
1350: 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69  har *zName){.  i
1360: 66 28 20 70 20 26 26 20 7a 4e 61 6d 65 20 29 7b  f( p && zName ){
1370: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
1380: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e  rintf(sizeof(p->
1390: 7a 53 65 6c 4e 61 6d 65 29 2c 20 70 2d 3e 7a 53  zSelName), p->zS
13a0: 65 6c 4e 61 6d 65 2c 20 22 25 73 22 2c 20 7a 4e  elName, "%s", zN
13b0: 61 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  ame);.  }.}.#end
13c0: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  if.../*.** Delet
13d0: 65 20 74 68 65 20 67 69 76 65 6e 20 53 65 6c 65  e the given Sele
13e0: 63 74 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  ct structure and
13f0: 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 73   all of its subs
1400: 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f  tructures..*/.vo
1410: 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  id sqlite3Select
1420: 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a  Delete(sqlite3 *
1430: 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  db, Select *p){.
1440: 20 20 63 6c 65 61 72 53 65 6c 65 63 74 28 64 62    clearSelect(db
1450: 2c 20 70 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , p, 1);.}../*.*
1460: 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
1470: 65 72 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d  er to the right-
1480: 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61 74  most SELECT stat
1490: 65 6d 65 6e 74 20 69 6e 20 61 20 63 6f 6d 70 6f  ement in a compo
14a0: 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53  und..*/.static S
14b0: 65 6c 65 63 74 20 2a 66 69 6e 64 52 69 67 68 74  elect *findRight
14c0: 6d 6f 73 74 28 53 65 6c 65 63 74 20 2a 70 29 7b  most(Select *p){
14d0: 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 70 4e 65  .  while( p->pNe
14e0: 78 74 20 29 20 70 20 3d 20 70 2d 3e 70 4e 65 78  xt ) p = p->pNex
14f0: 74 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d  t;.  return p;.}
1500: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 31 20  ../*.** Given 1 
1510: 74 6f 20 33 20 69 64 65 6e 74 69 66 69 65 72 73  to 3 identifiers
1520: 20 70 72 65 63 65 64 69 6e 67 20 74 68 65 20 4a   preceding the J
1530: 4f 49 4e 20 6b 65 79 77 6f 72 64 2c 20 64 65 74  OIN keyword, det
1540: 65 72 6d 69 6e 65 20 74 68 65 0a 2a 2a 20 74 79  ermine the.** ty
1550: 70 65 20 6f 66 20 6a 6f 69 6e 2e 20 20 52 65 74  pe of join.  Ret
1560: 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 63  urn an integer c
1570: 6f 6e 73 74 61 6e 74 20 74 68 61 74 20 65 78 70  onstant that exp
1580: 72 65 73 73 65 73 20 74 68 61 74 20 74 79 70 65  resses that type
1590: 0a 2a 2a 20 69 6e 20 74 65 72 6d 73 20 6f 66 20  .** in terms of 
15a0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 69  the following bi
15b0: 74 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a 2a 20  t values:.**.** 
15c0: 20 20 20 20 4a 54 5f 49 4e 4e 45 52 0a 2a 2a 20      JT_INNER.** 
15d0: 20 20 20 20 4a 54 5f 43 52 4f 53 53 0a 2a 2a 20      JT_CROSS.** 
15e0: 20 20 20 20 4a 54 5f 4f 55 54 45 52 0a 2a 2a 20      JT_OUTER.** 
15f0: 20 20 20 20 4a 54 5f 4e 41 54 55 52 41 4c 0a 2a      JT_NATURAL.*
1600: 2a 20 20 20 20 20 4a 54 5f 4c 45 46 54 0a 2a 2a  *     JT_LEFT.**
1610: 20 20 20 20 20 4a 54 5f 52 49 47 48 54 0a 2a 2a       JT_RIGHT.**
1620: 0a 2a 2a 20 41 20 66 75 6c 6c 20 6f 75 74 65 72  .** A full outer
1630: 20 6a 6f 69 6e 20 69 73 20 74 68 65 20 63 6f 6d   join is the com
1640: 62 69 6e 61 74 69 6f 6e 20 6f 66 20 4a 54 5f 4c  bination of JT_L
1650: 45 46 54 20 61 6e 64 20 4a 54 5f 52 49 47 48 54  EFT and JT_RIGHT
1660: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6c  ..**.** If an il
1670: 6c 65 67 61 6c 20 6f 72 20 75 6e 73 75 70 70 6f  legal or unsuppo
1680: 72 74 65 64 20 6a 6f 69 6e 20 74 79 70 65 20 69  rted join type i
1690: 73 20 73 65 65 6e 2c 20 74 68 65 6e 20 73 74 69  s seen, then sti
16a0: 6c 6c 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20 6a  ll return.** a j
16b0: 6f 69 6e 20 74 79 70 65 2c 20 62 75 74 20 70 75  oin type, but pu
16c0: 74 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 74 68  t an error in th
16d0: 65 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75  e pParse structu
16e0: 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  re..*/.int sqlit
16f0: 65 33 4a 6f 69 6e 54 79 70 65 28 50 61 72 73 65  e3JoinType(Parse
1700: 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
1710: 2a 70 41 2c 20 54 6f 6b 65 6e 20 2a 70 42 2c 20  *pA, Token *pB, 
1720: 54 6f 6b 65 6e 20 2a 70 43 29 7b 0a 20 20 69 6e  Token *pC){.  in
1730: 74 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a  t jointype = 0;.
1740: 20 20 54 6f 6b 65 6e 20 2a 61 70 41 6c 6c 5b 33    Token *apAll[3
1750: 5d 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 3b 0a 20  ];.  Token *p;. 
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1770: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20              /*  
1780: 20 30 31 32 33 34 35 36 37 38 39 20 31 32 33 34   0123456789 1234
1790: 35 36 37 38 39 20 31 32 33 34 35 36 37 38 39 20  56789 123456789 
17a0: 31 32 33 20 2a 2f 0a 20 20 73 74 61 74 69 63 20  123 */.  static 
17b0: 63 6f 6e 73 74 20 63 68 61 72 20 7a 4b 65 79 54  const char zKeyT
17c0: 65 78 74 5b 5d 20 3d 20 22 6e 61 74 75 72 61 6c  ext[] = "natural
17d0: 65 66 74 6f 75 74 65 72 69 67 68 74 66 75 6c 6c  eftouterightfull
17e0: 69 6e 6e 65 72 63 72 6f 73 73 22 3b 0a 20 20 73  innercross";.  s
17f0: 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75  tatic const stru
1800: 63 74 20 7b 0a 20 20 20 20 75 38 20 69 3b 20 20  ct {.    u8 i;  
1810: 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69        /* Beginni
1820: 6e 67 20 6f 66 20 6b 65 79 77 6f 72 64 20 74 65  ng of keyword te
1830: 78 74 20 69 6e 20 7a 4b 65 79 54 65 78 74 5b 5d  xt in zKeyText[]
1840: 20 2a 2f 0a 20 20 20 20 75 38 20 6e 43 68 61 72   */.    u8 nChar
1850: 3b 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f  ;    /* Length o
1860: 66 20 74 68 65 20 6b 65 79 77 6f 72 64 20 69 6e  f the keyword in
1870: 20 63 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20   characters */. 
1880: 20 20 20 75 38 20 63 6f 64 65 3b 20 20 20 20 20     u8 code;     
1890: 2f 2a 20 4a 6f 69 6e 20 74 79 70 65 20 6d 61 73  /* Join type mas
18a0: 6b 20 2a 2f 0a 20 20 7d 20 61 4b 65 79 77 6f 72  k */.  } aKeywor
18b0: 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a 20 6e  d[] = {.    /* n
18c0: 61 74 75 72 61 6c 20 2a 2f 20 7b 20 30 2c 20 20  atural */ { 0,  
18d0: 37 2c 20 4a 54 5f 4e 41 54 55 52 41 4c 20 20 20  7, JT_NATURAL   
18e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
18f0: 20 20 20 20 2f 2a 20 6c 65 66 74 20 20 20 20 2a      /* left    *
1900: 2f 20 7b 20 36 2c 20 20 34 2c 20 4a 54 5f 4c 45  / { 6,  4, JT_LE
1910: 46 54 7c 4a 54 5f 4f 55 54 45 52 20 20 20 20 20  FT|JT_OUTER     
1920: 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 6f       },.    /* o
1930: 75 74 65 72 20 20 20 2a 2f 20 7b 20 31 30 2c 20  uter   */ { 10, 
1940: 35 2c 20 4a 54 5f 4f 55 54 45 52 20 20 20 20 20  5, JT_OUTER     
1950: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
1960: 20 20 20 20 2f 2a 20 72 69 67 68 74 20 20 20 2a      /* right   *
1970: 2f 20 7b 20 31 34 2c 20 35 2c 20 4a 54 5f 52 49  / { 14, 5, JT_RI
1980: 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 20 20 20  GHT|JT_OUTER    
1990: 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 66       },.    /* f
19a0: 75 6c 6c 20 20 20 20 2a 2f 20 7b 20 31 39 2c 20  ull    */ { 19, 
19b0: 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52 49  4, JT_LEFT|JT_RI
19c0: 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a  GHT|JT_OUTER },.
19d0: 20 20 20 20 2f 2a 20 69 6e 6e 65 72 20 20 20 2a      /* inner   *
19e0: 2f 20 7b 20 32 33 2c 20 35 2c 20 4a 54 5f 49 4e  / { 23, 5, JT_IN
19f0: 4e 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  NER             
1a00: 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 63       },.    /* c
1a10: 72 6f 73 73 20 20 20 2a 2f 20 7b 20 32 38 2c 20  ross   */ { 28, 
1a20: 35 2c 20 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 43  5, JT_INNER|JT_C
1a30: 52 4f 53 53 20 20 20 20 20 20 20 20 20 7d 2c 0a  ROSS         },.
1a40: 20 20 7d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b    };.  int i, j;
1a50: 0a 20 20 61 70 41 6c 6c 5b 30 5d 20 3d 20 70 41  .  apAll[0] = pA
1a60: 3b 0a 20 20 61 70 41 6c 6c 5b 31 5d 20 3d 20 70  ;.  apAll[1] = p
1a70: 42 3b 0a 20 20 61 70 41 6c 6c 5b 32 5d 20 3d 20  B;.  apAll[2] = 
1a80: 70 43 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  pC;.  for(i=0; i
1a90: 3c 33 20 26 26 20 61 70 41 6c 6c 5b 69 5d 3b 20  <3 && apAll[i]; 
1aa0: 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61 70  i++){.    p = ap
1ab0: 41 6c 6c 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28  All[i];.    for(
1ac0: 6a 3d 30 3b 20 6a 3c 41 72 72 61 79 53 69 7a 65  j=0; j<ArraySize
1ad0: 28 61 4b 65 79 77 6f 72 64 29 3b 20 6a 2b 2b 29  (aKeyword); j++)
1ae0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e  {.      if( p->n
1af0: 3d 3d 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 6e 43  ==aKeyword[j].nC
1b00: 68 61 72 20 0a 20 20 20 20 20 20 20 20 20 20 26  har .          &
1b10: 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  & sqlite3StrNICm
1b20: 70 28 28 63 68 61 72 2a 29 70 2d 3e 7a 2c 20 26  p((char*)p->z, &
1b30: 7a 4b 65 79 54 65 78 74 5b 61 4b 65 79 77 6f 72  zKeyText[aKeywor
1b40: 64 5b 6a 5d 2e 69 5d 2c 20 70 2d 3e 6e 29 3d 3d  d[j].i], p->n)==
1b50: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 6f 69  0 ){.        joi
1b60: 6e 74 79 70 65 20 7c 3d 20 61 4b 65 79 77 6f 72  ntype |= aKeywor
1b70: 64 5b 6a 5d 2e 63 6f 64 65 3b 0a 20 20 20 20 20  d[j].code;.     
1b80: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1b90: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74  }.    }.    test
1ba0: 63 61 73 65 28 20 6a 3d 3d 30 20 7c 7c 20 6a 3d  case( j==0 || j=
1bb0: 3d 31 20 7c 7c 20 6a 3d 3d 32 20 7c 7c 20 6a 3d  =1 || j==2 || j=
1bc0: 3d 33 20 7c 7c 20 6a 3d 3d 34 20 7c 7c 20 6a 3d  =3 || j==4 || j=
1bd0: 3d 35 20 7c 7c 20 6a 3d 3d 36 20 29 3b 0a 20 20  =5 || j==6 );.  
1be0: 20 20 69 66 28 20 6a 3e 3d 41 72 72 61 79 53 69    if( j>=ArraySi
1bf0: 7a 65 28 61 4b 65 79 77 6f 72 64 29 20 29 7b 0a  ze(aKeyword) ){.
1c00: 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c        jointype |
1c10: 3d 20 4a 54 5f 45 52 52 4f 52 3b 0a 20 20 20 20  = JT_ERROR;.    
1c20: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1c30: 20 7d 0a 20 20 69 66 28 0a 20 20 20 20 20 28 6a   }.  if(.     (j
1c40: 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 49 4e  ointype & (JT_IN
1c50: 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29 29 3d 3d  NER|JT_OUTER))==
1c60: 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54  (JT_INNER|JT_OUT
1c70: 45 52 29 20 7c 7c 0a 20 20 20 20 20 28 6a 6f 69  ER) ||.     (joi
1c80: 6e 74 79 70 65 20 26 20 4a 54 5f 45 52 52 4f 52  ntype & JT_ERROR
1c90: 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 63 6f  )!=0.  ){.    co
1ca0: 6e 73 74 20 63 68 61 72 20 2a 7a 53 70 20 3d 20  nst char *zSp = 
1cb0: 22 20 22 3b 0a 20 20 20 20 61 73 73 65 72 74 28  " ";.    assert(
1cc0: 20 70 42 21 3d 30 20 29 3b 0a 20 20 20 20 69 66   pB!=0 );.    if
1cd0: 28 20 70 43 3d 3d 30 20 29 7b 20 7a 53 70 2b 2b  ( pC==0 ){ zSp++
1ce0: 3b 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45  ; }.    sqlite3E
1cf0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1d00: 22 75 6e 6b 6e 6f 77 6e 20 6f 72 20 75 6e 73 75  "unknown or unsu
1d10: 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70  pported join typ
1d20: 65 3a 20 22 0a 20 20 20 20 20 20 20 22 25 54 20  e: ".       "%T 
1d30: 25 54 25 73 25 54 22 2c 20 70 41 2c 20 70 42 2c  %T%s%T", pA, pB,
1d40: 20 7a 53 70 2c 20 70 43 29 3b 0a 20 20 20 20 6a   zSp, pC);.    j
1d50: 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e  ointype = JT_INN
1d60: 45 52 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ER;.  }else if( 
1d70: 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f  (jointype & JT_O
1d80: 55 54 45 52 29 21 3d 30 20 0a 20 20 20 20 20 20  UTER)!=0 .      
1d90: 20 20 20 26 26 20 28 6a 6f 69 6e 74 79 70 65 20     && (jointype 
1da0: 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52 49  & (JT_LEFT|JT_RI
1db0: 47 48 54 29 29 21 3d 4a 54 5f 4c 45 46 54 20 29  GHT))!=JT_LEFT )
1dc0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
1dd0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
1de0: 20 20 20 20 20 22 52 49 47 48 54 20 61 6e 64 20       "RIGHT and 
1df0: 46 55 4c 4c 20 4f 55 54 45 52 20 4a 4f 49 4e 73  FULL OUTER JOINs
1e00: 20 61 72 65 20 6e 6f 74 20 63 75 72 72 65 6e 74   are not current
1e10: 6c 79 20 73 75 70 70 6f 72 74 65 64 22 29 3b 0a  ly supported");.
1e20: 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a      jointype = J
1e30: 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 0a 20 20 72  T_INNER;.  }.  r
1e40: 65 74 75 72 6e 20 6a 6f 69 6e 74 79 70 65 3b 0a  eturn jointype;.
1e50: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1e60: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 63  the index of a c
1e70: 6f 6c 75 6d 6e 20 69 6e 20 61 20 74 61 62 6c 65  olumn in a table
1e80: 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66 20  .  Return -1 if 
1e90: 74 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 73  the column.** is
1ea0: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69   not contained i
1eb0: 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a  n the table..*/.
1ec0: 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6c 75 6d  static int colum
1ed0: 6e 49 6e 64 65 78 28 54 61 62 6c 65 20 2a 70 54  nIndex(Table *pT
1ee0: 61 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ab, const char *
1ef0: 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  zCol){.  int i;.
1f00: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
1f10: 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  b->nCol; i++){. 
1f20: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
1f30: 72 49 43 6d 70 28 70 54 61 62 2d 3e 61 43 6f 6c  rICmp(pTab->aCol
1f40: 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29  [i].zName, zCol)
1f50: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a  ==0 ) return i;.
1f60: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b    }.  return -1;
1f70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68  .}../*.** Search
1f80: 20 74 68 65 20 66 69 72 73 74 20 4e 20 74 61 62   the first N tab
1f90: 6c 65 73 20 69 6e 20 70 53 72 63 2c 20 66 72 6f  les in pSrc, fro
1fa0: 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2c  m left to right,
1fb0: 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 0a 2a   looking for a.*
1fc0: 2a 20 74 61 62 6c 65 20 74 68 61 74 20 68 61 73  * table that has
1fd0: 20 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20   a column named 
1fe0: 7a 43 6f 6c 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68  zCol.  .**.** Wh
1ff0: 65 6e 20 66 6f 75 6e 64 2c 20 73 65 74 20 2a 70  en found, set *p
2000: 69 54 61 62 20 61 6e 64 20 2a 70 69 43 6f 6c 20  iTab and *piCol 
2010: 74 6f 20 74 68 65 20 74 61 62 6c 65 20 69 6e 64  to the table ind
2020: 65 78 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 69 6e  ex and column in
2030: 64 65 78 0a 2a 2a 20 6f 66 20 74 68 65 20 6d 61  dex.** of the ma
2040: 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 61 6e  tching column an
2050: 64 20 72 65 74 75 72 6e 20 54 52 55 45 2e 0a 2a  d return TRUE..*
2060: 2a 0a 2a 2a 20 49 66 20 6e 6f 74 20 66 6f 75 6e  *.** If not foun
2070: 64 2c 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e  d, return FALSE.
2080: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
2090: 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64  ableAndColumnInd
20a0: 65 78 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  ex(.  SrcList *p
20b0: 53 72 63 2c 20 20 20 20 20 20 20 2f 2a 20 41 72  Src,       /* Ar
20c0: 72 61 79 20 6f 66 20 74 61 62 6c 65 73 20 74 6f  ray of tables to
20d0: 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 69 6e 74   search */.  int
20e0: 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   N,             
20f0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
2100: 61 62 6c 65 73 20 69 6e 20 70 53 72 63 2d 3e 61  ables in pSrc->a
2110: 5b 5d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a  [] to search */.
2120: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
2130: 6f 6c 2c 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  ol,    /* Name o
2140: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 77 65 20  f the column we 
2150: 61 72 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  are looking for 
2160: 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 54 61 62 2c  */.  int *piTab,
2170: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
2180: 74 65 20 69 6e 64 65 78 20 6f 66 20 70 53 72 63  te index of pSrc
2190: 2d 3e 61 5b 5d 20 68 65 72 65 20 2a 2f 0a 20 20  ->a[] here */.  
21a0: 69 6e 74 20 2a 70 69 43 6f 6c 20 20 20 20 20 20  int *piCol      
21b0: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 69 6e       /* Write in
21c0: 64 65 78 20 6f 66 20 70 53 72 63 2d 3e 61 5b 2a  dex of pSrc->a[*
21d0: 70 69 54 61 62 5d 2e 70 54 61 62 2d 3e 61 43 6f  piTab].pTab->aCo
21e0: 6c 5b 5d 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  l[] here */.){. 
21f0: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
2200: 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
2210: 70 69 6e 67 20 6f 76 65 72 20 74 61 62 6c 65 73  ping over tables
2220: 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e   in pSrc */.  in
2230: 74 20 69 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  t iCol;         
2240: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63     /* Index of c
2250: 6f 6c 75 6d 6e 20 6d 61 74 63 68 69 6e 67 20 7a  olumn matching z
2260: 43 6f 6c 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  Col */..  assert
2270: 28 20 28 70 69 54 61 62 3d 3d 30 29 3d 3d 28 70  ( (piTab==0)==(p
2280: 69 43 6f 6c 3d 3d 30 29 20 29 3b 20 20 2f 2a 20  iCol==0) );  /* 
2290: 42 6f 74 68 20 6f 72 20 6e 65 69 74 68 65 72 20  Both or neither 
22a0: 61 72 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 66 6f  are NULL */.  fo
22b0: 72 28 69 3d 30 3b 20 69 3c 4e 3b 20 69 2b 2b 29  r(i=0; i<N; i++)
22c0: 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 63 6f 6c  {.    iCol = col
22d0: 75 6d 6e 49 6e 64 65 78 28 70 53 72 63 2d 3e 61  umnIndex(pSrc->a
22e0: 5b 69 5d 2e 70 54 61 62 2c 20 7a 43 6f 6c 29 3b  [i].pTab, zCol);
22f0: 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30  .    if( iCol>=0
2300: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 69   ){.      if( pi
2310: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  Tab ){.        *
2320: 70 69 54 61 62 20 3d 20 69 3b 0a 20 20 20 20 20  piTab = i;.     
2330: 20 20 20 2a 70 69 43 6f 6c 20 3d 20 69 43 6f 6c     *piCol = iCol
2340: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2350: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
2360: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
2370: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
2380: 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
2390: 6f 20 61 64 64 20 74 65 72 6d 73 20 69 6d 70 6c  o add terms impl
23a0: 69 65 64 20 62 79 20 4a 4f 49 4e 20 73 79 6e 74  ied by JOIN synt
23b0: 61 78 20 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45  ax to the.** WHE
23c0: 52 45 20 63 6c 61 75 73 65 20 65 78 70 72 65 73  RE clause expres
23d0: 73 69 6f 6e 20 6f 66 20 61 20 53 45 4c 45 43 54  sion of a SELECT
23e0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 65 20   statement. The 
23f0: 6e 65 77 20 74 65 72 6d 2c 20 77 68 69 63 68 0a  new term, which.
2400: 2a 2a 20 69 73 20 41 4e 44 65 64 20 77 69 74 68  ** is ANDed with
2410: 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 57 48   the existing WH
2420: 45 52 45 20 63 6c 61 75 73 65 2c 20 69 73 20 6f  ERE clause, is o
2430: 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  f the form:.**.*
2440: 2a 20 20 20 20 28 74 61 62 31 2e 63 6f 6c 31 20  *    (tab1.col1 
2450: 3d 20 74 61 62 32 2e 63 6f 6c 32 29 0a 2a 2a 0a  = tab2.col2).**.
2460: 2a 2a 20 77 68 65 72 65 20 74 61 62 31 20 69 73  ** where tab1 is
2470: 20 74 68 65 20 69 53 72 63 27 74 68 20 74 61 62   the iSrc'th tab
2480: 6c 65 20 69 6e 20 53 72 63 4c 69 73 74 20 70 53  le in SrcList pS
2490: 72 63 20 61 6e 64 20 74 61 62 32 20 69 73 20 74  rc and tab2 is t
24a0: 68 65 20 0a 2a 2a 20 28 69 53 72 63 2b 31 29 27  he .** (iSrc+1)'
24b0: 74 68 2e 20 43 6f 6c 75 6d 6e 20 63 6f 6c 31 20  th. Column col1 
24c0: 69 73 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 4c 65  is column iColLe
24d0: 66 74 20 6f 66 20 74 61 62 31 2c 20 61 6e 64 20  ft of tab1, and 
24e0: 63 6f 6c 32 20 69 73 0a 2a 2a 20 63 6f 6c 75 6d  col2 is.** colum
24f0: 6e 20 69 43 6f 6c 52 69 67 68 74 20 6f 66 20 74  n iColRight of t
2500: 61 62 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ab2..*/.static v
2510: 6f 69 64 20 61 64 64 57 68 65 72 65 54 65 72 6d  oid addWhereTerm
2520: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
2530: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
2540: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
2550: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
2560: 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20  ist *pSrc,      
2570: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
2580: 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 69 6e  ist of tables in
2590: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
25a0: 20 20 69 6e 74 20 69 4c 65 66 74 2c 20 20 20 20    int iLeft,    
25b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25c0: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69    /* Index of fi
25d0: 72 73 74 20 74 61 62 6c 65 20 74 6f 20 6a 6f 69  rst table to joi
25e0: 6e 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69  n in pSrc */.  i
25f0: 6e 74 20 69 43 6f 6c 4c 65 66 74 2c 20 20 20 20  nt iColLeft,    
2600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2610: 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d  * Index of colum
2620: 6e 20 69 6e 20 66 69 72 73 74 20 74 61 62 6c 65  n in first table
2630: 20 2a 2f 0a 20 20 69 6e 74 20 69 52 69 67 68 74   */.  int iRight
2640: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2650: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
2660: 66 20 73 65 63 6f 6e 64 20 74 61 62 6c 65 20 69  f second table i
2670: 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e 74 20  n pSrc */.  int 
2680: 69 43 6f 6c 52 69 67 68 74 2c 20 20 20 20 20 20  iColRight,      
2690: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
26a0: 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69  ndex of column i
26b0: 6e 20 73 65 63 6f 6e 64 20 74 61 62 6c 65 20 2a  n second table *
26c0: 2f 0a 20 20 69 6e 74 20 69 73 4f 75 74 65 72 4a  /.  int isOuterJ
26d0: 6f 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  oin,            
26e0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
26f0: 68 69 73 20 69 73 20 61 6e 20 4f 55 54 45 52 20  his is an OUTER 
2700: 6a 6f 69 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a  join */.  Expr *
2710: 2a 70 70 57 68 65 72 65 20 20 20 20 20 20 20 20  *ppWhere        
2720: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
2730: 4f 55 54 3a 20 54 68 65 20 57 48 45 52 45 20 63  OUT: The WHERE c
2740: 6c 61 75 73 65 20 74 6f 20 61 64 64 20 74 6f 20  lause to add to 
2750: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
2760: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
2770: 3b 0a 20 20 45 78 70 72 20 2a 70 45 31 3b 0a 20  ;.  Expr *pE1;. 
2780: 20 45 78 70 72 20 2a 70 45 32 3b 0a 20 20 45 78   Expr *pE2;.  Ex
2790: 70 72 20 2a 70 45 71 3b 0a 0a 20 20 61 73 73 65  pr *pEq;..  asse
27a0: 72 74 28 20 69 4c 65 66 74 3c 69 52 69 67 68 74  rt( iLeft<iRight
27b0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
27c0: 72 63 2d 3e 6e 53 72 63 3e 69 52 69 67 68 74 20  rc->nSrc>iRight 
27d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72  );.  assert( pSr
27e0: 63 2d 3e 61 5b 69 4c 65 66 74 5d 2e 70 54 61 62  c->a[iLeft].pTab
27f0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
2800: 72 63 2d 3e 61 5b 69 52 69 67 68 74 5d 2e 70 54  rc->a[iRight].pT
2810: 61 62 20 29 3b 0a 0a 20 20 70 45 31 20 3d 20 73  ab );..  pE1 = s
2820: 71 6c 69 74 65 33 43 72 65 61 74 65 43 6f 6c 75  qlite3CreateColu
2830: 6d 6e 45 78 70 72 28 64 62 2c 20 70 53 72 63 2c  mnExpr(db, pSrc,
2840: 20 69 4c 65 66 74 2c 20 69 43 6f 6c 4c 65 66 74   iLeft, iColLeft
2850: 29 3b 0a 20 20 70 45 32 20 3d 20 73 71 6c 69 74  );.  pE2 = sqlit
2860: 65 33 43 72 65 61 74 65 43 6f 6c 75 6d 6e 45 78  e3CreateColumnEx
2870: 70 72 28 64 62 2c 20 70 53 72 63 2c 20 69 52 69  pr(db, pSrc, iRi
2880: 67 68 74 2c 20 69 43 6f 6c 52 69 67 68 74 29 3b  ght, iColRight);
2890: 0a 0a 20 20 70 45 71 20 3d 20 73 71 6c 69 74 65  ..  pEq = sqlite
28a0: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
28b0: 4b 5f 45 51 2c 20 70 45 31 2c 20 70 45 32 2c 20  K_EQ, pE1, pE2, 
28c0: 30 29 3b 0a 20 20 69 66 28 20 70 45 71 20 26 26  0);.  if( pEq &&
28d0: 20 69 73 4f 75 74 65 72 4a 6f 69 6e 20 29 7b 0a   isOuterJoin ){.
28e0: 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65      ExprSetPrope
28f0: 72 74 79 28 70 45 71 2c 20 45 50 5f 46 72 6f 6d  rty(pEq, EP_From
2900: 4a 6f 69 6e 29 3b 0a 20 20 20 20 61 73 73 65 72  Join);.    asser
2910: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
2920: 72 74 79 28 70 45 71 2c 20 45 50 5f 54 6f 6b 65  rty(pEq, EP_Toke
2930: 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64  nOnly|EP_Reduced
2940: 29 20 29 3b 0a 20 20 20 20 45 78 70 72 53 65 74  ) );.    ExprSet
2950: 56 56 41 50 72 6f 70 65 72 74 79 28 70 45 71 2c  VVAProperty(pEq,
2960: 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20   EP_NoReduce);. 
2970: 20 20 20 70 45 71 2d 3e 69 52 69 67 68 74 4a 6f     pEq->iRightJo
2980: 69 6e 54 61 62 6c 65 20 3d 20 28 69 31 36 29 70  inTable = (i16)p
2990: 45 32 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 7d 0a  E2->iTable;.  }.
29a0: 20 20 2a 70 70 57 68 65 72 65 20 3d 20 73 71 6c    *ppWhere = sql
29b0: 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20  ite3ExprAnd(db, 
29c0: 2a 70 70 57 68 65 72 65 2c 20 70 45 71 29 3b 0a  *ppWhere, pEq);.
29d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
29e0: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f   EP_FromJoin pro
29f0: 70 65 72 74 79 20 6f 6e 20 61 6c 6c 20 74 65 72  perty on all ter
2a00: 6d 73 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20  ms of the given 
2a10: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 41  expression..** A
2a20: 6e 64 20 73 65 74 20 74 68 65 20 45 78 70 72 2e  nd set the Expr.
2a30: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
2a40: 74 6f 20 69 54 61 62 6c 65 20 66 6f 72 20 65 76  to iTable for ev
2a50: 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65 0a  ery term in the.
2a60: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  ** expression..*
2a70: 2a 0a 2a 2a 20 54 68 65 20 45 50 5f 46 72 6f 6d  *.** The EP_From
2a80: 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20 69 73  Join property is
2a90: 20 75 73 65 64 20 6f 6e 20 74 65 72 6d 73 20 6f   used on terms o
2aa0: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  f an expression 
2ab0: 74 6f 20 74 65 6c 6c 0a 2a 2a 20 74 68 65 20 4c  to tell.** the L
2ac0: 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 70  EFT OUTER JOIN p
2ad0: 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69 63 20  rocessing logic 
2ae0: 74 68 61 74 20 74 68 69 73 20 74 65 72 6d 20 69  that this term i
2af0: 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a  s part of the.**
2b00: 20 6a 6f 69 6e 20 72 65 73 74 72 69 63 74 69 6f   join restrictio
2b10: 6e 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74  n specified in t
2b20: 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  he ON or USING c
2b30: 6c 61 75 73 65 20 61 6e 64 20 6e 6f 74 20 61 20  lause and not a 
2b40: 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20 6d  part.** of the m
2b50: 6f 72 65 20 67 65 6e 65 72 61 6c 20 57 48 45 52  ore general WHER
2b60: 45 20 63 6c 61 75 73 65 2e 20 20 54 68 65 73 65  E clause.  These
2b70: 20 74 65 72 6d 73 20 61 72 65 20 6d 6f 76 65 64   terms are moved
2b80: 20 6f 76 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20   over to the.** 
2b90: 57 48 45 52 45 20 63 6c 61 75 73 65 20 64 75 72  WHERE clause dur
2ba0: 69 6e 67 20 6a 6f 69 6e 20 70 72 6f 63 65 73 73  ing join process
2bb0: 69 6e 67 20 62 75 74 20 77 65 20 6e 65 65 64 20  ing but we need 
2bc0: 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74  to remember that
2bd0: 20 74 68 65 79 0a 2a 2a 20 6f 72 69 67 69 6e 61   they.** origina
2be0: 74 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72  ted in the ON or
2bf0: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a   USING clause..*
2c00: 2a 0a 2a 2a 20 54 68 65 20 45 78 70 72 2e 69 52  *.** The Expr.iR
2c10: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 74 65  ightJoinTable te
2c20: 6c 6c 73 20 74 68 65 20 57 48 45 52 45 20 63 6c  lls the WHERE cl
2c30: 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20  ause processing 
2c40: 74 68 61 74 20 74 68 65 0a 2a 2a 20 65 78 70 72  that the.** expr
2c50: 65 73 73 69 6f 6e 20 64 65 70 65 6e 64 73 20 6f  ession depends o
2c60: 6e 20 74 61 62 6c 65 20 69 52 69 67 68 74 4a 6f  n table iRightJo
2c70: 69 6e 54 61 62 6c 65 20 65 76 65 6e 20 69 66 20  inTable even if 
2c80: 74 68 61 74 20 74 61 62 6c 65 20 69 73 20 6e 6f  that table is no
2c90: 74 0a 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79 20  t.** explicitly 
2ca0: 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68 65  mentioned in the
2cb0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 54 68   expression.  Th
2cc0: 61 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  at information i
2cd0: 73 20 6e 65 65 64 65 64 0a 2a 2a 20 66 6f 72 20  s needed.** for 
2ce0: 63 61 73 65 73 20 6c 69 6b 65 20 74 68 69 73 3a  cases like this:
2cf0: 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54  .**.**    SELECT
2d00: 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20   * FROM t1 LEFT 
2d10: 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d  JOIN t2 ON t1.a=
2d20: 74 32 2e 62 20 41 4e 44 20 74 31 2e 78 3d 35 0a  t2.b AND t1.x=5.
2d30: 2a 2a 0a 2a 2a 20 54 68 65 20 77 68 65 72 65 20  **.** The where 
2d40: 63 6c 61 75 73 65 20 6e 65 65 64 73 20 74 6f 20  clause needs to 
2d50: 64 65 66 65 72 20 74 68 65 20 68 61 6e 64 6c 69  defer the handli
2d60: 6e 67 20 6f 66 20 74 68 65 20 74 31 2e 78 3d 35  ng of the t1.x=5
2d70: 0a 2a 2a 20 74 65 72 6d 20 75 6e 74 69 6c 20 61  .** term until a
2d80: 66 74 65 72 20 74 68 65 20 74 32 20 6c 6f 6f 70  fter the t2 loop
2d90: 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 49   of the join.  I
2da0: 6e 20 74 68 61 74 20 77 61 79 2c 20 61 0a 2a 2a  n that way, a.**
2db0: 20 4e 55 4c 4c 20 74 32 20 72 6f 77 20 77 69 6c   NULL t2 row wil
2dc0: 6c 20 62 65 20 69 6e 73 65 72 74 65 64 20 77 68  l be inserted wh
2dd0: 65 6e 65 76 65 72 20 74 31 2e 78 21 3d 35 2e 20  enever t1.x!=5. 
2de0: 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 0a 2a 2a   If we do not.**
2df0: 20 64 65 66 65 72 20 74 68 65 20 68 61 6e 64 6c   defer the handl
2e00: 69 6e 67 20 6f 66 20 74 31 2e 78 3d 35 2c 20 69  ing of t1.x=5, i
2e10: 74 20 77 69 6c 6c 20 62 65 20 70 72 6f 63 65 73  t will be proces
2e20: 73 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a  sed immediately.
2e30: 2a 2a 20 61 66 74 65 72 20 74 68 65 20 74 31 20  ** after the t1 
2e40: 6c 6f 6f 70 20 61 6e 64 20 72 6f 77 73 20 77 69  loop and rows wi
2e50: 74 68 20 74 31 2e 78 21 3d 35 20 77 69 6c 6c 20  th t1.x!=5 will 
2e60: 6e 65 76 65 72 20 61 70 70 65 61 72 20 69 6e 0a  never appear in.
2e70: 2a 2a 20 74 68 65 20 6f 75 74 70 75 74 2c 20 77  ** the output, w
2e80: 68 69 63 68 20 69 73 20 69 6e 63 6f 72 72 65 63  hich is incorrec
2e90: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
2ea0: 64 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 45 78  d setJoinExpr(Ex
2eb0: 70 72 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c  pr *p, int iTabl
2ec0: 65 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 20 29  e){.  while( p )
2ed0: 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f  {.    ExprSetPro
2ee0: 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d  perty(p, EP_From
2ef0: 4a 6f 69 6e 29 3b 0a 20 20 20 20 61 73 73 65 72  Join);.    asser
2f00: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
2f10: 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f  rty(p, EP_TokenO
2f20: 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20  nly|EP_Reduced) 
2f30: 29 3b 0a 20 20 20 20 45 78 70 72 53 65 74 56 56  );.    ExprSetVV
2f40: 41 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  AProperty(p, EP_
2f50: 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20 70  NoReduce);.    p
2f60: 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
2f70: 65 20 3d 20 28 69 31 36 29 69 54 61 62 6c 65 3b  e = (i16)iTable;
2f80: 0a 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72  .    setJoinExpr
2f90: 28 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c  (p->pLeft, iTabl
2fa0: 65 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70  e);.    p = p->p
2fb0: 52 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a 0a 2f  Right;.  } .}../
2fc0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2fd0: 65 20 70 72 6f 63 65 73 73 65 73 20 74 68 65 20  e processes the 
2fe0: 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  join information
2ff0: 20 66 6f 72 20 61 20 53 45 4c 45 43 54 20 73 74   for a SELECT st
3000: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e 20 61  atement..** ON a
3010: 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
3020: 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20 69   are converted i
3030: 6e 74 6f 20 65 78 74 72 61 20 74 65 72 6d 73 20  nto extra terms 
3040: 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
3050: 75 73 65 2e 0a 2a 2a 20 4e 41 54 55 52 41 4c 20  use..** NATURAL 
3060: 6a 6f 69 6e 73 20 61 6c 73 6f 20 63 72 65 61 74  joins also creat
3070: 65 20 65 78 74 72 61 20 57 48 45 52 45 20 63 6c  e extra WHERE cl
3080: 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 0a 2a  ause terms..**.*
3090: 2a 20 54 68 65 20 74 65 72 6d 73 20 6f 66 20 61  * The terms of a
30a0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 72 65   FROM clause are
30b0: 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
30c0: 65 20 53 65 6c 65 63 74 2e 70 53 72 63 20 73 74  e Select.pSrc st
30d0: 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68 65 20  ructure..** The 
30e0: 6c 65 66 74 20 6d 6f 73 74 20 74 61 62 6c 65 20  left most table 
30f0: 69 73 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  is the first ent
3100: 72 79 20 69 6e 20 53 65 6c 65 63 74 2e 70 53 72  ry in Select.pSr
3110: 63 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f  c.  The right-mo
3120: 73 74 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 74  st.** table is t
3130: 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2e 20 20  he last entry.  
3140: 54 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f  The join operato
3150: 72 20 69 73 20 68 65 6c 64 20 69 6e 20 74 68 65  r is held in the
3160: 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68 65   entry to.** the
3170: 20 6c 65 66 74 2e 20 20 54 68 75 73 20 65 6e 74   left.  Thus ent
3180: 72 79 20 30 20 63 6f 6e 74 61 69 6e 73 20 74 68  ry 0 contains th
3190: 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20  e join operator 
31a0: 66 6f 72 20 74 68 65 20 6a 6f 69 6e 20 62 65 74  for the join bet
31b0: 77 65 65 6e 0a 2a 2a 20 65 6e 74 72 69 65 73 20  ween.** entries 
31c0: 30 20 61 6e 64 20 31 2e 20 20 41 6e 79 20 4f 4e  0 and 1.  Any ON
31d0: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
31e0: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
31f0: 68 20 74 68 65 20 6a 6f 69 6e 20 61 72 65 0a 2a  h the join are.*
3200: 2a 20 61 6c 73 6f 20 61 74 74 61 63 68 65 64 20  * also attached 
3210: 74 6f 20 74 68 65 20 6c 65 66 74 20 65 6e 74 72  to the left entr
3220: 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  y..**.** This ro
3230: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
3240: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
3250: 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a  rs encountered..
3260: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
3270: 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28  liteProcessJoin(
3280: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
3290: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 72 63  elect *p){.  Src
32a0: 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20  List *pSrc;     
32b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32c0: 41 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68  All tables in th
32d0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
32e0: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20  .  int i, j;    
32f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3300: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
3310: 65 72 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ers */.  struct 
3320: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c  SrcList_item *pL
3330: 65 66 74 3b 20 20 20 20 20 2f 2a 20 4c 65 66 74  eft;     /* Left
3340: 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f 69   table being joi
3350: 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ned */.  struct 
3360: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 52  SrcList_item *pR
3370: 69 67 68 74 3b 20 20 20 20 2f 2a 20 52 69 67 68  ight;    /* Righ
3380: 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f  t table being jo
3390: 69 6e 65 64 20 2a 2f 0a 0a 20 20 70 53 72 63 20  ined */..  pSrc 
33a0: 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 4c 65  = p->pSrc;.  pLe
33b0: 66 74 20 3d 20 26 70 53 72 63 2d 3e 61 5b 30 5d  ft = &pSrc->a[0]
33c0: 3b 0a 20 20 70 52 69 67 68 74 20 3d 20 26 70 4c  ;.  pRight = &pL
33d0: 65 66 74 5b 31 5d 3b 0a 20 20 66 6f 72 28 69 3d  eft[1];.  for(i=
33e0: 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 2d  0; i<pSrc->nSrc-
33f0: 31 3b 20 69 2b 2b 2c 20 70 52 69 67 68 74 2b 2b  1; i++, pRight++
3400: 2c 20 70 4c 65 66 74 2b 2b 29 7b 0a 20 20 20 20  , pLeft++){.    
3410: 54 61 62 6c 65 20 2a 70 4c 65 66 74 54 61 62 20  Table *pLeftTab 
3420: 3d 20 70 4c 65 66 74 2d 3e 70 54 61 62 3b 0a 20  = pLeft->pTab;. 
3430: 20 20 20 54 61 62 6c 65 20 2a 70 52 69 67 68 74     Table *pRight
3440: 54 61 62 20 3d 20 70 52 69 67 68 74 2d 3e 70 54  Tab = pRight->pT
3450: 61 62 3b 0a 20 20 20 20 69 6e 74 20 69 73 4f 75  ab;.    int isOu
3460: 74 65 72 3b 0a 0a 20 20 20 20 69 66 28 20 4e 45  ter;..    if( NE
3470: 56 45 52 28 70 4c 65 66 74 54 61 62 3d 3d 30 20  VER(pLeftTab==0 
3480: 7c 7c 20 70 52 69 67 68 74 54 61 62 3d 3d 30 29  || pRightTab==0)
3490: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
34a0: 20 69 73 4f 75 74 65 72 20 3d 20 28 70 52 69 67   isOuter = (pRig
34b0: 68 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  ht->jointype & J
34c0: 54 5f 4f 55 54 45 52 29 21 3d 30 3b 0a 0a 20 20  T_OUTER)!=0;..  
34d0: 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 4e 41    /* When the NA
34e0: 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 20 69 73  TURAL keyword is
34f0: 20 70 72 65 73 65 6e 74 2c 20 61 64 64 20 57 48   present, add WH
3500: 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
3510: 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65 76 65 72   for.    ** ever
3520: 79 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74 68  y column that th
3530: 65 20 74 77 6f 20 74 61 62 6c 65 73 20 68 61 76  e two tables hav
3540: 65 20 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20 20 20  e in common..   
3550: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67   */.    if( pRig
3560: 68 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  ht->jointype & J
3570: 54 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20 20 20  T_NATURAL ){.   
3580: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70     if( pRight->p
3590: 4f 6e 20 7c 7c 20 70 52 69 67 68 74 2d 3e 70 55  On || pRight->pU
35a0: 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20  sing ){.        
35b0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
35c0: 70 50 61 72 73 65 2c 20 22 61 20 4e 41 54 55 52  pParse, "a NATUR
35d0: 41 4c 20 6a 6f 69 6e 20 6d 61 79 20 6e 6f 74 20  AL join may not 
35e0: 68 61 76 65 20 22 0a 20 20 20 20 20 20 20 20 20  have ".         
35f0: 20 20 22 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e    "an ON or USIN
3600: 47 20 63 6c 61 75 73 65 22 2c 20 30 29 3b 0a 20  G clause", 0);. 
3610: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
3620: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
3630: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 52 69 67 68 74  or(j=0; j<pRight
3640: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  Tab->nCol; j++){
3650: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
3660: 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20  Name;   /* Name 
3670: 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  of column in the
3680: 20 72 69 67 68 74 20 74 61 62 6c 65 20 2a 2f 0a   right table */.
3690: 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66          int iLef
36a0: 74 3b 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 69  t;     /* Matchi
36b0: 6e 67 20 6c 65 66 74 20 74 61 62 6c 65 20 2a 2f  ng left table */
36c0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65  .        int iLe
36d0: 66 74 43 6f 6c 3b 20 20 2f 2a 20 4d 61 74 63 68  ftCol;  /* Match
36e0: 69 6e 67 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  ing column in th
36f0: 65 20 6c 65 66 74 20 74 61 62 6c 65 20 2a 2f 0a  e left table */.
3700: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
3710: 20 70 52 69 67 68 74 54 61 62 2d 3e 61 43 6f 6c   pRightTab->aCol
3720: 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [j].zName;.     
3730: 20 20 20 69 66 28 20 74 61 62 6c 65 41 6e 64 43     if( tableAndC
3740: 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72 63 2c  olumnIndex(pSrc,
3750: 20 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c   i+1, zName, &iL
3760: 65 66 74 2c 20 26 69 4c 65 66 74 43 6f 6c 29 20  eft, &iLeftCol) 
3770: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 64 64  ){.          add
3780: 57 68 65 72 65 54 65 72 6d 28 70 50 61 72 73 65  WhereTerm(pParse
3790: 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c 20 69  , pSrc, iLeft, i
37a0: 4c 65 66 74 43 6f 6c 2c 20 69 2b 31 2c 20 6a 2c  LeftCol, i+1, j,
37b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
37c0: 20 20 20 20 20 20 20 20 69 73 4f 75 74 65 72 2c          isOuter,
37d0: 20 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20   &p->pWhere);.  
37e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
37f0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69      }..    /* Di
3800: 73 61 6c 6c 6f 77 20 62 6f 74 68 20 4f 4e 20 61  sallow both ON a
3810: 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
3820: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f 69   in the same joi
3830: 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  n.    */.    if(
3840: 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 26 26 20   pRight->pOn && 
3850: 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29  pRight->pUsing )
3860: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
3870: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
3880: 22 63 61 6e 6e 6f 74 20 68 61 76 65 20 62 6f 74  "cannot have bot
3890: 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 22  h ON and USING "
38a0: 0a 20 20 20 20 20 20 20 20 22 63 6c 61 75 73 65  .        "clause
38b0: 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f  s in the same jo
38c0: 69 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  in");.      retu
38d0: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rn 1;.    }..   
38e0: 20 2f 2a 20 41 64 64 20 74 68 65 20 4f 4e 20 63   /* Add the ON c
38f0: 6c 61 75 73 65 20 74 6f 20 74 68 65 20 65 6e 64  lause to the end
3900: 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
3910: 61 75 73 65 2c 20 63 6f 6e 6e 65 63 74 65 64 20  ause, connected 
3920: 62 79 0a 20 20 20 20 2a 2a 20 61 6e 20 41 4e 44  by.    ** an AND
3930: 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a   operator..    *
3940: 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74  /.    if( pRight
3950: 2d 3e 70 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69  ->pOn ){.      i
3960: 66 28 20 69 73 4f 75 74 65 72 20 29 20 73 65 74  f( isOuter ) set
3970: 4a 6f 69 6e 45 78 70 72 28 70 52 69 67 68 74 2d  JoinExpr(pRight-
3980: 3e 70 4f 6e 2c 20 70 52 69 67 68 74 2d 3e 69 43  >pOn, pRight->iC
3990: 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 70 2d  ursor);.      p-
39a0: 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65  >pWhere = sqlite
39b0: 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d  3ExprAnd(pParse-
39c0: 3e 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20  >db, p->pWhere, 
39d0: 70 52 69 67 68 74 2d 3e 70 4f 6e 29 3b 0a 20 20  pRight->pOn);.  
39e0: 20 20 20 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20      pRight->pOn 
39f0: 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
3a00: 2f 2a 20 43 72 65 61 74 65 20 65 78 74 72 61 20  /* Create extra 
3a10: 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 57 48 45  terms on the WHE
3a20: 52 45 20 63 6c 61 75 73 65 20 66 6f 72 20 65 61  RE clause for ea
3a30: 63 68 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 0a  ch column named.
3a40: 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 55 53      ** in the US
3a50: 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 45 78 61  ING clause.  Exa
3a60: 6d 70 6c 65 3a 20 49 66 20 74 68 65 20 74 77 6f  mple: If the two
3a70: 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f   tables to be jo
3a80: 69 6e 65 64 20 61 72 65 20 0a 20 20 20 20 2a 2a  ined are .    **
3a90: 20 41 20 61 6e 64 20 42 20 61 6e 64 20 74 68 65   A and B and the
3aa0: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6e 61   USING clause na
3ab0: 6d 65 73 20 58 2c 20 59 2c 20 61 6e 64 20 5a 2c  mes X, Y, and Z,
3ac0: 20 74 68 65 6e 20 61 64 64 20 74 68 69 73 0a 20   then add this. 
3ad0: 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 57 48 45     ** to the WHE
3ae0: 52 45 20 63 6c 61 75 73 65 3a 20 20 20 20 41 2e  RE clause:    A.
3af0: 58 3d 42 2e 58 20 41 4e 44 20 41 2e 59 3d 42 2e  X=B.X AND A.Y=B.
3b00: 59 20 41 4e 44 20 41 2e 5a 3d 42 2e 5a 0a 20 20  Y AND A.Z=B.Z.  
3b10: 20 20 2a 2a 20 52 65 70 6f 72 74 20 61 6e 20 65    ** Report an e
3b20: 72 72 6f 72 20 69 66 20 61 6e 79 20 63 6f 6c 75  rror if any colu
3b30: 6d 6e 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20  mn mentioned in 
3b40: 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65  the USING clause
3b50: 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 63   is.    ** not c
3b60: 6f 6e 74 61 69 6e 65 64 20 69 6e 20 62 6f 74 68  ontained in both
3b70: 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f   tables to be jo
3b80: 69 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ined..    */.   
3b90: 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 55 73   if( pRight->pUs
3ba0: 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 49 64 4c  ing ){.      IdL
3bb0: 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 52 69  ist *pList = pRi
3bc0: 67 68 74 2d 3e 70 55 73 69 6e 67 3b 0a 20 20 20  ght->pUsing;.   
3bd0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c     for(j=0; j<pL
3be0: 69 73 74 2d 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a  ist->nId; j++){.
3bf0: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
3c00: 61 6d 65 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ame;     /* Name
3c10: 20 6f 66 20 74 68 65 20 74 65 72 6d 20 69 6e 20   of the term in 
3c20: 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65  the USING clause
3c30: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
3c40: 69 4c 65 66 74 3b 20 20 20 20 20 20 20 2f 2a 20  iLeft;       /* 
3c50: 54 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 65 66  Table on the lef
3c60: 74 20 77 69 74 68 20 6d 61 74 63 68 69 6e 67 20  t with matching 
3c70: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20  column name */. 
3c80: 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66 74         int iLeft
3c90: 43 6f 6c 3b 20 20 20 20 2f 2a 20 43 6f 6c 75 6d  Col;    /* Colum
3ca0: 6e 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63  n number of matc
3cb0: 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74  hing column on t
3cc0: 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20 20 20  he left */.     
3cd0: 20 20 20 69 6e 74 20 69 52 69 67 68 74 43 6f 6c     int iRightCol
3ce0: 3b 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75  ;   /* Column nu
3cf0: 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 69 6e 67  mber of matching
3d00: 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65 20 72   column on the r
3d10: 69 67 68 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20  ight */..       
3d20: 20 7a 4e 61 6d 65 20 3d 20 70 4c 69 73 74 2d 3e   zName = pList->
3d30: 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  a[j].zName;.    
3d40: 20 20 20 20 69 52 69 67 68 74 43 6f 6c 20 3d 20      iRightCol = 
3d50: 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 52 69 67  columnIndex(pRig
3d60: 68 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  htTab, zName);. 
3d70: 20 20 20 20 20 20 20 69 66 28 20 69 52 69 67 68         if( iRigh
3d80: 74 43 6f 6c 3c 30 0a 20 20 20 20 20 20 20 20 20  tCol<0.         
3d90: 7c 7c 20 21 74 61 62 6c 65 41 6e 64 43 6f 6c 75  || !tableAndColu
3da0: 6d 6e 49 6e 64 65 78 28 70 53 72 63 2c 20 69 2b  mnIndex(pSrc, i+
3db0: 31 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c 65 66 74  1, zName, &iLeft
3dc0: 2c 20 26 69 4c 65 66 74 43 6f 6c 29 0a 20 20 20  , &iLeftCol).   
3dd0: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
3de0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
3df0: 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f  g(pParse, "canno
3e00: 74 20 6a 6f 69 6e 20 75 73 69 6e 67 20 63 6f 6c  t join using col
3e10: 75 6d 6e 20 25 73 20 2d 20 63 6f 6c 75 6d 6e 20  umn %s - column 
3e20: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 6e  ".            "n
3e30: 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20 62 6f  ot present in bo
3e40: 74 68 20 74 61 62 6c 65 73 22 2c 20 7a 4e 61 6d  th tables", zNam
3e50: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  e);.          re
3e60: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
3e70: 7d 0a 20 20 20 20 20 20 20 20 61 64 64 57 68 65  }.        addWhe
3e80: 72 65 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70  reTerm(pParse, p
3e90: 53 72 63 2c 20 69 4c 65 66 74 2c 20 69 4c 65 66  Src, iLeft, iLef
3ea0: 74 43 6f 6c 2c 20 69 2b 31 2c 20 69 52 69 67 68  tCol, i+1, iRigh
3eb0: 74 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  tCol,.          
3ec0: 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 75 74             isOut
3ed0: 65 72 2c 20 26 70 2d 3e 70 57 68 65 72 65 29 3b  er, &p->pWhere);
3ee0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
3ef0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
3f00: 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  ../* Forward ref
3f10: 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63  erence */.static
3f20: 20 4b 65 79 49 6e 66 6f 20 2a 6b 65 79 49 6e 66   KeyInfo *keyInf
3f30: 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20  oFromExprList(. 
3f40: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
3f50: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
3f60: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
3f70: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
3f80: 20 20 20 2f 2a 20 46 6f 72 6d 20 74 68 65 20 4b     /* Form the K
3f90: 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 66 72  eyInfo object fr
3fa0: 6f 6d 20 74 68 69 73 20 45 78 70 72 4c 69 73 74  om this ExprList
3fb0: 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 74   */.  int iStart
3fc0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65  ,          /* Be
3fd0: 67 69 6e 20 77 69 74 68 20 74 68 69 73 20 63 6f  gin with this co
3fe0: 6c 75 6d 6e 20 6f 66 20 70 4c 69 73 74 20 2a 2f  lumn of pList */
3ff0: 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20 20 20  .  int nExtra   
4000: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74          /* Add t
4010: 68 69 73 20 6d 61 6e 79 20 65 78 74 72 61 20 63  his many extra c
4020: 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20 65 6e  olumns to the en
4030: 64 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47  d */.);../*.** G
4040: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
4050: 74 20 77 69 6c 6c 20 70 75 73 68 20 74 68 65 20  t will push the 
4060: 72 65 63 6f 72 64 20 69 6e 20 72 65 67 69 73 74  record in regist
4070: 65 72 73 20 72 65 67 44 61 74 61 0a 2a 2a 20 74  ers regData.** t
4080: 68 72 6f 75 67 68 20 72 65 67 44 61 74 61 2b 6e  hrough regData+n
4090: 44 61 74 61 2d 31 20 6f 6e 74 6f 20 74 68 65 20  Data-1 onto the 
40a0: 73 6f 72 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  sorter..*/.stati
40b0: 63 20 76 6f 69 64 20 70 75 73 68 4f 6e 74 6f 53  c void pushOntoS
40c0: 6f 72 74 65 72 28 0a 20 20 50 61 72 73 65 20 2a  orter(.  Parse *
40d0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
40e0: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
40f0: 74 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a  t */.  SortCtx *
4100: 70 53 6f 72 74 2c 20 20 20 20 20 20 20 20 2f 2a  pSort,        /*
4110: 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   Information abo
4120: 75 74 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  ut the ORDER BY 
4130: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 53 65 6c 65  clause */.  Sele
4140: 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20  ct *pSelect,    
4150: 20 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20     /* The whole 
4160: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
4170: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 44 61 74   */.  int regDat
4180: 61 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  a,           /* 
4190: 46 69 72 73 74 20 72 65 67 69 73 74 65 72 20 68  First register h
41a0: 6f 6c 64 69 6e 67 20 64 61 74 61 20 74 6f 20 62  olding data to b
41b0: 65 20 73 6f 72 74 65 64 20 2a 2f 0a 20 20 69 6e  e sorted */.  in
41c0: 74 20 6e 44 61 74 61 2c 20 20 20 20 20 20 20 20  t nData,        
41d0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
41e0: 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  f elements in th
41f0: 65 20 64 61 74 61 20 61 72 72 61 79 20 2a 2f 0a  e data array */.
4200: 20 20 69 6e 74 20 6e 50 72 65 66 69 78 52 65 67    int nPrefixReg
4210: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2e 20           /* No. 
4220: 6f 66 20 72 65 67 20 70 72 69 6f 72 20 74 6f 20  of reg prior to 
4230: 72 65 67 44 61 74 61 20 61 76 61 69 6c 61 62 6c  regData availabl
4240: 65 20 66 6f 72 20 75 73 65 20 2a 2f 0a 29 7b 0a  e for use */.){.
4250: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
4260: 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20  se->pVdbe;      
4270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4280: 20 20 20 2f 2a 20 53 74 6d 74 20 75 6e 64 65 72     /* Stmt under
4290: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
42a0: 0a 20 20 69 6e 74 20 62 53 65 71 20 3d 20 28 28  .  int bSeq = ((
42b0: 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73  pSort->sortFlags
42c0: 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53   & SORTFLAG_UseS
42d0: 6f 72 74 65 72 29 3d 3d 30 29 3b 0a 20 20 69 6e  orter)==0);.  in
42e0: 74 20 6e 45 78 70 72 20 3d 20 70 53 6f 72 74 2d  t nExpr = pSort-
42f0: 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
4300: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
4310: 2a 20 4e 6f 2e 20 6f 66 20 4f 52 44 45 52 20 42  * No. of ORDER B
4320: 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 69 6e 74  Y terms */.  int
4330: 20 6e 42 61 73 65 20 3d 20 6e 45 78 70 72 20 2b   nBase = nExpr +
4340: 20 62 53 65 71 20 2b 20 6e 44 61 74 61 3b 20 20   bSeq + nData;  
4350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4360: 20 46 69 65 6c 64 73 20 69 6e 20 73 6f 72 74 65   Fields in sorte
4370: 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  r record */.  in
4380: 74 20 72 65 67 42 61 73 65 3b 20 20 20 20 20 20  t regBase;      
4390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
43b0: 2a 20 52 65 67 73 20 66 6f 72 20 73 6f 72 74 65  * Regs for sorte
43c0: 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  r record */.  in
43d0: 74 20 72 65 67 52 65 63 6f 72 64 20 3d 20 2b 2b  t regRecord = ++
43e0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20 20 20  pParse->nMem;   
43f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4400: 2a 20 41 73 73 65 6d 62 6c 65 64 20 73 6f 72 74  * Assembled sort
4410: 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69  er record */.  i
4420: 6e 74 20 6e 4f 42 53 61 74 20 3d 20 70 53 6f 72  nt nOBSat = pSor
4430: 74 2d 3e 6e 4f 42 53 61 74 3b 20 20 20 20 20 20  t->nOBSat;      
4440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4450: 2f 2a 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  /* ORDER BY term
4460: 73 20 74 6f 20 73 6b 69 70 20 2a 2f 0a 20 20 69  s to skip */.  i
4470: 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20  nt op;          
4480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4490: 20 20 2f 2a 20 4f 70 63 6f 64 65 20 74 6f 20 61    /* Opcode to a
44a0: 64 64 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64  dd sorter record
44b0: 20 74 6f 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20   to sorter */.  
44c0: 69 6e 74 20 69 4c 69 6d 69 74 3b 20 20 20 20 20  int iLimit;     
44d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44e0: 20 20 20 2f 2a 20 4c 49 4d 49 54 20 63 6f 75 6e     /* LIMIT coun
44f0: 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ter */..  assert
4500: 28 20 62 53 65 71 3d 3d 30 20 7c 7c 20 62 53 65  ( bSeq==0 || bSe
4510: 71 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 6e 50  q==1 );.  if( nP
4520: 72 65 66 69 78 52 65 67 20 29 7b 0a 20 20 20 20  refixReg ){.    
4530: 61 73 73 65 72 74 28 20 6e 50 72 65 66 69 78 52  assert( nPrefixR
4540: 65 67 3d 3d 6e 45 78 70 72 2b 62 53 65 71 20 29  eg==nExpr+bSeq )
4550: 3b 0a 20 20 20 20 72 65 67 42 61 73 65 20 3d 20  ;.    regBase = 
4560: 72 65 67 44 61 74 61 20 2d 20 6e 45 78 70 72 20  regData - nExpr 
4570: 2d 20 62 53 65 71 3b 0a 20 20 7d 65 6c 73 65 7b  - bSeq;.  }else{
4580: 0a 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 70  .    regBase = p
4590: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b  Parse->nMem + 1;
45a0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
45b0: 6d 20 2b 3d 20 6e 42 61 73 65 3b 0a 20 20 7d 0a  m += nBase;.  }.
45c0: 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 65 63    assert( pSelec
45d0: 74 2d 3e 69 4f 66 66 73 65 74 3d 3d 30 20 7c 7c  t->iOffset==0 ||
45e0: 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74   pSelect->iLimit
45f0: 21 3d 30 20 29 3b 0a 20 20 69 4c 69 6d 69 74 20  !=0 );.  iLimit 
4600: 3d 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73  = pSelect->iOffs
4610: 65 74 20 3f 20 70 53 65 6c 65 63 74 2d 3e 69 4f  et ? pSelect->iO
4620: 66 66 73 65 74 2b 31 20 3a 20 70 53 65 6c 65 63  ffset+1 : pSelec
4630: 74 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 70 53 6f  t->iLimit;.  pSo
4640: 72 74 2d 3e 6c 61 62 65 6c 44 6f 6e 65 20 3d 20  rt->labelDone = 
4650: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
4660: 61 62 65 6c 28 76 29 3b 0a 20 20 73 71 6c 69 74  abel(v);.  sqlit
4670: 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
4680: 73 74 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74  st(pParse, pSort
4690: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 72 65 67 42  ->pOrderBy, regB
46a0: 61 73 65 2c 20 53 51 4c 49 54 45 5f 45 43 45 4c  ase, SQLITE_ECEL
46b0: 5f 44 55 50 29 3b 0a 20 20 69 66 28 20 62 53 65  _DUP);.  if( bSe
46c0: 71 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  q ){.    sqlite3
46d0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
46e0: 5f 53 65 71 75 65 6e 63 65 2c 20 70 53 6f 72 74  _Sequence, pSort
46f0: 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72 65 67 42  ->iECursor, regB
4700: 61 73 65 2b 6e 45 78 70 72 29 3b 0a 20 20 7d 0a  ase+nExpr);.  }.
4710: 20 20 69 66 28 20 6e 50 72 65 66 69 78 52 65 67    if( nPrefixReg
4720: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
4730: 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70  e3ExprCodeMove(p
4740: 50 61 72 73 65 2c 20 72 65 67 44 61 74 61 2c 20  Parse, regData, 
4750: 72 65 67 42 61 73 65 2b 6e 45 78 70 72 2b 62 53  regBase+nExpr+bS
4760: 65 71 2c 20 6e 44 61 74 61 29 3b 0a 20 20 7d 0a  eq, nData);.  }.
4770: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4780: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
4790: 63 6f 72 64 2c 20 72 65 67 42 61 73 65 2b 6e 4f  cord, regBase+nO
47a0: 42 53 61 74 2c 20 6e 42 61 73 65 2d 6e 4f 42 53  BSat, nBase-nOBS
47b0: 61 74 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  at, regRecord);.
47c0: 20 20 69 66 28 20 6e 4f 42 53 61 74 3e 30 20 29    if( nOBSat>0 )
47d0: 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 50 72 65  {.    int regPre
47e0: 76 4b 65 79 3b 20 20 20 2f 2a 20 54 68 65 20 66  vKey;   /* The f
47f0: 69 72 73 74 20 6e 4f 42 53 61 74 20 63 6f 6c 75  irst nOBSat colu
4800: 6d 6e 73 20 6f 66 20 74 68 65 20 70 72 65 76 69  mns of the previ
4810: 6f 75 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20 69  ous row */.    i
4820: 6e 74 20 61 64 64 72 46 69 72 73 74 3b 20 20 20  nt addrFirst;   
4830: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
4840: 68 65 20 4f 50 5f 49 66 4e 6f 74 20 6f 70 63 6f  he OP_IfNot opco
4850: 64 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64  de */.    int ad
4860: 64 72 4a 6d 70 3b 20 20 20 20 20 20 2f 2a 20 41  drJmp;      /* A
4870: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 4f 50  ddress of the OP
4880: 5f 4a 75 6d 70 20 6f 70 63 6f 64 65 20 2a 2f 0a  _Jump opcode */.
4890: 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b      VdbeOp *pOp;
48a0: 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20        /* Opcode 
48b0: 74 68 61 74 20 6f 70 65 6e 73 20 74 68 65 20 73  that opens the s
48c0: 6f 72 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  orter */.    int
48d0: 20 6e 4b 65 79 3b 20 20 20 20 20 20 20 20 20 2f   nKey;         /
48e0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 6f 72 74  * Number of sort
48f0: 69 6e 67 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 2c  ing key columns,
4900: 20 69 6e 63 6c 75 64 69 6e 67 20 4f 50 5f 53 65   including OP_Se
4910: 71 75 65 6e 63 65 20 2a 2f 0a 20 20 20 20 4b 65  quence */.    Ke
4920: 79 49 6e 66 6f 20 2a 70 4b 49 3b 20 20 20 20 20  yInfo *pKI;     
4930: 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 4b 65 79 49  /* Original KeyI
4940: 6e 66 6f 20 6f 6e 20 74 68 65 20 73 6f 72 74 65  nfo on the sorte
4950: 72 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20  r table */..    
4960: 72 65 67 50 72 65 76 4b 65 79 20 3d 20 70 50 61  regPrevKey = pPa
4970: 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20  rse->nMem+1;.   
4980: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
4990: 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a   pSort->nOBSat;.
49a0: 20 20 20 20 6e 4b 65 79 20 3d 20 6e 45 78 70 72      nKey = nExpr
49b0: 20 2d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74   - pSort->nOBSat
49c0: 20 2b 20 62 53 65 71 3b 0a 20 20 20 20 69 66 28   + bSeq;.    if(
49d0: 20 62 53 65 71 20 29 7b 0a 20 20 20 20 20 20 61   bSeq ){.      a
49e0: 64 64 72 46 69 72 73 74 20 3d 20 73 71 6c 69 74  ddrFirst = sqlit
49f0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
4a00: 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67 42 61 73  OP_IfNot, regBas
4a10: 65 2b 6e 45 78 70 72 29 3b 20 0a 20 20 20 20 7d  e+nExpr); .    }
4a20: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 64 64 72  else{.      addr
4a30: 46 69 72 73 74 20 3d 20 73 71 6c 69 74 65 33 56  First = sqlite3V
4a40: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
4a50: 53 65 71 75 65 6e 63 65 54 65 73 74 2c 20 70 53  SequenceTest, pS
4a60: 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a  ort->iECursor);.
4a70: 20 20 20 20 7d 0a 20 20 20 20 56 64 62 65 43 6f      }.    VdbeCo
4a80: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73  verage(v);.    s
4a90: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
4aa0: 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20  (v, OP_Compare, 
4ab0: 72 65 67 50 72 65 76 4b 65 79 2c 20 72 65 67 42  regPrevKey, regB
4ac0: 61 73 65 2c 20 70 53 6f 72 74 2d 3e 6e 4f 42 53  ase, pSort->nOBS
4ad0: 61 74 29 3b 0a 20 20 20 20 70 4f 70 20 3d 20 73  at);.    pOp = s
4ae0: 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
4af0: 76 2c 20 70 53 6f 72 74 2d 3e 61 64 64 72 53 6f  v, pSort->addrSo
4b00: 72 74 49 6e 64 65 78 29 3b 0a 20 20 20 20 69 66  rtIndex);.    if
4b10: 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  ( pParse->db->ma
4b20: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
4b30: 75 72 6e 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 32  urn;.    pOp->p2
4b40: 20 3d 20 6e 4b 65 79 20 2b 20 6e 44 61 74 61 3b   = nKey + nData;
4b50: 0a 20 20 20 20 70 4b 49 20 3d 20 70 4f 70 2d 3e  .    pKI = pOp->
4b60: 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20  p4.pKeyInfo;.   
4b70: 20 6d 65 6d 73 65 74 28 70 4b 49 2d 3e 61 53 6f   memset(pKI->aSo
4b80: 72 74 4f 72 64 65 72 2c 20 30 2c 20 70 4b 49 2d  rtOrder, 0, pKI-
4b90: 3e 6e 46 69 65 6c 64 29 3b 20 2f 2a 20 4d 61 6b  >nField); /* Mak
4ba0: 65 73 20 4f 50 5f 4a 75 6d 70 20 62 65 6c 6f 77  es OP_Jump below
4bb0: 20 74 65 73 74 61 62 6c 65 20 2a 2f 0a 20 20 20   testable */.   
4bc0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
4bd0: 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61  geP4(v, -1, (cha
4be0: 72 2a 29 70 4b 49 2c 20 50 34 5f 4b 45 59 49 4e  r*)pKI, P4_KEYIN
4bf0: 46 4f 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  FO);.    testcas
4c00: 65 28 20 70 4b 49 2d 3e 6e 58 46 69 65 6c 64 3e  e( pKI->nXField>
4c10: 32 20 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  2 );.    pOp->p4
4c20: 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49  .pKeyInfo = keyI
4c30: 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
4c40: 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2d 3e 70  pParse, pSort->p
4c50: 4f 72 64 65 72 42 79 2c 20 6e 4f 42 53 61 74 2c  OrderBy, nOBSat,
4c60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c80: 20 20 20 20 20 20 20 20 20 20 20 20 70 4b 49 2d              pKI-
4c90: 3e 6e 58 46 69 65 6c 64 2d 31 29 3b 0a 20 20 20  >nXField-1);.   
4ca0: 20 61 64 64 72 4a 6d 70 20 3d 20 73 71 6c 69 74   addrJmp = sqlit
4cb0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
4cc0: 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  r(v);.    sqlite
4cd0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
4ce0: 50 5f 4a 75 6d 70 2c 20 61 64 64 72 4a 6d 70 2b  P_Jump, addrJmp+
4cf0: 31 2c 20 30 2c 20 61 64 64 72 4a 6d 70 2b 31 29  1, 0, addrJmp+1)
4d00: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
4d10: 29 3b 0a 20 20 20 20 70 53 6f 72 74 2d 3e 6c 61  );.    pSort->la
4d20: 62 65 6c 42 6b 4f 75 74 20 3d 20 73 71 6c 69 74  belBkOut = sqlit
4d30: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
4d40: 76 29 3b 0a 20 20 20 20 70 53 6f 72 74 2d 3e 72  v);.    pSort->r
4d50: 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61  egReturn = ++pPa
4d60: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73  rse->nMem;.    s
4d70: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
4d80: 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 53  (v, OP_Gosub, pS
4d90: 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20  ort->regReturn, 
4da0: 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75  pSort->labelBkOu
4db0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
4dc0: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
4dd0: 52 65 73 65 74 53 6f 72 74 65 72 2c 20 70 53 6f  ResetSorter, pSo
4de0: 72 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20  rt->iECursor);. 
4df0: 20 20 20 69 66 28 20 69 4c 69 6d 69 74 20 29 7b     if( iLimit ){
4e00: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
4e10: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
4e20: 66 4e 6f 74 2c 20 69 4c 69 6d 69 74 2c 20 70 53  fNot, iLimit, pS
4e30: 6f 72 74 2d 3e 6c 61 62 65 6c 44 6f 6e 65 29 3b  ort->labelDone);
4e40: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
4e50: 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20  age(v);.    }.  
4e60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
4e70: 70 48 65 72 65 28 76 2c 20 61 64 64 72 46 69 72  pHere(v, addrFir
4e80: 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  st);.    sqlite3
4e90: 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61  ExprCodeMove(pPa
4ea0: 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20 72 65  rse, regBase, re
4eb0: 67 50 72 65 76 4b 65 79 2c 20 70 53 6f 72 74 2d  gPrevKey, pSort-
4ec0: 3e 6e 4f 42 53 61 74 29 3b 0a 20 20 20 20 73 71  >nOBSat);.    sq
4ed0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
4ee0: 65 28 76 2c 20 61 64 64 72 4a 6d 70 29 3b 0a 20  e(v, addrJmp);. 
4ef0: 20 7d 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e   }.  if( pSort->
4f00: 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54  sortFlags & SORT
4f10: 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 20 29  FLAG_UseSorter )
4f20: 7b 0a 20 20 20 20 6f 70 20 3d 20 4f 50 5f 53 6f  {.    op = OP_So
4f30: 72 74 65 72 49 6e 73 65 72 74 3b 0a 20 20 7d 65  rterInsert;.  }e
4f40: 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d 20 4f 50  lse{.    op = OP
4f50: 5f 49 64 78 49 6e 73 65 72 74 3b 0a 20 20 7d 0a  _IdxInsert;.  }.
4f60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4f70: 4f 70 32 28 76 2c 20 6f 70 2c 20 70 53 6f 72 74  Op2(v, op, pSort
4f80: 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72 65 67 52  ->iECursor, regR
4f90: 65 63 6f 72 64 29 3b 0a 20 20 69 66 28 20 69 4c  ecord);.  if( iL
4fa0: 69 6d 69 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  imit ){.    int 
4fb0: 61 64 64 72 3b 0a 20 20 20 20 69 6e 74 20 72 31  addr;.    int r1
4fc0: 20 3d 20 30 3b 0a 20 20 20 20 2f 2a 20 46 69 6c   = 0;.    /* Fil
4fd0: 6c 20 74 68 65 20 73 6f 72 74 65 72 20 75 6e 74  l the sorter unt
4fe0: 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 4c  il it contains L
4ff0: 49 4d 49 54 2b 4f 46 46 53 45 54 20 65 6e 74 72  IMIT+OFFSET entr
5000: 69 65 73 2e 20 20 28 54 68 65 20 69 4c 69 6d 69  ies.  (The iLimi
5010: 74 0a 20 20 20 20 2a 2a 20 72 65 67 69 73 74 65  t.    ** registe
5020: 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  r is initialized
5030: 20 77 69 74 68 20 76 61 6c 75 65 20 6f 66 20 4c   with value of L
5040: 49 4d 49 54 2b 4f 46 46 53 45 54 2e 29 20 20 41  IMIT+OFFSET.)  A
5050: 66 74 65 72 20 74 68 65 20 73 6f 72 74 65 72 0a  fter the sorter.
5060: 20 20 20 20 2a 2a 20 66 69 6c 6c 73 20 75 70 2c      ** fills up,
5070: 20 64 65 6c 65 74 65 20 74 68 65 20 6c 65 61 73   delete the leas
5080: 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 73  t entry in the s
5090: 6f 72 74 65 72 20 61 66 74 65 72 20 65 61 63 68  orter after each
50a0: 20 69 6e 73 65 72 74 2e 0a 20 20 20 20 2a 2a 20   insert..    ** 
50b0: 54 68 75 73 20 77 65 20 6e 65 76 65 72 20 68 6f  Thus we never ho
50c0: 6c 64 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 65  ld more than the
50d0: 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 20 72 6f   LIMIT+OFFSET ro
50e0: 77 73 20 69 6e 20 6d 65 6d 6f 72 79 20 61 74 20  ws in memory at 
50f0: 6f 6e 63 65 20 2a 2f 0a 20 20 20 20 61 64 64 72  once */.    addr
5100: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
5110: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  dOp3(v, OP_IfNot
5120: 5a 65 72 6f 2c 20 69 4c 69 6d 69 74 2c 20 30 2c  Zero, iLimit, 0,
5130: 20 2d 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61   -1); VdbeCovera
5140: 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  ge(v);.    sqlit
5150: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
5160: 4f 50 5f 4c 61 73 74 2c 20 70 53 6f 72 74 2d 3e  OP_Last, pSort->
5170: 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 69  iECursor);.    i
5180: 66 28 20 70 53 6f 72 74 2d 3e 62 4f 72 64 65 72  f( pSort->bOrder
5190: 65 64 49 6e 6e 65 72 4c 6f 6f 70 20 29 7b 0a 20  edInnerLoop ){. 
51a0: 20 20 20 20 20 72 31 20 3d 20 2b 2b 70 50 61 72       r1 = ++pPar
51b0: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
51c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
51d0: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
51e0: 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 2c  pSort->iECursor,
51f0: 20 6e 45 78 70 72 2c 20 72 31 29 3b 0a 20 20 20   nExpr, r1);.   
5200: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
5210: 76 2c 20 22 73 65 71 22 29 29 3b 0a 20 20 20 20  v, "seq"));.    
5220: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
5230: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65  eAddOp1(v, OP_De
5240: 6c 65 74 65 2c 20 70 53 6f 72 74 2d 3e 69 45 43  lete, pSort->iEC
5250: 75 72 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20  ursor);.    if( 
5260: 70 53 6f 72 74 2d 3e 62 4f 72 64 65 72 65 64 49  pSort->bOrderedI
5270: 6e 6e 65 72 4c 6f 6f 70 20 29 7b 0a 20 20 20 20  nnerLoop ){.    
5280: 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 6e 65    /* If the inne
5290: 72 20 6c 6f 6f 70 20 69 73 20 64 72 69 76 65 6e  r loop is driven
52a0: 20 62 79 20 61 6e 20 69 6e 64 65 78 20 73 75 63   by an index suc
52b0: 68 20 74 68 61 74 20 76 61 6c 75 65 73 20 66 72  h that values fr
52c0: 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  om.      ** the 
52d0: 73 61 6d 65 20 69 74 65 72 61 74 69 6f 6e 20 6f  same iteration o
52e0: 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  f the inner loop
52f0: 20 61 72 65 20 69 6e 20 73 6f 72 74 65 64 20 6f   are in sorted o
5300: 72 64 65 72 2c 20 74 68 65 6e 0a 20 20 20 20 20  rder, then.     
5310: 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20   ** immediately 
5320: 6a 75 6d 70 20 74 6f 20 74 68 65 20 6e 65 78 74  jump to the next
5330: 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 61 6e   iteration of an
5340: 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 69 66 20 74   inner loop if t
5350: 68 65 0a 20 20 20 20 20 20 2a 2a 20 65 6e 74 72  he.      ** entr
5360: 79 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65  y from the curre
5370: 6e 74 20 69 74 65 72 61 74 69 6f 6e 20 64 6f 65  nt iteration doe
5380: 73 20 6e 6f 74 20 66 69 74 20 69 6e 74 6f 20 74  s not fit into t
5390: 68 65 20 74 6f 70 0a 20 20 20 20 20 20 2a 2a 20  he top.      ** 
53a0: 4c 49 4d 49 54 2b 4f 46 46 53 45 54 20 65 6e 74  LIMIT+OFFSET ent
53b0: 72 69 65 73 20 6f 66 20 74 68 65 20 73 6f 72 74  ries of the sort
53c0: 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  er. */.      int
53d0: 20 69 42 72 6b 20 3d 20 73 71 6c 69 74 65 33 56   iBrk = sqlite3V
53e0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
53f0: 29 20 2b 20 32 3b 0a 20 20 20 20 20 20 73 71 6c  ) + 2;.      sql
5400: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
5410: 2c 20 4f 50 5f 45 71 2c 20 72 65 67 42 61 73 65  , OP_Eq, regBase
5420: 2b 6e 45 78 70 72 2c 20 69 42 72 6b 2c 20 72 31  +nExpr, iBrk, r1
5430: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
5440: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
5450: 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a  SQLITE_NULLEQ);.
5460: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
5470: 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ge(v);.    }.   
5480: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
5490: 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  Here(v, addr);. 
54a0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
54b0: 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  code to implemen
54c0: 74 20 74 68 65 20 4f 46 46 53 45 54 0a 2a 2f 0a  t the OFFSET.*/.
54d0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65  static void code
54e0: 4f 66 66 73 65 74 28 0a 20 20 56 64 62 65 20 2a  Offset(.  Vdbe *
54f0: 76 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47  v,          /* G
5500: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74  enerate code int
5510: 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69  o this VM */.  i
5520: 6e 74 20 69 4f 66 66 73 65 74 2c 20 20 20 20 20  nt iOffset,     
5530: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
5540: 64 69 6e 67 20 74 68 65 20 6f 66 66 73 65 74 20  ding the offset 
5550: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
5560: 20 69 43 6f 6e 74 69 6e 75 65 20 20 20 20 20 2f   iContinue     /
5570: 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73  * Jump here to s
5580: 6b 69 70 20 74 68 65 20 63 75 72 72 65 6e 74 20  kip the current 
5590: 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 69  record */.){.  i
55a0: 66 28 20 69 4f 66 66 73 65 74 3e 30 20 29 7b 0a  f( iOffset>0 ){.
55b0: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
55c0: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
55d0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
55e0: 5f 49 66 4e 65 67 2c 20 69 4f 66 66 73 65 74 2c  _IfNeg, iOffset,
55f0: 20 30 2c 20 2d 31 29 3b 20 56 64 62 65 43 6f 76   0, -1); VdbeCov
5600: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71  erage(v);.    sq
5610: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
5620: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69  v, OP_Goto, 0, i
5630: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 56  Continue);.    V
5640: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
5650: 73 6b 69 70 20 4f 46 46 53 45 54 20 72 65 63 6f  skip OFFSET reco
5660: 72 64 73 22 29 29 3b 0a 20 20 20 20 73 71 6c 69  rds"));.    sqli
5670: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
5680: 76 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a  v, addr);.  }.}.
5690: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20  ./*.** Add code 
56a0: 74 68 61 74 20 77 69 6c 6c 20 63 68 65 63 6b 20  that will check 
56b0: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  to make sure the
56c0: 20 4e 20 72 65 67 69 73 74 65 72 73 20 73 74 61   N registers sta
56d0: 72 74 69 6e 67 20 61 74 20 69 4d 65 6d 0a 2a 2a  rting at iMem.**
56e0: 20 66 6f 72 6d 20 61 20 64 69 73 74 69 6e 63 74   form a distinct
56f0: 20 65 6e 74 72 79 2e 20 20 69 54 61 62 20 69 73   entry.  iTab is
5700: 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78   a sorting index
5710: 20 74 68 61 74 20 68 6f 6c 64 73 20 70 72 65 76   that holds prev
5720: 69 6f 75 73 6c 79 0a 2a 2a 20 73 65 65 6e 20 63  iously.** seen c
5730: 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 74  ombinations of t
5740: 68 65 20 4e 20 76 61 6c 75 65 73 2e 20 20 41 20  he N values.  A 
5750: 6e 65 77 20 65 6e 74 72 79 20 69 73 20 6d 61 64  new entry is mad
5760: 65 20 69 6e 20 69 54 61 62 0a 2a 2a 20 69 66 20  e in iTab.** if 
5770: 74 68 65 20 63 75 72 72 65 6e 74 20 4e 20 76 61  the current N va
5780: 6c 75 65 73 20 61 72 65 20 6e 65 77 2e 0a 2a 2a  lues are new..**
5790: 0a 2a 2a 20 41 20 6a 75 6d 70 20 74 6f 20 61 64  .** A jump to ad
57a0: 64 72 52 65 70 65 61 74 20 69 73 20 6d 61 64 65  drRepeat is made
57b0: 20 61 6e 64 20 74 68 65 20 4e 2b 31 20 76 61 6c   and the N+1 val
57c0: 75 65 73 20 61 72 65 20 70 6f 70 70 65 64 20 66  ues are popped f
57d0: 72 6f 6d 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b  rom the.** stack
57e0: 20 69 66 20 74 68 65 20 74 6f 70 20 4e 20 65 6c   if the top N el
57f0: 65 6d 65 6e 74 73 20 61 72 65 20 6e 6f 74 20 64  ements are not d
5800: 69 73 74 69 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74  istinct..*/.stat
5810: 69 63 20 76 6f 69 64 20 63 6f 64 65 44 69 73 74  ic void codeDist
5820: 69 6e 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70  inct(.  Parse *p
5830: 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61  Parse,     /* Pa
5840: 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67  rsing and code g
5850: 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
5860: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c  t */.  int iTab,
5870: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73            /* A s
5880: 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 75 73 65  orting index use
5890: 64 20 74 6f 20 74 65 73 74 20 66 6f 72 20 64 69  d to test for di
58a0: 73 74 69 6e 63 74 6e 65 73 73 20 2a 2f 0a 20 20  stinctness */.  
58b0: 69 6e 74 20 61 64 64 72 52 65 70 65 61 74 2c 20  int addrRepeat, 
58c0: 20 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65     /* Jump to he
58d0: 72 65 20 69 66 20 6e 6f 74 20 64 69 73 74 69 6e  re if not distin
58e0: 63 74 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20  ct */.  int N,  
58f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
5900: 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
5910: 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 65 6d 20 20   */.  int iMem  
5920: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
5930: 74 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a  t element */.){.
5940: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74    Vdbe *v;.  int
5950: 20 72 31 3b 0a 0a 20 20 76 20 3d 20 70 50 61 72   r1;..  v = pPar
5960: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 72 31 20  se->pVdbe;.  r1 
5970: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
5980: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73  Reg(pParse);.  s
5990: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
59a0: 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c  Int(v, OP_Found,
59b0: 20 69 54 61 62 2c 20 61 64 64 72 52 65 70 65 61   iTab, addrRepea
59c0: 74 2c 20 69 4d 65 6d 2c 20 4e 29 3b 20 56 64 62  t, iMem, N); Vdb
59d0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
59e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
59f0: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
5a00: 72 64 2c 20 69 4d 65 6d 2c 20 4e 2c 20 72 31 29  rd, iMem, N, r1)
5a10: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
5a20: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
5a30: 6e 73 65 72 74 2c 20 69 54 61 62 2c 20 72 31 29  nsert, iTab, r1)
5a40: 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
5a50: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
5a60: 2c 20 72 31 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65  , r1);.}..#ifnde
5a70: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
5a80: 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e  BQUERY./*.** Gen
5a90: 65 72 61 74 65 20 61 6e 20 65 72 72 6f 72 20 6d  erate an error m
5aa0: 65 73 73 61 67 65 20 77 68 65 6e 20 61 20 53 45  essage when a SE
5ab0: 4c 45 43 54 20 69 73 20 75 73 65 64 20 77 69 74  LECT is used wit
5ac0: 68 69 6e 20 61 20 73 75 62 65 78 70 72 65 73 73  hin a subexpress
5ad0: 69 6f 6e 0a 2a 2a 20 28 65 78 61 6d 70 6c 65 3a  ion.** (example:
5ae0: 20 20 22 61 20 49 4e 20 28 53 45 4c 45 43 54 20    "a IN (SELECT 
5af0: 2a 20 46 52 4f 4d 20 74 61 62 6c 65 29 22 29 20  * FROM table)") 
5b00: 62 75 74 20 69 74 20 68 61 73 20 6d 6f 72 65 20  but it has more 
5b10: 74 68 61 6e 20 31 20 72 65 73 75 6c 74 0a 2a 2a  than 1 result.**
5b20: 20 63 6f 6c 75 6d 6e 2e 20 20 57 65 20 64 6f 20   column.  We do 
5b30: 74 68 69 73 20 69 6e 20 61 20 73 75 62 72 6f 75  this in a subrou
5b40: 74 69 6e 65 20 62 65 63 61 75 73 65 20 74 68 65  tine because the
5b50: 20 65 72 72 6f 72 20 75 73 65 64 20 74 6f 20 6f   error used to o
5b60: 63 63 75 72 0a 2a 2a 20 69 6e 20 6d 75 6c 74 69  ccur.** in multi
5b70: 70 6c 65 20 70 6c 61 63 65 73 2e 20 20 28 54 68  ple places.  (Th
5b80: 65 20 65 72 72 6f 72 20 6f 6e 6c 79 20 6f 63 63  e error only occ
5b90: 75 72 73 20 69 6e 20 6f 6e 65 20 70 6c 61 63 65  urs in one place
5ba0: 20 6e 6f 77 2c 20 62 75 74 20 77 65 0a 2a 2a 20   now, but we.** 
5bb0: 72 65 74 61 69 6e 20 74 68 65 20 73 75 62 72 6f  retain the subro
5bc0: 75 74 69 6e 65 20 74 6f 20 6d 69 6e 69 6d 69 7a  utine to minimiz
5bd0: 65 20 63 6f 64 65 20 64 69 73 72 75 70 74 69 6f  e code disruptio
5be0: 6e 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  n.).*/.static in
5bf0: 74 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43  t checkForMultiC
5c00: 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72  olumnSelectError
5c10: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
5c20: 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
5c30: 65 20 63 6f 6e 74 65 78 74 2e 20 2a 2f 0a 20 20  e context. */.  
5c40: 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
5c50: 74 2c 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74  t,   /* Destinat
5c60: 69 6f 6e 20 6f 66 20 53 45 4c 45 43 54 20 72 65  ion of SELECT re
5c70: 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  sults */.  int n
5c80: 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20  Expr            
5c90: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73  /* Number of res
5ca0: 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75  ult columns retu
5cb0: 72 6e 65 64 20 62 79 20 53 45 4c 45 43 54 20 2a  rned by SELECT *
5cc0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 65 44 65 73 74  /.){.  int eDest
5cd0: 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b   = pDest->eDest;
5ce0: 0a 20 20 69 66 28 20 6e 45 78 70 72 3e 31 20 26  .  if( nExpr>1 &
5cf0: 26 20 28 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65  & (eDest==SRT_Me
5d00: 6d 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f  m || eDest==SRT_
5d10: 53 65 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  Set) ){.    sqli
5d20: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
5d30: 73 65 2c 20 22 6f 6e 6c 79 20 61 20 73 69 6e 67  se, "only a sing
5d40: 6c 65 20 72 65 73 75 6c 74 20 61 6c 6c 6f 77 65  le result allowe
5d50: 64 20 66 6f 72 20 22 0a 20 20 20 20 20 20 20 22  d for ".       "
5d60: 61 20 53 45 4c 45 43 54 20 74 68 61 74 20 69 73  a SELECT that is
5d70: 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72   part of an expr
5d80: 65 73 73 69 6f 6e 22 29 3b 0a 20 20 20 20 72 65  ession");.    re
5d90: 74 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  turn 1;.  }else{
5da0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
5db0: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   }.}.#endif../*.
5dc0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
5dd0: 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f  generates the co
5de0: 64 65 20 66 6f 72 20 74 68 65 20 69 6e 73 69 64  de for the insid
5df0: 65 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c  e of the inner l
5e00: 6f 6f 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45  oop.** of a SELE
5e10: 43 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72 63  CT..**.** If src
5e20: 54 61 62 20 69 73 20 6e 65 67 61 74 69 76 65 2c  Tab is negative,
5e30: 20 74 68 65 6e 20 74 68 65 20 70 45 4c 69 73 74   then the pEList
5e40: 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20   expressions.** 
5e50: 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 69 6e  are evaluated in
5e60: 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74 68   order to get th
5e70: 65 20 64 61 74 61 20 66 6f 72 20 74 68 69 73 20  e data for this 
5e80: 72 6f 77 2e 20 20 49 66 20 73 72 63 54 61 62 20  row.  If srcTab 
5e90: 69 73 0a 2a 2a 20 7a 65 72 6f 20 6f 72 20 6d 6f  is.** zero or mo
5ea0: 72 65 2c 20 74 68 65 6e 20 64 61 74 61 20 69 73  re, then data is
5eb0: 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20 73 72 63   pulled from src
5ec0: 54 61 62 20 61 6e 64 20 70 45 4c 69 73 74 20 69  Tab and pEList i
5ed0: 73 20 75 73 65 64 20 6f 6e 6c 79 20 0a 2a 2a 20  s used only .** 
5ee0: 74 6f 20 67 65 74 20 6e 75 6d 62 65 72 20 63 6f  to get number co
5ef0: 6c 75 6d 6e 73 20 61 6e 64 20 74 68 65 20 64 61  lumns and the da
5f00: 74 61 74 79 70 65 20 66 6f 72 20 65 61 63 68 20  tatype for each 
5f10: 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69  column..*/.stati
5f20: 63 20 76 6f 69 64 20 73 65 6c 65 63 74 49 6e 6e  c void selectInn
5f30: 65 72 4c 6f 6f 70 28 0a 20 20 50 61 72 73 65 20  erLoop(.  Parse 
5f40: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
5f50: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
5f60: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
5f70: 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
5f80: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70       /* The comp
5f90: 6c 65 74 65 20 73 65 6c 65 63 74 20 73 74 61 74  lete select stat
5fa0: 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65  ement being code
5fb0: 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  d */.  ExprList 
5fc0: 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20 2f  *pEList,       /
5fd0: 2a 20 4c 69 73 74 20 6f 66 20 76 61 6c 75 65 73  * List of values
5fe0: 20 62 65 69 6e 67 20 65 78 74 72 61 63 74 65 64   being extracted
5ff0: 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 54 61 62   */.  int srcTab
6000: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
6010: 20 50 75 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20   Pull data from 
6020: 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20  this table */.  
6030: 53 6f 72 74 43 74 78 20 2a 70 53 6f 72 74 2c 20  SortCtx *pSort, 
6040: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f          /* If no
6050: 74 20 4e 55 4c 4c 2c 20 69 6e 66 6f 20 6f 6e 20  t NULL, info on 
6060: 68 6f 77 20 74 6f 20 70 72 6f 63 65 73 73 20 4f  how to process O
6070: 52 44 45 52 20 42 59 20 2a 2f 0a 20 20 44 69 73  RDER BY */.  Dis
6080: 74 69 6e 63 74 43 74 78 20 2a 70 44 69 73 74 69  tinctCtx *pDisti
6090: 6e 63 74 2c 20 2f 2a 20 49 66 20 6e 6f 74 20 4e  nct, /* If not N
60a0: 55 4c 4c 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f 77  ULL, info on how
60b0: 20 74 6f 20 70 72 6f 63 65 73 73 20 44 49 53 54   to process DIST
60c0: 49 4e 43 54 20 2a 2f 0a 20 20 53 65 6c 65 63 74  INCT */.  Select
60d0: 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20 20  Dest *pDest,    
60e0: 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70    /* How to disp
60f0: 6f 73 65 20 6f 66 20 74 68 65 20 72 65 73 75 6c  ose of the resul
6100: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e  ts */.  int iCon
6110: 74 69 6e 75 65 2c 20 20 20 20 20 20 20 20 20 20  tinue,          
6120: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
6130: 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 6e 65  continue with ne
6140: 78 74 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20  xt row */.  int 
6150: 69 42 72 65 61 6b 20 20 20 20 20 20 20 20 20 20  iBreak          
6160: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
6170: 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66   to break out of
6180: 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20   the inner loop 
6190: 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
61a0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
61b0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
61c0: 68 61 73 44 69 73 74 69 6e 63 74 3b 20 20 20 20  hasDistinct;    
61d0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
61e0: 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77  he DISTINCT keyw
61f0: 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ord is present *
6200: 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 73 75 6c  /.  int regResul
6210: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
6220: 2f 2a 20 53 74 61 72 74 20 6f 66 20 6d 65 6d 6f  /* Start of memo
6230: 72 79 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c  ry holding resul
6240: 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 65  t set */.  int e
6250: 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44  Dest = pDest->eD
6260: 65 73 74 3b 20 20 20 2f 2a 20 48 6f 77 20 74 6f  est;   /* How to
6270: 20 64 69 73 70 6f 73 65 20 6f 66 20 72 65 73 75   dispose of resu
6280: 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61  lts */.  int iPa
6290: 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69 53 44 50  rm = pDest->iSDP
62a0: 61 72 6d 3b 20 2f 2a 20 46 69 72 73 74 20 61 72  arm; /* First ar
62b0: 67 75 6d 65 6e 74 20 74 6f 20 64 69 73 70 6f 73  gument to dispos
62c0: 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 69  al method */.  i
62d0: 6e 74 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 20  nt nResultCol;  
62e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
62f0: 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63  mber of result c
6300: 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  olumns */.  int 
6310: 6e 50 72 65 66 69 78 52 65 67 20 3d 20 30 3b 20  nPrefixReg = 0; 
6320: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
6330: 72 20 6f 66 20 65 78 74 72 61 20 72 65 67 69 73  r of extra regis
6340: 74 65 72 73 20 62 65 66 6f 72 65 20 72 65 67 52  ters before regR
6350: 65 73 75 6c 74 20 2a 2f 0a 0a 20 20 61 73 73 65  esult */..  asse
6360: 72 74 28 20 76 20 29 3b 0a 20 20 61 73 73 65 72  rt( v );.  asser
6370: 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a  t( pEList!=0 );.
6380: 20 20 68 61 73 44 69 73 74 69 6e 63 74 20 3d 20    hasDistinct = 
6390: 70 44 69 73 74 69 6e 63 74 20 3f 20 70 44 69 73  pDistinct ? pDis
63a0: 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65  tinct->eTnctType
63b0: 20 3a 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   : WHERE_DISTINC
63c0: 54 5f 4e 4f 4f 50 3b 0a 20 20 69 66 28 20 70 53  T_NOOP;.  if( pS
63d0: 6f 72 74 20 26 26 20 70 53 6f 72 74 2d 3e 70 4f  ort && pSort->pO
63e0: 72 64 65 72 42 79 3d 3d 30 20 29 20 70 53 6f 72  rderBy==0 ) pSor
63f0: 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 53 6f  t = 0;.  if( pSo
6400: 72 74 3d 3d 30 20 26 26 20 21 68 61 73 44 69 73  rt==0 && !hasDis
6410: 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 61 73 73  tinct ){.    ass
6420: 65 72 74 28 20 69 43 6f 6e 74 69 6e 75 65 21 3d  ert( iContinue!=
6430: 30 20 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66  0 );.    codeOff
6440: 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65  set(v, p->iOffse
6450: 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  t, iContinue);. 
6460: 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20 74 68   }..  /* Pull th
6470: 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 75  e requested colu
6480: 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20 6e 52 65 73  mns..  */.  nRes
6490: 75 6c 74 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d  ultCol = pEList-
64a0: 3e 6e 45 78 70 72 3b 0a 0a 20 20 69 66 28 20 70  >nExpr;..  if( p
64b0: 44 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29  Dest->iSdst==0 )
64c0: 7b 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 20  {.    if( pSort 
64d0: 29 7b 0a 20 20 20 20 20 20 6e 50 72 65 66 69 78  ){.      nPrefix
64e0: 52 65 67 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72  Reg = pSort->pOr
64f0: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
6500: 20 20 20 20 69 66 28 20 21 28 70 53 6f 72 74 2d      if( !(pSort-
6510: 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52  >sortFlags & SOR
6520: 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 29  TFLAG_UseSorter)
6530: 20 29 20 6e 50 72 65 66 69 78 52 65 67 2b 2b 3b   ) nPrefixReg++;
6540: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
6550: 4d 65 6d 20 2b 3d 20 6e 50 72 65 66 69 78 52 65  Mem += nPrefixRe
6560: 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44 65  g;.    }.    pDe
6570: 73 74 2d 3e 69 53 64 73 74 20 3d 20 70 50 61 72  st->iSdst = pPar
6580: 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
6590: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
65a0: 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d 65  nResultCol;.  }e
65b0: 6c 73 65 20 69 66 28 20 70 44 65 73 74 2d 3e 69  lse if( pDest->i
65c0: 53 64 73 74 2b 6e 52 65 73 75 6c 74 43 6f 6c 20  Sdst+nResultCol 
65d0: 3e 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29  > pParse->nMem )
65e0: 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73  {.    /* This is
65f0: 20 61 6e 20 65 72 72 6f 72 20 63 6f 6e 64 69 74   an error condit
6600: 69 6f 6e 20 74 68 61 74 20 63 61 6e 20 72 65 73  ion that can res
6610: 75 6c 74 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  ult, for example
6620: 2c 20 77 68 65 6e 20 61 20 53 45 4c 45 43 54 0a  , when a SELECT.
6630: 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 72 69      ** on the ri
6640: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66  ght-hand side of
6650: 20 61 6e 20 49 4e 53 45 52 54 20 63 6f 6e 74 61   an INSERT conta
6660: 69 6e 73 20 6d 6f 72 65 20 72 65 73 75 6c 74 20  ins more result 
6670: 63 6f 6c 75 6d 6e 73 20 74 68 61 6e 0a 20 20 20  columns than.   
6680: 20 2a 2a 20 74 68 65 72 65 20 61 72 65 20 63 6f   ** there are co
6690: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62  lumns in the tab
66a0: 6c 65 20 6f 6e 20 74 68 65 20 6c 65 66 74 2e 20  le on the left. 
66b0: 20 54 68 65 20 65 72 72 6f 72 20 77 69 6c 6c 20   The error will 
66c0: 62 65 20 63 61 75 67 68 74 0a 20 20 20 20 2a 2a  be caught.    **
66d0: 20 61 6e 64 20 72 65 70 6f 72 74 65 64 20 6c 61   and reported la
66e0: 74 65 72 2e 20 20 42 75 74 20 77 65 20 6e 65 65  ter.  But we nee
66f0: 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 65  d to make sure e
6700: 6e 6f 75 67 68 20 6d 65 6d 6f 72 79 20 69 73 20  nough memory is 
6710: 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 2a 2a  allocated.    **
6720: 20 74 6f 20 61 76 6f 69 64 20 6f 74 68 65 72 20   to avoid other 
6730: 73 70 75 72 69 6f 75 73 20 65 72 72 6f 72 73 20  spurious errors 
6740: 69 6e 20 74 68 65 20 6d 65 61 6e 74 69 6d 65 2e  in the meantime.
6750: 20 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   */.    pParse->
6760: 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43  nMem += nResultC
6770: 6f 6c 3b 0a 20 20 7d 0a 20 20 70 44 65 73 74 2d  ol;.  }.  pDest-
6780: 3e 6e 53 64 73 74 20 3d 20 6e 52 65 73 75 6c 74  >nSdst = nResult
6790: 43 6f 6c 3b 0a 20 20 72 65 67 52 65 73 75 6c 74  Col;.  regResult
67a0: 20 3d 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3b   = pDest->iSdst;
67b0: 0a 20 20 69 66 28 20 73 72 63 54 61 62 3e 3d 30  .  if( srcTab>=0
67c0: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
67d0: 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 69   i<nResultCol; i
67e0: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
67f0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
6800: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61  OP_Column, srcTa
6810: 62 2c 20 69 2c 20 72 65 67 52 65 73 75 6c 74 2b  b, i, regResult+
6820: 69 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  i);.      VdbeCo
6830: 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20  mment((v, "%s", 
6840: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  pEList->a[i].zNa
6850: 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  me));.    }.  }e
6860: 6c 73 65 20 69 66 28 20 65 44 65 73 74 21 3d 53  lse if( eDest!=S
6870: 52 54 5f 45 78 69 73 74 73 20 29 7b 0a 20 20 20  RT_Exists ){.   
6880: 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74 69   /* If the desti
6890: 6e 61 74 69 6f 6e 20 69 73 20 61 6e 20 45 58 49  nation is an EXI
68a0: 53 54 53 28 2e 2e 2e 29 20 65 78 70 72 65 73 73  STS(...) express
68b0: 69 6f 6e 2c 20 74 68 65 20 61 63 74 75 61 6c 0a  ion, the actual.
68c0: 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20 72 65      ** values re
68d0: 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 53 45  turned by the SE
68e0: 4c 45 43 54 20 61 72 65 20 6e 6f 74 20 72 65 71  LECT are not req
68f0: 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  uired..    */.  
6900: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
6910: 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
6920: 2c 20 70 45 4c 69 73 74 2c 20 72 65 67 52 65 73  , pEList, regRes
6930: 75 6c 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ult,.           
6940: 20 20 20 20 20 20 20 28 65 44 65 73 74 3d 3d 53         (eDest==S
6950: 52 54 5f 4f 75 74 70 75 74 7c 7c 65 44 65 73 74  RT_Output||eDest
6960: 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 29  ==SRT_Coroutine)
6970: 3f 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50  ?SQLITE_ECEL_DUP
6980: 3a 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  :0);.  }..  /* I
6990: 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b  f the DISTINCT k
69a0: 65 79 77 6f 72 64 20 77 61 73 20 70 72 65 73 65  eyword was prese
69b0: 6e 74 20 6f 6e 20 74 68 65 20 53 45 4c 45 43 54  nt on the SELECT
69c0: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20   statement.  ** 
69d0: 61 6e 64 20 74 68 69 73 20 72 6f 77 20 68 61 73  and this row has
69e0: 20 62 65 65 6e 20 73 65 65 6e 20 62 65 66 6f 72   been seen befor
69f0: 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 6d  e, then do not m
6a00: 61 6b 65 20 74 68 69 73 20 72 6f 77 0a 20 20 2a  ake this row.  *
6a10: 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 72 65  * part of the re
6a20: 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  sult..  */.  if(
6a30: 20 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a   hasDistinct ){.
6a40: 20 20 20 20 73 77 69 74 63 68 28 20 70 44 69 73      switch( pDis
6a50: 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65  tinct->eTnctType
6a60: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 57   ){.      case W
6a70: 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52  HERE_DISTINCT_OR
6a80: 44 45 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20  DERED: {.       
6a90: 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 20 20 20   VdbeOp *pOp;   
6aa0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6c           /* No l
6ab0: 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64 20 4f  onger required O
6ac0: 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73  penEphemeral ins
6ad0: 74 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  tr. */.        i
6ae0: 6e 74 20 69 4a 75 6d 70 3b 20 20 20 20 20 20 20  nt iJump;       
6af0: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 64         /* Jump d
6b00: 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20  estination */.  
6b10: 20 20 20 20 20 20 69 6e 74 20 72 65 67 50 72 65        int regPre
6b20: 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  v;            /*
6b30: 20 50 72 65 76 69 6f 75 73 20 72 6f 77 20 63 6f   Previous row co
6b40: 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 20 20  ntent */..      
6b50: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70    /* Allocate sp
6b60: 61 63 65 20 66 6f 72 20 74 68 65 20 70 72 65 76  ace for the prev
6b70: 69 6f 75 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20  ious row */.    
6b80: 20 20 20 20 72 65 67 50 72 65 76 20 3d 20 70 50      regPrev = pP
6b90: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
6ba0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
6bb0: 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c  em += nResultCol
6bc0: 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68  ;..        /* Ch
6bd0: 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e  ange the OP_Open
6be0: 45 70 68 65 6d 65 72 61 6c 20 63 6f 64 65 64 20  Ephemeral coded 
6bf0: 65 61 72 6c 69 65 72 20 74 6f 20 61 6e 20 4f 50  earlier to an OP
6c00: 5f 4e 75 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a  _Null.        **
6c10: 20 73 65 74 73 20 74 68 65 20 4d 45 4d 5f 43 6c   sets the MEM_Cl
6c20: 65 61 72 65 64 20 62 69 74 20 6f 6e 20 74 68 65  eared bit on the
6c30: 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72 20   first register 
6c40: 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  of the.        *
6c50: 2a 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65  * previous value
6c60: 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 63 61 75  .  This will cau
6c70: 73 65 20 74 68 65 20 4f 50 5f 4e 65 20 62 65 6c  se the OP_Ne bel
6c80: 6f 77 20 74 6f 20 61 6c 77 61 79 73 0a 20 20 20  ow to always.   
6c90: 20 20 20 20 20 2a 2a 20 66 61 69 6c 20 6f 6e 20       ** fail on 
6ca0: 74 68 65 20 66 69 72 73 74 20 69 74 65 72 61 74  the first iterat
6cb0: 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  ion of the loop 
6cc0: 65 76 65 6e 20 69 66 20 74 68 65 20 66 69 72 73  even if the firs
6cd0: 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77  t.        ** row
6ce0: 20 69 73 20 61 6c 6c 20 4e 55 4c 4c 73 2e 0a 20   is all NULLs.. 
6cf0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
6d00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
6d10: 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 70 44 69  ngeToNoop(v, pDi
6d20: 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74  stinct->addrTnct
6d30: 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 20 3d  );.        pOp =
6d40: 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f   sqlite3VdbeGetO
6d50: 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e  p(v, pDistinct->
6d60: 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20  addrTnct);.     
6d70: 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d     pOp->opcode =
6d80: 20 4f 50 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20   OP_Null;.      
6d90: 20 20 70 4f 70 2d 3e 70 31 20 3d 20 31 3b 0a 20    pOp->p1 = 1;. 
6da0: 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d         pOp->p2 =
6db0: 20 72 65 67 50 72 65 76 3b 0a 0a 20 20 20 20 20   regPrev;..     
6dc0: 20 20 20 69 4a 75 6d 70 20 3d 20 73 71 6c 69 74     iJump = sqlit
6dd0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
6de0: 72 28 76 29 20 2b 20 6e 52 65 73 75 6c 74 43 6f  r(v) + nResultCo
6df0: 6c 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  l;.        for(i
6e00: 3d 30 3b 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c  =0; i<nResultCol
6e10: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
6e20: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
6e30: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
6e40: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
6e50: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
6e60: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
6e70: 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 2d 31 20   i<nResultCol-1 
6e80: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
6e90: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
6ea0: 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 65 67 52 65  (v, OP_Ne, regRe
6eb0: 73 75 6c 74 2b 69 2c 20 69 4a 75 6d 70 2c 20 72  sult+i, iJump, r
6ec0: 65 67 50 72 65 76 2b 69 29 3b 0a 20 20 20 20 20  egPrev+i);.     
6ed0: 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
6ee0: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
6ef0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6f00: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
6f10: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45 71 2c  AddOp3(v, OP_Eq,
6f20: 20 72 65 67 52 65 73 75 6c 74 2b 69 2c 20 69 43   regResult+i, iC
6f30: 6f 6e 74 69 6e 75 65 2c 20 72 65 67 50 72 65 76  ontinue, regPrev
6f40: 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  +i);.           
6f50: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
6f60: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  ;.           }. 
6f70: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
6f80: 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
6f90: 2d 31 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 20  -1, (const char 
6fa0: 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c  *)pColl, P4_COLL
6fb0: 53 45 51 29 3b 0a 20 20 20 20 20 20 20 20 20 20  SEQ);.          
6fc0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
6fd0: 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e 55  eP5(v, SQLITE_NU
6fe0: 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 20 20 7d  LLEQ);.        }
6ff0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
7000: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
7010: 65 6e 74 41 64 64 72 28 76 29 3d 3d 69 4a 75 6d  entAddr(v)==iJum
7020: 70 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d  p || pParse->db-
7030: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
7040: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7050: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
7060: 5f 43 6f 70 79 2c 20 72 65 67 52 65 73 75 6c 74  _Copy, regResult
7070: 2c 20 72 65 67 50 72 65 76 2c 20 6e 52 65 73 75  , regPrev, nResu
7080: 6c 74 43 6f 6c 2d 31 29 3b 0a 20 20 20 20 20 20  ltCol-1);.      
7090: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
70a0: 0a 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45  ..      case WHE
70b0: 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51  RE_DISTINCT_UNIQ
70c0: 55 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71  UE: {.        sq
70d0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54  lite3VdbeChangeT
70e0: 6f 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74 69 6e  oNoop(v, pDistin
70f0: 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20  ct->addrTnct);. 
7100: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
7110: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 64 65 66      }..      def
7120: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20  ault: {.        
7130: 61 73 73 65 72 74 28 20 70 44 69 73 74 69 6e 63  assert( pDistinc
7140: 74 2d 3e 65 54 6e 63 74 54 79 70 65 3d 3d 57 48  t->eTnctType==WH
7150: 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f  ERE_DISTINCT_UNO
7160: 52 44 45 52 45 44 20 29 3b 0a 20 20 20 20 20 20  RDERED );.      
7170: 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28 70    codeDistinct(p
7180: 50 61 72 73 65 2c 20 70 44 69 73 74 69 6e 63 74  Parse, pDistinct
7190: 2d 3e 74 61 62 54 6e 63 74 2c 20 69 43 6f 6e 74  ->tabTnct, iCont
71a0: 69 6e 75 65 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  inue, nResultCol
71b0: 2c 20 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20  , regResult);.  
71c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
71d0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
71e0: 66 28 20 70 53 6f 72 74 3d 3d 30 20 29 7b 0a 20  f( pSort==0 ){. 
71f0: 20 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28       codeOffset(
7200: 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69  v, p->iOffset, i
7210: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 7d  Continue);.    }
7220: 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20  .  }..  switch( 
7230: 65 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20  eDest ){.    /* 
7240: 49 6e 20 74 68 69 73 20 6d 6f 64 65 2c 20 77 72  In this mode, wr
7250: 69 74 65 20 65 61 63 68 20 71 75 65 72 79 20 72  ite each query r
7260: 65 73 75 6c 74 20 74 6f 20 74 68 65 20 6b 65 79  esult to the key
7270: 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72   of the temporar
7280: 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 69  y.    ** table i
7290: 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69 66  Parm..    */.#if
72a0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
72b0: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
72c0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 55 6e  .    case SRT_Un
72d0: 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ion: {.      int
72e0: 20 72 31 3b 0a 20 20 20 20 20 20 72 31 20 3d 20   r1;.      r1 = 
72f0: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
7300: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
7310: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7320: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
7330: 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  ord, regResult, 
7340: 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72 31 29 3b  nResultCol, r1);
7350: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
7360: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
7370: 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  dxInsert, iParm,
7380: 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
7390: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
73a0: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
73b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
73c0: 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72  }..    /* Constr
73d0: 75 63 74 20 61 20 72 65 63 6f 72 64 20 66 72 6f  uct a record fro
73e0: 6d 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75  m the query resu
73f0: 6c 74 2c 20 62 75 74 20 69 6e 73 74 65 61 64 20  lt, but instead 
7400: 6f 66 0a 20 20 20 20 2a 2a 20 73 61 76 69 6e 67  of.    ** saving
7410: 20 74 68 61 74 20 72 65 63 6f 72 64 2c 20 75 73   that record, us
7420: 65 20 69 74 20 61 73 20 61 20 6b 65 79 20 74 6f  e it as a key to
7430: 20 64 65 6c 65 74 65 20 65 6c 65 6d 65 6e 74 73   delete elements
7440: 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65   from.    ** the
7450: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
7460: 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20   iParm..    */. 
7470: 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 63 65     case SRT_Exce
7480: 70 74 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  pt: {.      sqli
7490: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
74a0: 20 4f 50 5f 49 64 78 44 65 6c 65 74 65 2c 20 69   OP_IdxDelete, i
74b0: 50 61 72 6d 2c 20 72 65 67 52 65 73 75 6c 74 2c  Parm, regResult,
74c0: 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20   nResultCol);.  
74d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
74e0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
74f0: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
7500: 53 45 4c 45 43 54 20 2a 2f 0a 0a 20 20 20 20 2f  SELECT */..    /
7510: 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75  * Store the resu
7520: 6c 74 20 61 73 20 64 61 74 61 20 75 73 69 6e 67  lt as data using
7530: 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20   a unique key.. 
7540: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
7550: 52 54 5f 46 69 66 6f 3a 0a 20 20 20 20 63 61 73  RT_Fifo:.    cas
7560: 65 20 53 52 54 5f 44 69 73 74 46 69 66 6f 3a 0a  e SRT_DistFifo:.
7570: 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62      case SRT_Tab
7580: 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  le:.    case SRT
7590: 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20  _EphemTab: {.   
75a0: 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69     int r1 = sqli
75b0: 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
75c0: 70 50 61 72 73 65 2c 20 6e 50 72 65 66 69 78 52  pParse, nPrefixR
75d0: 65 67 2b 31 29 3b 0a 20 20 20 20 20 20 74 65 73  eg+1);.      tes
75e0: 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52  tcase( eDest==SR
75f0: 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20  T_Table );.     
7600: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
7610: 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29  ==SRT_EphemTab )
7620: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
7630: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
7640: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52  MakeRecord, regR
7650: 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f  esult, nResultCo
7660: 6c 2c 20 72 31 2b 6e 50 72 65 66 69 78 52 65 67  l, r1+nPrefixReg
7670: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
7680: 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20 20  E_OMIT_CTE.     
7690: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
76a0: 44 69 73 74 46 69 66 6f 20 29 7b 0a 20 20 20 20  DistFifo ){.    
76b0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 65      /* If the de
76c0: 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 44 69 73  stination is Dis
76d0: 74 46 69 66 6f 2c 20 74 68 65 6e 20 63 75 72 73  tFifo, then curs
76e0: 6f 72 20 28 69 50 61 72 6d 2b 31 29 20 69 73 20  or (iParm+1) is 
76f0: 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  open.        ** 
7700: 6f 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20  on an ephemeral 
7710: 69 6e 64 65 78 2e 20 49 66 20 74 68 65 20 63 75  index. If the cu
7720: 72 72 65 6e 74 20 72 6f 77 20 69 73 20 61 6c 72  rrent row is alr
7730: 65 61 64 79 20 70 72 65 73 65 6e 74 0a 20 20 20  eady present.   
7740: 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 69       ** in the i
7750: 6e 64 65 78 2c 20 64 6f 20 6e 6f 74 20 77 72 69  ndex, do not wri
7760: 74 65 20 69 74 20 74 6f 20 74 68 65 20 6f 75 74  te it to the out
7770: 70 75 74 2e 20 49 66 20 6e 6f 74 2c 20 61 64 64  put. If not, add
7780: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
7790: 63 75 72 72 65 6e 74 20 72 6f 77 20 74 6f 20 74  current row to t
77a0: 68 65 20 69 6e 64 65 78 20 61 6e 64 20 70 72 6f  he index and pro
77b0: 63 65 65 64 20 77 69 74 68 20 77 72 69 74 69 6e  ceed with writin
77c0: 67 20 69 74 20 74 6f 20 74 68 65 0a 20 20 20 20  g it to the.    
77d0: 20 20 20 20 2a 2a 20 6f 75 74 70 75 74 20 74 61      ** output ta
77e0: 62 6c 65 20 61 73 20 77 65 6c 6c 2e 20 20 2a 2f  ble as well.  */
77f0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64  .        int add
7800: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  r = sqlite3VdbeC
7810: 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20  urrentAddr(v) + 
7820: 34 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  4;.        sqlit
7830: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
7840: 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 50 61  v, OP_Found, iPa
7850: 72 6d 2b 31 2c 20 61 64 64 72 2c 20 72 31 2c 20  rm+1, addr, r1, 
7860: 30 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  0); VdbeCoverage
7870: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  (v);.        sql
7880: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
7890: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
78a0: 69 50 61 72 6d 2b 31 2c 20 72 31 29 3b 0a 20 20  iParm+1, r1);.  
78b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
78c0: 6f 72 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ort==0 );.      
78d0: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  }.#endif.      i
78e0: 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20  f( pSort ){.    
78f0: 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74      pushOntoSort
7900: 65 72 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74  er(pParse, pSort
7910: 2c 20 70 2c 20 72 31 2b 6e 50 72 65 66 69 78 52  , p, r1+nPrefixR
7920: 65 67 2c 20 31 2c 20 6e 50 72 65 66 69 78 52 65  eg, 1, nPrefixRe
7930: 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  g);.      }else{
7940: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 32 20  .        int r2 
7950: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
7960: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
7970: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7980: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77  AddOp2(v, OP_New
7990: 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 72 32  Rowid, iParm, r2
79a0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
79b0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
79c0: 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  OP_Insert, iParm
79d0: 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20 20  , r1, r2);.     
79e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
79f0: 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
7a00: 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20  _APPEND);.      
7a10: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
7a20: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
7a30: 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  r2);.      }.   
7a40: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
7a50: 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
7a60: 65 2c 20 72 31 2c 20 6e 50 72 65 66 69 78 52 65  e, r1, nPrefixRe
7a70: 67 2b 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61  g+1);.      brea
7a80: 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65  k;.    }..#ifnde
7a90: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
7aa0: 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49 66  BQUERY.    /* If
7ab0: 20 77 65 20 61 72 65 20 63 72 65 61 74 69 6e 67   we are creating
7ac0: 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65   a set for an "e
7ad0: 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e  xpr IN (SELECT .
7ae0: 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a  ..)" construct,.
7af0: 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72      ** then ther
7b00: 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73 69  e should be a si
7b10: 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68 65  ngle item on the
7b20: 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20 74   stack.  Write t
7b30: 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20  his.    ** item 
7b40: 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61 62  into the set tab
7b50: 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20 64 61  le with bogus da
7b60: 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ta..    */.    c
7b70: 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20  ase SRT_Set: {. 
7b80: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65       assert( nRe
7b90: 73 75 6c 74 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20  sultCol==1 );.  
7ba0: 20 20 20 20 70 44 65 73 74 2d 3e 61 66 66 53 64      pDest->affSd
7bb0: 73 74 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20  st =.           
7bc0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f         sqlite3Co
7bd0: 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45  mpareAffinity(pE
7be0: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
7bf0: 2c 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74  , pDest->affSdst
7c00: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f  );.      if( pSo
7c10: 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  rt ){.        /*
7c20: 20 41 74 20 66 69 72 73 74 20 67 6c 61 6e 63 65   At first glance
7c30: 20 79 6f 75 20 77 6f 75 6c 64 20 74 68 69 6e 6b   you would think
7c40: 20 77 65 20 63 6f 75 6c 64 20 6f 70 74 69 6d 69   we could optimi
7c50: 7a 65 20 6f 75 74 20 74 68 65 0a 20 20 20 20 20  ze out the.     
7c60: 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 69     ** ORDER BY i
7c70: 6e 20 74 68 69 73 20 63 61 73 65 20 73 69 6e 63  n this case sinc
7c80: 65 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 65  e the order of e
7c90: 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 73 65  ntries in the se
7ca0: 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 65  t.        ** doe
7cb0: 73 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20 20 42  s not matter.  B
7cc0: 75 74 20 74 68 65 72 65 20 6d 69 67 68 74 20 62  ut there might b
7cd0: 65 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  e a LIMIT clause
7ce0: 2c 20 69 6e 20 77 68 69 63 68 0a 20 20 20 20 20  , in which.     
7cf0: 20 20 20 2a 2a 20 63 61 73 65 20 74 68 65 20 6f     ** case the o
7d00: 72 64 65 72 20 64 6f 65 73 20 6d 61 74 74 65 72  rder does matter
7d10: 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 73 68   */.        push
7d20: 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73  OntoSorter(pPars
7d30: 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67  e, pSort, p, reg
7d40: 52 65 73 75 6c 74 2c 20 31 2c 20 6e 50 72 65 66  Result, 1, nPref
7d50: 69 78 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65  ixReg);.      }e
7d60: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
7d70: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
7d80: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
7d90: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7da0: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
7db0: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
7dc0: 52 65 73 75 6c 74 2c 31 2c 72 31 2c 20 26 70 44  Result,1,r1, &pD
7dd0: 65 73 74 2d 3e 61 66 66 53 64 73 74 2c 20 31 29  est->affSdst, 1)
7de0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
7df0: 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
7e00: 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
7e10: 20 72 65 67 52 65 73 75 6c 74 2c 20 31 29 3b 0a   regResult, 1);.
7e20: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
7e30: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
7e40: 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  IdxInsert, iParm
7e50: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73  , r1);.        s
7e60: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
7e70: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
7e80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
7e90: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
7ea0: 20 20 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77 20    /* If any row 
7eb0: 65 78 69 73 74 20 69 6e 20 74 68 65 20 72 65 73  exist in the res
7ec0: 75 6c 74 20 73 65 74 2c 20 72 65 63 6f 72 64 20  ult set, record 
7ed0: 74 68 61 74 20 66 61 63 74 20 61 6e 64 20 61 62  that fact and ab
7ee0: 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ort..    */.    
7ef0: 63 61 73 65 20 53 52 54 5f 45 78 69 73 74 73 3a  case SRT_Exists:
7f00: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
7f10: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
7f20: 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 50 61  _Integer, 1, iPa
7f30: 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68  rm);.      /* Th
7f40: 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77  e LIMIT clause w
7f50: 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68  ill terminate th
7f60: 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f  e loop for us */
7f70: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7f80: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
7f90: 68 69 73 20 69 73 20 61 20 73 63 61 6c 61 72 20  his is a scalar 
7fa0: 73 65 6c 65 63 74 20 74 68 61 74 20 69 73 20 70  select that is p
7fb0: 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73  art of an expres
7fc0: 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a  sion, then.    *
7fd0: 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  * store the resu
7fe0: 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f  lts in the appro
7ff0: 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65  priate memory ce
8000: 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74  ll and break out
8010: 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73  .    ** of the s
8020: 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f  can loop..    */
8030: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65  .    case SRT_Me
8040: 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  m: {.      asser
8050: 74 28 20 6e 52 65 73 75 6c 74 43 6f 6c 3d 3d 31  t( nResultCol==1
8060: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53   );.      if( pS
8070: 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ort ){.        p
8080: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50  ushOntoSorter(pP
8090: 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20  arse, pSort, p, 
80a0: 72 65 67 52 65 73 75 6c 74 2c 20 31 2c 20 6e 50  regResult, 1, nP
80b0: 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20 20 20  refixReg);.     
80c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
80d0: 61 73 73 65 72 74 28 20 72 65 67 52 65 73 75 6c  assert( regResul
80e0: 74 3d 3d 69 50 61 72 6d 20 29 3b 0a 20 20 20 20  t==iParm );.    
80f0: 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54      /* The LIMIT
8100: 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d   clause will jum
8110: 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f  p out of the loo
8120: 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
8130: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
8140: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
8150: 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f   #ifndef SQLITE_
8160: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
8170: 0a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 43  ..    case SRT_C
8180: 6f 72 6f 75 74 69 6e 65 3a 20 20 20 20 20 20 20  oroutine:       
8190: 2f 2a 20 53 65 6e 64 20 64 61 74 61 20 74 6f 20  /* Send data to 
81a0: 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a  a co-routine */.
81b0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 4f 75 74      case SRT_Out
81c0: 70 75 74 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a  put: {        /*
81d0: 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75   Return the resu
81e0: 6c 74 73 20 2a 2f 0a 20 20 20 20 20 20 74 65 73  lts */.      tes
81f0: 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52  tcase( eDest==SR
8200: 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20  T_Coroutine );. 
8210: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
8220: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
8230: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53   );.      if( pS
8240: 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ort ){.        p
8250: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50  ushOntoSorter(pP
8260: 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20  arse, pSort, p, 
8270: 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75  regResult, nResu
8280: 6c 74 43 6f 6c 2c 20 6e 50 72 65 66 69 78 52 65  ltCol, nPrefixRe
8290: 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  g);.      }else 
82a0: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  if( eDest==SRT_C
82b0: 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20  oroutine ){.    
82c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
82d0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
82e0: 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  d, pDest->iSDPar
82f0: 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  m);.      }else{
8300: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8310: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
8320: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 72 65 67 52  _ResultRow, regR
8330: 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f  esult, nResultCo
8340: 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
8350: 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
8360: 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
8370: 65 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52  e, regResult, nR
8380: 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20  esultCol);.     
8390: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
83a0: 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53      }..#ifndef S
83b0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20  QLITE_OMIT_CTE. 
83c0: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
83d0: 72 65 73 75 6c 74 73 20 69 6e 74 6f 20 61 20 70  results into a p
83e0: 72 69 6f 72 69 74 79 20 71 75 65 75 65 20 74 68  riority queue th
83f0: 61 74 20 69 73 20 6f 72 64 65 72 20 61 63 63 6f  at is order acco
8400: 72 64 69 6e 67 20 74 6f 0a 20 20 20 20 2a 2a 20  rding to.    ** 
8410: 70 44 65 73 74 2d 3e 70 4f 72 64 65 72 42 79 20  pDest->pOrderBy 
8420: 28 69 6e 20 70 53 4f 29 2e 20 20 70 44 65 73 74  (in pSO).  pDest
8430: 2d 3e 69 53 44 50 61 72 6d 20 28 69 6e 20 69 50  ->iSDParm (in iP
8440: 61 72 6d 29 20 69 73 20 74 68 65 20 63 75 72 73  arm) is the curs
8450: 6f 72 20 66 6f 72 20 61 6e 0a 20 20 20 20 2a 2a  or for an.    **
8460: 20 69 6e 64 65 78 20 77 69 74 68 20 70 53 4f 2d   index with pSO-
8470: 3e 6e 45 78 70 72 2b 32 20 63 6f 6c 75 6d 6e 73  >nExpr+2 columns
8480: 2e 20 20 42 75 69 6c 64 20 61 20 6b 65 79 20 75  .  Build a key u
8490: 73 69 6e 67 20 70 53 4f 20 66 6f 72 20 74 68 65  sing pSO for the
84a0: 20 66 69 72 73 74 0a 20 20 20 20 2a 2a 20 70 53   first.    ** pS
84b0: 4f 2d 3e 6e 45 78 70 72 20 63 6f 6c 75 6d 6e 73  O->nExpr columns
84c0: 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65  , then make sure
84d0: 20 61 6c 6c 20 6b 65 79 73 20 61 72 65 20 75 6e   all keys are un
84e0: 69 71 75 65 20 62 79 20 61 64 64 69 6e 67 20 61  ique by adding a
84f0: 0a 20 20 20 20 2a 2a 20 66 69 6e 61 6c 20 4f 50  .    ** final OP
8500: 5f 53 65 71 75 65 6e 63 65 20 63 6f 6c 75 6d 6e  _Sequence column
8510: 2e 20 20 54 68 65 20 6c 61 73 74 20 63 6f 6c 75  .  The last colu
8520: 6d 6e 20 69 73 20 74 68 65 20 72 65 63 6f 72 64  mn is the record
8530: 20 61 73 20 61 20 62 6c 6f 62 2e 0a 20 20 20 20   as a blob..    
8540: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
8550: 44 69 73 74 51 75 65 75 65 3a 0a 20 20 20 20 63  DistQueue:.    c
8560: 61 73 65 20 53 52 54 5f 51 75 65 75 65 3a 20 7b  ase SRT_Queue: {
8570: 0a 20 20 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b  .      int nKey;
8580: 0a 20 20 20 20 20 20 69 6e 74 20 72 31 2c 20 72  .      int r1, r
8590: 32 2c 20 72 33 3b 0a 20 20 20 20 20 20 69 6e 74  2, r3;.      int
85a0: 20 61 64 64 72 54 65 73 74 20 3d 20 30 3b 0a 20   addrTest = 0;. 
85b0: 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
85c0: 53 4f 3b 0a 20 20 20 20 20 20 70 53 4f 20 3d 20  SO;.      pSO = 
85d0: 70 44 65 73 74 2d 3e 70 4f 72 64 65 72 42 79 3b  pDest->pOrderBy;
85e0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
85f0: 53 4f 20 29 3b 0a 20 20 20 20 20 20 6e 4b 65 79  SO );.      nKey
8600: 20 3d 20 70 53 4f 2d 3e 6e 45 78 70 72 3b 0a 20   = pSO->nExpr;. 
8610: 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
8620: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
8630: 73 65 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20  se);.      r2 = 
8640: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
8650: 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 4b 65 79  nge(pParse, nKey
8660: 2b 32 29 3b 0a 20 20 20 20 20 20 72 33 20 3d 20  +2);.      r3 = 
8670: 72 32 2b 6e 4b 65 79 2b 31 3b 0a 20 20 20 20 20  r2+nKey+1;.     
8680: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
8690: 44 69 73 74 51 75 65 75 65 20 29 7b 0a 20 20 20  DistQueue ){.   
86a0: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64       /* If the d
86b0: 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 44 69  estination is Di
86c0: 73 74 51 75 65 75 65 2c 20 74 68 65 6e 20 63 75  stQueue, then cu
86d0: 72 73 6f 72 20 28 69 50 61 72 6d 2b 31 29 20 69  rsor (iParm+1) i
86e0: 73 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a  s open.        *
86f0: 2a 20 6f 6e 20 61 20 73 65 63 6f 6e 64 20 65 70  * on a second ep
8700: 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20 74 68  hemeral index th
8710: 61 74 20 68 6f 6c 64 73 20 61 6c 6c 20 76 61 6c  at holds all val
8720: 75 65 73 20 65 76 65 72 79 20 70 72 65 76 69 6f  ues every previo
8730: 75 73 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  usly.        ** 
8740: 61 64 64 65 64 20 74 6f 20 74 68 65 20 71 75 65  added to the que
8750: 75 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  ue. */.        a
8760: 64 64 72 54 65 73 74 20 3d 20 73 71 6c 69 74 65  ddrTest = sqlite
8770: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
8780: 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 50 61 72  , OP_Found, iPar
8790: 6d 2b 31 2c 20 30 2c 20 0a 20 20 20 20 20 20 20  m+1, 0, .       
87a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
87b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
87c0: 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73   regResult, nRes
87d0: 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  ultCol);.       
87e0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
87f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8800: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8810: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
8820: 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e  rd, regResult, n
8830: 52 65 73 75 6c 74 43 6f 6c 2c 20 72 33 29 3b 0a  ResultCol, r3);.
8840: 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d        if( eDest=
8850: 3d 53 52 54 5f 44 69 73 74 51 75 65 75 65 20 29  =SRT_DistQueue )
8860: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
8870: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
8880: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61  P_IdxInsert, iPa
8890: 72 6d 2b 31 2c 20 72 33 29 3b 0a 20 20 20 20 20  rm+1, r3);.     
88a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
88b0: 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
88c0: 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29 3b  _USESEEKRESULT);
88d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
88e0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 4b 65 79 3b 20  or(i=0; i<nKey; 
88f0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71  i++){.        sq
8900: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
8910: 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 0a 20 20 20  v, OP_SCopy,.   
8920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8930: 20 20 20 20 20 20 20 72 65 67 52 65 73 75 6c 74         regResult
8940: 20 2b 20 70 53 4f 2d 3e 61 5b 69 5d 2e 75 2e 78   + pSO->a[i].u.x
8950: 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 2d 20 31  .iOrderByCol - 1
8960: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
8970: 20 20 20 20 20 20 20 20 20 20 20 20 72 32 2b 69              r2+i
8980: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
8990: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
89a0: 70 32 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63  p2(v, OP_Sequenc
89b0: 65 2c 20 69 50 61 72 6d 2c 20 72 32 2b 6e 4b 65  e, iParm, r2+nKe
89c0: 79 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  y);.      sqlite
89d0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
89e0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 32  P_MakeRecord, r2
89f0: 2c 20 6e 4b 65 79 2b 32 2c 20 72 31 29 3b 0a 20  , nKey+2, r1);. 
8a00: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8a10: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
8a20: 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72  Insert, iParm, r
8a30: 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 64  1);.      if( ad
8a40: 64 72 54 65 73 74 20 29 20 73 71 6c 69 74 65 33  drTest ) sqlite3
8a50: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
8a60: 61 64 64 72 54 65 73 74 29 3b 0a 20 20 20 20 20  addrTest);.     
8a70: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
8a80: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
8a90: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
8aa0: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
8ab0: 65 28 70 50 61 72 73 65 2c 20 72 32 2c 20 6e 4b  e(pParse, r2, nK
8ac0: 65 79 2b 32 29 3b 0a 20 20 20 20 20 20 62 72 65  ey+2);.      bre
8ad0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
8ae0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
8af0: 43 54 45 20 2a 2f 0a 0a 0a 0a 23 69 66 20 21 64  CTE */....#if !d
8b00: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
8b10: 49 54 5f 54 52 49 47 47 45 52 29 0a 20 20 20 20  IT_TRIGGER).    
8b20: 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 72  /* Discard the r
8b30: 65 73 75 6c 74 73 2e 20 20 54 68 69 73 20 69 73  esults.  This is
8b40: 20 75 73 65 64 20 66 6f 72 20 53 45 4c 45 43 54   used for SELECT
8b50: 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 73 69   statements insi
8b60: 64 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 6f  de.    ** the bo
8b70: 64 79 20 6f 66 20 61 20 54 52 49 47 47 45 52 2e  dy of a TRIGGER.
8b80: 20 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66    The purpose of
8b90: 20 73 75 63 68 20 73 65 6c 65 63 74 73 20 69 73   such selects is
8ba0: 20 74 6f 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20   to call.    ** 
8bb0: 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e  user-defined fun
8bc0: 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61 76 65  ctions that have
8bd0: 20 73 69 64 65 20 65 66 66 65 63 74 73 2e 20 20   side effects.  
8be0: 57 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 0a 20  We do not care. 
8bf0: 20 20 20 2a 2a 20 61 62 6f 75 74 20 74 68 65 20     ** about the 
8c00: 61 63 74 75 61 6c 20 72 65 73 75 6c 74 73 20 6f  actual results o
8c10: 66 20 74 68 65 20 73 65 6c 65 63 74 2e 0a 20 20  f the select..  
8c20: 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74    */.    default
8c30: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
8c40: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ( eDest==SRT_Dis
8c50: 63 61 72 64 20 29 3b 0a 20 20 20 20 20 20 62 72  card );.      br
8c60: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
8c70: 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70  f.  }..  /* Jump
8c80: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
8c90: 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c  he loop if the L
8ca0: 49 4d 49 54 20 69 73 20 72 65 61 63 68 65 64 2e  IMIT is reached.
8cb0: 20 20 45 78 63 65 70 74 2c 20 69 66 0a 20 20 2a    Except, if.  *
8cc0: 2a 20 74 68 65 72 65 20 69 73 20 61 20 73 6f 72  * there is a sor
8cd0: 74 65 72 2c 20 69 6e 20 77 68 69 63 68 20 63 61  ter, in which ca
8ce0: 73 65 20 74 68 65 20 73 6f 72 74 65 72 20 68 61  se the sorter ha
8cf0: 73 20 61 6c 72 65 61 64 79 20 6c 69 6d 69 74 65  s already limite
8d00: 64 0a 20 20 2a 2a 20 74 68 65 20 6f 75 74 70 75  d.  ** the outpu
8d10: 74 20 66 6f 72 20 75 73 2e 0a 20 20 2a 2f 0a 20  t for us..  */. 
8d20: 20 69 66 28 20 70 53 6f 72 74 3d 3d 30 20 26 26   if( pSort==0 &&
8d30: 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20   p->iLimit ){.  
8d40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8d50: 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75  Op2(v, OP_DecrJu
8d60: 6d 70 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69  mpZero, p->iLimi
8d70: 74 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65  t, iBreak); Vdbe
8d80: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d  Coverage(v);.  }
8d90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
8da0: 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a  te a KeyInfo obj
8db0: 65 63 74 20 73 75 66 66 69 63 69 65 6e 74 20 66  ect sufficient f
8dc0: 6f 72 20 61 6e 20 69 6e 64 65 78 20 6f 66 20 4e  or an index of N
8dd0: 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 61 6e 64   key columns and
8de0: 0a 2a 2a 20 58 20 65 78 74 72 61 20 63 6f 6c 75  .** X extra colu
8df0: 6d 6e 73 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20  mns..*/.KeyInfo 
8e00: 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41  *sqlite3KeyInfoA
8e10: 6c 6c 6f 63 28 73 71 6c 69 74 65 33 20 2a 64 62  lloc(sqlite3 *db
8e20: 2c 20 69 6e 74 20 4e 2c 20 69 6e 74 20 58 29 7b  , int N, int X){
8e30: 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 20 3d 20  .  KeyInfo *p = 
8e40: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
8e50: 65 72 6f 28 30 2c 20 0a 20 20 20 20 20 20 20 20  ero(0, .        
8e60: 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
8e70: 66 28 4b 65 79 49 6e 66 6f 29 20 2b 20 28 4e 2b  f(KeyInfo) + (N+
8e80: 58 29 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53  X)*(sizeof(CollS
8e90: 65 71 2a 29 2b 31 29 29 3b 0a 20 20 69 66 28 20  eq*)+1));.  if( 
8ea0: 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61 53 6f 72  p ){.    p->aSor
8eb0: 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26 70  tOrder = (u8*)&p
8ec0: 2d 3e 61 43 6f 6c 6c 5b 4e 2b 58 5d 3b 0a 20 20  ->aColl[N+X];.  
8ed0: 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75    p->nField = (u
8ee0: 31 36 29 4e 3b 0a 20 20 20 20 70 2d 3e 6e 58 46  16)N;.    p->nXF
8ef0: 69 65 6c 64 20 3d 20 28 75 31 36 29 58 3b 0a 20  ield = (u16)X;. 
8f00: 20 20 20 70 2d 3e 65 6e 63 20 3d 20 45 4e 43 28     p->enc = ENC(
8f10: 64 62 29 3b 0a 20 20 20 20 70 2d 3e 64 62 20 3d  db);.    p->db =
8f20: 20 64 62 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66   db;.    p->nRef
8f30: 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
8f40: 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69     db->mallocFai
8f50: 6c 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72  led = 1;.  }.  r
8f60: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
8f70: 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 4b  * Deallocate a K
8f80: 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f  eyInfo object.*/
8f90: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4b 65 79  .void sqlite3Key
8fa0: 49 6e 66 6f 55 6e 72 65 66 28 4b 65 79 49 6e 66  InfoUnref(KeyInf
8fb0: 6f 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29  o *p){.  if( p )
8fc0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
8fd0: 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 70  >nRef>0 );.    p
8fe0: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66  ->nRef--;.    if
8ff0: 28 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 20 73  ( p->nRef==0 ) s
9000: 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20  qlite3DbFree(0, 
9010: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
9020: 20 4d 61 6b 65 20 61 20 6e 65 77 20 70 6f 69 6e   Make a new poin
9030: 74 65 72 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f  ter to a KeyInfo
9040: 20 6f 62 6a 65 63 74 0a 2a 2f 0a 4b 65 79 49 6e   object.*/.KeyIn
9050: 66 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e  fo *sqlite3KeyIn
9060: 66 6f 52 65 66 28 4b 65 79 49 6e 66 6f 20 2a 70  foRef(KeyInfo *p
9070: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
9080: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65    assert( p->nRe
9090: 66 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 52  f>0 );.    p->nR
90a0: 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ef++;.  }.  retu
90b0: 72 6e 20 70 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  rn p;.}..#ifdef 
90c0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
90d0: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
90e0: 66 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65  f a KeyInfo obje
90f0: 63 74 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65  ct can be change
9100: 2e 20 20 54 68 65 20 4b 65 79 49 6e 66 6f 20 6f  .  The KeyInfo o
9110: 62 6a 65 63 74 0a 2a 2a 20 63 61 6e 20 6f 6e 6c  bject.** can onl
9120: 79 20 62 65 20 63 68 61 6e 67 65 64 20 69 66 20  y be changed if 
9130: 74 68 69 73 20 69 73 20 6a 75 73 74 20 61 20 73  this is just a s
9140: 69 6e 67 6c 65 20 72 65 66 65 72 65 6e 63 65 20  ingle reference 
9150: 74 6f 20 74 68 65 20 6f 62 6a 65 63 74 2e 0a 2a  to the object..*
9160: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
9170: 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 69  e is used only i
9180: 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74 28  nside of assert(
9190: 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f  ) statements..*/
91a0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 4b 65 79 49  .int sqlite3KeyI
91b0: 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 4b  nfoIsWriteable(K
91c0: 65 79 49 6e 66 6f 20 2a 70 29 7b 20 72 65 74 75  eyInfo *p){ retu
91d0: 72 6e 20 70 2d 3e 6e 52 65 66 3d 3d 31 3b 20 7d  rn p->nRef==1; }
91e0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
91f0: 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a  E_DEBUG */../*.*
9200: 2a 20 47 69 76 65 6e 20 61 6e 20 65 78 70 72 65  * Given an expre
9210: 73 73 69 6f 6e 20 6c 69 73 74 2c 20 67 65 6e 65  ssion list, gene
9220: 72 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 73  rate a KeyInfo s
9230: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65  tructure that re
9240: 63 6f 72 64 73 0a 2a 2a 20 74 68 65 20 63 6f 6c  cords.** the col
9250: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
9260: 66 6f 72 20 65 61 63 68 20 65 78 70 72 65 73 73  for each express
9270: 69 6f 6e 20 69 6e 20 74 68 61 74 20 65 78 70 72  ion in that expr
9280: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a  ession list..**.
9290: 2a 2a 20 49 66 20 74 68 65 20 45 78 70 72 4c 69  ** If the ExprLi
92a0: 73 74 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  st is an ORDER B
92b0: 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c  Y or GROUP BY cl
92c0: 61 75 73 65 20 74 68 65 6e 20 74 68 65 20 72 65  ause then the re
92d0: 73 75 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e  sulting.** KeyIn
92e0: 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20  fo structure is 
92f0: 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
9300: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76  initializing a v
9310: 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 0a  irtual index to.
9320: 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61  ** implement tha
9330: 74 20 63 6c 61 75 73 65 2e 20 20 49 66 20 74 68  t clause.  If th
9340: 65 20 45 78 70 72 4c 69 73 74 20 69 73 20 74 68  e ExprList is th
9350: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
9360: 61 20 53 45 4c 45 43 54 0a 2a 2a 20 74 68 65 6e  a SELECT.** then
9370: 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72   the KeyInfo str
9380: 75 63 74 75 72 65 20 69 73 20 61 70 70 72 6f 70  ucture is approp
9390: 72 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61  riate for initia
93a0: 6c 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c  lizing a virtual
93b0: 0a 2a 2a 20 69 6e 64 65 78 20 74 6f 20 69 6d 70  .** index to imp
93c0: 6c 65 6d 65 6e 74 20 61 20 44 49 53 54 49 4e 43  lement a DISTINC
93d0: 54 20 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70  T test..**.** Sp
93e0: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
93f0: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
9400: 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  e is obtained fr
9410: 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 54 68 65 20  om malloc.  The 
9420: 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74  calling.** funct
9430: 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73 69 62  ion is responsib
9440: 6c 65 20 66 6f 72 20 73 65 65 69 6e 67 20 74 68  le for seeing th
9450: 61 74 20 74 68 69 73 20 73 74 72 75 63 74 75 72  at this structur
9460: 65 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a  e is eventually.
9470: 2a 2a 20 66 72 65 65 64 2e 0a 2a 2f 0a 73 74 61  ** freed..*/.sta
9480: 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6b 65 79  tic KeyInfo *key
9490: 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
94a0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
94b0: 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
94c0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
94d0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
94e0: 2c 20 20 20 20 20 2f 2a 20 46 6f 72 6d 20 74 68  ,     /* Form th
94f0: 65 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74  e KeyInfo object
9500: 20 66 72 6f 6d 20 74 68 69 73 20 45 78 70 72 4c   from this ExprL
9510: 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74  ist */.  int iSt
9520: 61 72 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  art,          /*
9530: 20 42 65 67 69 6e 20 77 69 74 68 20 74 68 69 73   Begin with this
9540: 20 63 6f 6c 75 6d 6e 20 6f 66 20 70 4c 69 73 74   column of pList
9550: 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61   */.  int nExtra
9560: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
9570: 64 20 74 68 69 73 20 6d 61 6e 79 20 65 78 74 72  d this many extr
9580: 61 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65  a columns to the
9590: 20 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74   end */.){.  int
95a0: 20 6e 45 78 70 72 3b 0a 20 20 4b 65 79 49 6e 66   nExpr;.  KeyInf
95b0: 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20 73 74 72 75  o *pInfo;.  stru
95c0: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
95d0: 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74   *pItem;.  sqlit
95e0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
95f0: 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  >db;.  int i;.. 
9600: 20 6e 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e   nExpr = pList->
9610: 6e 45 78 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d  nExpr;.  pInfo =
9620: 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41   sqlite3KeyInfoA
9630: 6c 6c 6f 63 28 64 62 2c 20 6e 45 78 70 72 2d 69  lloc(db, nExpr-i
9640: 53 74 61 72 74 2c 20 6e 45 78 74 72 61 2b 31 29  Start, nExtra+1)
9650: 3b 0a 20 20 69 66 28 20 70 49 6e 66 6f 20 29 7b  ;.  if( pInfo ){
9660: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
9670: 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69  ite3KeyInfoIsWri
9680: 74 65 61 62 6c 65 28 70 49 6e 66 6f 29 20 29 3b  teable(pInfo) );
9690: 0a 20 20 20 20 66 6f 72 28 69 3d 69 53 74 61 72  .    for(i=iStar
96a0: 74 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  t, pItem=pList->
96b0: 61 2b 69 53 74 61 72 74 3b 20 69 3c 6e 45 78 70  a+iStart; i<nExp
96c0: 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  r; i++, pItem++)
96d0: 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
96e0: 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 43  *pColl;.      pC
96f0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
9700: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
9710: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a   pItem->pExpr);.
9720: 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
9730: 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70   ) pColl = db->p
9740: 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
9750: 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 2d 69  pInfo->aColl[i-i
9760: 53 74 61 72 74 5d 20 3d 20 70 43 6f 6c 6c 3b 0a  Start] = pColl;.
9770: 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 53 6f        pInfo->aSo
9780: 72 74 4f 72 64 65 72 5b 69 2d 69 53 74 61 72 74  rtOrder[i-iStart
9790: 5d 20 3d 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f  ] = pItem->sortO
97a0: 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rder;.    }.  }.
97b0: 20 20 72 65 74 75 72 6e 20 70 49 6e 66 6f 3b 0a    return pInfo;.
97c0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
97d0: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
97e0: 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 4e 61 6d  SELECT./*.** Nam
97f0: 65 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74  e of the connect
9800: 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75 73  ion operator, us
9810: 65 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73  ed for error mes
9820: 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  sages..*/.static
9830: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 6c   const char *sel
9840: 65 63 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64  ectOpName(int id
9850: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  ){.  char *z;.  
9860: 73 77 69 74 63 68 28 20 69 64 20 29 7b 0a 20 20  switch( id ){.  
9870: 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20    case TK_ALL:  
9880: 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20       z = "UNION 
9890: 41 4c 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  ALL";   break;. 
98a0: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52     case TK_INTER
98b0: 53 45 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52  SECT: z = "INTER
98c0: 53 45 43 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a  SECT";   break;.
98d0: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45      case TK_EXCE
98e0: 50 54 3a 20 20 20 20 7a 20 3d 20 22 45 58 43 45  PT:    z = "EXCE
98f0: 50 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  PT";      break;
9900: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20  .    default:   
9910: 20 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49          z = "UNI
9920: 4f 4e 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b  ON";       break
9930: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
9940: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
9950: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
9960: 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 23 69  ND_SELECT */..#i
9970: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
9980: 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20  T_EXPLAIN./*.** 
9990: 55 6e 6c 65 73 73 20 61 6e 20 22 45 58 50 4c 41  Unless an "EXPLA
99a0: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 22 20 63  IN QUERY PLAN" c
99b0: 6f 6d 6d 61 6e 64 20 69 73 20 62 65 69 6e 67 20  ommand is being 
99c0: 70 72 6f 63 65 73 73 65 64 2c 20 74 68 69 73 20  processed, this 
99d0: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61  function.** is a
99e0: 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73   no-op. Otherwis
99f0: 65 2c 20 69 74 20 61 64 64 73 20 61 20 73 69 6e  e, it adds a sin
9a00: 67 6c 65 20 72 6f 77 20 6f 66 20 6f 75 74 70 75  gle row of outpu
9a10: 74 20 74 6f 20 74 68 65 20 45 51 50 20 72 65 73  t to the EQP res
9a20: 75 6c 74 2c 0a 2a 2a 20 77 68 65 72 65 20 74 68  ult,.** where th
9a30: 65 20 63 61 70 74 69 6f 6e 20 69 73 20 6f 66 20  e caption is of 
9a40: 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  the form:.**.** 
9a50: 20 20 22 55 53 45 20 54 45 4d 50 20 42 2d 54 52    "USE TEMP B-TR
9a60: 45 45 20 46 4f 52 20 78 78 78 22 0a 2a 2a 0a 2a  EE FOR xxx".**.*
9a70: 2a 20 77 68 65 72 65 20 78 78 78 20 69 73 20 6f  * where xxx is o
9a80: 6e 65 20 6f 66 20 22 44 49 53 54 49 4e 43 54 22  ne of "DISTINCT"
9a90: 2c 20 22 4f 52 44 45 52 20 42 59 22 20 6f 72 20  , "ORDER BY" or 
9aa0: 22 47 52 4f 55 50 20 42 59 22 2e 20 45 78 61 63  "GROUP BY". Exac
9ab0: 74 6c 79 20 77 68 69 63 68 0a 2a 2a 20 69 73 20  tly which.** is 
9ac0: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
9ad0: 65 20 7a 55 73 61 67 65 20 61 72 67 75 6d 65 6e  e zUsage argumen
9ae0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
9af0: 64 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62  d explainTempTab
9b00: 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
9b10: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55  , const char *zU
9b20: 73 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61  sage){.  if( pPa
9b30: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20  rse->explain==2 
9b40: 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d  ){.    Vdbe *v =
9b50: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
9b60: 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d      char *zMsg =
9b70: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
9b80: 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 55 53 45  pParse->db, "USE
9b90: 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f 52   TEMP B-TREE FOR
9ba0: 20 25 73 22 2c 20 7a 55 73 61 67 65 29 3b 0a 20   %s", zUsage);. 
9bb0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9bc0: 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61  dOp4(v, OP_Expla
9bd0: 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  in, pParse->iSel
9be0: 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73  ectId, 0, 0, zMs
9bf0: 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a  g, P4_DYNAMIC);.
9c00: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73    }.}../*.** Ass
9c10: 69 67 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 62  ign expression b
9c20: 20 74 6f 20 6c 76 61 6c 75 65 20 61 2e 20 41 20   to lvalue a. A 
9c30: 73 65 63 6f 6e 64 2c 20 6e 6f 2d 6f 70 2c 20 76  second, no-op, v
9c40: 65 72 73 69 6f 6e 20 6f 66 20 74 68 69 73 20 6d  ersion of this m
9c50: 61 63 72 6f 0a 2a 2a 20 69 73 20 70 72 6f 76 69  acro.** is provi
9c60: 64 65 64 20 77 68 65 6e 20 53 51 4c 49 54 45 5f  ded when SQLITE_
9c70: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69 73 20  OMIT_EXPLAIN is 
9c80: 64 65 66 69 6e 65 64 2e 20 54 68 69 73 20 61 6c  defined. This al
9c90: 6c 6f 77 73 20 74 68 65 20 63 6f 64 65 0a 2a 2a  lows the code.**
9ca0: 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63   in sqlite3Selec
9cb0: 74 28 29 20 74 6f 20 61 73 73 69 67 6e 20 76 61  t() to assign va
9cc0: 6c 75 65 73 20 74 6f 20 73 74 72 75 63 74 75 72  lues to structur
9cd0: 65 20 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c  e member variabl
9ce0: 65 73 20 74 68 61 74 0a 2a 2a 20 6f 6e 6c 79 20  es that.** only 
9cf0: 65 78 69 73 74 20 69 66 20 53 51 4c 49 54 45 5f  exist if SQLITE_
9d00: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69 73 20  OMIT_EXPLAIN is 
9d10: 6e 6f 74 20 64 65 66 69 6e 65 64 20 77 69 74 68  not defined with
9d20: 6f 75 74 20 70 6f 6c 6c 75 74 69 6e 67 20 74 68  out polluting th
9d30: 65 0a 2a 2a 20 63 6f 64 65 20 77 69 74 68 20 23  e.** code with #
9d40: 69 66 6e 64 65 66 20 64 69 72 65 63 74 69 76 65  ifndef directive
9d50: 73 2e 0a 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65  s..*/.# define e
9d60: 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
9d70: 28 61 2c 20 62 29 20 61 20 3d 20 62 0a 0a 23 65  (a, b) a = b..#e
9d80: 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72  lse./* No-op ver
9d90: 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 65 78 70  sions of the exp
9da0: 6c 61 69 6e 58 58 58 28 29 20 66 75 6e 63 74 69  lainXXX() functi
9db0: 6f 6e 73 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20  ons and macros. 
9dc0: 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c  */.# define expl
9dd0: 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 79 2c 7a  ainTempTable(y,z
9de0: 29 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61  ).# define expla
9df0: 69 6e 53 65 74 49 6e 74 65 67 65 72 28 79 2c 7a  inSetInteger(y,z
9e00: 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64  ).#endif..#if !d
9e10: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
9e20: 49 54 5f 45 58 50 4c 41 49 4e 29 20 26 26 20 21  IT_EXPLAIN) && !
9e30: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
9e40: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
9e50: 45 43 54 29 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73  ECT)./*.** Unles
9e60: 73 20 61 6e 20 22 45 58 50 4c 41 49 4e 20 51 55  s an "EXPLAIN QU
9e70: 45 52 59 20 50 4c 41 4e 22 20 63 6f 6d 6d 61 6e  ERY PLAN" comman
9e80: 64 20 69 73 20 62 65 69 6e 67 20 70 72 6f 63 65  d is being proce
9e90: 73 73 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74  ssed, this funct
9ea0: 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f  ion.** is a no-o
9eb0: 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  p. Otherwise, it
9ec0: 20 61 64 64 73 20 61 20 73 69 6e 67 6c 65 20 72   adds a single r
9ed0: 6f 77 20 6f 66 20 6f 75 74 70 75 74 20 74 6f 20  ow of output to 
9ee0: 74 68 65 20 45 51 50 20 72 65 73 75 6c 74 2c 0a  the EQP result,.
9ef0: 2a 2a 20 77 68 65 72 65 20 74 68 65 20 63 61 70  ** where the cap
9f00: 74 69 6f 6e 20 69 73 20 6f 66 20 6f 6e 65 20 6f  tion is of one o
9f10: 66 20 74 68 65 20 74 77 6f 20 66 6f 72 6d 73 3a  f the two forms:
9f20: 0a 2a 2a 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f 53  .**.**   "COMPOS
9f30: 49 54 45 20 53 55 42 51 55 45 52 49 45 53 20 69  ITE SUBQUERIES i
9f40: 53 75 62 31 20 61 6e 64 20 69 53 75 62 32 20 28  Sub1 and iSub2 (
9f50: 6f 70 29 22 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f  op)".**   "COMPO
9f60: 53 49 54 45 20 53 55 42 51 55 45 52 49 45 53 20  SITE SUBQUERIES 
9f70: 69 53 75 62 31 20 61 6e 64 20 69 53 75 62 32 20  iSub1 and iSub2 
9f80: 55 53 49 4e 47 20 54 45 4d 50 20 42 2d 54 52 45  USING TEMP B-TRE
9f90: 45 20 28 6f 70 29 22 0a 2a 2a 0a 2a 2a 20 77 68  E (op)".**.** wh
9fa0: 65 72 65 20 69 53 75 62 31 20 61 6e 64 20 69 53  ere iSub1 and iS
9fb0: 75 62 32 20 61 72 65 20 74 68 65 20 69 6e 74 65  ub2 are the inte
9fc0: 67 65 72 73 20 70 61 73 73 65 64 20 61 73 20 74  gers passed as t
9fd0: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
9fe0: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 70 61 72  .** function par
9ff0: 61 6d 65 74 65 72 73 2c 20 61 6e 64 20 6f 70 20  ameters, and op 
a000: 69 73 20 74 68 65 20 74 65 78 74 20 72 65 70 72  is the text repr
a010: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
a020: 65 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f  e parameter.** o
a030: 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e  f the same name.
a040: 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 22   The parameter "
a050: 6f 70 22 20 6d 75 73 74 20 62 65 20 6f 6e 65 20  op" must be one 
a060: 6f 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f  of TK_UNION, TK_
a070: 45 58 43 45 50 54 2c 0a 2a 2a 20 54 4b 5f 49 4e  EXCEPT,.** TK_IN
a080: 54 45 52 53 45 43 54 20 6f 72 20 54 4b 5f 41 4c  TERSECT or TK_AL
a090: 4c 2e 20 54 68 65 20 66 69 72 73 74 20 66 6f 72  L. The first for
a0a0: 6d 20 69 73 20 75 73 65 64 20 69 66 20 61 72 67  m is used if arg
a0b0: 75 6d 65 6e 74 20 62 55 73 65 54 6d 70 20 69 73  ument bUseTmp is
a0c0: 20 0a 2a 2a 20 66 61 6c 73 65 2c 20 6f 72 20 74   .** false, or t
a0d0: 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69  he second form i
a0e0: 66 20 69 74 20 69 73 20 74 72 75 65 2e 0a 2a 2f  f it is true..*/
a0f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
a100: 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 0a 20  lainComposite(. 
a110: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
a120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a130: 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78   /* Parse contex
a140: 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20  t */.  int op,  
a150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a160: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
a170: 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58   TK_UNION, TK_EX
a180: 43 45 50 54 20 65 74 63 2e 20 2a 2f 0a 20 20 69  CEPT etc. */.  i
a190: 6e 74 20 69 53 75 62 31 2c 20 20 20 20 20 20 20  nt iSub1,       
a1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a1b0: 2a 20 53 75 62 71 75 65 72 79 20 69 64 20 31 20  * Subquery id 1 
a1c0: 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 2c 20  */.  int iSub2, 
a1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1e0: 20 20 20 20 20 2f 2a 20 53 75 62 71 75 65 72 79       /* Subquery
a1f0: 20 69 64 20 32 20 2a 2f 0a 20 20 69 6e 74 20 62   id 2 */.  int b
a200: 55 73 65 54 6d 70 20 20 20 20 20 20 20 20 20 20  UseTmp          
a210: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
a220: 75 65 20 69 66 20 61 20 74 65 6d 70 20 74 61 62  ue if a temp tab
a230: 6c 65 20 77 61 73 20 75 73 65 64 20 2a 2f 0a 29  le was used */.)
a240: 7b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d  {.  assert( op==
a250: 54 4b 5f 55 4e 49 4f 4e 20 7c 7c 20 6f 70 3d 3d  TK_UNION || op==
a260: 54 4b 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d  TK_EXCEPT || op=
a270: 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 7c 7c  =TK_INTERSECT ||
a280: 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 3b 0a 20   op==TK_ALL );. 
a290: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
a2a0: 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 56  lain==2 ){.    V
a2b0: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
a2c0: 3e 70 56 64 62 65 3b 0a 20 20 20 20 63 68 61 72  >pVdbe;.    char
a2d0: 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33   *zMsg = sqlite3
a2e0: 4d 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  MPrintf(.       
a2f0: 20 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 43 4f   pParse->db, "CO
a300: 4d 50 4f 55 4e 44 20 53 55 42 51 55 45 52 49 45  MPOUND SUBQUERIE
a310: 53 20 25 64 20 41 4e 44 20 25 64 20 25 73 28 25  S %d AND %d %s(%
a320: 73 29 22 2c 20 69 53 75 62 31 2c 20 69 53 75 62  s)", iSub1, iSub
a330: 32 2c 0a 20 20 20 20 20 20 20 20 62 55 73 65 54  2,.        bUseT
a340: 6d 70 3f 22 55 53 49 4e 47 20 54 45 4d 50 20 42  mp?"USING TEMP B
a350: 2d 54 52 45 45 20 22 3a 22 22 2c 20 73 65 6c 65  -TREE ":"", sele
a360: 63 74 4f 70 4e 61 6d 65 28 6f 70 29 0a 20 20 20  ctOpName(op).   
a370: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
a380: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
a390: 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d  Explain, pParse-
a3a0: 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30  >iSelectId, 0, 0
a3b0: 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d  , zMsg, P4_DYNAM
a3c0: 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65  IC);.  }.}.#else
a3d0: 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72 73 69 6f  ./* No-op versio
a3e0: 6e 73 20 6f 66 20 74 68 65 20 65 78 70 6c 61 69  ns of the explai
a3f0: 6e 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73  nXXX() functions
a400: 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a   and macros. */.
a410: 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e  # define explain
a420: 43 6f 6d 70 6f 73 69 74 65 28 76 2c 77 2c 78 2c  Composite(v,w,x,
a430: 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  y,z).#endif../*.
a440: 2a 2a 20 49 66 20 74 68 65 20 69 6e 6e 65 72 20  ** If the inner 
a450: 6c 6f 6f 70 20 77 61 73 20 67 65 6e 65 72 61 74  loop was generat
a460: 65 64 20 75 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e  ed using a non-n
a470: 75 6c 6c 20 70 4f 72 64 65 72 42 79 20 61 72 67  ull pOrderBy arg
a480: 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20 74  ument,.** then t
a490: 68 65 20 72 65 73 75 6c 74 73 20 77 65 72 65 20  he results were 
a4a0: 70 6c 61 63 65 64 20 69 6e 20 61 20 73 6f 72 74  placed in a sort
a4b0: 65 72 2e 20 20 41 66 74 65 72 20 74 68 65 20 6c  er.  After the l
a4c0: 6f 6f 70 20 69 73 20 74 65 72 6d 69 6e 61 74 65  oop is terminate
a4d0: 64 0a 2a 2a 20 77 65 20 6e 65 65 64 20 74 6f 20  d.** we need to 
a4e0: 72 75 6e 20 74 68 65 20 73 6f 72 74 65 72 20 61  run the sorter a
a4f0: 6e 64 20 6f 75 74 70 75 74 20 74 68 65 20 72 65  nd output the re
a500: 73 75 6c 74 73 2e 20 20 54 68 65 20 66 6f 6c 6c  sults.  The foll
a510: 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e 65  owing.** routine
a520: 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63   generates the c
a530: 6f 64 65 20 6e 65 65 64 65 64 20 74 6f 20 64 6f  ode needed to do
a540: 20 74 68 61 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   that..*/.static
a550: 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 53 6f   void generateSo
a560: 72 74 54 61 69 6c 28 0a 20 20 50 61 72 73 65 20  rtTail(.  Parse 
a570: 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
a580: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
a590: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
a5a0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
a5b0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
a5c0: 0a 20 20 53 6f 72 74 43 74 78 20 2a 70 53 6f 72  .  SortCtx *pSor
a5d0: 74 2c 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74  t,   /* Informat
a5e0: 69 6f 6e 20 6f 6e 20 74 68 65 20 4f 52 44 45 52  ion on the ORDER
a5f0: 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
a600: 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20  int nColumn,    
a610: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
a620: 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a  olumns of data *
a630: 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
a640: 70 44 65 73 74 20 2f 2a 20 57 72 69 74 65 20 74  pDest /* Write t
a650: 68 65 20 73 6f 72 74 65 64 20 72 65 73 75 6c 74  he sorted result
a660: 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 56  s here */.){.  V
a670: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
a680: 3e 70 56 64 62 65 3b 20 20 20 20 20 20 20 20 20  >pVdbe;         
a690: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
a6a0: 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
a6b0: 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 61  ement */.  int a
a6c0: 64 64 72 42 72 65 61 6b 20 3d 20 70 53 6f 72 74  ddrBreak = pSort
a6d0: 2d 3e 6c 61 62 65 6c 44 6f 6e 65 3b 20 20 20 20  ->labelDone;    
a6e0: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
a6f0: 68 65 72 65 20 74 6f 20 65 78 69 74 20 6c 6f 6f  here to exit loo
a700: 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43  p */.  int addrC
a710: 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65  ontinue = sqlite
a720: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
a730: 29 3b 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  );  /* Jump here
a740: 20 66 6f 72 20 6e 65 78 74 20 63 79 63 6c 65 20   for next cycle 
a750: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20  */.  int addr;. 
a760: 20 69 6e 74 20 61 64 64 72 4f 6e 63 65 20 3d 20   int addrOnce = 
a770: 30 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20  0;.  int iTab;. 
a780: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
a790: 72 42 79 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72  rBy = pSort->pOr
a7a0: 64 65 72 42 79 3b 0a 20 20 69 6e 74 20 65 44 65  derBy;.  int eDe
a7b0: 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73  st = pDest->eDes
a7c0: 74 3b 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d  t;.  int iParm =
a7d0: 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 3b   pDest->iSDParm;
a7e0: 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 3b 0a 20  .  int regRow;. 
a7f0: 20 69 6e 74 20 72 65 67 52 6f 77 69 64 3b 0a 20   int regRowid;. 
a800: 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 69 6e 74   int nKey;.  int
a810: 20 69 53 6f 72 74 54 61 62 3b 20 20 20 20 20 20   iSortTab;      
a820: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a830: 53 6f 72 74 65 72 20 63 75 72 73 6f 72 20 74 6f  Sorter cursor to
a840: 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20   read from */.  
a850: 69 6e 74 20 6e 53 6f 72 74 44 61 74 61 3b 20 20  int nSortData;  
a860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a870: 2f 2a 20 54 72 61 69 6c 69 6e 67 20 76 61 6c 75  /* Trailing valu
a880: 65 73 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  es to read from 
a890: 73 6f 72 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  sorter */.  int 
a8a0: 69 3b 0a 20 20 69 6e 74 20 62 53 65 71 3b 20 20  i;.  int bSeq;  
a8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a8c0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
a8d0: 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20 69 6e  sorter record in
a8e0: 63 6c 75 64 65 73 20 73 65 71 2e 20 6e 6f 2e 20  cludes seq. no. 
a8f0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
a900: 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f  _ENABLE_EXPLAIN_
a910: 43 4f 4d 4d 45 4e 54 53 0a 20 20 73 74 72 75 63  COMMENTS.  struc
a920: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
a930: 2a 61 4f 75 74 45 78 20 3d 20 70 2d 3e 70 45 4c  *aOutEx = p->pEL
a940: 69 73 74 2d 3e 61 3b 0a 23 65 6e 64 69 66 0a 0a  ist->a;.#endif..
a950: 20 20 61 73 73 65 72 74 28 20 61 64 64 72 42 72    assert( addrBr
a960: 65 61 6b 3c 30 20 29 3b 0a 20 20 69 66 28 20 70  eak<0 );.  if( p
a970: 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74  Sort->labelBkOut
a980: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
a990: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
a9a0: 47 6f 73 75 62 2c 20 70 53 6f 72 74 2d 3e 72 65  Gosub, pSort->re
a9b0: 67 52 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d 3e  gReturn, pSort->
a9c0: 6c 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20 20  labelBkOut);.   
a9d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a9e0: 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
a9f0: 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20  , addrBreak);.  
aa00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
aa10: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 53 6f  olveLabel(v, pSo
aa20: 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b  rt->labelBkOut);
aa30: 0a 20 20 7d 0a 20 20 69 54 61 62 20 3d 20 70 53  .  }.  iTab = pS
aa40: 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 3b 0a 20  ort->iECursor;. 
aa50: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
aa60: 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73 74 3d  Output || eDest=
aa70: 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29  =SRT_Coroutine )
aa80: 7b 0a 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d  {.    regRowid =
aa90: 20 30 3b 0a 20 20 20 20 72 65 67 52 6f 77 20 3d   0;.    regRow =
aaa0: 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3b 0a 20   pDest->iSdst;. 
aab0: 20 20 20 6e 53 6f 72 74 44 61 74 61 20 3d 20 6e     nSortData = n
aac0: 43 6f 6c 75 6d 6e 3b 0a 20 20 7d 65 6c 73 65 7b  Column;.  }else{
aad0: 0a 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20  .    regRowid = 
aae0: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
aaf0: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 72  g(pParse);.    r
ab00: 65 67 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 47  egRow = sqlite3G
ab10: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
ab20: 29 3b 0a 20 20 20 20 6e 53 6f 72 74 44 61 74 61  );.    nSortData
ab30: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 6e 4b 65 79   = 1;.  }.  nKey
ab40: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   = pOrderBy->nEx
ab50: 70 72 20 2d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53  pr - pSort->nOBS
ab60: 61 74 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 2d  at;.  if( pSort-
ab70: 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52  >sortFlags & SOR
ab80: 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 20  TFLAG_UseSorter 
ab90: 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 53 6f  ){.    int regSo
aba0: 72 74 4f 75 74 20 3d 20 2b 2b 70 50 61 72 73 65  rtOut = ++pParse
abb0: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 53 6f 72  ->nMem;.    iSor
abc0: 74 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e  tTab = pParse->n
abd0: 54 61 62 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70  Tab++;.    if( p
abe0: 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74  Sort->labelBkOut
abf0: 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 4f 6e   ){.      addrOn
ac00: 63 65 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65  ce = sqlite3Code
ac10: 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 20 56 64  Once(pParse); Vd
ac20: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
ac30: 20 20 20 7d 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 4f 70 65 6e 50 73 65 75 64 6f 2c 20 69 53 6f  _OpenPseudo, iSo
ac60: 72 74 54 61 62 2c 20 72 65 67 53 6f 72 74 4f 75  rtTab, regSortOu
ac70: 74 2c 20 6e 4b 65 79 2b 31 2b 6e 53 6f 72 74 44  t, nKey+1+nSortD
ac80: 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20 61 64  ata);.    if( ad
ac90: 64 72 4f 6e 63 65 20 29 20 73 71 6c 69 74 65 33  drOnce ) sqlite3
aca0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
acb0: 61 64 64 72 4f 6e 63 65 29 3b 0a 20 20 20 20 61  addrOnce);.    a
acc0: 64 64 72 20 3d 20 31 20 2b 20 73 71 6c 69 74 65  ddr = 1 + sqlite
acd0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
ace0: 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20 69 54  P_SorterSort, iT
acf0: 61 62 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a  ab, addrBreak);.
ad00: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
ad10: 28 76 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66  (v);.    codeOff
ad20: 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65  set(v, p->iOffse
ad30: 74 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29  t, addrContinue)
ad40: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
ad50: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 6f  eAddOp3(v, OP_So
ad60: 72 74 65 72 44 61 74 61 2c 20 69 54 61 62 2c 20  rterData, iTab, 
ad70: 72 65 67 53 6f 72 74 4f 75 74 2c 20 69 53 6f 72  regSortOut, iSor
ad80: 74 54 61 62 29 3b 0a 20 20 20 20 62 53 65 71 20  tTab);.    bSeq 
ad90: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
ada0: 20 20 61 64 64 72 20 3d 20 31 20 2b 20 73 71 6c    addr = 1 + sql
adb0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
adc0: 2c 20 4f 50 5f 53 6f 72 74 2c 20 69 54 61 62 2c  , OP_Sort, iTab,
add0: 20 61 64 64 72 42 72 65 61 6b 29 3b 20 56 64 62   addrBreak); Vdb
ade0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
adf0: 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
ae00: 70 2d 3e 69 4f 66 66 73 65 74 2c 20 61 64 64 72  p->iOffset, addr
ae10: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 69  Continue);.    i
ae20: 53 6f 72 74 54 61 62 20 3d 20 69 54 61 62 3b 0a  SortTab = iTab;.
ae30: 20 20 20 20 62 53 65 71 20 3d 20 31 3b 0a 20 20      bSeq = 1;.  
ae40: 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  }.  for(i=0; i<n
ae50: 53 6f 72 74 44 61 74 61 3b 20 69 2b 2b 29 7b 0a  SortData; i++){.
ae60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ae70: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
ae80: 6d 6e 2c 20 69 53 6f 72 74 54 61 62 2c 20 6e 4b  mn, iSortTab, nK
ae90: 65 79 2b 62 53 65 71 2b 69 2c 20 72 65 67 52 6f  ey+bSeq+i, regRo
aea0: 77 2b 69 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  w+i);.    VdbeCo
aeb0: 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20  mment((v, "%s", 
aec0: 61 4f 75 74 45 78 5b 69 5d 2e 7a 4e 61 6d 65 20  aOutEx[i].zName 
aed0: 3f 20 61 4f 75 74 45 78 5b 69 5d 2e 7a 4e 61 6d  ? aOutEx[i].zNam
aee0: 65 20 3a 20 61 4f 75 74 45 78 5b 69 5d 2e 7a 53  e : aOutEx[i].zS
aef0: 70 61 6e 29 29 3b 0a 20 20 7d 0a 20 20 73 77 69  pan));.  }.  swi
af00: 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20  tch( eDest ){.  
af10: 20 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65    case SRT_Table
af20: 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45  :.    case SRT_E
af30: 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20  phemTab: {.     
af40: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
af50: 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20  ==SRT_Table );. 
af60: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
af70: 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54  Dest==SRT_EphemT
af80: 61 62 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ab );.      sqli
af90: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
afa0: 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50   OP_NewRowid, iP
afb0: 61 72 6d 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  arm, regRowid);.
afc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
afd0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
afe0: 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67  sert, iParm, reg
aff0: 52 6f 77 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  Row, regRowid);.
b000: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b010: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
b020: 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20  LAG_APPEND);.   
b030: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
b040: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
b050: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
b060: 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b   case SRT_Set: {
b070: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
b080: 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20  Column==1 );.   
b090: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b0a0: 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp4(v, OP_MakeR
b0b0: 65 63 6f 72 64 2c 20 72 65 67 52 6f 77 2c 20 31  ecord, regRow, 1
b0c0: 2c 20 72 65 67 52 6f 77 69 64 2c 0a 20 20 20 20  , regRowid,.    
b0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0e0: 20 20 20 20 26 70 44 65 73 74 2d 3e 61 66 66 53      &pDest->affS
b0f0: 64 73 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 73  dst, 1);.      s
b100: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
b110: 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
b120: 61 72 73 65 2c 20 72 65 67 52 6f 77 2c 20 31 29  arse, regRow, 1)
b130: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
b140: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
b150: 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  IdxInsert, iParm
b160: 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20  , regRowid);.   
b170: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
b180: 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d      case SRT_Mem
b190: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
b1a0: 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a  ( nColumn==1 );.
b1b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
b1c0: 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65  rCodeMove(pParse
b1d0: 2c 20 72 65 67 52 6f 77 2c 20 69 50 61 72 6d 2c  , regRow, iParm,
b1e0: 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68   1);.      /* Th
b1f0: 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77  e LIMIT clause w
b200: 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68  ill terminate th
b210: 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f  e loop for us */
b220: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
b230: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64    }.#endif.    d
b240: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
b250: 61 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d 53  assert( eDest==S
b260: 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65  RT_Output || eDe
b270: 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st==SRT_Coroutin
b280: 65 20 29 3b 20 0a 20 20 20 20 20 20 74 65 73 74  e ); .      test
b290: 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54  case( eDest==SRT
b2a0: 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20  _Output );.     
b2b0: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
b2c0: 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20  ==SRT_Coroutine 
b2d0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44 65  );.      if( eDe
b2e0: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
b2f0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
b300: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
b310: 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70 44 65  P_ResultRow, pDe
b320: 73 74 2d 3e 69 53 64 73 74 2c 20 6e 43 6f 6c 75  st->iSdst, nColu
b330: 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  mn);.        sql
b340: 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
b350: 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
b360: 73 65 2c 20 70 44 65 73 74 2d 3e 69 53 64 73 74  se, pDest->iSdst
b370: 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  , nColumn);.    
b380: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
b390: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b3a0: 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
b3b0: 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b  pDest->iSDParm);
b3c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
b3d0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
b3e0: 20 20 69 66 28 20 72 65 67 52 6f 77 69 64 20 29    if( regRowid )
b3f0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  {.    sqlite3Rel
b400: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
b410: 73 65 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20 20  se, regRow);.   
b420: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
b430: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
b440: 65 67 52 6f 77 69 64 29 3b 0a 20 20 7d 0a 20 20  egRowid);.  }.  
b450: 2f 2a 20 54 68 65 20 62 6f 74 74 6f 6d 20 6f 66  /* The bottom of
b460: 20 74 68 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20   the loop.  */. 
b470: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
b480: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
b490: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 69 66 28  Continue);.  if(
b4a0: 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67   pSort->sortFlag
b4b0: 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65  s & SORTFLAG_Use
b4c0: 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 73 71  Sorter ){.    sq
b4d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
b4e0: 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74  v, OP_SorterNext
b4f0: 2c 20 69 54 61 62 2c 20 61 64 64 72 29 3b 20 56  , iTab, addr); V
b500: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
b510: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
b520: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
b530: 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c  , OP_Next, iTab,
b540: 20 61 64 64 72 29 3b 20 56 64 62 65 43 6f 76 65   addr); VdbeCove
b550: 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 69  rage(v);.  }.  i
b560: 66 28 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74  f( pSort->regRet
b570: 75 72 6e 20 29 20 73 71 6c 69 74 65 33 56 64 62  urn ) sqlite3Vdb
b580: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
b590: 74 75 72 6e 2c 20 70 53 6f 72 74 2d 3e 72 65 67  turn, pSort->reg
b5a0: 52 65 74 75 72 6e 29 3b 0a 20 20 73 71 6c 69 74  Return);.  sqlit
b5b0: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
b5c0: 65 6c 28 76 2c 20 61 64 64 72 42 72 65 61 6b 29  el(v, addrBreak)
b5d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
b5e0: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
b5f0: 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69   string containi
b600: 6e 67 20 74 68 65 20 27 64 65 63 6c 61 72 61 74  ng the 'declarat
b610: 69 6f 6e 20 74 79 70 65 27 20 6f 66 20 74 68 65  ion type' of the
b620: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70  .** expression p
b630: 45 78 70 72 2e 20 54 68 65 20 73 74 72 69 6e 67  Expr. The string
b640: 20 6d 61 79 20 62 65 20 74 72 65 61 74 65 64 20   may be treated 
b650: 61 73 20 73 74 61 74 69 63 20 62 79 20 74 68 65  as static by the
b660: 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41   caller..**.** A
b670: 6c 73 6f 20 74 72 79 20 74 6f 20 65 73 74 69 6d  lso try to estim
b680: 61 74 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ate the size of 
b690: 74 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c  the returned val
b6a0: 75 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  ue and return th
b6b0: 61 74 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20  at.** result in 
b6c0: 2a 70 45 73 74 57 69 64 74 68 2e 0a 2a 2a 0a 2a  *pEstWidth..**.*
b6d0: 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74 69 6f  * The declaratio
b6e0: 6e 20 74 79 70 65 20 69 73 20 74 68 65 20 65 78  n type is the ex
b6f0: 61 63 74 20 64 61 74 61 74 79 70 65 20 64 65 66  act datatype def
b700: 69 6e 69 74 69 6f 6e 20 65 78 74 72 61 63 74 65  inition extracte
b710: 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6f 72  d from the.** or
b720: 69 67 69 6e 61 6c 20 43 52 45 41 54 45 20 54 41  iginal CREATE TA
b730: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69 66  BLE statement if
b740: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
b750: 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 54 68 65  is a column. The
b760: 0a 2a 2a 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  .** declaration 
b770: 74 79 70 65 20 66 6f 72 20 61 20 52 4f 57 49 44  type for a ROWID
b780: 20 66 69 65 6c 64 20 69 73 20 49 4e 54 45 47 45   field is INTEGE
b790: 52 2e 20 45 78 61 63 74 6c 79 20 77 68 65 6e 20  R. Exactly when 
b7a0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  an expression.**
b7b0: 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
b7c0: 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20 63   column can be c
b7d0: 6f 6d 70 6c 65 78 20 69 6e 20 74 68 65 20 70 72  omplex in the pr
b7e0: 65 73 65 6e 63 65 20 6f 66 20 73 75 62 71 75 65  esence of subque
b7f0: 72 69 65 73 2e 20 54 68 65 0a 2a 2a 20 72 65 73  ries. The.** res
b800: 75 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73 69  ult-set expressi
b810: 6f 6e 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 65  on in all of the
b820: 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 45 4c 45 43   following SELEC
b830: 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69 73 20  T statements is 
b840: 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 61  .** considered a
b850: 20 63 6f 6c 75 6d 6e 20 62 79 20 74 68 69 73 20   column by this 
b860: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
b870: 20 20 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f    SELECT col FRO
b880: 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45  M tbl;.**   SELE
b890: 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 46  CT (SELECT col F
b8a0: 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45  ROM tbl;.**   SE
b8b0: 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c  LECT (SELECT col
b8c0: 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 20   FROM tbl);.**  
b8d0: 20 53 45 4c 45 43 54 20 61 62 63 20 46 52 4f 4d   SELECT abc FROM
b8e0: 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 41 53 20   (SELECT col AS 
b8f0: 61 62 63 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a  abc FROM tbl);.*
b900: 2a 20 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72  * .** The declar
b910: 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61  ation type for a
b920: 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 74  ny expression ot
b930: 68 65 72 20 74 68 61 6e 20 61 20 63 6f 6c 75 6d  her than a colum
b940: 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  n is NULL..**.**
b950: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61   This routine ha
b960: 73 20 65 69 74 68 65 72 20 33 20 6f 72 20 36 20  s either 3 or 6 
b970: 70 61 72 61 6d 65 74 65 72 73 20 64 65 70 65 6e  parameters depen
b980: 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20  ding on whether 
b990: 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 53 51  or not.** the SQ
b9a0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
b9b0: 4d 4e 5f 4d 45 54 41 44 41 54 41 20 63 6f 6d 70  MN_METADATA comp
b9c0: 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20  ile-time option 
b9d0: 69 73 20 75 73 65 64 2e 0a 2a 2f 0a 23 69 66 64  is used..*/.#ifd
b9e0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
b9f0: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
ba00: 0a 23 20 64 65 66 69 6e 65 20 63 6f 6c 75 6d 6e  .# define column
ba10: 54 79 70 65 28 41 2c 42 2c 43 2c 44 2c 45 2c 46  Type(A,B,C,D,E,F
ba20: 29 20 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c  ) columnTypeImpl
ba30: 28 41 2c 42 2c 43 2c 44 2c 45 2c 46 29 0a 73 74  (A,B,C,D,E,F).st
ba40: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
ba50: 2a 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28  *columnTypeImpl(
ba60: 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
ba70: 70 4e 43 2c 20 0a 20 20 45 78 70 72 20 2a 70 45  pNC, .  Expr *pE
ba80: 78 70 72 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  xpr,.  const cha
ba90: 72 20 2a 2a 70 7a 4f 72 69 67 44 62 2c 0a 20 20  r **pzOrigDb,.  
baa0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f  const char **pzO
bab0: 72 69 67 54 61 62 2c 0a 20 20 63 6f 6e 73 74 20  rigTab,.  const 
bac0: 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 43 6f 6c  char **pzOrigCol
bad0: 2c 0a 20 20 75 38 20 2a 70 45 73 74 57 69 64 74  ,.  u8 *pEstWidt
bae0: 68 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73  h.){.  char cons
baf0: 74 20 2a 7a 4f 72 69 67 44 62 20 3d 20 30 3b 0a  t *zOrigDb = 0;.
bb00: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f    char const *zO
bb10: 72 69 67 54 61 62 20 3d 20 30 3b 0a 20 20 63 68  rigTab = 0;.  ch
bb20: 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 43  ar const *zOrigC
bb30: 6f 6c 20 3d 20 30 3b 0a 23 65 6c 73 65 20 2f 2a  ol = 0;.#else /*
bb40: 20 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c   if !defined(SQL
bb50: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
bb60: 4e 5f 4d 45 54 41 44 41 54 41 29 20 2a 2f 0a 23  N_METADATA) */.#
bb70: 20 64 65 66 69 6e 65 20 63 6f 6c 75 6d 6e 54 79   define columnTy
bb80: 70 65 28 41 2c 42 2c 43 2c 44 2c 45 2c 46 29 20  pe(A,B,C,D,E,F) 
bb90: 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28 41  columnTypeImpl(A
bba0: 2c 42 2c 46 29 0a 73 74 61 74 69 63 20 63 6f 6e  ,B,F).static con
bbb0: 73 74 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e 54  st char *columnT
bbc0: 79 70 65 49 6d 70 6c 28 0a 20 20 4e 61 6d 65 43  ypeImpl(.  NameC
bbd0: 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 0a 20 20  ontext *pNC, .  
bbe0: 45 78 70 72 20 2a 70 45 78 70 72 2c 0a 20 20 75  Expr *pExpr,.  u
bbf0: 38 20 2a 70 45 73 74 57 69 64 74 68 0a 29 7b 0a  8 *pEstWidth.){.
bc00: 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
bc10: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
bc20: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
bc30: 29 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73  ) */.  char cons
bc40: 74 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20  t *zType = 0;.  
bc50: 69 6e 74 20 6a 3b 0a 20 20 75 38 20 65 73 74 57  int j;.  u8 estW
bc60: 69 64 74 68 20 3d 20 31 3b 0a 0a 20 20 69 66 28  idth = 1;..  if(
bc70: 20 4e 45 56 45 52 28 70 45 78 70 72 3d 3d 30 29   NEVER(pExpr==0)
bc80: 20 7c 7c 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73   || pNC->pSrcLis
bc90: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  t==0 ) return 0;
bca0: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
bcb0: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
bcc0: 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a   TK_AGG_COLUMN:.
bcd0: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
bce0: 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54  MN: {.      /* T
bcf0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
bd00: 20 61 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63 61 74   a column. Locat
bd10: 65 20 74 68 65 20 74 61 62 6c 65 20 74 68 65 20  e the table the 
bd20: 63 6f 6c 75 6d 6e 20 69 73 20 62 65 69 6e 67 0a  column is being.
bd30: 20 20 20 20 20 20 2a 2a 20 65 78 74 72 61 63 74        ** extract
bd40: 65 64 20 66 72 6f 6d 20 69 6e 20 4e 61 6d 65 43  ed from in NameC
bd50: 6f 6e 74 65 78 74 2e 70 53 72 63 4c 69 73 74 2e  ontext.pSrcList.
bd60: 20 54 68 69 73 20 74 61 62 6c 65 20 6d 61 79 20   This table may 
bd70: 62 65 20 72 65 61 6c 0a 20 20 20 20 20 20 2a 2a  be real.      **
bd80: 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20   database table 
bd90: 6f 72 20 61 20 73 75 62 71 75 65 72 79 2e 0a 20  or a subquery.. 
bda0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 61       */.      Ta
bdb0: 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 20 20  ble *pTab = 0;  
bdc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
bdd0: 6c 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6c  le structure col
bde0: 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74 65 64  umn is extracted
bdf0: 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 53   from */.      S
be00: 65 6c 65 63 74 20 2a 70 53 20 3d 20 30 3b 20 20  elect *pS = 0;  
be10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
be20: 6c 65 63 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20  lect the column 
be30: 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
be40: 6d 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  m */.      int i
be50: 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f  Col = pExpr->iCo
be60: 6c 75 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65 78 20  lumn;  /* Index 
be70: 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 54 61  of column in pTa
be80: 62 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63  b */.      testc
be90: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
bea0: 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b  TK_AGG_COLUMN );
beb0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
bec0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
bed0: 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 77  OLUMN );.      w
bee0: 68 69 6c 65 28 20 70 4e 43 20 26 26 20 21 70 54  hile( pNC && !pT
bef0: 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 53 72  ab ){.        Sr
bf00: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20  cList *pTabList 
bf10: 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b  = pNC->pSrcList;
bf20: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  .        for(j=0
bf30: 3b 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  ;j<pTabList->nSr
bf40: 63 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 61  c && pTabList->a
bf50: 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70 45 78  [j].iCursor!=pEx
bf60: 70 72 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b 29 3b  pr->iTable;j++);
bf70: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3c 70  .        if( j<p
bf80: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 7b  TabList->nSrc ){
bf90: 0a 20 20 20 20 20 20 20 20 20 20 70 54 61 62 20  .          pTab 
bfa0: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  = pTabList->a[j]
bfb0: 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20  .pTab;.         
bfc0: 20 70 53 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e   pS = pTabList->
bfd0: 61 5b 6a 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20  a[j].pSelect;.  
bfe0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
bff0: 20 20 20 20 20 20 20 70 4e 43 20 3d 20 70 4e 43         pNC = pNC
c000: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
c010: 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
c020: 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b    if( pTab==0 ){
c030: 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 6f  .        /* At o
c040: 6e 65 20 74 69 6d 65 2c 20 63 6f 64 65 20 73 75  ne time, code su
c050: 63 68 20 61 73 20 22 53 45 4c 45 43 54 20 6e 65  ch as "SELECT ne
c060: 77 2e 78 22 20 77 69 74 68 69 6e 20 61 20 74 72  w.x" within a tr
c070: 69 67 67 65 72 20 77 6f 75 6c 64 0a 20 20 20 20  igger would.    
c080: 20 20 20 20 2a 2a 20 63 61 75 73 65 20 74 68 69      ** cause thi
c090: 73 20 63 6f 6e 64 69 74 69 6f 6e 20 74 6f 20 72  s condition to r
c0a0: 75 6e 2e 20 20 53 69 6e 63 65 20 74 68 65 6e 2c  un.  Since then,
c0b0: 20 77 65 20 68 61 76 65 20 72 65 73 74 72 75 63   we have restruc
c0c0: 74 75 72 65 64 20 68 6f 77 0a 20 20 20 20 20 20  tured how.      
c0d0: 20 20 2a 2a 20 74 72 69 67 67 65 72 20 63 6f 64    ** trigger cod
c0e0: 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 61  e is generated a
c0f0: 6e 64 20 73 6f 20 74 68 69 73 20 63 6f 6e 64 69  nd so this condi
c100: 74 69 6f 6e 20 69 73 20 6e 6f 20 6c 6f 6e 67 65  tion is no longe
c110: 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f  r .        ** po
c120: 73 73 69 62 6c 65 2e 20 48 6f 77 65 76 65 72 2c  ssible. However,
c130: 20 69 74 20 63 61 6e 20 73 74 69 6c 6c 20 62 65   it can still be
c140: 20 74 72 75 65 20 66 6f 72 20 73 74 61 74 65 6d   true for statem
c150: 65 6e 74 73 20 6c 69 6b 65 0a 20 20 20 20 20 20  ents like.      
c160: 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69    ** the followi
c170: 6e 67 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ng:.        **. 
c180: 20 20 20 20 20 20 20 2a 2a 20 20 20 43 52 45 41         **   CREA
c190: 54 45 20 54 41 42 4c 45 20 74 31 28 63 6f 6c 20  TE TABLE t1(col 
c1a0: 49 4e 54 45 47 45 52 29 3b 0a 20 20 20 20 20 20  INTEGER);.      
c1b0: 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53    **   SELECT (S
c1c0: 45 4c 45 43 54 20 74 31 2e 63 6f 6c 29 20 46 52  ELECT t1.col) FR
c1d0: 4f 4d 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20  OM FROM t1;.    
c1e0: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
c1f0: 2a 20 77 68 65 6e 20 63 6f 6c 75 6d 6e 54 79 70  * when columnTyp
c200: 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  e() is called on
c210: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
c220: 22 74 31 2e 63 6f 6c 22 20 69 6e 20 74 68 65 20  "t1.col" in the 
c230: 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 75 62 2d  .        ** sub-
c240: 73 65 6c 65 63 74 2e 20 49 6e 20 74 68 69 73 20  select. In this 
c250: 63 61 73 65 2c 20 73 65 74 20 74 68 65 20 63 6f  case, set the co
c260: 6c 75 6d 6e 20 74 79 70 65 20 74 6f 20 4e 55 4c  lumn type to NUL
c270: 4c 2c 20 65 76 65 6e 0a 20 20 20 20 20 20 20 20  L, even.        
c280: 2a 2a 20 74 68 6f 75 67 68 20 69 74 20 73 68 6f  ** though it sho
c290: 75 6c 64 20 72 65 61 6c 6c 79 20 62 65 20 22 49  uld really be "I
c2a0: 4e 54 45 47 45 52 22 2e 0a 20 20 20 20 20 20 20  NTEGER"..       
c2b0: 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
c2c0: 68 69 73 20 69 73 20 6e 6f 74 20 61 20 70 72 6f  his is not a pro
c2d0: 62 6c 65 6d 2c 20 61 73 20 74 68 65 20 63 6f 6c  blem, as the col
c2e0: 75 6d 6e 20 74 79 70 65 20 6f 66 20 22 74 31 2e  umn type of "t1.
c2f0: 63 6f 6c 22 20 69 73 20 6e 65 76 65 72 0a 20 20  col" is never.  
c300: 20 20 20 20 20 20 2a 2a 20 75 73 65 64 2e 20 57        ** used. W
c310: 68 65 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28 29  hen columnType()
c320: 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68   is called on th
c330: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 0a 20 20  e expression .  
c340: 20 20 20 20 20 20 2a 2a 20 22 28 53 45 4c 45 43        ** "(SELEC
c350: 54 20 74 31 2e 63 6f 6c 29 22 2c 20 74 68 65 20  T t1.col)", the 
c360: 63 6f 72 72 65 63 74 20 74 79 70 65 20 69 73 20  correct type is 
c370: 72 65 74 75 72 6e 65 64 20 28 73 65 65 20 74 68  returned (see th
c380: 65 20 54 4b 5f 53 45 4c 45 43 54 0a 20 20 20 20  e TK_SELECT.    
c390: 20 20 20 20 2a 2a 20 62 72 61 6e 63 68 20 62 65      ** branch be
c3a0: 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  low.  */.       
c3b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
c3c0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
c3d0: 54 61 62 20 26 26 20 70 45 78 70 72 2d 3e 70 54  Tab && pExpr->pT
c3e0: 61 62 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20 20  ab==pTab );.    
c3f0: 20 20 69 66 28 20 70 53 20 29 7b 0a 20 20 20 20    if( pS ){.    
c400: 20 20 20 20 2f 2a 20 54 68 65 20 22 74 61 62 6c      /* The "tabl
c410: 65 22 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61  e" is actually a
c420: 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 61   sub-select or a
c430: 20 76 69 65 77 20 69 6e 20 74 68 65 20 46 52 4f   view in the FRO
c440: 4d 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20  M clause.       
c450: 20 2a 2a 20 6f 66 20 74 68 65 20 53 45 4c 45 43   ** of the SELEC
c460: 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 52 65 74  T statement. Ret
c470: 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74  urn the declarat
c480: 69 6f 6e 20 74 79 70 65 20 61 6e 64 20 6f 72 69  ion type and ori
c490: 67 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  gin.        ** d
c4a0: 61 74 61 20 66 6f 72 20 74 68 65 20 72 65 73 75  ata for the resu
c4b0: 6c 74 2d 73 65 74 20 63 6f 6c 75 6d 6e 20 6f 66  lt-set column of
c4c0: 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e   the sub-select.
c4d0: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
c4e0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20      if( iCol>=0 
c4f0: 26 26 20 41 4c 57 41 59 53 28 69 43 6f 6c 3c 70  && ALWAYS(iCol<p
c500: 53 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  S->pEList->nExpr
c510: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  ) ){.          /
c520: 2a 20 49 66 20 69 43 6f 6c 20 69 73 20 6c 65 73  * If iCol is les
c530: 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  s than zero, the
c540: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
c550: 20 72 65 71 75 65 73 74 73 20 74 68 65 0a 20 20   requests the.  
c560: 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 69 64          ** rowid
c570: 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65   of the sub-sele
c580: 63 74 20 6f 72 20 76 69 65 77 2e 20 54 68 69 73  ct or view. This
c590: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6c   expression is l
c5a0: 65 67 61 6c 20 28 73 65 65 20 0a 20 20 20 20 20  egal (see .     
c5b0: 20 20 20 20 20 2a 2a 20 74 65 73 74 20 63 61 73       ** test cas
c5c0: 65 20 6d 69 73 63 32 2e 32 2e 32 29 20 2d 20 69  e misc2.2.2) - i
c5d0: 74 20 61 6c 77 61 79 73 20 65 76 61 6c 75 61 74  t always evaluat
c5e0: 65 73 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20  es to NULL..    
c5f0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
c600: 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73     NameContext s
c610: 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 45 78  NC;.          Ex
c620: 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69  pr *p = pS->pELi
c630: 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70  st->a[iCol].pExp
c640: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43  r;.          sNC
c650: 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e  .pSrcList = pS->
c660: 70 53 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20  pSrc;.          
c670: 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b  sNC.pNext = pNC;
c680: 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70  .          sNC.p
c690: 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61  Parse = pNC->pPa
c6a0: 72 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  rse;.          z
c6b0: 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70  Type = columnTyp
c6c0: 65 28 26 73 4e 43 2c 20 70 2c 26 7a 4f 72 69 67  e(&sNC, p,&zOrig
c6d0: 44 62 2c 26 7a 4f 72 69 67 54 61 62 2c 26 7a 4f  Db,&zOrigTab,&zO
c6e0: 72 69 67 43 6f 6c 2c 20 26 65 73 74 57 69 64 74  rigCol, &estWidt
c6f0: 68 29 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20  h); .        }. 
c700: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
c710: 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a  Tab->pSchema ){.
c720: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72 65 61          /* A rea
c730: 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  l table */.     
c740: 20 20 20 61 73 73 65 72 74 28 20 21 70 53 20 29     assert( !pS )
c750: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43  ;.        if( iC
c760: 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54  ol<0 ) iCol = pT
c770: 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20  ab->iPKey;.     
c780: 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d     assert( iCol=
c790: 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20  =-1 || (iCol>=0 
c7a0: 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  && iCol<pTab->nC
c7b0: 6f 6c 29 20 29 3b 0a 23 69 66 64 65 66 20 53 51  ol) );.#ifdef SQ
c7c0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
c7d0: 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 20 20  MN_METADATA.    
c7e0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
c7f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70  {.          zTyp
c800: 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20  e = "INTEGER";. 
c810: 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 43 6f           zOrigCo
c820: 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20  l = "rowid";.   
c830: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
c840: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54        zType = pT
c850: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
c860: 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Type;.          
c870: 7a 4f 72 69 67 43 6f 6c 20 3d 20 70 54 61 62 2d  zOrigCol = pTab-
c880: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d  >aCol[iCol].zNam
c890: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 65 73 74  e;.          est
c8a0: 57 69 64 74 68 20 3d 20 70 54 61 62 2d 3e 61 43  Width = pTab->aC
c8b0: 6f 6c 5b 69 43 6f 6c 5d 2e 73 7a 45 73 74 3b 0a  ol[iCol].szEst;.
c8c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c8d0: 20 20 7a 4f 72 69 67 54 61 62 20 3d 20 70 54 61    zOrigTab = pTa
c8e0: 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  b->zName;.      
c8f0: 20 20 69 66 28 20 70 4e 43 2d 3e 70 50 61 72 73    if( pNC->pPars
c900: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  e ){.          i
c910: 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  nt iDb = sqlite3
c920: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 4e  SchemaToIndex(pN
c930: 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  C->pParse->db, p
c940: 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
c950: 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 44 62           zOrigDb
c960: 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e   = pNC->pParse->
c970: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
c980: 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65  me;.        }.#e
c990: 6c 73 65 0a 20 20 20 20 20 20 20 20 69 66 28 20  lse.        if( 
c9a0: 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20  iCol<0 ){.      
c9b0: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54      zType = "INT
c9c0: 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20 20 7d  EGER";.        }
c9d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
c9e0: 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43  zType = pTab->aC
c9f0: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a  ol[iCol].zType;.
ca00: 20 20 20 20 20 20 20 20 20 20 65 73 74 57 69 64            estWid
ca10: 74 68 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  th = pTab->aCol[
ca20: 69 43 6f 6c 5d 2e 73 7a 45 73 74 3b 0a 20 20 20  iCol].szEst;.   
ca30: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
ca40: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
ca50: 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
ca60: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
ca70: 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54  QUERY.    case T
ca80: 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20  K_SELECT: {.    
ca90: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
caa0: 69 6f 6e 20 69 73 20 61 20 73 75 62 2d 73 65 6c  ion is a sub-sel
cab0: 65 63 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20  ect. Return the 
cac0: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
cad0: 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 6f 72   and.      ** or
cae0: 69 67 69 6e 20 69 6e 66 6f 20 66 6f 72 20 74 68  igin info for th
caf0: 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20  e single column 
cb00: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
cb10: 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 0a  t of the SELECT.
cb20: 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65        ** stateme
cb30: 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  nt..      */.   
cb40: 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73     NameContext s
cb50: 4e 43 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74  NC;.      Select
cb60: 20 2a 70 53 20 3d 20 70 45 78 70 72 2d 3e 78 2e   *pS = pExpr->x.
cb70: 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 45  pSelect;.      E
cb80: 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c  xpr *p = pS->pEL
cb90: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
cba0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45  .      assert( E
cbb0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
cbc0: 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
cbd0: 63 74 29 20 29 3b 0a 20 20 20 20 20 20 73 4e 43  ct) );.      sNC
cbe0: 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e  .pSrcList = pS->
cbf0: 70 53 72 63 3b 0a 20 20 20 20 20 20 73 4e 43 2e  pSrc;.      sNC.
cc00: 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20  pNext = pNC;.   
cc10: 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20     sNC.pParse = 
cc20: 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20  pNC->pParse;.   
cc30: 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d     zType = colum
cc40: 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26  nType(&sNC, p, &
cc50: 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69 67 54  zOrigDb, &zOrigT
cc60: 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 2c 20 26  ab, &zOrigCol, &
cc70: 65 73 74 57 69 64 74 68 29 3b 20 0a 20 20 20 20  estWidth); .    
cc80: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
cc90: 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 64 65  endif.  }..#ifde
cca0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
ccb0: 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 20  COLUMN_METADATA 
ccc0: 20 0a 20 20 69 66 28 20 70 7a 4f 72 69 67 44 62   .  if( pzOrigDb
ccd0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
cce0: 70 7a 4f 72 69 67 54 61 62 20 26 26 20 70 7a 4f  pzOrigTab && pzO
ccf0: 72 69 67 43 6f 6c 20 29 3b 0a 20 20 20 20 2a 70  rigCol );.    *p
cd00: 7a 4f 72 69 67 44 62 20 3d 20 7a 4f 72 69 67 44  zOrigDb = zOrigD
cd10: 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 54 61  b;.    *pzOrigTa
cd20: 62 20 3d 20 7a 4f 72 69 67 54 61 62 3b 0a 20 20  b = zOrigTab;.  
cd30: 20 20 2a 70 7a 4f 72 69 67 43 6f 6c 20 3d 20 7a    *pzOrigCol = z
cd40: 4f 72 69 67 43 6f 6c 3b 0a 20 20 7d 0a 23 65 6e  OrigCol;.  }.#en
cd50: 64 69 66 0a 20 20 69 66 28 20 70 45 73 74 57 69  dif.  if( pEstWi
cd60: 64 74 68 20 29 20 2a 70 45 73 74 57 69 64 74 68  dth ) *pEstWidth
cd70: 20 3d 20 65 73 74 57 69 64 74 68 3b 0a 20 20 72   = estWidth;.  r
cd80: 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a 0a  eturn zType;.}..
cd90: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
cda0: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65  ode that will te
cdb0: 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68 65 20  ll the VDBE the 
cdc0: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
cdd0: 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20  s of columns.** 
cde0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
cdf0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
ce00: 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e  d generateColumn
ce10: 54 79 70 65 73 28 0a 20 20 50 61 72 73 65 20 2a  Types(.  Parse *
ce20: 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20  pParse,      /* 
ce30: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
ce40: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
ce50: 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20  bList,  /* List 
ce60: 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45  of tables */.  E
ce70: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
ce80: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
ce90: 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72  s defining the r
cea0: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a  esult set */.){.
ceb0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
cec0: 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a 20 20 56  MIT_DECLTYPE.  V
ced0: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
cee0: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
cef0: 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73  .  NameContext s
cf00: 4e 43 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69  NC;.  sNC.pSrcLi
cf10: 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20  st = pTabList;. 
cf20: 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50   sNC.pParse = pP
cf30: 61 72 73 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  arse;.  for(i=0;
cf40: 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
cf50: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
cf60: 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b   *p = pEList->a[
cf70: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 63 6f  i].pExpr;.    co
cf80: 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b  nst char *zType;
cf90: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
cfa0: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
cfb0: 41 44 41 54 41 0a 20 20 20 20 63 6f 6e 73 74 20  ADATA.    const 
cfc0: 63 68 61 72 20 2a 7a 4f 72 69 67 44 62 20 3d 20  char *zOrigDb = 
cfd0: 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  0;.    const cha
cfe0: 72 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20 30 3b  r *zOrigTab = 0;
cff0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
d000: 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b 0a 20  *zOrigCol = 0;. 
d010: 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d     zType = colum
d020: 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26  nType(&sNC, p, &
d030: 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69 67 54  zOrigDb, &zOrigT
d040: 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 2c 20 30  ab, &zOrigCol, 0
d050: 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 76  );..    /* The v
d060: 64 62 65 20 6d 75 73 74 20 6d 61 6b 65 20 69 74  dbe must make it
d070: 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20 74 68  s own copy of th
d080: 65 20 63 6f 6c 75 6d 6e 2d 74 79 70 65 20 61 6e  e column-type an
d090: 64 20 6f 74 68 65 72 20 0a 20 20 20 20 2a 2a 20  d other .    ** 
d0a0: 63 6f 6c 75 6d 6e 20 73 70 65 63 69 66 69 63 20  column specific 
d0b0: 73 74 72 69 6e 67 73 2c 20 69 6e 20 63 61 73 65  strings, in case
d0c0: 20 74 68 65 20 73 63 68 65 6d 61 20 69 73 20 72   the schema is r
d0d0: 65 73 65 74 20 62 65 66 6f 72 65 20 74 68 69 73  eset before this
d0e0: 0a 20 20 20 20 2a 2a 20 76 69 72 74 75 61 6c 20  .    ** virtual 
d0f0: 6d 61 63 68 69 6e 65 20 69 73 20 64 65 6c 65 74  machine is delet
d100: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ed..    */.    s
d110: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
d120: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
d130: 4d 45 5f 44 41 54 41 42 41 53 45 2c 20 7a 4f 72  ME_DATABASE, zOr
d140: 69 67 44 62 2c 20 53 51 4c 49 54 45 5f 54 52 41  igDb, SQLITE_TRA
d150: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c  NSIENT);.    sql
d160: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
d170: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
d180: 5f 54 41 42 4c 45 2c 20 7a 4f 72 69 67 54 61 62  _TABLE, zOrigTab
d190: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
d1a0: 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  NT);.    sqlite3
d1b0: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
d1c0: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 43 4f 4c  , i, COLNAME_COL
d1d0: 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f 6c 2c 20 53  UMN, zOrigCol, S
d1e0: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
d1f0: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 7a 54 79 70  ;.#else.    zTyp
d200: 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26  e = columnType(&
d210: 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30 2c  sNC, p, 0, 0, 0,
d220: 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20   0);.#endif.    
d230: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
d240: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
d250: 41 4d 45 5f 44 45 43 4c 54 59 50 45 2c 20 7a 54  AME_DECLTYPE, zT
d260: 79 70 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  ype, SQLITE_TRAN
d270: 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 23 65 6e 64  SIENT);.  }.#end
d280: 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
d290: 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54  QLITE_OMIT_DECLT
d2a0: 59 50 45 29 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a  YPE) */.}../*.**
d2b0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
d2c0: 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68  hat will tell th
d2d0: 65 20 56 44 42 45 20 74 68 65 20 6e 61 6d 65 73  e VDBE the names
d2e0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69   of columns.** i
d2f0: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
d300: 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74  .  This informat
d310: 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 70  ion is used to p
d320: 72 6f 76 69 64 65 20 74 68 65 0a 2a 2a 20 61 7a  rovide the.** az
d330: 43 6f 6c 5b 5d 20 76 61 6c 75 65 73 20 69 6e 20  Col[] values in 
d340: 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f  the callback..*/
d350: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e  .static void gen
d360: 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
d370: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
d380: 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65  e,      /* Parse
d390: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
d3a0: 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
d3b0: 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61  ,  /* List of ta
d3c0: 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69  bles */.  ExprLi
d3d0: 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a  st *pEList    /*
d3e0: 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66   Expressions def
d3f0: 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74  ining the result
d400: 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62   set */.){.  Vdb
d410: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
d420: 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  Vdbe;.  int i, j
d430: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
d440: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
d450: 69 6e 74 20 66 75 6c 6c 4e 61 6d 65 73 2c 20 73  int fullNames, s
d460: 68 6f 72 74 4e 61 6d 65 73 3b 0a 0a 23 69 66 6e  hortNames;..#ifn
d470: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
d480: 45 58 50 4c 41 49 4e 0a 20 20 2f 2a 20 49 66 20  EXPLAIN.  /* If 
d490: 74 68 69 73 20 69 73 20 61 6e 20 45 58 50 4c 41  this is an EXPLA
d4a0: 49 4e 2c 20 73 6b 69 70 20 74 68 69 73 20 73 74  IN, skip this st
d4b0: 65 70 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  ep */.  if( pPar
d4c0: 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20  se->explain ){. 
d4d0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23     return;.  }.#
d4e0: 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 50 61  endif..  if( pPa
d4f0: 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74  rse->colNamesSet
d500: 20 7c 7c 20 4e 45 56 45 52 28 76 3d 3d 30 29 20   || NEVER(v==0) 
d510: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
d520: 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
d530: 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73  pParse->colNames
d540: 53 65 74 20 3d 20 31 3b 0a 20 20 66 75 6c 6c 4e  Set = 1;.  fullN
d550: 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67  ames = (db->flag
d560: 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43  s & SQLITE_FullC
d570: 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73  olNames)!=0;.  s
d580: 68 6f 72 74 4e 61 6d 65 73 20 3d 20 28 64 62 2d  hortNames = (db-
d590: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
d5a0: 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 21 3d  ShortColNames)!=
d5b0: 30 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  0;.  sqlite3Vdbe
d5c0: 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 70 45  SetNumCols(v, pE
d5d0: 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
d5e0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73  for(i=0; i<pELis
d5f0: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
d600: 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20      Expr *p;.   
d610: 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69   p = pEList->a[i
d620: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ].pExpr;.    if(
d630: 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20 63   NEVER(p==0) ) c
d640: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
d650: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e   pEList->a[i].zN
d660: 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 63 68 61  ame ){.      cha
d670: 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73  r *zName = pELis
d680: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20  t->a[i].zName;. 
d690: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d6a0: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
d6b0: 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a   COLNAME_NAME, z
d6c0: 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 54 52 41  Name, SQLITE_TRA
d6d0: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d 65 6c  NSIENT);.    }el
d6e0: 73 65 20 69 66 28 20 28 70 2d 3e 6f 70 3d 3d 54  se if( (p->op==T
d6f0: 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 2d 3e 6f  K_COLUMN || p->o
d700: 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p==TK_AGG_COLUMN
d710: 29 20 26 26 20 70 54 61 62 4c 69 73 74 20 29 7b  ) && pTabList ){
d720: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
d730: 61 62 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  ab;.      char *
d740: 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20  zCol;.      int 
d750: 69 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d  iCol = p->iColum
d760: 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  n;.      for(j=0
d770: 3b 20 41 4c 57 41 59 53 28 6a 3c 70 54 61 62 4c  ; ALWAYS(j<pTabL
d780: 69 73 74 2d 3e 6e 53 72 63 29 3b 20 6a 2b 2b 29  ist->nSrc); j++)
d790: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  {.        if( pT
d7a0: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75  abList->a[j].iCu
d7b0: 72 73 6f 72 3d 3d 70 2d 3e 69 54 61 62 6c 65 20  rsor==p->iTable 
d7c0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
d7d0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a  .      assert( j
d7e0: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20  <pTabList->nSrc 
d7f0: 29 3b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20  );.      pTab = 
d800: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70  pTabList->a[j].p
d810: 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 69  Tab;.      if( i
d820: 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70  Col<0 ) iCol = p
d830: 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20  Tab->iPKey;.    
d840: 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d    assert( iCol==
d850: 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26  -1 || (iCol>=0 &
d860: 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  & iCol<pTab->nCo
d870: 6c 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  l) );.      if( 
d880: 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20  iCol<0 ){.      
d890: 20 20 7a 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22    zCol = "rowid"
d8a0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
d8b0: 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54         zCol = pT
d8c0: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
d8d0: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Name;.      }.  
d8e0: 20 20 20 20 69 66 28 20 21 73 68 6f 72 74 4e 61      if( !shortNa
d8f0: 6d 65 73 20 26 26 20 21 66 75 6c 6c 4e 61 6d 65  mes && !fullName
d900: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  s ){.        sql
d910: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
d920: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
d930: 5f 4e 41 4d 45 2c 20 0a 20 20 20 20 20 20 20 20  _NAME, .        
d940: 20 20 20 20 73 71 6c 69 74 65 33 44 62 53 74 72      sqlite3DbStr
d950: 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74 2d 3e  Dup(db, pEList->
d960: 61 5b 69 5d 2e 7a 53 70 61 6e 29 2c 20 53 51 4c  a[i].zSpan), SQL
d970: 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ITE_DYNAMIC);.  
d980: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 75      }else if( fu
d990: 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20  llNames ){.     
d9a0: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d     char *zName =
d9b0: 20 30 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d   0;.        zNam
d9c0: 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
d9d0: 74 66 28 64 62 2c 20 22 25 73 2e 25 73 22 2c 20  tf(db, "%s.%s", 
d9e0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f  pTab->zName, zCo
d9f0: 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
da00: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
da10: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
da20: 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c  NAME, zName, SQL
da30: 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ITE_DYNAMIC);.  
da40: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
da50: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
da60: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
da70: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 43 6f  OLNAME_NAME, zCo
da80: 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  l, SQLITE_TRANSI
da90: 45 4e 54 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ENT);.      }.  
daa0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
dab0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70  onst char *z = p
dac0: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61  EList->a[i].zSpa
dad0: 6e 3b 0a 20 20 20 20 20 20 7a 20 3d 20 7a 3d 3d  n;.      z = z==
dae0: 30 20 3f 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  0 ? sqlite3MPrin
daf0: 74 66 28 64 62 2c 20 22 63 6f 6c 75 6d 6e 25 64  tf(db, "column%d
db00: 22 2c 20 69 2b 31 29 20 3a 20 73 71 6c 69 74 65  ", i+1) : sqlite
db10: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a 29  3DbStrDup(db, z)
db20: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
db30: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
db40: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
db50: 2c 20 7a 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41  , z, SQLITE_DYNA
db60: 4d 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  MIC);.    }.  }.
db70: 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
db80: 54 79 70 65 73 28 70 50 61 72 73 65 2c 20 70 54  Types(pParse, pT
db90: 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b  abList, pEList);
dba0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
dbb0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  an expression li
dbc0: 73 74 20 28 77 68 69 63 68 20 69 73 20 72 65 61  st (which is rea
dbd0: 6c 6c 79 20 74 68 65 20 6c 69 73 74 20 6f 66 20  lly the list of 
dbe0: 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74  expressions.** t
dbf0: 68 61 74 20 66 6f 72 6d 20 74 68 65 20 72 65 73  hat form the res
dc00: 75 6c 74 20 73 65 74 20 6f 66 20 61 20 53 45 4c  ult set of a SEL
dc10: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 29 20 63  ECT statement) c
dc20: 6f 6d 70 75 74 65 20 61 70 70 72 6f 70 72 69 61  ompute appropria
dc30: 74 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 61 6d  te.** column nam
dc40: 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65 20 74  es for a table t
dc50: 68 61 74 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74  hat would hold t
dc60: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  he expression li
dc70: 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 6f  st..**.** All co
dc80: 6c 75 6d 6e 20 6e 61 6d 65 73 20 77 69 6c 6c 20  lumn names will 
dc90: 62 65 20 75 6e 69 71 75 65 2e 0a 2a 2a 0a 2a 2a  be unique..**.**
dca0: 20 4f 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e   Only the column
dcb0: 20 6e 61 6d 65 73 20 61 72 65 20 63 6f 6d 70 75   names are compu
dcc0: 74 65 64 2e 20 20 43 6f 6c 75 6d 6e 2e 7a 54 79  ted.  Column.zTy
dcd0: 70 65 2c 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c  pe, Column.zColl
dce0: 2c 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72 20 66  ,.** and other f
dcf0: 69 65 6c 64 73 20 6f 66 20 43 6f 6c 75 6d 6e 20  ields of Column 
dd00: 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a  are zeroed..**.*
dd10: 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
dd20: 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  OK on success.  
dd30: 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  If a memory allo
dd40: 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63  cation error occ
dd50: 75 72 73 2c 0a 2a 2a 20 73 74 6f 72 65 20 4e 55  urs,.** store NU
dd60: 4c 4c 20 69 6e 20 2a 70 61 43 6f 6c 20 61 6e 64  LL in *paCol and
dd70: 20 30 20 69 6e 20 2a 70 6e 43 6f 6c 20 61 6e 64   0 in *pnCol and
dd80: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
dd90: 4f 4d 45 4d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  OMEM..*/.static 
dda0: 69 6e 74 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e  int selectColumn
ddb0: 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20  sFromExprList(. 
ddc0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
ddd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
dde0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
ddf0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
de00: 74 2c 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72  t,       /* Expr
de10: 20 6c 69 73 74 20 66 72 6f 6d 20 77 68 69 63 68   list from which
de20: 20 74 6f 20 64 65 72 69 76 65 20 63 6f 6c 75 6d   to derive colum
de30: 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 31 36  n names */.  i16
de40: 20 2a 70 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20   *pnCol,        
de50: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
de60: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
de70: 6d 6e 73 20 68 65 72 65 20 2a 2f 0a 20 20 43 6f  mns here */.  Co
de80: 6c 75 6d 6e 20 2a 2a 70 61 43 6f 6c 20 20 20 20  lumn **paCol    
de90: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
dea0: 68 65 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 6c 69  he new column li
deb0: 73 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  st here */.){.  
dec0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
ded0: 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 44  arse->db;   /* D
dee0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
def0: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a  on */.  int i, j
df00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
df10: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
df20: 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6e  ters */.  int cn
df30: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
df40: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 61        /* Index a
df50: 64 64 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65  dded to make the
df60: 20 6e 61 6d 65 20 75 6e 69 71 75 65 20 2a 2f 0a   name unique */.
df70: 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20    Column *aCol, 
df80: 2a 70 43 6f 6c 3b 20 20 20 20 20 20 20 20 2f 2a  *pCol;        /*
df90: 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
dfa0: 72 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  r result columns
dfb0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20   */.  int nCol; 
dfc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfd0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
dfe0: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
dff0: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 45 78  sult set */.  Ex
e000: 70 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  pr *p;          
e010: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
e020: 72 65 73 73 69 6f 6e 20 66 6f 72 20 61 20 73 69  ression for a si
e030: 6e 67 6c 65 20 72 65 73 75 6c 74 20 63 6f 6c 75  ngle result colu
e040: 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e  mn */.  char *zN
e050: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
e060: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61      /* Column na
e070: 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d  me */.  int nNam
e080: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
e090: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6e      /* Size of n
e0a0: 61 6d 65 20 69 6e 20 7a 4e 61 6d 65 5b 5d 20 2a  ame in zName[] *
e0b0: 2f 0a 0a 20 20 69 66 28 20 70 45 4c 69 73 74 20  /..  if( pEList 
e0c0: 29 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 45  ){.    nCol = pE
e0d0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
e0e0: 20 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 44   aCol = sqlite3D
e0f0: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
e100: 73 69 7a 65 6f 66 28 61 43 6f 6c 5b 30 5d 29 2a  sizeof(aCol[0])*
e110: 6e 43 6f 6c 29 3b 0a 20 20 20 20 74 65 73 74 63  nCol);.    testc
e120: 61 73 65 28 20 61 43 6f 6c 3d 3d 30 20 29 3b 0a  ase( aCol==0 );.
e130: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f    }else{.    nCo
e140: 6c 20 3d 20 30 3b 0a 20 20 20 20 61 43 6f 6c 20  l = 0;.    aCol 
e150: 3d 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 6e 43 6f  = 0;.  }.  *pnCo
e160: 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 2a 70 61 43  l = nCol;.  *paC
e170: 6f 6c 20 3d 20 61 43 6f 6c 3b 0a 0a 20 20 66 6f  ol = aCol;..  fo
e180: 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c  r(i=0, pCol=aCol
e190: 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70  ; i<nCol; i++, p
e1a0: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 47  Col++){.    /* G
e1b0: 65 74 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  et an appropriat
e1c0: 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 63  e name for the c
e1d0: 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2f 0a 20 20 20  olumn.    */.   
e1e0: 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72   p = sqlite3Expr
e1f0: 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 4c 69  SkipCollate(pELi
e200: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
e210: 0a 20 20 20 20 69 66 28 20 28 7a 4e 61 6d 65 20  .    if( (zName 
e220: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  = pEList->a[i].z
e230: 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
e240: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75    /* If the colu
e250: 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 22  mn contains an "
e260: 41 53 20 3c 6e 61 6d 65 3e 22 20 70 68 72 61 73  AS <name>" phras
e270: 65 2c 20 75 73 65 20 3c 6e 61 6d 65 3e 20 61 73  e, use <name> as
e280: 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20   the name */.   
e290: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
e2a0: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a  e3DbStrDup(db, z
e2b0: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Name);.    }else
e2c0: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 43  {.      Expr *pC
e2d0: 6f 6c 45 78 70 72 20 3d 20 70 3b 20 20 2f 2a 20  olExpr = p;  /* 
e2e0: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  The expression t
e2f0: 68 61 74 20 69 73 20 74 68 65 20 72 65 73 75 6c  hat is the resul
e300: 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f  t column name */
e310: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
e320: 61 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ab;         /* T
e330: 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20  able associated 
e340: 77 69 74 68 20 74 68 69 73 20 65 78 70 72 65 73  with this expres
e350: 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 77 68  sion */.      wh
e360: 69 6c 65 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f  ile( pColExpr->o
e370: 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20  p==TK_DOT ){.   
e380: 20 20 20 20 20 70 43 6f 6c 45 78 70 72 20 3d 20       pColExpr = 
e390: 70 43 6f 6c 45 78 70 72 2d 3e 70 52 69 67 68 74  pColExpr->pRight
e3a0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
e3b0: 28 20 70 43 6f 6c 45 78 70 72 21 3d 30 20 29 3b  ( pColExpr!=0 );
e3c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
e3d0: 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d  f( pColExpr->op=
e3e0: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 41 4c  =TK_COLUMN && AL
e3f0: 57 41 59 53 28 70 43 6f 6c 45 78 70 72 2d 3e 70  WAYS(pColExpr->p
e400: 54 61 62 21 3d 30 29 20 29 7b 0a 20 20 20 20 20  Tab!=0) ){.     
e410: 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e     /* For column
e420: 73 20 75 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e  s use the column
e430: 20 6e 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20   name name */.  
e440: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
e450: 20 70 43 6f 6c 45 78 70 72 2d 3e 69 43 6f 6c 75   pColExpr->iColu
e460: 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62  mn;.        pTab
e470: 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 54 61   = pColExpr->pTa
e480: 62 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  b;.        if( i
e490: 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70  Col<0 ) iCol = p
e4a0: 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20  Tab->iPKey;.    
e4b0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
e4c0: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
e4d0: 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
e4e0: 20 20 20 20 20 20 69 43 6f 6c 3e 3d 30 20 3f 20        iCol>=0 ? 
e4f0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
e500: 2e 7a 4e 61 6d 65 20 3a 20 22 72 6f 77 69 64 22  .zName : "rowid"
e510: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
e520: 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d  f( pColExpr->op=
e530: 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20 20 20  =TK_ID ){.      
e540: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
e550: 61 73 50 72 6f 70 65 72 74 79 28 70 43 6f 6c 45  asProperty(pColE
e560: 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
e570: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61  ) );.        zNa
e580: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
e590: 6e 74 66 28 64 62 2c 20 22 25 73 22 2c 20 70 43  ntf(db, "%s", pC
e5a0: 6f 6c 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  olExpr->u.zToken
e5b0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
e5c0: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74          /* Use t
e5d0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 78 74  he original text
e5e0: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 65   of the column e
e5f0: 78 70 72 65 73 73 69 6f 6e 20 61 73 20 69 74 73  xpression as its
e600: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20   name */.       
e610: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
e620: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22  MPrintf(db, "%s"
e630: 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  , pEList->a[i].z
e640: 53 70 61 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Span);.      }. 
e650: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d     }.    if( db-
e660: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
e670: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
e680: 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b  Free(db, zName);
e690: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
e6a0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65    }..    /* Make
e6b0: 20 73 75 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e   sure the column
e6c0: 20 6e 61 6d 65 20 69 73 20 75 6e 69 71 75 65 2e   name is unique.
e6d0: 20 20 49 66 20 74 68 65 20 6e 61 6d 65 20 69 73    If the name is
e6e0: 20 6e 6f 74 20 75 6e 69 71 75 65 2c 0a 20 20 20   not unique,.   
e6f0: 20 2a 2a 20 61 70 70 65 6e 64 20 61 6e 20 69 6e   ** append an in
e700: 74 65 67 65 72 20 74 6f 20 74 68 65 20 6e 61 6d  teger to the nam
e710: 65 20 73 6f 20 74 68 61 74 20 69 74 20 62 65 63  e so that it bec
e720: 6f 6d 65 73 20 75 6e 69 71 75 65 2e 0a 20 20 20  omes unique..   
e730: 20 2a 2f 0a 20 20 20 20 6e 4e 61 6d 65 20 3d 20   */.    nName = 
e740: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
e750: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72 28  zName);.    for(
e760: 6a 3d 63 6e 74 3d 30 3b 20 6a 3c 69 3b 20 6a 2b  j=cnt=0; j<i; j+
e770: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  +){.      if( sq
e780: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 61 43 6f  lite3StrICmp(aCo
e790: 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  l[j].zName, zNam
e7a0: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
e7b0: 20 63 68 61 72 20 2a 7a 4e 65 77 4e 61 6d 65 3b   char *zNewName;
e7c0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a  .        int k;.
e7d0: 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 6e 4e          for(k=nN
e7e0: 61 6d 65 2d 31 3b 20 6b 3e 31 20 26 26 20 73 71  ame-1; k>1 && sq
e7f0: 6c 69 74 65 33 49 73 64 69 67 69 74 28 7a 4e 61  lite3Isdigit(zNa
e800: 6d 65 5b 6b 5d 29 3b 20 6b 2d 2d 29 7b 7d 0a 20  me[k]); k--){}. 
e810: 20 20 20 20 20 20 20 69 66 28 20 6b 3e 3d 30 20         if( k>=0 
e820: 26 26 20 7a 4e 61 6d 65 5b 6b 5d 3d 3d 27 3a 27  && zName[k]==':'
e830: 20 29 20 6e 4e 61 6d 65 20 3d 20 6b 3b 0a 20 20   ) nName = k;.  
e840: 20 20 20 20 20 20 7a 4e 61 6d 65 5b 6e 4e 61 6d        zName[nNam
e850: 65 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  e] = 0;.        
e860: 7a 4e 65 77 4e 61 6d 65 20 3d 20 73 71 6c 69 74  zNewName = sqlit
e870: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
e880: 73 3a 25 64 22 2c 20 7a 4e 61 6d 65 2c 20 2b 2b  s:%d", zName, ++
e890: 63 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  cnt);.        sq
e8a0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
e8b0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
e8c0: 7a 4e 61 6d 65 20 3d 20 7a 4e 65 77 4e 61 6d 65  zName = zNewName
e8d0: 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 2d 31  ;.        j = -1
e8e0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 4e  ;.        if( zN
e8f0: 61 6d 65 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ame==0 ) break;.
e900: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
e910: 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20    pCol->zName = 
e920: 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 69 66 28  zName;.  }.  if(
e930: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
e940: 64 20 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  d ){.    for(j=0
e950: 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ; j<i; j++){.   
e960: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
e970: 28 64 62 2c 20 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  (db, aCol[j].zNa
e980: 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  me);.    }.    s
e990: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
e9a0: 20 61 43 6f 6c 29 3b 0a 20 20 20 20 2a 70 61 43   aCol);.    *paC
e9b0: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 2a 70 6e 43  ol = 0;.    *pnC
e9c0: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  ol = 0;.    retu
e9d0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
e9e0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
e9f0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
ea00: 2a 20 41 64 64 20 74 79 70 65 20 61 6e 64 20 63  * Add type and c
ea10: 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61  ollation informa
ea20: 74 69 6f 6e 20 74 6f 20 61 20 63 6f 6c 75 6d 6e  tion to a column
ea30: 20 6c 69 73 74 20 62 61 73 65 64 20 6f 6e 0a 2a   list based on.*
ea40: 2a 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  * a SELECT state
ea50: 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65  ment..** .** The
ea60: 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 70 72 65   column list pre
ea70: 73 75 6d 61 62 6c 79 20 63 61 6d 65 20 66 72 6f  sumably came fro
ea80: 6d 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 4e 61  m selectColumnNa
ea90: 6d 65 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  mesFromExprList(
eaa0: 29 2e 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e  )..** The column
eab0: 20 6c 69 73 74 20 68 61 73 20 6f 6e 6c 79 20 6e   list has only n
eac0: 61 6d 65 73 2c 20 6e 6f 74 20 74 79 70 65 73 20  ames, not types 
ead0: 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e 20 20  or collations.  
eae0: 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  This.** routine 
eaf0: 67 6f 65 73 20 74 68 72 6f 75 67 68 20 61 6e 64  goes through and
eb00: 20 61 64 64 73 20 74 68 65 20 74 79 70 65 73 20   adds the types 
eb10: 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e 0a  and collations..
eb20: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
eb30: 6e 65 20 72 65 71 75 69 72 65 73 20 74 68 61 74  ne requires that
eb40: 20 61 6c 6c 20 69 64 65 6e 74 69 66 69 65 72 73   all identifiers
eb50: 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 0a 2a   in the SELECT.*
eb60: 2a 20 73 74 61 74 65 6d 65 6e 74 20 62 65 20 72  * statement be r
eb70: 65 73 6f 6c 76 65 64 2e 0a 2a 2f 0a 73 74 61 74  esolved..*/.stat
eb80: 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74 41 64  ic void selectAd
eb90: 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f  dColumnTypeAndCo
eba0: 6c 6c 61 74 69 6f 6e 28 0a 20 20 50 61 72 73 65  llation(.  Parse
ebb0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
ebc0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
ebd0: 65 78 74 73 20 2a 2f 0a 20 20 54 61 62 6c 65 20  exts */.  Table 
ebe0: 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 20  *pTab,          
ebf0: 2f 2a 20 41 64 64 20 63 6f 6c 75 6d 6e 20 74 79  /* Add column ty
ec00: 70 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  pe information t
ec10: 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a  o this table */.
ec20: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
ec30: 74 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43  t       /* SELEC
ec40: 54 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  T used to determ
ec50: 69 6e 65 20 74 79 70 65 73 20 61 6e 64 20 63 6f  ine types and co
ec60: 6c 6c 61 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20  llations */.){. 
ec70: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
ec80: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4e 61 6d  Parse->db;.  Nam
ec90: 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20  eContext sNC;.  
eca0: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20  Column *pCol;.  
ecb0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
ecc0: 20 20 69 6e 74 20 69 3b 0a 20 20 45 78 70 72 20    int i;.  Expr 
ecd0: 2a 70 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70  *p;.  struct Exp
ece0: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20  rList_item *a;. 
ecf0: 20 75 36 34 20 73 7a 41 6c 6c 20 3d 20 30 3b 0a   u64 szAll = 0;.
ed00: 0a 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 65  .  assert( pSele
ed10: 63 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ct!=0 );.  asser
ed20: 74 28 20 28 70 53 65 6c 65 63 74 2d 3e 73 65 6c  t( (pSelect->sel
ed30: 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c  Flags & SF_Resol
ed40: 76 65 64 29 21 3d 30 20 29 3b 0a 20 20 61 73 73  ved)!=0 );.  ass
ed50: 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d  ert( pTab->nCol=
ed60: 3d 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  =pSelect->pEList
ed70: 2d 3e 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e 6d  ->nExpr || db->m
ed80: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
ed90: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
eda0: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
edb0: 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30    memset(&sNC, 0
edc0: 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a  , sizeof(sNC));.
edd0: 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
ede0: 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a   pSelect->pSrc;.
edf0: 20 20 61 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70    a = pSelect->p
ee00: 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 66 6f 72 28  EList->a;.  for(
ee10: 69 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62 2d 3e  i=0, pCol=pTab->
ee20: 61 43 6f 6c 3b 20 69 3c 70 54 61 62 2d 3e 6e 43  aCol; i<pTab->nC
ee30: 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; i++, pCol++)
ee40: 7b 0a 20 20 20 20 70 20 3d 20 61 5b 69 5d 2e 70  {.    p = a[i].p
ee50: 45 78 70 72 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e  Expr;.    pCol->
ee60: 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 44  zType = sqlite3D
ee70: 62 53 74 72 44 75 70 28 64 62 2c 20 63 6f 6c 75  bStrDup(db, colu
ee80: 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 30  mnType(&sNC, p,0
ee90: 2c 30 2c 30 2c 20 26 70 43 6f 6c 2d 3e 73 7a 45  ,0,0, &pCol->szE
eea0: 73 74 29 29 3b 0a 20 20 20 20 73 7a 41 6c 6c 20  st));.    szAll 
eeb0: 2b 3d 20 70 43 6f 6c 2d 3e 73 7a 45 73 74 3b 0a  += pCol->szEst;.
eec0: 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69      pCol->affini
eed0: 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ty = sqlite3Expr
eee0: 41 66 66 69 6e 69 74 79 28 70 29 3b 0a 20 20 20  Affinity(p);.   
eef0: 20 69 66 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e   if( pCol->affin
ef00: 69 74 79 3d 3d 30 20 29 20 70 43 6f 6c 2d 3e 61  ity==0 ) pCol->a
ef10: 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45  ffinity = SQLITE
ef20: 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 70  _AFF_NONE;.    p
ef30: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
ef40: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
ef50: 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70 43  , p);.    if( pC
ef60: 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 43 6f  oll ){.      pCo
ef70: 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  l->zColl = sqlit
ef80: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
ef90: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Coll->zName);.  
efa0: 20 20 7d 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e    }.  }.  pTab->
efb0: 73 7a 54 61 62 52 6f 77 20 3d 20 73 71 6c 69 74  szTabRow = sqlit
efc0: 65 33 4c 6f 67 45 73 74 28 73 7a 41 6c 6c 2a 34  e3LogEst(szAll*4
efd0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  );.}../*.** Give
efe0: 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  n a SELECT state
eff0: 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65 20 61  ment, generate a
f000: 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
f010: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 0a   that describes.
f020: 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ** the result se
f030: 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45 43 54  t of that SELECT
f040: 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69  ..*/.Table *sqli
f050: 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
f060: 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61 72  lect(Parse *pPar
f070: 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  se, Select *pSel
f080: 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ect){.  Table *p
f090: 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Tab;.  sqlite3 *
f0a0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
f0b0: 0a 20 20 69 6e 74 20 73 61 76 65 64 46 6c 61 67  .  int savedFlag
f0c0: 73 3b 0a 0a 20 20 73 61 76 65 64 46 6c 61 67 73  s;..  savedFlags
f0d0: 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20   = db->flags;.  
f0e0: 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51  db->flags &= ~SQ
f0f0: 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65  LITE_FullColName
f100: 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c  s;.  db->flags |
f110: 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f  = SQLITE_ShortCo
f120: 6c 4e 61 6d 65 73 3b 0a 20 20 73 71 6c 69 74 65  lNames;.  sqlite
f130: 33 53 65 6c 65 63 74 50 72 65 70 28 70 50 61 72  3SelectPrep(pPar
f140: 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 30 29 3b  se, pSelect, 0);
f150: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
f160: 45 72 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  Err ) return 0;.
f170: 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65 63 74    while( pSelect
f180: 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c 65  ->pPrior ) pSele
f190: 63 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50  ct = pSelect->pP
f1a0: 72 69 6f 72 3b 0a 20 20 64 62 2d 3e 66 6c 61 67  rior;.  db->flag
f1b0: 73 20 3d 20 73 61 76 65 64 46 6c 61 67 73 3b 0a  s = savedFlags;.
f1c0: 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
f1d0: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
f1e0: 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20 29   sizeof(Table) )
f1f0: 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20  ;.  if( pTab==0 
f200: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
f210: 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20 73 71  .  }.  /* The sq
f220: 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
f230: 53 65 6c 65 63 74 28 29 20 69 73 20 6f 6e 6c 79  Select() is only
f240: 20 75 73 65 64 20 6e 20 63 6f 6e 74 65 78 74 73   used n contexts
f250: 20 77 68 65 72 65 20 6c 6f 6f 6b 61 73 69 64 65   where lookaside
f260: 0a 20 20 2a 2a 20 69 73 20 64 69 73 61 62 6c 65  .  ** is disable
f270: 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 64  d */.  assert( d
f280: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e  b->lookaside.bEn
f290: 61 62 6c 65 64 3d 3d 30 20 29 3b 0a 20 20 70 54  abled==0 );.  pT
f2a0: 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  ab->nRef = 1;.  
f2b0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b  pTab->zName = 0;
f2c0: 0a 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67  .  pTab->nRowLog
f2d0: 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72  Est = 200; asser
f2e0: 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c  t( 200==sqlite3L
f2f0: 6f 67 45 73 74 28 31 30 34 38 35 37 36 29 20 29  ogEst(1048576) )
f300: 3b 0a 20 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e  ;.  selectColumn
f310: 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  sFromExprList(pP
f320: 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70  arse, pSelect->p
f330: 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43  EList, &pTab->nC
f340: 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29  ol, &pTab->aCol)
f350: 3b 0a 20 20 73 65 6c 65 63 74 41 64 64 43 6f 6c  ;.  selectAddCol
f360: 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74  umnTypeAndCollat
f370: 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  ion(pParse, pTab
f380: 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 70 54  , pSelect);.  pT
f390: 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a  ab->iPKey = -1;.
f3a0: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
f3b0: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71  Failed ){.    sq
f3c0: 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
f3d0: 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20  (db, pTab);.    
f3e0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
f3f0: 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a  return pTab;.}..
f400: 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 56 44 42 45  /*.** Get a VDBE
f410: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70   for the given p
f420: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 2e 20 20  arser context.  
f430: 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65  Create a new one
f440: 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   if necessary..*
f450: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
f460: 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c  curs, return NUL
f470: 4c 20 61 6e 64 20 6c 65 61 76 65 20 61 20 6d 65  L and leave a me
f480: 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e  ssage in pParse.
f490: 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74 65  .*/.Vdbe *sqlite
f4a0: 33 47 65 74 56 64 62 65 28 50 61 72 73 65 20 2a  3GetVdbe(Parse *
f4b0: 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20  pParse){.  Vdbe 
f4c0: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
f4d0: 62 65 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  be;.  if( v==0 )
f4e0: 7b 0a 20 20 20 20 76 20 3d 20 70 50 61 72 73 65  {.    v = pParse
f4f0: 2d 3e 70 56 64 62 65 20 3d 20 73 71 6c 69 74 65  ->pVdbe = sqlite
f500: 33 56 64 62 65 43 72 65 61 74 65 28 70 50 61 72  3VdbeCreate(pPar
f510: 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 20 29  se);.    if( v )
f520: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f530: 70 30 28 76 2c 20 4f 50 5f 49 6e 69 74 29 3b 0a  p0(v, OP_Init);.
f540: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
f550: 70 54 6f 70 6c 65 76 65 6c 3d 3d 30 0a 20 20 20  pToplevel==0.   
f560: 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f    && Optimizatio
f570: 6e 45 6e 61 62 6c 65 64 28 70 50 61 72 73 65 2d  nEnabled(pParse-
f580: 3e 64 62 2c 53 51 4c 49 54 45 5f 46 61 63 74 6f  >db,SQLITE_Facto
f590: 72 4f 75 74 43 6f 6e 73 74 29 0a 20 20 20 20 29  rOutConst).    )
f5a0: 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
f5b0: 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72 20 3d 20  okConstFactor = 
f5c0: 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 0a 20 20  1;.    }..  }.  
f5d0: 72 65 74 75 72 6e 20 76 3b 0a 7d 0a 0a 0a 2f 2a  return v;.}.../*
f5e0: 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20  .** Compute the 
f5f0: 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73  iLimit and iOffs
f600: 65 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  et fields of the
f610: 20 53 45 4c 45 43 54 20 62 61 73 65 64 20 6f 6e   SELECT based on
f620: 20 74 68 65 0a 2a 2a 20 70 4c 69 6d 69 74 20 61   the.** pLimit a
f630: 6e 64 20 70 4f 66 66 73 65 74 20 65 78 70 72 65  nd pOffset expre
f640: 73 73 69 6f 6e 73 2e 20 20 70 4c 69 6d 69 74 20  ssions.  pLimit 
f650: 61 6e 64 20 70 4f 66 66 73 65 74 20 68 6f 6c 64  and pOffset hold
f660: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
f670: 0a 2a 2a 20 74 68 61 74 20 61 70 70 65 61 72 20  .** that appear 
f680: 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  in the original 
f690: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 66  SQL statement af
f6a0: 74 65 72 20 74 68 65 20 4c 49 4d 49 54 20 61 6e  ter the LIMIT an
f6b0: 64 20 4f 46 46 53 45 54 0a 2a 2a 20 6b 65 79 77  d OFFSET.** keyw
f6c0: 6f 72 64 73 2e 20 20 4f 72 20 4e 55 4c 4c 20 69  ords.  Or NULL i
f6d0: 66 20 74 68 6f 73 65 20 6b 65 79 77 6f 72 64 73  f those keywords
f6e0: 20 61 72 65 20 6f 6d 69 74 74 65 64 2e 20 69 4c   are omitted. iL
f6f0: 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74  imit and iOffset
f700: 20 0a 2a 2a 20 61 72 65 20 74 68 65 20 69 6e 74   .** are the int
f710: 65 67 65 72 20 6d 65 6d 6f 72 79 20 72 65 67 69  eger memory regi
f720: 73 74 65 72 20 6e 75 6d 62 65 72 73 20 66 6f 72  ster numbers for
f730: 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20 74   counters used t
f740: 6f 20 63 6f 6d 70 75 74 65 20 0a 2a 2a 20 74 68  o compute .** th
f750: 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73  e limit and offs
f760: 65 74 2e 20 20 49 66 20 74 68 65 72 65 20 69 73  et.  If there is
f770: 20 6e 6f 20 6c 69 6d 69 74 20 61 6e 64 2f 6f 72   no limit and/or
f780: 20 6f 66 66 73 65 74 2c 20 74 68 65 6e 20 0a 2a   offset, then .*
f790: 2a 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66  * iLimit and iOf
f7a0: 66 73 65 74 20 61 72 65 20 6e 65 67 61 74 69 76  fset are negativ
f7b0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
f7c0: 75 74 69 6e 65 20 63 68 61 6e 67 65 73 20 74 68  utine changes th
f7d0: 65 20 76 61 6c 75 65 73 20 6f 66 20 69 4c 69 6d  e values of iLim
f7e0: 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 6f  it and iOffset o
f7f0: 6e 6c 79 20 69 66 0a 2a 2a 20 61 20 6c 69 6d 69  nly if.** a limi
f800: 74 20 6f 72 20 6f 66 66 73 65 74 20 69 73 20 64  t or offset is d
f810: 65 66 69 6e 65 64 20 62 79 20 70 4c 69 6d 69 74  efined by pLimit
f820: 20 61 6e 64 20 70 4f 66 66 73 65 74 2e 20 20 69   and pOffset.  i
f830: 4c 69 6d 69 74 20 61 6e 64 0a 2a 2a 20 69 4f 66  Limit and.** iOf
f840: 66 73 65 74 20 73 68 6f 75 6c 64 20 68 61 76 65  fset should have
f850: 20 62 65 65 6e 20 70 72 65 73 65 74 20 74 6f 20   been preset to 
f860: 61 70 70 72 6f 70 72 69 61 74 65 20 64 65 66 61  appropriate defa
f870: 75 6c 74 20 76 61 6c 75 65 73 20 28 7a 65 72 6f  ult values (zero
f880: 29 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61  ).** prior to ca
f890: 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
f8a0: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 4f  ne..**.** The iO
f8b0: 66 66 73 65 74 20 72 65 67 69 73 74 65 72 20 28  ffset register (
f8c0: 69 66 20 69 74 20 65 78 69 73 74 73 29 20 69 73  if it exists) is
f8d0: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
f8e0: 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20  the value.** of 
f8f0: 74 68 65 20 4f 46 46 53 45 54 2e 20 20 54 68 65  the OFFSET.  The
f900: 20 69 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72   iLimit register
f910: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
f920: 74 6f 20 4c 49 4d 49 54 2e 20 20 52 65 67 69 73  to LIMIT.  Regis
f930: 74 65 72 0a 2a 2a 20 69 4f 66 66 73 65 74 2b 31  ter.** iOffset+1
f940: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
f950: 74 6f 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 2e  to LIMIT+OFFSET.
f960: 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20 70  .**.** Only if p
f970: 4c 69 6d 69 74 21 3d 30 20 6f 72 20 70 4f 66 66  Limit!=0 or pOff
f980: 73 65 74 21 3d 30 20 64 6f 20 74 68 65 20 6c 69  set!=0 do the li
f990: 6d 69 74 20 72 65 67 69 73 74 65 72 73 20 67 65  mit registers ge
f9a0: 74 0a 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e 20  t.** redefined. 
f9b0: 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f   The UNION ALL o
f9c0: 70 65 72 61 74 6f 72 20 75 73 65 73 20 74 68 69  perator uses thi
f9d0: 73 20 70 72 6f 70 65 72 74 79 20 74 6f 20 66 6f  s property to fo
f9e0: 72 63 65 0a 2a 2a 20 74 68 65 20 72 65 75 73 65  rce.** the reuse
f9f0: 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6c 69 6d   of the same lim
fa00: 69 74 20 61 6e 64 20 6f 66 66 73 65 74 20 72 65  it and offset re
fa10: 67 69 73 74 65 72 73 20 61 63 72 6f 73 73 20 6d  gisters across m
fa20: 75 6c 74 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43  ultiple.** SELEC
fa30: 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f  T statements..*/
fa40: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6d  .static void com
fa50: 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
fa60: 72 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  rs(Parse *pParse
fa70: 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
fa80: 20 69 42 72 65 61 6b 29 7b 0a 20 20 56 64 62 65   iBreak){.  Vdbe
fa90: 20 2a 76 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69   *v = 0;.  int i
faa0: 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74  Limit = 0;.  int
fab0: 20 69 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74 20   iOffset;.  int 
fac0: 61 64 64 72 31 2c 20 6e 3b 0a 20 20 69 66 28 20  addr1, n;.  if( 
fad0: 70 2d 3e 69 4c 69 6d 69 74 20 29 20 72 65 74 75  p->iLimit ) retu
fae0: 72 6e 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20  rn;..  /* .  ** 
faf0: 22 4c 49 4d 49 54 20 2d 31 22 20 61 6c 77 61 79  "LIMIT -1" alway
fb00: 73 20 73 68 6f 77 73 20 61 6c 6c 20 72 6f 77 73  s shows all rows
fb10: 2e 20 20 54 68 65 72 65 20 69 73 20 73 6f 6d 65  .  There is some
fb20: 0a 20 20 2a 2a 20 63 6f 6e 74 72 6f 76 65 72 73  .  ** controvers
fb30: 79 20 61 62 6f 75 74 20 77 68 61 74 20 74 68 65  y about what the
fb40: 20 63 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f   correct behavio
fb50: 72 20 73 68 6f 75 6c 64 20 62 65 2e 0a 20 20 2a  r should be..  *
fb60: 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 69 6d  * The current im
fb70: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74  plementation int
fb80: 65 72 70 72 65 74 73 20 22 4c 49 4d 49 54 20 30  erprets "LIMIT 0
fb90: 22 20 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20 6e  " to mean.  ** n
fba0: 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20 73  o rows..  */.  s
fbb0: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
fbc0: 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
fbd0: 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73  assert( p->pOffs
fbe0: 65 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 4c 69 6d  et==0 || p->pLim
fbf0: 69 74 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  it!=0 );.  if( p
fc00: 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->pLimit ){.    
fc10: 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 69 4c 69 6d  p->iLimit = iLim
fc20: 69 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  it = ++pParse->n
fc30: 4d 65 6d 3b 0a 20 20 20 20 76 20 3d 20 73 71 6c  Mem;.    v = sql
fc40: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
fc50: 73 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  se);.    assert(
fc60: 20 76 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28   v!=0 );.    if(
fc70: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
fc80: 74 65 67 65 72 28 70 2d 3e 70 4c 69 6d 69 74 2c  teger(p->pLimit,
fc90: 20 26 6e 29 20 29 7b 0a 20 20 20 20 20 20 73 71   &n) ){.      sq
fca0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
fcb0: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6e  v, OP_Integer, n
fcc0: 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  , iLimit);.     
fcd0: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
fce0: 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22   "LIMIT counter"
fcf0: 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d  ));.      if( n=
fd00: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
fd10: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
fd20: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69  v, OP_Goto, 0, i
fd30: 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 7d 65  Break);.      }e
fd40: 6c 73 65 20 69 66 28 20 6e 3e 3d 30 20 26 26 20  lse if( n>=0 && 
fd50: 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 28 75  p->nSelectRow>(u
fd60: 36 34 29 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  64)n ){.        
fd70: 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
fd80: 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  n;.      }.    }
fd90: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
fda0: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
fdb0: 73 65 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 69  se, p->pLimit, i
fdc0: 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 73 71  Limit);.      sq
fdd0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
fde0: 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c  v, OP_MustBeInt,
fdf0: 20 69 4c 69 6d 69 74 29 3b 20 56 64 62 65 43 6f   iLimit); VdbeCo
fe00: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
fe10: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
fe20: 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22   "LIMIT counter"
fe30: 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
fe40: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
fe50: 50 5f 49 66 4e 6f 74 2c 20 69 4c 69 6d 69 74 2c  P_IfNot, iLimit,
fe60: 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f   iBreak); VdbeCo
fe70: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d  verage(v);.    }
fe80: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 66 66  .    if( p->pOff
fe90: 73 65 74 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  set ){.      p->
fea0: 69 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 73 65  iOffset = iOffse
feb0: 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
fec0: 65 6d 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  em;.      pParse
fed0: 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 2f 2a 20 41  ->nMem++;   /* A
fee0: 6c 6c 6f 63 61 74 65 20 61 6e 20 65 78 74 72 61  llocate an extra
fef0: 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 6c 69   register for li
ff00: 6d 69 74 2b 6f 66 66 73 65 74 20 2a 2f 0a 20 20  mit+offset */.  
ff10: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
ff20: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  ode(pParse, p->p
ff30: 4f 66 66 73 65 74 2c 20 69 4f 66 66 73 65 74 29  Offset, iOffset)
ff40: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
ff50: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
ff60: 4d 75 73 74 42 65 49 6e 74 2c 20 69 4f 66 66 73  MustBeInt, iOffs
ff70: 65 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  et); VdbeCoverag
ff80: 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65  e(v);.      Vdbe
ff90: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46 46  Comment((v, "OFF
ffa0: 53 45 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a  SET counter"));.
ffb0: 20 20 20 20 20 20 61 64 64 72 31 20 3d 20 73 71        addr1 = sq
ffc0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
ffd0: 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4f 66  v, OP_IfPos, iOf
ffe0: 66 73 65 74 29 3b 20 56 64 62 65 43 6f 76 65 72  fset); VdbeCover
fff0: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71  age(v);.      sq
10000 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
10010 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
10020 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  , iOffset);.    
10030 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
10040 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
10050 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10060 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41  beAddOp3(v, OP_A
10070 64 64 2c 20 69 4c 69 6d 69 74 2c 20 69 4f 66 66  dd, iLimit, iOff
10080 73 65 74 2c 20 69 4f 66 66 73 65 74 2b 31 29 3b  set, iOffset+1);
10090 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
100a0 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 2b 4f 46  nt((v, "LIMIT+OF
100b0 46 53 45 54 22 29 29 3b 0a 20 20 20 20 20 20 61  FSET"));.      a
100c0 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
100d0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
100e0 66 50 6f 73 2c 20 69 4c 69 6d 69 74 29 3b 20 56  fPos, iLimit); V
100f0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
10100 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10110 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
10120 74 65 67 65 72 2c 20 2d 31 2c 20 69 4f 66 66 73  teger, -1, iOffs
10130 65 74 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  et+1);.      sql
10140 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
10150 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20  (v, addr1);.    
10160 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  }.  }.}..#ifndef
10170 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
10180 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a  POUND_SELECT./*.
10190 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 70  ** Return the ap
101a0 70 72 6f 70 72 69 61 74 65 20 63 6f 6c 6c 61 74  propriate collat
101b0 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
101c0 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c   the iCol-th col
101d0 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 72 65  umn of.** the re
101e0 73 75 6c 74 20 73 65 74 20 66 6f 72 20 74 68 65  sult set for the
101f0 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74   compound-select
10200 20 73 74 61 74 65 6d 65 6e 74 20 22 70 22 2e 20   statement "p". 
10210 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 0a   Return NULL if.
10220 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61  ** the column ha
10230 73 20 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f 6c  s no default col
10240 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e  lating sequence.
10250 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61  .**.** The colla
10260 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f  ting sequence fo
10270 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  r the compound s
10280 65 6c 65 63 74 20 69 73 20 74 61 6b 65 6e 20 66  elect is taken f
10290 72 6f 6d 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d  rom the.** left-
102a0 6d 6f 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65  most term of the
102b0 20 73 65 6c 65 63 74 20 74 68 61 74 20 68 61 73   select that has
102c0 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71   a collating seq
102d0 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  uence..*/.static
102e0 20 43 6f 6c 6c 53 65 71 20 2a 6d 75 6c 74 69 53   CollSeq *multiS
102f0 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 50 61 72  electCollSeq(Par
10300 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
10310 63 74 20 2a 70 2c 20 69 6e 74 20 69 43 6f 6c 29  ct *p, int iCol)
10320 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65  {.  CollSeq *pRe
10330 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  t;.  if( p->pPri
10340 6f 72 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d  or ){.    pRet =
10350 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c   multiSelectColl
10360 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  Seq(pParse, p->p
10370 50 72 69 6f 72 2c 20 69 43 6f 6c 29 3b 0a 20 20  Prior, iCol);.  
10380 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52 65 74 20  }else{.    pRet 
10390 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  = 0;.  }.  asser
103a0 74 28 20 69 43 6f 6c 3e 3d 30 20 29 3b 0a 20 20  t( iCol>=0 );.  
103b0 69 66 28 20 70 52 65 74 3d 3d 30 20 26 26 20 69  if( pRet==0 && i
103c0 43 6f 6c 3c 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  Col<p->pEList->n
103d0 45 78 70 72 20 29 7b 0a 20 20 20 20 70 52 65 74  Expr ){.    pRet
103e0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
103f0 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d  llSeq(pParse, p-
10400 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d  >pEList->a[iCol]
10410 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72  .pExpr);.  }.  r
10420 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f  eturn pRet;.}../
10430 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63 74 20  *.** The select 
10440 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64  statement passed
10450 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70   as the second p
10460 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 63 6f  arameter is a co
10470 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 0a 2a 2a  mpound SELECT.**
10480 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42   with an ORDER B
10490 59 20 63 6c 61 75 73 65 2e 20 54 68 69 73 20 66  Y clause. This f
104a0 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65  unction allocate
104b0 73 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20  s and returns a 
104c0 4b 65 79 49 6e 66 6f 0a 2a 2a 20 73 74 72 75 63  KeyInfo.** struc
104d0 74 75 72 65 20 73 75 69 74 61 62 6c 65 20 66 6f  ture suitable fo
104e0 72 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74  r implementing t
104f0 68 65 20 4f 52 44 45 52 20 42 59 2e 0a 2a 2a 0a  he ORDER BY..**.
10500 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  ** Space to hold
10510 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72   the KeyInfo str
10520 75 63 74 75 72 65 20 69 73 20 6f 62 74 61 69 6e  ucture is obtain
10530 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20  ed from malloc. 
10540 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66  The calling.** f
10550 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73 70 6f  unction is respo
10560 6e 73 69 62 6c 65 20 66 6f 72 20 65 6e 73 75 72  nsible for ensur
10570 69 6e 67 20 74 68 61 74 20 74 68 69 73 20 73 74  ing that this st
10580 72 75 63 74 75 72 65 20 69 73 20 65 76 65 6e 74  ructure is event
10590 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 0a  ually.** freed..
105a0 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79 49 6e 66  */.static KeyInf
105b0 6f 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72  o *multiSelectOr
105c0 64 65 72 42 79 4b 65 79 49 6e 66 6f 28 50 61 72  derByKeyInfo(Par
105d0 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
105e0 63 74 20 2a 70 2c 20 69 6e 74 20 6e 45 78 74 72  ct *p, int nExtr
105f0 61 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  a){.  ExprList *
10600 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
10610 72 64 65 72 42 79 3b 0a 20 20 69 6e 74 20 6e 4f  rderBy;.  int nO
10620 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
10630 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 73  erBy->nExpr;.  s
10640 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
10650 72 73 65 2d 3e 64 62 3b 0a 20 20 4b 65 79 49 6e  rse->db;.  KeyIn
10660 66 6f 20 2a 70 52 65 74 20 3d 20 73 71 6c 69 74  fo *pRet = sqlit
10670 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64  e3KeyInfoAlloc(d
10680 62 2c 20 6e 4f 72 64 65 72 42 79 2b 6e 45 78 74  b, nOrderBy+nExt
10690 72 61 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 52  ra, 1);.  if( pR
106a0 65 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  et ){.    int i;
106b0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
106c0 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a  nOrderBy; i++){.
106d0 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
106e0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
106f0 6d 20 3d 20 26 70 4f 72 64 65 72 42 79 2d 3e 61  m = &pOrderBy->a
10700 5b 69 5d 3b 0a 20 20 20 20 20 20 45 78 70 72 20  [i];.      Expr 
10710 2a 70 54 65 72 6d 20 3d 20 70 49 74 65 6d 2d 3e  *pTerm = pItem->
10720 70 45 78 70 72 3b 0a 20 20 20 20 20 20 43 6f 6c  pExpr;.      Col
10730 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20  lSeq *pColl;..  
10740 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 66      if( pTerm->f
10750 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74  lags & EP_Collat
10760 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  e ){.        pCo
10770 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
10780 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
10790 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65  pTerm);.      }e
107a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  lse{.        pCo
107b0 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  ll = multiSelect
107c0 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
107d0 70 2c 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f  p, pItem->u.x.iO
107e0 72 64 65 72 42 79 43 6f 6c 2d 31 29 3b 0a 20 20  rderByCol-1);.  
107f0 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d        if( pColl=
10800 3d 30 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d  =0 ) pColl = db-
10810 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
10820 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b      pOrderBy->a[
10830 69 5d 2e 70 45 78 70 72 20 3d 0a 20 20 20 20 20  i].pExpr =.     
10840 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
10850 41 64 64 43 6f 6c 6c 61 74 65 53 74 72 69 6e 67  AddCollateString
10860 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20  (pParse, pTerm, 
10870 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pColl->zName);. 
10880 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
10890 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49  ert( sqlite3KeyI
108a0 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70  nfoIsWriteable(p
108b0 52 65 74 29 20 29 3b 0a 20 20 20 20 20 20 70 52  Ret) );.      pR
108c0 65 74 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70  et->aColl[i] = p
108d0 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 52 65 74  Coll;.      pRet
108e0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
108f0 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
10900 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  .sortOrder;.    
10910 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
10920 70 52 65 74 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  pRet;.}..#ifndef
10930 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45   SQLITE_OMIT_CTE
10940 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
10950 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 56 44  ine generates VD
10960 42 45 20 63 6f 64 65 20 74 6f 20 63 6f 6d 70 75  BE code to compu
10970 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  te the content o
10980 66 20 61 20 57 49 54 48 20 52 45 43 55 52 53 49  f a WITH RECURSI
10990 56 45 0a 2a 2a 20 71 75 65 72 79 20 6f 66 20 74  VE.** query of t
109a0 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20  he form:.**.**  
109b0 20 3c 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c   <recursive-tabl
109c0 65 3e 20 41 53 20 28 3c 73 65 74 75 70 2d 71 75  e> AS (<setup-qu
109d0 65 72 79 3e 20 55 4e 49 4f 4e 20 5b 41 4c 4c 5d  ery> UNION [ALL]
109e0 20 3c 72 65 63 75 72 73 69 76 65 2d 71 75 65 72   <recursive-quer
109f0 79 3e 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  y>).**          
10a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
10a10 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20  ___________/    
10a20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f           \______
10a30 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20  _________/.**   
10a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a50 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f          p->pPrio
10a60 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
10a70 20 20 20 20 20 20 20 70 0a 2a 2a 0a 2a 2a 0a 2a         p.**.**.*
10a80 2a 20 54 68 65 72 65 20 69 73 20 65 78 61 63 74  * There is exact
10a90 6c 79 20 6f 6e 65 20 72 65 66 65 72 65 6e 63 65  ly one reference
10aa0 20 74 6f 20 74 68 65 20 72 65 63 75 72 73 69 76   to the recursiv
10ab0 65 2d 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46  e-table in the F
10ac0 52 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20 6f 66  ROM clause.** of
10ad0 20 72 65 63 75 72 73 69 76 65 2d 71 75 65 72 79   recursive-query
10ae0 2c 20 6d 61 72 6b 65 64 20 77 69 74 68 20 74 68  , marked with th
10af0 65 20 53 72 63 4c 69 73 74 2d 3e 61 5b 5d 2e 69  e SrcList->a[].i
10b00 73 52 65 63 75 72 73 69 76 65 20 66 6c 61 67 2e  sRecursive flag.
10b10 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 74 75 70  .**.** The setup
10b20 2d 71 75 65 72 79 20 72 75 6e 73 20 6f 6e 63 65  -query runs once
10b30 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e 20   to generate an 
10b40 69 6e 69 74 69 61 6c 20 73 65 74 20 6f 66 20 72  initial set of r
10b50 6f 77 73 20 74 68 61 74 20 67 6f 0a 2a 2a 20 69  ows that go.** i
10b60 6e 74 6f 20 61 20 51 75 65 75 65 20 74 61 62 6c  nto a Queue tabl
10b70 65 2e 20 20 52 6f 77 73 20 61 72 65 20 65 78 74  e.  Rows are ext
10b80 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20  racted from the 
10b90 51 75 65 75 65 20 74 61 62 6c 65 20 6f 6e 65 20  Queue table one 
10ba0 62 79 0a 2a 2a 20 6f 6e 65 2e 20 20 45 61 63 68  by.** one.  Each
10bb0 20 72 6f 77 20 65 78 74 72 61 63 74 65 64 20 66   row extracted f
10bc0 72 6f 6d 20 51 75 65 75 65 20 69 73 20 6f 75 74  rom Queue is out
10bd0 70 75 74 20 74 6f 20 70 44 65 73 74 2e 20 20 54  put to pDest.  T
10be0 68 65 6e 20 74 68 65 20 73 69 6e 67 6c 65 0a 2a  hen the single.*
10bf0 2a 20 65 78 74 72 61 63 74 65 64 20 72 6f 77 20  * extracted row 
10c00 28 6e 6f 77 20 69 6e 20 74 68 65 20 69 43 75 72  (now in the iCur
10c10 72 65 6e 74 20 74 61 62 6c 65 29 20 62 65 63 6f  rent table) beco
10c20 6d 65 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  mes the content 
10c30 6f 66 20 74 68 65 0a 2a 2a 20 72 65 63 75 72 73  of the.** recurs
10c40 69 76 65 2d 74 61 62 6c 65 20 66 6f 72 20 61 20  ive-table for a 
10c50 72 65 63 75 72 73 69 76 65 2d 71 75 65 72 79 20  recursive-query 
10c60 72 75 6e 2e 20 20 54 68 65 20 6f 75 74 70 75 74  run.  The output
10c70 20 6f 66 20 74 68 65 20 72 65 63 75 72 73 69 76   of the recursiv
10c80 65 2d 71 75 65 72 79 0a 2a 2a 20 69 73 20 61 64  e-query.** is ad
10c90 64 65 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  ded back into th
10ca0 65 20 51 75 65 75 65 20 74 61 62 6c 65 2e 20 20  e Queue table.  
10cb0 54 68 65 6e 20 61 6e 6f 74 68 65 72 20 72 6f 77  Then another row
10cc0 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72   is extracted fr
10cd0 6f 6d 20 51 75 65 75 65 0a 2a 2a 20 61 6e 64 20  om Queue.** and 
10ce0 74 68 65 20 69 74 65 72 61 74 69 6f 6e 20 63 6f  the iteration co
10cf0 6e 74 69 6e 75 65 73 20 75 6e 74 69 6c 20 74 68  ntinues until th
10d00 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 69 73  e Queue table is
10d10 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66   empty..**.** If
10d20 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75   the compound qu
10d30 65 72 79 20 6f 70 65 72 61 74 6f 72 20 69 73 20  ery operator is 
10d40 55 4e 49 4f 4e 20 74 68 65 6e 20 6e 6f 20 64 75  UNION then no du
10d50 70 6c 69 63 61 74 65 20 72 6f 77 73 20 61 72 65  plicate rows are
10d60 20 65 76 65 72 0a 2a 2a 20 69 6e 73 65 72 74 65   ever.** inserte
10d70 64 20 69 6e 74 6f 20 74 68 65 20 51 75 65 75 65  d into the Queue
10d80 20 74 61 62 6c 65 2e 20 20 54 68 65 20 69 44 69   table.  The iDi
10d90 73 74 69 6e 63 74 20 74 61 62 6c 65 20 6b 65 65  stinct table kee
10da0 70 73 20 61 20 63 6f 70 79 20 6f 66 20 61 6c 6c  ps a copy of all
10db0 20 72 6f 77 73 0a 2a 2a 20 74 68 61 74 20 68 61   rows.** that ha
10dc0 76 65 20 65 76 65 72 20 62 65 65 6e 20 69 6e 73  ve ever been ins
10dd0 65 72 74 65 64 20 69 6e 74 6f 20 51 75 65 75 65  erted into Queue
10de0 20 61 6e 64 20 63 61 75 73 65 73 20 64 75 70 6c   and causes dupl
10df0 69 63 61 74 65 73 20 74 6f 20 62 65 0a 2a 2a 20  icates to be.** 
10e00 64 69 73 63 61 72 64 65 64 2e 20 20 49 66 20 74  discarded.  If t
10e10 68 65 20 6f 70 65 72 61 74 6f 72 20 69 73 20 55  he operator is U
10e20 4e 49 4f 4e 20 41 4c 4c 2c 20 74 68 65 6e 20 64  NION ALL, then d
10e30 75 70 6c 69 63 61 74 65 73 20 61 72 65 20 61 6c  uplicates are al
10e40 6c 6f 77 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 49 66  lowed..** .** If
10e50 20 74 68 65 20 71 75 65 72 79 20 68 61 73 20 61   the query has a
10e60 6e 20 4f 52 44 45 52 20 42 59 2c 20 74 68 65 6e  n ORDER BY, then
10e70 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
10e80 51 75 65 75 65 20 74 61 62 6c 65 20 61 72 65 20  Queue table are 
10e90 6b 65 70 74 20 69 6e 0a 2a 2a 20 4f 52 44 45 52  kept in.** ORDER
10ea0 20 42 59 20 6f 72 64 65 72 20 61 6e 64 20 74 68   BY order and th
10eb0 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 73  e first entry is
10ec0 20 65 78 74 72 61 63 74 65 64 20 66 6f 72 20 65   extracted for e
10ed0 61 63 68 20 63 79 63 6c 65 2e 20 20 57 69 74 68  ach cycle.  With
10ee0 6f 75 74 0a 2a 2a 20 61 6e 20 4f 52 44 45 52 20  out.** an ORDER 
10ef0 42 59 2c 20 74 68 65 20 51 75 65 75 65 20 74 61  BY, the Queue ta
10f00 62 6c 65 20 69 73 20 6a 75 73 74 20 61 20 46 49  ble is just a FI
10f10 46 4f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 4c  FO..**.** If a L
10f20 49 4d 49 54 20 63 6c 61 75 73 65 20 69 73 20 70  IMIT clause is p
10f30 72 6f 76 69 64 65 64 2c 20 74 68 65 6e 20 74 68  rovided, then th
10f40 65 20 69 74 65 72 61 74 69 6f 6e 20 73 74 6f 70  e iteration stop
10f50 73 20 61 66 74 65 72 20 4c 49 4d 49 54 20 72 6f  s after LIMIT ro
10f60 77 73 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e 20  ws.** have been 
10f70 6f 75 74 70 75 74 20 74 6f 20 70 44 65 73 74 2e  output to pDest.
10f80 20 20 41 20 4c 49 4d 49 54 20 6f 66 20 7a 65 72    A LIMIT of zer
10f90 6f 20 6d 65 61 6e 73 20 74 6f 20 6f 75 74 70 75  o means to outpu
10fa0 74 20 6e 6f 20 72 6f 77 73 20 61 6e 64 20 61 0a  t no rows and a.
10fb0 2a 2a 20 6e 65 67 61 74 69 76 65 20 4c 49 4d 49  ** negative LIMI
10fc0 54 20 6d 65 61 6e 73 20 74 6f 20 6f 75 74 70 75  T means to outpu
10fd0 74 20 61 6c 6c 20 72 6f 77 73 2e 20 20 49 66 20  t all rows.  If 
10fe0 74 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61 6e  there is also an
10ff0 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 0a 2a   OFFSET clause.*
11000 2a 20 77 69 74 68 20 61 20 70 6f 73 69 74 69 76  * with a positiv
11010 65 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 68  e value, then th
11020 65 20 66 69 72 73 74 20 4f 46 46 53 45 54 20 6f  e first OFFSET o
11030 75 74 70 75 74 73 20 61 72 65 20 64 69 73 63 61  utputs are disca
11040 72 64 65 64 20 72 61 74 68 65 72 0a 2a 2a 20 74  rded rather.** t
11050 68 61 6e 20 62 65 69 6e 67 20 73 65 6e 74 20 74  han being sent t
11060 6f 20 70 44 65 73 74 2e 20 20 54 68 65 20 4c 49  o pDest.  The LI
11070 4d 49 54 20 63 6f 75 6e 74 20 64 6f 65 73 20 6e  MIT count does n
11080 6f 74 20 62 65 67 69 6e 20 75 6e 74 69 6c 20 61  ot begin until a
11090 66 74 65 72 20 4f 46 46 53 45 54 0a 2a 2a 20 72  fter OFFSET.** r
110a0 6f 77 73 20 68 61 76 65 20 62 65 65 6e 20 73 6b  ows have been sk
110b0 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ipped..*/.static
110c0 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 57 69   void generateWi
110d0 74 68 52 65 63 75 72 73 69 76 65 51 75 65 72 79  thRecursiveQuery
110e0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
110f0 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
11100 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
11110 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
11120 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
11130 65 63 75 72 73 69 76 65 20 53 45 4c 45 43 54 20  ecursive SELECT 
11140 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
11150 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
11160 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74  st     /* What t
11170 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20  o do with query 
11180 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20  results */.){.  
11190 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20  SrcList *pSrc = 
111a0 70 2d 3e 70 53 72 63 3b 20 20 20 20 20 20 2f 2a  p->pSrc;      /*
111b0 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
111c0 20 6f 66 20 74 68 65 20 72 65 63 75 72 73 69 76   of the recursiv
111d0 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  e query */.  int
111e0 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73   nCol = p->pELis
111f0 74 2d 3e 6e 45 78 70 72 3b 20 20 2f 2a 20 4e 75  t->nExpr;  /* Nu
11200 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
11210 69 6e 20 74 68 65 20 72 65 63 75 72 73 69 76 65  in the recursive
11220 20 74 61 62 6c 65 20 2a 2f 0a 20 20 56 64 62 65   table */.  Vdbe
11230 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
11240 64 62 65 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  dbe;      /* The
11250 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
11260 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ent under constr
11270 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65  uction */.  Sele
11280 63 74 20 2a 70 53 65 74 75 70 20 3d 20 70 2d 3e  ct *pSetup = p->
11290 70 50 72 69 6f 72 3b 20 20 20 2f 2a 20 54 68 65  pPrior;   /* The
112a0 20 73 65 74 75 70 20 71 75 65 72 79 20 2a 2f 0a   setup query */.
112b0 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20 20    int addrTop;  
112c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112d0 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 6c 6f  /* Top of the lo
112e0 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  op */.  int addr
112f0 43 6f 6e 74 2c 20 61 64 64 72 42 72 65 61 6b 3b  Cont, addrBreak;
11300 20 20 20 20 20 20 2f 2a 20 43 4f 4e 54 49 4e 55        /* CONTINU
11310 45 20 61 6e 64 20 42 52 45 41 4b 20 61 64 64 72  E and BREAK addr
11320 65 73 73 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69  esses */.  int i
11330 43 75 72 72 65 6e 74 20 3d 20 30 3b 20 20 20 20  Current = 0;    
11340 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
11350 43 75 72 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f  Current table */
11360 0a 20 20 69 6e 74 20 72 65 67 43 75 72 72 65 6e  .  int regCurren
11370 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
11380 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
11390 64 69 6e 67 20 43 75 72 72 65 6e 74 20 74 61 62  ding Current tab
113a0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 51 75 65  le */.  int iQue
113b0 75 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ue;             
113c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 51 75 65        /* The Que
113d0 75 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  ue table */.  in
113e0 74 20 69 44 69 73 74 69 6e 63 74 20 3d 20 30 3b  t iDistinct = 0;
113f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
11400 6f 20 65 6e 73 75 72 65 20 75 6e 69 71 75 65 20  o ensure unique 
11410 72 65 73 75 6c 74 73 20 69 66 20 55 4e 49 4f 4e  results if UNION
11420 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 20   */.  int eDest 
11430 3d 20 53 52 54 5f 46 69 66 6f 3b 20 20 20 20 20  = SRT_Fifo;     
11440 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 77 72      /* How to wr
11450 69 74 65 20 74 6f 20 51 75 65 75 65 20 2a 2f 0a  ite to Queue */.
11460 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
11470 74 51 75 65 75 65 3b 20 20 20 20 20 20 20 20 20  tQueue;         
11480 2f 2a 20 53 65 6c 65 63 74 44 65 73 74 20 74 61  /* SelectDest ta
11490 72 67 65 74 74 69 6e 67 20 74 68 65 20 51 75 65  rgetting the Que
114a0 75 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  ue table */.  in
114b0 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
114c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
114d0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
114e0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
114f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11500 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f  * Result code */
11510 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
11520 64 65 72 42 79 3b 20 20 20 20 20 20 20 20 20 20  derBy;          
11530 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59   /* The ORDER BY
11540 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
11550 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66  r *pLimit, *pOff
11560 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 61  set;       /* Sa
11570 76 65 64 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46  ved LIMIT and OF
11580 46 53 45 54 20 2a 2f 0a 20 20 69 6e 74 20 72 65  FSET */.  int re
11590 67 4c 69 6d 69 74 2c 20 72 65 67 4f 66 66 73 65  gLimit, regOffse
115a0 74 3b 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73  t;      /* Regis
115b0 74 65 72 73 20 75 73 65 64 20 62 79 20 4c 49 4d  ters used by LIM
115c0 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 2a 2f  IT and OFFSET */
115d0 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 75  ..  /* Obtain au
115e0 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20 64  thorization to d
115f0 6f 20 61 20 72 65 63 75 72 73 69 76 65 20 71 75  o a recursive qu
11600 65 72 79 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  ery */.  if( sql
11610 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
11620 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 52 45 43  arse, SQLITE_REC
11630 55 52 53 49 56 45 2c 20 30 2c 20 30 2c 20 30 29  URSIVE, 0, 0, 0)
11640 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a   ) return;..  /*
11650 20 50 72 6f 63 65 73 73 20 74 68 65 20 4c 49 4d   Process the LIM
11660 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c  IT and OFFSET cl
11670 61 75 73 65 73 2c 20 69 66 20 74 68 65 79 20 65  auses, if they e
11680 78 69 73 74 20 2a 2f 0a 20 20 61 64 64 72 42 72  xist */.  addrBr
11690 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  eak = sqlite3Vdb
116a0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
116b0 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
116c0 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70  isters(pParse, p
116d0 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20  , addrBreak);.  
116e0 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d  pLimit = p->pLim
116f0 69 74 3b 0a 20 20 70 4f 66 66 73 65 74 20 3d 20  it;.  pOffset = 
11700 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 72 65  p->pOffset;.  re
11710 67 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d  gLimit = p->iLim
11720 69 74 3b 0a 20 20 72 65 67 4f 66 66 73 65 74 20  it;.  regOffset 
11730 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20  = p->iOffset;.  
11740 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70  p->pLimit = p->p
11750 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 70 2d  Offset = 0;.  p-
11760 3e 69 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4f 66  >iLimit = p->iOf
11770 66 73 65 74 20 3d 20 30 3b 0a 20 20 70 4f 72 64  fset = 0;.  pOrd
11780 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
11790 42 79 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65  By;..  /* Locate
117a0 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62   the cursor numb
117b0 65 72 20 6f 66 20 74 68 65 20 43 75 72 72 65 6e  er of the Curren
117c0 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72  t table */.  for
117d0 28 69 3d 30 3b 20 41 4c 57 41 59 53 28 69 3c 70  (i=0; ALWAYS(i<p
117e0 53 72 63 2d 3e 6e 53 72 63 29 3b 20 69 2b 2b 29  Src->nSrc); i++)
117f0 7b 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e  {.    if( pSrc->
11800 61 5b 69 5d 2e 69 73 52 65 63 75 72 73 69 76 65  a[i].isRecursive
11810 20 29 7b 0a 20 20 20 20 20 20 69 43 75 72 72 65   ){.      iCurre
11820 6e 74 20 3d 20 70 53 72 63 2d 3e 61 5b 69 5d 2e  nt = pSrc->a[i].
11830 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 62  iCursor;.      b
11840 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
11850 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 63  .  /* Allocate c
11860 75 72 73 6f 72 73 20 6e 75 6d 62 65 72 73 20 66  ursors numbers f
11870 6f 72 20 51 75 65 75 65 20 61 6e 64 20 44 69 73  or Queue and Dis
11880 74 69 6e 63 74 2e 20 20 54 68 65 20 63 75 72 73  tinct.  The curs
11890 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 0a 20 20  or number for.  
118a0 2a 2a 20 74 68 65 20 44 69 73 74 69 6e 63 74 20  ** the Distinct 
118b0 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 65 78  table must be ex
118c0 61 63 74 6c 79 20 6f 6e 65 20 67 72 65 61 74 65  actly one greate
118d0 72 20 74 68 61 6e 20 51 75 65 75 65 20 69 6e 20  r than Queue in 
118e0 6f 72 64 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74  order.  ** for t
118f0 68 65 20 53 52 54 5f 44 69 73 74 46 69 66 6f 20  he SRT_DistFifo 
11900 61 6e 64 20 53 52 54 5f 44 69 73 74 51 75 65 75  and SRT_DistQueu
11910 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 73 20 74  e destinations t
11920 6f 20 77 6f 72 6b 2e 20 2a 2f 0a 20 20 69 51 75  o work. */.  iQu
11930 65 75 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  eue = pParse->nT
11940 61 62 2b 2b 3b 0a 20 20 69 66 28 20 70 2d 3e 6f  ab++;.  if( p->o
11950 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20  p==TK_UNION ){. 
11960 20 20 20 65 44 65 73 74 20 3d 20 70 4f 72 64 65     eDest = pOrde
11970 72 42 79 20 3f 20 53 52 54 5f 44 69 73 74 51 75  rBy ? SRT_DistQu
11980 65 75 65 20 3a 20 53 52 54 5f 44 69 73 74 46 69  eue : SRT_DistFi
11990 66 6f 3b 0a 20 20 20 20 69 44 69 73 74 69 6e 63  fo;.    iDistinc
119a0 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  t = pParse->nTab
119b0 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ++;.  }else{.   
119c0 20 65 44 65 73 74 20 3d 20 70 4f 72 64 65 72 42   eDest = pOrderB
119d0 79 20 3f 20 53 52 54 5f 51 75 65 75 65 20 3a 20  y ? SRT_Queue : 
119e0 53 52 54 5f 46 69 66 6f 3b 0a 20 20 7d 0a 20 20  SRT_Fifo;.  }.  
119f0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
11a00 74 49 6e 69 74 28 26 64 65 73 74 51 75 65 75 65  tInit(&destQueue
11a10 2c 20 65 44 65 73 74 2c 20 69 51 75 65 75 65 29  , eDest, iQueue)
11a20 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
11a30 20 63 75 72 73 6f 72 73 20 66 6f 72 20 43 75 72   cursors for Cur
11a40 72 65 6e 74 2c 20 51 75 65 75 65 2c 20 61 6e 64  rent, Queue, and
11a50 20 44 69 73 74 69 6e 63 74 2e 20 2a 2f 0a 20 20   Distinct. */.  
11a60 72 65 67 43 75 72 72 65 6e 74 20 3d 20 2b 2b 70  regCurrent = ++p
11a70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73  Parse->nMem;.  s
11a80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
11a90 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64  (v, OP_OpenPseud
11aa0 6f 2c 20 69 43 75 72 72 65 6e 74 2c 20 72 65 67  o, iCurrent, reg
11ab0 43 75 72 72 65 6e 74 2c 20 6e 43 6f 6c 29 3b 0a  Current, nCol);.
11ac0 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
11ad0 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70  {.    KeyInfo *p
11ae0 4b 65 79 49 6e 66 6f 20 3d 20 6d 75 6c 74 69 53  KeyInfo = multiS
11af0 65 6c 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49  electOrderByKeyI
11b00 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 2c 20 31  nfo(pParse, p, 1
11b10 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
11b20 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f  beAddOp4(v, OP_O
11b30 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69 51  penEphemeral, iQ
11b40 75 65 75 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e  ueue, pOrderBy->
11b50 6e 45 78 70 72 2b 32 2c 20 30 2c 0a 20 20 20 20  nExpr+2, 0,.    
11b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b70 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66    (char*)pKeyInf
11b80 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  o, P4_KEYINFO);.
11b90 20 20 20 20 64 65 73 74 51 75 65 75 65 2e 70 4f      destQueue.pO
11ba0 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
11bb0 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  y;.  }else{.    
11bc0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11bd0 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
11be0 6d 65 72 61 6c 2c 20 69 51 75 65 75 65 2c 20 6e  meral, iQueue, n
11bf0 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20 56 64 62 65  Col);.  }.  Vdbe
11c00 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 51 75 65  Comment((v, "Que
11c10 75 65 20 74 61 62 6c 65 22 29 29 3b 0a 20 20 69  ue table"));.  i
11c20 66 28 20 69 44 69 73 74 69 6e 63 74 20 29 7b 0a  f( iDistinct ){.
11c30 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45      p->addrOpenE
11c40 70 68 6d 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33  phm[0] = sqlite3
11c50 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
11c60 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
11c70 69 44 69 73 74 69 6e 63 74 2c 20 30 29 3b 0a 20  iDistinct, 0);. 
11c80 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c     p->selFlags |
11c90 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72  = SF_UsesEphemer
11ca0 61 6c 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65  al;.  }..  /* De
11cb0 74 61 63 68 20 74 68 65 20 4f 52 44 45 52 20 42  tach the ORDER B
11cc0 59 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74 68  Y clause from th
11cd0 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  e compound SELEC
11ce0 54 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65 72  T */.  p->pOrder
11cf0 42 79 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53 74  By = 0;..  /* St
11d00 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
11d10 6f 66 20 74 68 65 20 73 65 74 75 70 2d 71 75 65  of the setup-que
11d20 72 79 20 69 6e 20 51 75 65 75 65 2e 20 2a 2f 0a  ry in Queue. */.
11d30 20 20 70 53 65 74 75 70 2d 3e 70 4e 65 78 74 20    pSetup->pNext 
11d40 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  = 0;.  rc = sqli
11d50 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
11d60 2c 20 70 53 65 74 75 70 2c 20 26 64 65 73 74 51  , pSetup, &destQ
11d70 75 65 75 65 29 3b 0a 20 20 70 53 65 74 75 70 2d  ueue);.  pSetup-
11d80 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 69 66  >pNext = p;.  if
11d90 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f  ( rc ) goto end_
11da0 6f 66 5f 72 65 63 75 72 73 69 76 65 5f 71 75 65  of_recursive_que
11db0 72 79 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74  ry;..  /* Find t
11dc0 68 65 20 6e 65 78 74 20 72 6f 77 20 69 6e 20 74  he next row in t
11dd0 68 65 20 51 75 65 75 65 20 61 6e 64 20 6f 75 74  he Queue and out
11de0 70 75 74 20 74 68 61 74 20 72 6f 77 20 2a 2f 0a  put that row */.
11df0 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69    addrTop = sqli
11e00 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
11e10 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 51 75 65   OP_Rewind, iQue
11e20 75 65 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 20  ue, addrBreak); 
11e30 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
11e40 0a 0a 20 20 2f 2a 20 54 72 61 6e 73 66 65 72 20  ..  /* Transfer 
11e50 74 68 65 20 6e 65 78 74 20 72 6f 77 20 69 6e 20  the next row in 
11e60 51 75 65 75 65 20 6f 76 65 72 20 74 6f 20 43 75  Queue over to Cu
11e70 72 72 65 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74  rrent */.  sqlit
11e80 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
11e90 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 69 43 75 72  OP_NullRow, iCur
11ea0 72 65 6e 74 29 3b 20 2f 2a 20 54 6f 20 72 65 73  rent); /* To res
11eb0 65 74 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20  et column cache 
11ec0 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  */.  if( pOrderB
11ed0 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
11ee0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
11ef0 5f 43 6f 6c 75 6d 6e 2c 20 69 51 75 65 75 65 2c  _Column, iQueue,
11f00 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
11f10 2b 31 2c 20 72 65 67 43 75 72 72 65 6e 74 29 3b  +1, regCurrent);
11f20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
11f30 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
11f40 76 2c 20 4f 50 5f 52 6f 77 44 61 74 61 2c 20 69  v, OP_RowData, i
11f50 51 75 65 75 65 2c 20 72 65 67 43 75 72 72 65 6e  Queue, regCurren
11f60 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  t);.  }.  sqlite
11f70 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
11f80 50 5f 44 65 6c 65 74 65 2c 20 69 51 75 65 75 65  P_Delete, iQueue
11f90 29 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20  );..  /* Output 
11fa0 74 68 65 20 73 69 6e 67 6c 65 20 72 6f 77 20 69  the single row i
11fb0 6e 20 43 75 72 72 65 6e 74 20 2a 2f 0a 20 20 61  n Current */.  a
11fc0 64 64 72 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65  ddrCont = sqlite
11fd0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
11fe0 29 3b 0a 20 20 63 6f 64 65 4f 66 66 73 65 74 28  );.  codeOffset(
11ff0 76 2c 20 72 65 67 4f 66 66 73 65 74 2c 20 61 64  v, regOffset, ad
12000 64 72 43 6f 6e 74 29 3b 0a 20 20 73 65 6c 65 63  drCont);.  selec
12010 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
12020 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  e, p, p->pEList,
12030 20 69 43 75 72 72 65 6e 74 2c 0a 20 20 20 20 20   iCurrent,.     
12040 20 30 2c 20 30 2c 20 70 44 65 73 74 2c 20 61 64   0, 0, pDest, ad
12050 64 72 43 6f 6e 74 2c 20 61 64 64 72 42 72 65 61  drCont, addrBrea
12060 6b 29 3b 0a 20 20 69 66 28 20 72 65 67 4c 69 6d  k);.  if( regLim
12070 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  it ){.    sqlite
12080 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
12090 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c 20  P_DecrJumpZero, 
120a0 72 65 67 4c 69 6d 69 74 2c 20 61 64 64 72 42 72  regLimit, addrBr
120b0 65 61 6b 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  eak);.    VdbeCo
120c0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20  verage(v);.  }. 
120d0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
120e0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
120f0 43 6f 6e 74 29 3b 0a 0a 20 20 2f 2a 20 45 78 65  Cont);..  /* Exe
12100 63 75 74 65 20 74 68 65 20 72 65 63 75 72 73 69  cute the recursi
12110 76 65 20 53 45 4c 45 43 54 20 74 61 6b 69 6e 67  ve SELECT taking
12120 20 74 68 65 20 73 69 6e 67 6c 65 20 72 6f 77 20   the single row 
12130 69 6e 20 43 75 72 72 65 6e 74 20 61 73 0a 20 20  in Current as.  
12140 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72  ** the value for
12150 20 74 68 65 20 72 65 63 75 72 73 69 76 65 2d 74   the recursive-t
12160 61 62 6c 65 2e 20 53 74 6f 72 65 20 74 68 65 20  able. Store the 
12170 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20 51  results in the Q
12180 75 65 75 65 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e  ueue..  */.  p->
12190 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 73 71  pPrior = 0;.  sq
121a0 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
121b0 73 65 2c 20 70 2c 20 26 64 65 73 74 51 75 65 75  se, p, &destQueu
121c0 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  e);.  assert( p-
121d0 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 20 20  >pPrior==0 );.  
121e0 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 53 65 74  p->pPrior = pSet
121f0 75 70 3b 0a 0a 20 20 2f 2a 20 4b 65 65 70 20 72  up;..  /* Keep r
12200 75 6e 6e 69 6e 67 20 74 68 65 20 6c 6f 6f 70 20  unning the loop 
12210 75 6e 74 69 6c 20 74 68 65 20 51 75 65 75 65 20  until the Queue 
12220 69 73 20 65 6d 70 74 79 20 2a 2f 0a 20 20 73 71  is empty */.  sq
12230 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
12240 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61  v, OP_Goto, 0, a
12250 64 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c 69 74  ddrTop);.  sqlit
12260 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
12270 65 6c 28 76 2c 20 61 64 64 72 42 72 65 61 6b 29  el(v, addrBreak)
12280 3b 0a 0a 65 6e 64 5f 6f 66 5f 72 65 63 75 72 73  ;..end_of_recurs
12290 69 76 65 5f 71 75 65 72 79 3a 0a 20 20 73 71 6c  ive_query:.  sql
122a0 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
122b0 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  te(pParse->db, p
122c0 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 70  ->pOrderBy);.  p
122d0 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  ->pOrderBy = pOr
122e0 64 65 72 42 79 3b 0a 20 20 70 2d 3e 70 4c 69 6d  derBy;.  p->pLim
122f0 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 70  it = pLimit;.  p
12300 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66  ->pOffset = pOff
12310 73 65 74 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  set;.  return;.}
12320 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
12330 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a 2f  E_OMIT_CTE */../
12340 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
12350 6e 63 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 69  nces */.static i
12360 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72  nt multiSelectOr
12370 64 65 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a  derBy(.  Parse *
12380 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
12390 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
123a0 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
123b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
123c0 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f  The right-most o
123d0 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20  f SELECTs to be 
123e0 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63  coded */.  Selec
123f0 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20  tDest *pDest    
12400 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
12410 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74  ith query result
12420 73 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 45  s */.);../*.** E
12430 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 6f 72  rror message for
12440 20 77 68 65 6e 20 74 77 6f 20 6f 72 20 6d 6f 72   when two or mor
12450 65 20 74 65 72 6d 73 20 6f 66 20 61 20 63 6f 6d  e terms of a com
12460 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 68 61 76  pound select hav
12470 65 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 73  e different.** s
12480 69 7a 65 20 72 65 73 75 6c 74 20 73 65 74 73 2e  ize result sets.
12490 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
124a0 73 65 6c 65 63 74 57 72 6f 6e 67 4e 75 6d 54 65  selectWrongNumTe
124b0 72 6d 73 45 72 72 6f 72 28 50 61 72 73 65 20 2a  rmsError(Parse *
124c0 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
124d0 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c  p){.  if( p->sel
124e0 46 6c 61 67 73 20 26 20 53 46 5f 56 61 6c 75 65  Flags & SF_Value
124f0 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  s ){.    sqlite3
12500 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
12510 20 22 61 6c 6c 20 56 41 4c 55 45 53 20 6d 75 73   "all VALUES mus
12520 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  t have the same 
12530 6e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 22  number of terms"
12540 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
12550 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
12560 70 50 61 72 73 65 2c 20 22 53 45 4c 45 43 54 73  pParse, "SELECTs
12570 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6e 64   to the left and
12580 20 72 69 67 68 74 20 6f 66 20 25 73 22 0a 20 20   right of %s".  
12590 20 20 20 20 22 20 64 6f 20 6e 6f 74 20 68 61 76      " do not hav
125a0 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  e the same numbe
125b0 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  r of result colu
125c0 6d 6e 73 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61  mns", selectOpNa
125d0 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 7d 0a  me(p->op));.  }.
125e0 7d 0a 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 20  }../*.** Handle 
125f0 74 68 65 20 73 70 65 63 69 61 6c 20 63 61 73 65  the special case
12600 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73   of a compound-s
12610 65 6c 65 63 74 20 74 68 61 74 20 6f 72 69 67 69  elect that origi
12620 6e 61 74 65 73 20 66 72 6f 6d 20 61 0a 2a 2a 20  nates from a.** 
12630 56 41 4c 55 45 53 20 63 6c 61 75 73 65 2e 20 20  VALUES clause.  
12640 42 79 20 68 61 6e 64 6c 69 6e 67 20 74 68 69 73  By handling this
12650 20 61 73 20 61 20 73 70 65 63 69 61 6c 20 63 61   as a special ca
12660 73 65 2c 20 77 65 20 61 76 6f 69 64 20 64 65 65  se, we avoid dee
12670 70 0a 2a 2a 20 72 65 63 75 72 73 69 6f 6e 2c 20  p.** recursion, 
12680 61 6e 64 20 74 68 75 73 20 64 6f 20 6e 6f 74 20  and thus do not 
12690 6e 65 65 64 20 74 6f 20 65 6e 66 6f 72 63 65 20  need to enforce 
126a0 74 68 65 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54  the SQLITE_LIMIT
126b0 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
126c0 0a 2a 2a 20 6f 6e 20 61 20 56 41 4c 55 45 53 20  .** on a VALUES 
126d0 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 65  clause..**.** Be
126e0 63 61 75 73 65 20 74 68 65 20 53 65 6c 65 63 74  cause the Select
126f0 20 6f 62 6a 65 63 74 20 6f 72 69 67 69 6e 61 74   object originat
12700 65 73 20 66 72 6f 6d 20 61 20 56 41 4c 55 45 53  es from a VALUES
12710 20 63 6c 61 75 73 65 3a 0a 2a 2a 20 20 20 28 31   clause:.**   (1
12720 29 20 49 74 20 68 61 73 20 6e 6f 20 4c 49 4d 49  ) It has no LIMI
12730 54 20 6f 72 20 4f 46 46 53 45 54 0a 2a 2a 20 20  T or OFFSET.**  
12740 20 28 32 29 20 41 6c 6c 20 74 65 72 6d 73 20 61   (2) All terms a
12750 72 65 20 55 4e 49 4f 4e 20 41 4c 4c 0a 2a 2a 20  re UNION ALL.** 
12760 20 20 28 33 29 20 54 68 65 72 65 20 69 73 20 6e    (3) There is n
12770 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  o ORDER BY claus
12780 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e.*/.static int 
12790 6d 75 6c 74 69 53 65 6c 65 63 74 56 61 6c 75 65  multiSelectValue
127a0 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
127b0 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
127c0 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
127d0 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
127e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
127f0 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45  right-most of SE
12800 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65  LECTs to be code
12810 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  d */.  SelectDes
12820 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20  t *pDest     /* 
12830 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
12840 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f  query results */
12850 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 50  .){.  Select *pP
12860 72 69 6f 72 3b 0a 20 20 69 6e 74 20 6e 45 78 70  rior;.  int nExp
12870 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  r = p->pEList->n
12880 45 78 70 72 3b 0a 20 20 69 6e 74 20 6e 52 6f 77  Expr;.  int nRow
12890 20 3d 20 31 3b 0a 20 20 69 6e 74 20 72 63 20 3d   = 1;.  int rc =
128a0 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   0;.  assert( p-
128b0 3e 70 4e 65 78 74 3d 3d 30 20 29 3b 0a 20 20 61  >pNext==0 );.  a
128c0 73 73 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61  ssert( p->selFla
128d0 67 73 20 26 20 53 46 5f 41 6c 6c 56 61 6c 75 65  gs & SF_AllValue
128e0 73 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 61  s );.  do{.    a
128f0 73 73 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61  ssert( p->selFla
12900 67 73 20 26 20 53 46 5f 56 61 6c 75 65 73 20 29  gs & SF_Values )
12910 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
12920 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 28  >op==TK_ALL || (
12930 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  p->op==TK_SELECT
12940 20 26 26 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30   && p->pPrior==0
12950 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
12960 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30 20 29 3b   p->pLimit==0 );
12970 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
12980 70 4f 66 66 73 65 74 3d 3d 30 20 29 3b 0a 20 20  pOffset==0 );.  
12990 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d    if( p->pEList-
129a0 3e 6e 45 78 70 72 21 3d 6e 45 78 70 72 20 29 7b  >nExpr!=nExpr ){
129b0 0a 20 20 20 20 20 20 73 65 6c 65 63 74 57 72 6f  .      selectWro
129c0 6e 67 4e 75 6d 54 65 72 6d 73 45 72 72 6f 72 28  ngNumTermsError(
129d0 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20  pParse, p);.    
129e0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
129f0 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 50 72  }.    if( p->pPr
12a00 69 6f 72 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ior==0 ) break;.
12a10 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
12a20 50 72 69 6f 72 2d 3e 70 4e 65 78 74 3d 3d 70 20  Prior->pNext==p 
12a30 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 50  );.    p = p->pP
12a40 72 69 6f 72 3b 0a 20 20 20 20 6e 52 6f 77 2b 2b  rior;.    nRow++
12a50 3b 0a 20 20 7d 77 68 69 6c 65 28 31 29 3b 0a 20  ;.  }while(1);. 
12a60 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20   while( p ){.   
12a70 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72   pPrior = p->pPr
12a80 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69  ior;.    p->pPri
12a90 6f 72 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d  or = 0;.    rc =
12aa0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
12ab0 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29  Parse, p, pDest)
12ac0 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20  ;.    p->pPrior 
12ad0 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 69 66  = pPrior;.    if
12ae0 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20  ( rc ) break;.  
12af0 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
12b00 3d 20 6e 52 6f 77 3b 0a 20 20 20 20 70 20 3d 20  = nRow;.    p = 
12b10 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20  p->pNext;.  }.  
12b20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
12b30 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
12b40 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72   is called to pr
12b50 6f 63 65 73 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ocess a compound
12b60 20 71 75 65 72 79 20 66 6f 72 6d 20 66 72 6f 6d   query form from
12b70 0a 2a 2a 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  .** two or more 
12b80 73 65 70 61 72 61 74 65 20 71 75 65 72 69 65 73  separate queries
12b90 20 75 73 69 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e   using UNION, UN
12ba0 49 4f 4e 20 41 4c 4c 2c 20 45 58 43 45 50 54 2c  ION ALL, EXCEPT,
12bb0 20 6f 72 0a 2a 2a 20 49 4e 54 45 52 53 45 43 54   or.** INTERSECT
12bc0 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74  .**.** "p" point
12bd0 73 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d  s to the right-m
12be0 6f 73 74 20 6f 66 20 74 68 65 20 74 77 6f 20 71  ost of the two q
12bf0 75 65 72 69 65 73 2e 20 20 74 68 65 20 71 75 65  ueries.  the que
12c00 72 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66  ry on the.** lef
12c10 74 20 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20  t is p->pPrior. 
12c20 20 54 68 65 20 6c 65 66 74 20 71 75 65 72 79 20   The left query 
12c30 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20 61 20  could also be a 
12c40 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a  compound query.*
12c50 2a 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20  * in which case 
12c60 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
12c70 6c 20 62 65 20 63 61 6c 6c 65 64 20 72 65 63 75  l be called recu
12c80 72 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20  rsively. .**.** 
12c90 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  The results of t
12ca0 68 65 20 74 6f 74 61 6c 20 71 75 65 72 79 20 61  he total query a
12cb0 72 65 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  re to be written
12cc0 20 69 6e 74 6f 20 61 20 64 65 73 74 69 6e 61 74   into a destinat
12cd0 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65  ion.** of type e
12ce0 44 65 73 74 20 77 69 74 68 20 70 61 72 61 6d 65  Dest with parame
12cf0 74 65 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a  ter iParm..**.**
12d00 20 45 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e   Example 1:  Con
12d10 73 69 64 65 72 20 61 20 74 68 72 65 65 2d 77 61  sider a three-wa
12d20 79 20 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73  y compound SQL s
12d30 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
12d40 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f      SELECT a FRO
12d50 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43  M t1 UNION SELEC
12d60 54 20 62 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f  T b FROM t2 UNIO
12d70 4e 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20  N SELECT c FROM 
12d80 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74  t3.**.** This st
12d90 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65  atement is parse
12da0 64 20 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  d up as follows:
12db0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43  .**.**     SELEC
12dc0 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20  T c FROM t3.**  
12dd0 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d      |.**      `-
12de0 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62 20  ---->  SELECT b 
12df0 46 52 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20  FROM t2.**      
12e00 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20            |.**  
12e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 60 2d                `-
12e20 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61  ----->  SELECT a
12e30 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54   FROM t1.**.** T
12e40 68 65 20 61 72 72 6f 77 73 20 69 6e 20 74 68 65  he arrows in the
12e50 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20 72   diagram above r
12e60 65 70 72 65 73 65 6e 74 20 74 68 65 20 53 65 6c  epresent the Sel
12e70 65 63 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74  ect.pPrior point
12e80 65 72 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69  er..** So if thi
12e90 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
12ea0 6c 65 64 20 77 69 74 68 20 70 20 65 71 75 61 6c  led with p equal
12eb0 20 74 6f 20 74 68 65 20 74 33 20 71 75 65 72 79   to the t3 query
12ec0 2c 20 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72  , then.** pPrior
12ed0 20 77 69 6c 6c 20 62 65 20 74 68 65 20 74 32 20   will be the t2 
12ee0 71 75 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69  query.  p->op wi
12ef0 6c 6c 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69  ll be TK_UNION i
12f00 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
12f10 2a 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20 62  ** Notice that b
12f20 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 77 61  ecause of the wa
12f30 79 20 53 51 4c 69 74 65 20 70 61 72 73 65 73 20  y SQLite parses 
12f40 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73  compound SELECTs
12f50 2c 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64  , the.** individ
12f60 75 61 6c 20 73 65 6c 65 63 74 73 20 61 6c 77 61  ual selects alwa
12f70 79 73 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65  ys group from le
12f80 66 74 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a  ft to right..*/.
12f90 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69  static int multi
12fa0 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20  Select(.  Parse 
12fb0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
12fc0 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
12fd0 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
12fe0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
12ff0 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
13000 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65  of SELECTs to be
13010 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65   coded */.  Sele
13020 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20  ctDest *pDest   
13030 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
13040 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c  with query resul
13050 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ts */.){.  int r
13060 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
13070 20 2f 2a 20 53 75 63 63 65 73 73 20 63 6f 64 65   /* Success code
13080 20 66 72 6f 6d 20 61 20 73 75 62 72 6f 75 74 69   from a subrouti
13090 6e 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  ne */.  Select *
130a0 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a  pPrior;       /*
130b0 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20   Another SELECT 
130c0 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f  immediately to o
130d0 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62  ur left */.  Vdb
130e0 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
130f0 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
13100 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44 42 45  ode to this VDBE
13110 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
13120 20 64 65 73 74 3b 20 20 20 20 20 20 2f 2a 20 41   dest;      /* A
13130 6c 74 65 72 6e 61 74 69 76 65 20 64 61 74 61 20  lternative data 
13140 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20  destination */. 
13150 20 53 65 6c 65 63 74 20 2a 70 44 65 6c 65 74 65   Select *pDelete
13160 20 3d 20 30 3b 20 20 2f 2a 20 43 68 61 69 6e 20   = 0;  /* Chain 
13170 6f 66 20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74  of simple select
13180 73 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20  s to delete */. 
13190 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
131a0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
131b0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
131c0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
131d0 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69  OMIT_EXPLAIN.  i
131e0 6e 74 20 69 53 75 62 31 20 3d 20 30 3b 20 20 20  nt iSub1 = 0;   
131f0 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f       /* EQP id o
13200 66 20 6c 65 66 74 2d 68 61 6e 64 20 71 75 65 72  f left-hand quer
13210 79 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 32  y */.  int iSub2
13220 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
13230 45 51 50 20 69 64 20 6f 66 20 72 69 67 68 74 2d  EQP id of right-
13240 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 23 65  hand query */.#e
13250 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  ndif..  /* Make 
13260 73 75 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f  sure there is no
13270 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d   ORDER BY or LIM
13280 49 54 20 63 6c 61 75 73 65 20 6f 6e 20 70 72 69  IT clause on pri
13290 6f 72 20 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c  or SELECTs.  Onl
132a0 79 0a 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20  y.  ** the last 
132b0 28 72 69 67 68 74 2d 6d 6f 73 74 29 20 53 45 4c  (right-most) SEL
132c0 45 43 54 20 69 6e 20 74 68 65 20 73 65 72 69 65  ECT in the serie
132d0 73 20 6d 61 79 20 68 61 76 65 20 61 6e 20 4f 52  s may have an OR
132e0 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 2e  DER BY or LIMIT.
132f0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
13300 70 20 26 26 20 70 2d 3e 70 50 72 69 6f 72 20 29  p && p->pPrior )
13310 3b 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20 66 75  ;  /* Calling fu
13320 6e 63 74 69 6f 6e 20 67 75 61 72 61 6e 74 65 65  nction guarantee
13330 73 20 74 68 69 73 20 6d 75 63 68 20 2a 2f 0a 20  s this much */. 
13340 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c   assert( (p->sel
13350 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72  Flags & SF_Recur
13360 73 69 76 65 29 3d 3d 30 20 7c 7c 20 70 2d 3e 6f  sive)==0 || p->o
13370 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 2d 3e  p==TK_ALL || p->
13380 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a  op==TK_UNION );.
13390 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
133a0 62 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d  b;.  pPrior = p-
133b0 3e 70 50 72 69 6f 72 3b 0a 20 20 64 65 73 74 20  >pPrior;.  dest 
133c0 3d 20 2a 70 44 65 73 74 3b 0a 20 20 69 66 28 20  = *pDest;.  if( 
133d0 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
133e0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
133f0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22  rrorMsg(pParse,"
13400 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
13410 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65  should come afte
13420 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22  r %s not before"
13430 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70  ,.      selectOp
13440 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20  Name(p->op));.  
13450 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f    rc = 1;.    go
13460 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
13470 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  end;.  }.  if( p
13480 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 7b  Prior->pLimit ){
13490 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
134a0 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4c 49 4d  rMsg(pParse,"LIM
134b0 49 54 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64  IT clause should
134c0 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e   come after %s n
134d0 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20  ot before",.    
134e0 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70    selectOpName(p
134f0 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d  ->op));.    rc =
13500 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c   1;.    goto mul
13510 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
13520 20 7d 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   }..  v = sqlite
13530 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
13540 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30  ;.  assert( v!=0
13550 20 29 3b 20 20 2f 2a 20 54 68 65 20 56 44 42 45   );  /* The VDBE
13560 20 61 6c 72 65 61 64 79 20 63 72 65 61 74 65 64   already created
13570 20 62 79 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63   by calling func
13580 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43 72  tion */..  /* Cr
13590 65 61 74 65 20 74 68 65 20 64 65 73 74 69 6e 61  eate the destina
135a0 74 69 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20 74  tion temporary t
135b0 61 62 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72  able if necessar
135c0 79 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73  y.  */.  if( des
135d0 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68  t.eDest==SRT_Eph
135e0 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 61 73 73  emTab ){.    ass
135f0 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
13600 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
13610 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
13620 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 64 65 73  enEphemeral, des
13630 74 2e 69 53 44 50 61 72 6d 2c 20 70 2d 3e 70 45  t.iSDParm, p->pE
13640 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
13650 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
13660 6e 67 65 50 35 28 76 2c 20 42 54 52 45 45 5f 55  ngeP5(v, BTREE_U
13670 4e 4f 52 44 45 52 45 44 29 3b 0a 20 20 20 20 64  NORDERED);.    d
13680 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f  est.eDest = SRT_
13690 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Table;.  }..  /*
136a0 20 53 70 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e   Special handlin
136b0 67 20 66 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64  g for a compound
136c0 2d 73 65 6c 65 63 74 20 74 68 61 74 20 6f 72 69  -select that ori
136d0 67 69 6e 61 74 65 73 20 61 73 20 61 20 56 41 4c  ginates as a VAL
136e0 55 45 53 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f  UES clause..  */
136f0 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
13700 67 73 20 26 20 53 46 5f 41 6c 6c 56 61 6c 75 65  gs & SF_AllValue
13710 73 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d 75  s ){.    rc = mu
13720 6c 74 69 53 65 6c 65 63 74 56 61 6c 75 65 73 28  ltiSelectValues(
13730 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74  pParse, p, &dest
13740 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  );.    goto mult
13750 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
13760 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
13770 65 20 61 6c 6c 20 53 45 4c 45 43 54 73 20 69 6e  e all SELECTs in
13780 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 68   the statement h
13790 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  ave the same num
137a0 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 0a  ber of elements.
137b0 20 20 2a 2a 20 69 6e 20 74 68 65 69 72 20 72 65    ** in their re
137c0 73 75 6c 74 20 73 65 74 73 2e 0a 20 20 2a 2f 0a  sult sets..  */.
137d0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
137e0 69 73 74 20 26 26 20 70 50 72 69 6f 72 2d 3e 70  ist && pPrior->p
137f0 45 4c 69 73 74 20 29 3b 0a 20 20 69 66 28 20 70  EList );.  if( p
13800 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  ->pEList->nExpr!
13810 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d  =pPrior->pEList-
13820 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73 65  >nExpr ){.    se
13830 6c 65 63 74 57 72 6f 6e 67 4e 75 6d 54 65 72 6d  lectWrongNumTerm
13840 73 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20 70  sError(pParse, p
13850 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  );.    rc = 1;. 
13860 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
13870 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 23  lect_end;.  }..#
13880 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13890 49 54 5f 43 54 45 0a 20 20 69 66 28 20 70 2d 3e  IT_CTE.  if( p->
138a0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65  selFlags & SF_Re
138b0 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 67  cursive ){.    g
138c0 65 6e 65 72 61 74 65 57 69 74 68 52 65 63 75 72  enerateWithRecur
138d0 73 69 76 65 51 75 65 72 79 28 70 50 61 72 73 65  siveQuery(pParse
138e0 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 7d  , p, &dest);.  }
138f0 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  else.#endif..  /
13900 2a 20 43 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  * Compound SELEC
13910 54 73 20 74 68 61 74 20 68 61 76 65 20 61 6e 20  Ts that have an 
13920 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
13930 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65 70 61  are handled sepa
13940 72 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69  rately..  */.  i
13950 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29  f( p->pOrderBy )
13960 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c  {.    return mul
13970 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28  tiSelectOrderBy(
13980 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74  pParse, p, pDest
13990 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a  );.  }else..  /*
139a0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
139b0 6f 72 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20  or the left and 
139c0 72 69 67 68 74 20 53 45 4c 45 43 54 20 73 74 61  right SELECT sta
139d0 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20  tements..  */.  
139e0 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b  switch( p->op ){
139f0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c  .    case TK_ALL
13a00 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  : {.      int ad
13a10 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  dr = 0;.      in
13a20 74 20 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  t nLimit;.      
13a30 61 73 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d  assert( !pPrior-
13a40 3e 70 4c 69 6d 69 74 20 29 3b 0a 20 20 20 20 20  >pLimit );.     
13a50 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20   pPrior->iLimit 
13a60 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20  = p->iLimit;.   
13a70 20 20 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73     pPrior->iOffs
13a80 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b  et = p->iOffset;
13a90 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70  .      pPrior->p
13aa0 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69  Limit = p->pLimi
13ab0 74 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d  t;.      pPrior-
13ac0 3e 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f  >pOffset = p->pO
13ad0 66 66 73 65 74 3b 0a 20 20 20 20 20 20 65 78 70  ffset;.      exp
13ae0 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69  lainSetInteger(i
13af0 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e  Sub1, pParse->iN
13b00 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
13b10 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
13b20 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
13b30 50 72 69 6f 72 2c 20 26 64 65 73 74 29 3b 0a 20  Prior, &dest);. 
13b40 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d       p->pLimit =
13b50 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66   0;.      p->pOf
13b60 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fset = 0;.      
13b70 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
13b80 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
13b90 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
13ba0 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
13bb0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69   = 0;.      p->i
13bc0 4c 69 6d 69 74 20 3d 20 70 50 72 69 6f 72 2d 3e  Limit = pPrior->
13bd0 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d  iLimit;.      p-
13be0 3e 69 4f 66 66 73 65 74 20 3d 20 70 50 72 69 6f  >iOffset = pPrio
13bf0 72 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20  r->iOffset;.    
13c00 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20    if( p->iLimit 
13c10 29 7b 0a 20 20 20 20 20 20 20 20 61 64 64 72 20  ){.        addr 
13c20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
13c30 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c  Op1(v, OP_IfNot,
13c40 20 70 2d 3e 69 4c 69 6d 69 74 29 3b 20 56 64 62   p->iLimit); Vdb
13c50 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
13c60 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
13c70 74 28 28 76 2c 20 22 4a 75 6d 70 20 61 68 65 61  t((v, "Jump ahea
13c80 64 20 69 66 20 4c 49 4d 49 54 20 72 65 61 63 68  d if LIMIT reach
13c90 65 64 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ed"));.      }. 
13ca0 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49       explainSetI
13cb0 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20 70 50  nteger(iSub2, pP
13cc0 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
13cd0 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  tId);.      rc =
13ce0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
13cf0 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 29  Parse, p, &dest)
13d00 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
13d10 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
13d20 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65  );.      pDelete
13d30 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
13d40 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
13d50 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d  pPrior;.      p-
13d60 3e 6e 53 65 6c 65 63 74 52 6f 77 20 2b 3d 20 70  >nSelectRow += p
13d70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f  Prior->nSelectRo
13d80 77 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72  w;.      if( pPr
13d90 69 6f 72 2d 3e 70 4c 69 6d 69 74 0a 20 20 20 20  ior->pLimit.    
13da0 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70     && sqlite3Exp
13db0 72 49 73 49 6e 74 65 67 65 72 28 70 50 72 69 6f  rIsInteger(pPrio
13dc0 72 2d 3e 70 4c 69 6d 69 74 2c 20 26 6e 4c 69 6d  r->pLimit, &nLim
13dd0 69 74 29 0a 20 20 20 20 20 20 20 26 26 20 6e 4c  it).       && nL
13de0 69 6d 69 74 3e 30 20 26 26 20 70 2d 3e 6e 53 65  imit>0 && p->nSe
13df0 6c 65 63 74 52 6f 77 20 3e 20 28 75 36 34 29 6e  lectRow > (u64)n
13e00 4c 69 6d 69 74 20 0a 20 20 20 20 20 20 29 7b 0a  Limit .      ){.
13e10 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65          p->nSele
13e20 63 74 52 6f 77 20 3d 20 6e 4c 69 6d 69 74 3b 0a  ctRow = nLimit;.
13e30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
13e40 28 20 61 64 64 72 20 29 7b 0a 20 20 20 20 20 20  ( addr ){.      
13e50 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
13e60 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a  pHere(v, addr);.
13e70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
13e80 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
13e90 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 0a 20  ase TK_EXCEPT:. 
13ea0 20 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e     case TK_UNION
13eb0 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 75 6e  : {.      int un
13ec0 69 6f 6e 54 61 62 3b 20 20 20 20 2f 2a 20 43 75  ionTab;    /* Cu
13ed0 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74  rsor number of t
13ee0 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
13ef0 6c 65 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c  le holding resul
13f00 74 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 6f 70  t */.      u8 op
13f10 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4f   = 0;       /* O
13f20 6e 65 20 6f 66 20 74 68 65 20 53 52 54 5f 20 6f  ne of the SRT_ o
13f30 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 61 70 70  perations to app
13f40 6c 79 20 74 6f 20 73 65 6c 66 20 2a 2f 0a 20 20  ly to self */.  
13f50 20 20 20 20 69 6e 74 20 70 72 69 6f 72 4f 70 3b      int priorOp;
13f60 20 20 20 20 20 2f 2a 20 54 68 65 20 53 52 54 5f       /* The SRT_
13f70 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 61 70   operation to ap
13f80 70 6c 79 20 74 6f 20 70 72 69 6f 72 20 73 65 6c  ply to prior sel
13f90 65 63 74 73 20 2a 2f 0a 20 20 20 20 20 20 45 78  ects */.      Ex
13fa0 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66  pr *pLimit, *pOf
13fb0 66 73 65 74 3b 20 2f 2a 20 53 61 76 65 64 20 76  fset; /* Saved v
13fc0 61 6c 75 65 73 20 6f 66 20 70 2d 3e 6e 4c 69 6d  alues of p->nLim
13fd0 69 74 20 61 6e 64 20 70 2d 3e 6e 4f 66 66 73 65  it and p->nOffse
13fe0 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  t */.      int a
13ff0 64 64 72 3b 0a 20 20 20 20 20 20 53 65 6c 65 63  ddr;.      Selec
14000 74 44 65 73 74 20 75 6e 69 6f 6e 64 65 73 74 3b  tDest uniondest;
14010 0a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ..      testcase
14020 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45  ( p->op==TK_EXCE
14030 50 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  PT );.      test
14040 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  case( p->op==TK_
14050 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 70  UNION );.      p
14060 72 69 6f 72 4f 70 20 3d 20 53 52 54 5f 55 6e 69  riorOp = SRT_Uni
14070 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 64 65  on;.      if( de
14080 73 74 2e 65 44 65 73 74 3d 3d 70 72 69 6f 72 4f  st.eDest==priorO
14090 70 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  p ){.        /* 
140a0 57 65 20 63 61 6e 20 72 65 75 73 65 20 61 20 74  We can reuse a t
140b0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 67  emporary table g
140c0 65 6e 65 72 61 74 65 64 20 62 79 20 61 20 53 45  enerated by a SE
140d0 4c 45 43 54 20 74 6f 20 6f 75 72 0a 20 20 20 20  LECT to our.    
140e0 20 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20      ** right..  
140f0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
14100 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4c 69 6d   assert( p->pLim
14110 69 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a  it==0 );      /*
14120 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20   Not allowed on 
14130 6c 65 66 74 77 61 72 64 20 65 6c 65 6d 65 6e 74  leftward element
14140 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  s */.        ass
14150 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d  ert( p->pOffset=
14160 3d 30 20 29 3b 20 20 20 20 20 2f 2a 20 4e 6f 74  =0 );     /* Not
14170 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74   allowed on left
14180 77 61 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f  ward elements */
14190 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61  .        unionTa
141a0 62 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72 6d  b = dest.iSDParm
141b0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
141c0 20 20 20 20 20 20 20 2f 2a 20 57 65 20 77 69 6c         /* We wil
141d0 6c 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65  l need to create
141e0 20 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61   our own tempora
141f0 72 79 20 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64  ry table to hold
14200 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
14210 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73  intermediate res
14220 75 6c 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ults..        */
14230 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61  .        unionTa
14240 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  b = pParse->nTab
14250 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ++;.        asse
14260 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d  rt( p->pOrderBy=
14270 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 64  =0 );.        ad
14280 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
14290 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
142a0 6e 45 70 68 65 6d 65 72 61 6c 2c 20 75 6e 69 6f  nEphemeral, unio
142b0 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  nTab, 0);.      
142c0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64    assert( p->add
142d0 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20  rOpenEphm[0] == 
142e0 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  -1 );.        p-
142f0 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
14300 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20   = addr;.       
14310 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70   findRightmost(p
14320 29 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  )->selFlags |= S
14330 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b  F_UsesEphemeral;
14340 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
14350 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
14360 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
14370 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 20  Code the SELECT 
14380 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75  statements to ou
14390 72 20 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a  r left.      */.
143a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
143b0 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20  Prior->pOrderBy 
143c0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
143d0 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
143e0 75 6e 69 6f 6e 64 65 73 74 2c 20 70 72 69 6f 72  uniondest, prior
143f0 4f 70 2c 20 75 6e 69 6f 6e 54 61 62 29 3b 0a 20  Op, unionTab);. 
14400 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49       explainSetI
14410 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70 50  nteger(iSub1, pP
14420 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
14430 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  tId);.      rc =
14440 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
14450 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26  Parse, pPrior, &
14460 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20  uniondest);.    
14470 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
14480 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
14490 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
144a0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64   }..      /* Cod
144b0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 53 45  e the current SE
144c0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20  LECT statement. 
144d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
144e0 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45  ( p->op==TK_EXCE
144f0 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70  PT ){.        op
14500 20 3d 20 53 52 54 5f 45 78 63 65 70 74 3b 0a 20   = SRT_Except;. 
14510 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
14520 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f      assert( p->o
14530 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20  p==TK_UNION );. 
14540 20 20 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f         op = SRT_
14550 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  Union;.      }. 
14560 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
14570 20 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74   0;.      pLimit
14580 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20   = p->pLimit;.  
14590 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
145a0 30 3b 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74  0;.      pOffset
145b0 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20   = p->pOffset;. 
145c0 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20       p->pOffset 
145d0 3d 20 30 3b 0a 20 20 20 20 20 20 75 6e 69 6f 6e  = 0;.      union
145e0 64 65 73 74 2e 65 44 65 73 74 20 3d 20 6f 70 3b  dest.eDest = op;
145f0 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65  .      explainSe
14600 74 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20  tInteger(iSub2, 
14610 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
14620 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63  ectId);.      rc
14630 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
14640 28 70 50 61 72 73 65 2c 20 70 2c 20 26 75 6e 69  (pParse, p, &uni
14650 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74  ondest);.      t
14660 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c  estcase( rc!=SQL
14670 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
14680 2f 2a 20 51 75 65 72 79 20 66 6c 61 74 74 65 6e  /* Query flatten
14690 69 6e 67 20 69 6e 20 73 71 6c 69 74 65 33 53 65  ing in sqlite3Se
146a0 6c 65 63 74 28 29 20 6d 69 67 68 74 20 72 65 66  lect() might ref
146b0 69 6c 6c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2e  ill p->pOrderBy.
146c0 0a 20 20 20 20 20 20 2a 2a 20 42 65 20 73 75 72  .      ** Be sur
146d0 65 20 74 6f 20 64 65 6c 65 74 65 20 70 2d 3e 70  e to delete p->p
146e0 4f 72 64 65 72 42 79 2c 20 74 68 65 72 65 66 6f  OrderBy, therefo
146f0 72 65 2c 20 74 6f 20 61 76 6f 69 64 20 61 20 6d  re, to avoid a m
14700 65 6d 6f 72 79 20 6c 65 61 6b 2e 20 2a 2f 0a 20  emory leak. */. 
14710 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
14720 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
14730 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  ->pOrderBy);.   
14740 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e     pDelete = p->
14750 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d  pPrior;.      p-
14760 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
14770 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65  ;.      p->pOrde
14780 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  rBy = 0;.      i
14790 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49  f( p->op==TK_UNI
147a0 4f 4e 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52  ON ) p->nSelectR
147b0 6f 77 20 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e 53  ow += pPrior->nS
147c0 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20  electRow;.      
147d0 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
147e0 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  e(db, p->pLimit)
147f0 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69  ;.      p->pLimi
14800 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20  t = pLimit;.    
14810 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70    p->pOffset = p
14820 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d  Offset;.      p-
14830 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >iLimit = 0;.   
14840 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20     p->iOffset = 
14850 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e  0;..      /* Con
14860 76 65 72 74 20 74 68 65 20 64 61 74 61 20 69 6e  vert the data in
14870 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
14880 61 62 6c 65 20 69 6e 74 6f 20 77 68 61 74 65 76  able into whatev
14890 65 72 20 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a  er form.      **
148a0 20 69 74 20 69 73 20 74 68 61 74 20 77 65 20 63   it is that we c
148b0 75 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20  urrently need.. 
148c0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
148d0 73 65 72 74 28 20 75 6e 69 6f 6e 54 61 62 3d 3d  sert( unionTab==
148e0 64 65 73 74 2e 69 53 44 50 61 72 6d 20 7c 7c 20  dest.iSDParm || 
148f0 64 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f  dest.eDest!=prio
14900 72 4f 70 20 29 3b 0a 20 20 20 20 20 20 69 66 28  rOp );.      if(
14910 20 64 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69   dest.eDest!=pri
14920 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20 20 20 20  orOp ){.        
14930 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61  int iCont, iBrea
14940 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20  k, iStart;.     
14950 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
14960 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  List );.        
14970 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d  if( dest.eDest==
14980 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20  SRT_Output ){.  
14990 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a          Select *
149a0 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 20 20  pFirst = p;.    
149b0 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 46 69        while( pFi
149c0 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46  rst->pPrior ) pF
149d0 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70  irst = pFirst->p
149e0 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 20  Prior;.         
149f0 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
14a00 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20  ames(pParse, 0, 
14a10 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b  pFirst->pEList);
14a20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14a30 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69     iBreak = sqli
14a40 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
14a50 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69 43 6f  (v);.        iCo
14a60 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nt = sqlite3Vdbe
14a70 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
14a80 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d        computeLim
14a90 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
14aa0 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a  se, p, iBreak);.
14ab0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
14ac0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
14ad0 52 65 77 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62  Rewind, unionTab
14ae0 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43  , iBreak); VdbeC
14af0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
14b00 20 20 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c      iStart = sql
14b10 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
14b20 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20  ddr(v);.        
14b30 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
14b40 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45  pParse, p, p->pE
14b50 4c 69 73 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 0a  List, unionTab,.
14b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b70 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 26 64          0, 0, &d
14b80 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65  est, iCont, iBre
14b90 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ak);.        sql
14ba0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
14bb0 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a  abel(v, iCont);.
14bc0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
14bd0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
14be0 4e 65 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  Next, unionTab, 
14bf0 69 53 74 61 72 74 29 3b 20 56 64 62 65 43 6f 76  iStart); VdbeCov
14c00 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
14c10 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
14c20 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72  olveLabel(v, iBr
14c30 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71  eak);.        sq
14c40 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
14c50 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69  v, OP_Close, uni
14c60 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20  onTab, 0);.     
14c70 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
14c80 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
14c90 74 3a 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70  t: assert( p->op
14ca0 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29  ==TK_INTERSECT )
14cb0 3b 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 61  ; {.      int ta
14cc0 62 31 2c 20 74 61 62 32 3b 0a 20 20 20 20 20 20  b1, tab2;.      
14cd0 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61  int iCont, iBrea
14ce0 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20  k, iStart;.     
14cf0 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a   Expr *pLimit, *
14d00 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69  pOffset;.      i
14d10 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 53  nt addr;.      S
14d20 65 6c 65 63 74 44 65 73 74 20 69 6e 74 65 72 73  electDest inters
14d30 65 63 74 64 65 73 74 3b 0a 20 20 20 20 20 20 69  ectdest;.      i
14d40 6e 74 20 72 31 3b 0a 0a 20 20 20 20 20 20 2f 2a  nt r1;..      /*
14d50 20 49 4e 54 45 52 53 45 43 54 20 69 73 20 64 69   INTERSECT is di
14d60 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65  fferent from the
14d70 20 6f 74 68 65 72 73 20 73 69 6e 63 65 20 69 74   others since it
14d80 20 72 65 71 75 69 72 65 73 0a 20 20 20 20 20 20   requires.      
14d90 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79  ** two temporary
14da0 20 74 61 62 6c 65 73 2e 20 20 48 65 6e 63 65 20   tables.  Hence 
14db0 69 74 20 68 61 73 20 69 74 73 20 6f 77 6e 20 63  it has its own c
14dc0 61 73 65 2e 20 20 42 65 67 69 6e 0a 20 20 20 20  ase.  Begin.    
14dd0 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69    ** by allocati
14de0 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20 77 65  ng the tables we
14df0 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20   will need..    
14e00 20 20 2a 2f 0a 20 20 20 20 20 20 74 61 62 31 20    */.      tab1 
14e10 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
14e20 3b 0a 20 20 20 20 20 20 74 61 62 32 20 3d 20 70  ;.      tab2 = p
14e30 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
14e40 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
14e50 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 0a  pOrderBy==0 );..
14e60 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
14e70 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
14e80 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
14e90 61 6c 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20  al, tab1, 0);.  
14ea0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
14eb0 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
14ec0 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d  = -1 );.      p-
14ed0 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
14ee0 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 66   = addr;.      f
14ef0 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29 2d  indRightmost(p)-
14f00 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
14f10 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20  UsesEphemeral;. 
14f20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
14f30 70 45 4c 69 73 74 20 29 3b 0a 0a 20 20 20 20 20  pEList );..     
14f40 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c   /* Code the SEL
14f50 45 43 54 73 20 74 6f 20 6f 75 72 20 6c 65 66 74  ECTs to our left
14f60 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20   into temporary 
14f70 74 61 62 6c 65 20 22 74 61 62 31 22 2e 0a 20 20  table "tab1"..  
14f80 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
14f90 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
14fa0 69 74 28 26 69 6e 74 65 72 73 65 63 74 64 65 73  it(&intersectdes
14fb0 74 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61  t, SRT_Union, ta
14fc0 62 31 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61  b1);.      expla
14fd0 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75  inSetInteger(iSu
14fe0 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78  b1, pParse->iNex
14ff0 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20  tSelectId);.    
15000 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
15010 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72  lect(pParse, pPr
15020 69 6f 72 2c 20 26 69 6e 74 65 72 73 65 63 74 64  ior, &intersectd
15030 65 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  est);.      if( 
15040 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  rc ){.        go
15050 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
15060 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  end;.      }..  
15070 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20      /* Code the 
15080 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69  current SELECT i
15090 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61  nto temporary ta
150a0 62 6c 65 20 22 74 61 62 32 22 0a 20 20 20 20 20  ble "tab2".     
150b0 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 20 3d   */.      addr =
150c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
150d0 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
150e0 65 6d 65 72 61 6c 2c 20 74 61 62 32 2c 20 30 29  emeral, tab2, 0)
150f0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
15100 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
15110 31 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20  1] == -1 );.    
15120 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68    p->addrOpenEph
15130 6d 5b 31 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20  m[1] = addr;.   
15140 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30     p->pPrior = 0
15150 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d  ;.      pLimit =
15160 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20   p->pLimit;.    
15170 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b    p->pLimit = 0;
15180 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d  .      pOffset =
15190 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20   p->pOffset;.   
151a0 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
151b0 30 3b 0a 20 20 20 20 20 20 69 6e 74 65 72 73 65  0;.      interse
151c0 63 74 64 65 73 74 2e 69 53 44 50 61 72 6d 20 3d  ctdest.iSDParm =
151d0 20 74 61 62 32 3b 0a 20 20 20 20 20 20 65 78 70   tab2;.      exp
151e0 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69  lainSetInteger(i
151f0 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e  Sub2, pParse->iN
15200 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
15210 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
15220 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
15230 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65 73 74  , &intersectdest
15240 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
15250 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
15260 20 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74   );.      pDelet
15270 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  e = p->pPrior;. 
15280 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
15290 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 69   pPrior;.      i
152a0 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  f( p->nSelectRow
152b0 3e 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74  >pPrior->nSelect
152c0 52 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74  Row ) p->nSelect
152d0 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e 6e 53  Row = pPrior->nS
152e0 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20  electRow;.      
152f0 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
15300 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  e(db, p->pLimit)
15310 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69  ;.      p->pLimi
15320 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20  t = pLimit;.    
15330 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70    p->pOffset = p
15340 4f 66 66 73 65 74 3b 0a 0a 20 20 20 20 20 20 2f  Offset;..      /
15350 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
15360 74 6f 20 74 61 6b 65 20 74 68 65 20 69 6e 74 65  to take the inte
15370 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20  rsection of the 
15380 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a 20 20  two temporary.  
15390 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 2e 0a 20      ** tables.. 
153a0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
153b0 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
153c0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 65 73  );.      if( des
153d0 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  t.eDest==SRT_Out
153e0 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 53  put ){.        S
153f0 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20  elect *pFirst = 
15400 70 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  p;.        while
15410 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72  ( pFirst->pPrior
15420 20 29 20 70 46 69 72 73 74 20 3d 20 70 46 69 72   ) pFirst = pFir
15430 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20  st->pPrior;.    
15440 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75      generateColu
15450 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
15460 30 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73  0, pFirst->pELis
15470 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
15480 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74    iBreak = sqlit
15490 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
154a0 76 29 3b 0a 20 20 20 20 20 20 69 43 6f 6e 74 20  v);.      iCont 
154b0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
154c0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
154d0 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
154e0 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70  isters(pParse, p
154f0 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
15500 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15510 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
15520 20 74 61 62 31 2c 20 69 42 72 65 61 6b 29 3b 20   tab1, iBreak); 
15530 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
15540 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
15550 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
15560 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 53 74  arse);.      iSt
15570 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  art = sqlite3Vdb
15580 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f  eAddOp2(v, OP_Ro
15590 77 4b 65 79 2c 20 74 61 62 31 2c 20 72 31 29 3b  wKey, tab1, r1);
155a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
155b0 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
155c0 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 62 32  P_NotFound, tab2
155d0 2c 20 69 43 6f 6e 74 2c 20 72 31 2c 20 30 29 3b  , iCont, r1, 0);
155e0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
155f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
15600 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
15610 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
15620 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
15630 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70  (pParse, p, p->p
15640 45 4c 69 73 74 2c 20 74 61 62 31 2c 0a 20 20 20  EList, tab1,.   
15650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15660 20 20 20 30 2c 20 30 2c 20 26 64 65 73 74 2c 20     0, 0, &dest, 
15670 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a  iCont, iBreak);.
15680 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15690 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
156a0 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73   iCont);.      s
156b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
156c0 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 74 61 62  (v, OP_Next, tab
156d0 31 2c 20 69 53 74 61 72 74 29 3b 20 56 64 62 65  1, iStart); Vdbe
156e0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
156f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
15700 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42  solveLabel(v, iB
15710 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c  reak);.      sql
15720 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15730 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32  , OP_Close, tab2
15740 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
15750 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
15760 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31 2c   OP_Close, tab1,
15770 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
15780 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 65  ;.    }.  }..  e
15790 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28  xplainComposite(
157a0 70 50 61 72 73 65 2c 20 70 2d 3e 6f 70 2c 20 69  pParse, p->op, i
157b0 53 75 62 31 2c 20 69 53 75 62 32 2c 20 70 2d 3e  Sub1, iSub2, p->
157c0 6f 70 21 3d 54 4b 5f 41 4c 4c 29 3b 0a 0a 20 20  op!=TK_ALL);..  
157d0 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c 6c 61  /* Compute colla
157e0 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 75  ting sequences u
157f0 73 65 64 20 62 79 20 0a 20 20 2a 2a 20 74 65 6d  sed by .  ** tem
15800 70 6f 72 61 72 79 20 74 61 62 6c 65 73 20 6e 65  porary tables ne
15810 65 64 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  eded to implemen
15820 74 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  t the compound s
15830 65 6c 65 63 74 2e 0a 20 20 2a 2a 20 41 74 74 61  elect..  ** Atta
15840 63 68 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  ch the KeyInfo s
15850 74 72 75 63 74 75 72 65 20 74 6f 20 61 6c 6c 20  tructure to all 
15860 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
15870 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
15880 20 73 65 63 74 69 6f 6e 20 69 73 20 72 75 6e 20   section is run 
15890 62 79 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  by the right-mos
158a0 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  t SELECT stateme
158b0 6e 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20 53 45  nt only..  ** SE
158c0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
158d0 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6c 77 61  to the left alwa
158e0 79 73 20 73 6b 69 70 20 74 68 69 73 20 70 61 72  ys skip this par
158f0 74 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f  t.  The right-mo
15900 73 74 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 6d  st.  ** SELECT m
15910 69 67 68 74 20 61 6c 73 6f 20 73 6b 69 70 20 74  ight also skip t
15920 68 69 73 20 70 61 72 74 20 69 66 20 69 74 20 68  his part if it h
15930 61 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63  as no ORDER BY c
15940 6c 61 75 73 65 20 61 6e 64 0a 20 20 2a 2a 20 6e  lause and.  ** n
15950 6f 20 74 65 6d 70 20 74 61 62 6c 65 73 20 61 72  o temp tables ar
15960 65 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f  e required..  */
15970 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
15980 67 73 20 26 20 53 46 5f 55 73 65 73 45 70 68 65  gs & SF_UsesEphe
15990 6d 65 72 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74  meral ){.    int
159a0 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
159b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
159c0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
159d0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
159e0 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  nfo;            
159f0 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71  /* Collating seq
15a00 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72 65  uence for the re
15a10 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20 20  sult set */.    
15a20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b 20 20  Select *pLoop;  
15a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15a40 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72   For looping thr
15a50 6f 75 67 68 20 53 45 4c 45 43 54 20 73 74 61 74  ough SELECT stat
15a60 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 43 6f  ements */.    Co
15a70 6c 6c 53 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b 20  llSeq **apColl; 
15a80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
15a90 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75  or looping throu
15aa0 67 68 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  gh pKeyInfo->aCo
15ab0 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ll[] */.    int 
15ac0 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  nCol;           
15ad0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
15ae0 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
15af0 6e 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  n result set */.
15b00 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
15b10 70 4e 65 78 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pNext==0 );.    
15b20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74  nCol = p->pEList
15b30 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 70 4b 65  ->nExpr;.    pKe
15b40 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b  yInfo = sqlite3K
15b50 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20  eyInfoAlloc(db, 
15b60 6e 43 6f 6c 2c 20 31 29 3b 0a 20 20 20 20 69 66  nCol, 1);.    if
15b70 28 20 21 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20  ( !pKeyInfo ){. 
15b80 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
15b90 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f  _NOMEM;.      go
15ba0 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
15bb0 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  end;.    }.    f
15bc0 6f 72 28 69 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70  or(i=0, apColl=p
15bd0 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20  KeyInfo->aColl; 
15be0 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43  i<nCol; i++, apC
15bf0 6f 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 2a 61  oll++){.      *a
15c00 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c  pColl = multiSel
15c10 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ectCollSeq(pPars
15c20 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20  e, p, i);.      
15c30 69 66 28 20 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29  if( 0==*apColl )
15c40 7b 0a 20 20 20 20 20 20 20 20 2a 61 70 43 6f 6c  {.        *apCol
15c50 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
15c60 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  l;.      }.    }
15c70 0a 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d  ..    for(pLoop=
15c80 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d  p; pLoop; pLoop=
15c90 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 29 7b 0a  pLoop->pPrior){.
15ca0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
15cb0 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <2; i++){.      
15cc0 20 20 69 6e 74 20 61 64 64 72 20 3d 20 70 4c 6f    int addr = pLo
15cd0 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  op->addrOpenEphm
15ce0 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [i];.        if(
15cf0 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 20   addr<0 ){.     
15d00 20 20 20 20 20 2f 2a 20 49 66 20 5b 30 5d 20 69       /* If [0] i
15d10 73 20 75 6e 75 73 65 64 20 74 68 65 6e 20 5b 31  s unused then [1
15d20 5d 20 69 73 20 61 6c 73 6f 20 75 6e 75 73 65 64  ] is also unused
15d30 2e 20 20 53 6f 20 77 65 20 63 61 6e 0a 20 20 20  .  So we can.   
15d40 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73         ** always
15d50 20 73 61 66 65 6c 79 20 61 62 6f 72 74 20 61 73   safely abort as
15d60 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 66 69 72   soon as the fir
15d70 73 74 20 75 6e 75 73 65 64 20 73 6c 6f 74 20 69  st unused slot i
15d80 73 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20  s found */.     
15d90 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
15da0 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  op->addrOpenEphm
15db0 5b 31 5d 3c 30 20 29 3b 0a 20 20 20 20 20 20 20  [1]<0 );.       
15dc0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
15dd0 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
15de0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
15df0 76 2c 20 61 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a  v, addr, nCol);.
15e00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
15e10 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61  dbeChangeP4(v, a
15e20 64 64 72 2c 20 28 63 68 61 72 2a 29 73 71 6c 69  ddr, (char*)sqli
15e30 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b  te3KeyInfoRef(pK
15e40 65 79 49 6e 66 6f 29 2c 0a 20 20 20 20 20 20 20  eyInfo),.       
15e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e60 20 20 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29       P4_KEYINFO)
15e70 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d  ;.        pLoop-
15e80 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d  >addrOpenEphm[i]
15e90 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20   = -1;.      }. 
15ea0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
15eb0 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65  KeyInfoUnref(pKe
15ec0 79 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c  yInfo);.  }..mul
15ed0 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20  ti_select_end:. 
15ee0 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20   pDest->iSdst = 
15ef0 64 65 73 74 2e 69 53 64 73 74 3b 0a 20 20 70 44  dest.iSdst;.  pD
15f00 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 64 65 73  est->nSdst = des
15f10 74 2e 6e 53 64 73 74 3b 0a 20 20 73 71 6c 69 74  t.nSdst;.  sqlit
15f20 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
15f30 62 2c 20 70 44 65 6c 65 74 65 29 3b 0a 20 20 72  b, pDelete);.  r
15f40 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
15f50 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
15f60 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
15f70 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65  T */../*.** Code
15f80 20 61 6e 20 6f 75 74 70 75 74 20 73 75 62 72 6f   an output subro
15f90 75 74 69 6e 65 20 66 6f 72 20 61 20 63 6f 72 6f  utine for a coro
15fa0 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 61  utine implementa
15fb0 74 69 6f 6e 20 6f 66 20 61 0a 2a 2a 20 53 45 4c  tion of a.** SEL
15fc0 45 43 54 20 73 74 61 74 6d 65 6e 74 2e 0a 2a 2a  ECT statment..**
15fd0 0a 2a 2a 20 54 68 65 20 64 61 74 61 20 74 6f 20  .** The data to 
15fe0 62 65 20 6f 75 74 70 75 74 20 69 73 20 63 6f 6e  be output is con
15ff0 74 61 69 6e 65 64 20 69 6e 20 70 49 6e 2d 3e 69  tained in pIn->i
16000 53 64 73 74 2e 20 20 54 68 65 72 65 20 61 72 65  Sdst.  There are
16010 0a 2a 2a 20 70 49 6e 2d 3e 6e 53 64 73 74 20 63  .** pIn->nSdst c
16020 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 6f 75 74  olumns to be out
16030 70 75 74 2e 20 20 70 44 65 73 74 20 69 73 20 77  put.  pDest is w
16040 68 65 72 65 20 74 68 65 20 6f 75 74 70 75 74 20  here the output 
16050 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 6e  should.** be sen
16060 74 2e 0a 2a 2a 0a 2a 2a 20 72 65 67 52 65 74 75  t..**.** regRetu
16070 72 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  rn is the number
16080 20 6f 66 20 74 68 65 20 72 65 67 69 73 74 65 72   of the register
16090 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 75 62   holding the sub
160a0 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72  routine.** retur
160b0 6e 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a  n address..**.**
160c0 20 49 66 20 72 65 67 50 72 65 76 3e 30 20 74 68   If regPrev>0 th
160d0 65 6e 20 69 74 20 69 73 20 74 68 65 20 66 69 72  en it is the fir
160e0 73 74 20 72 65 67 69 73 74 65 72 20 69 6e 20 61  st register in a
160f0 20 76 65 63 74 6f 72 20 74 68 61 74 0a 2a 2a 20   vector that.** 
16100 72 65 63 6f 72 64 73 20 74 68 65 20 70 72 65 76  records the prev
16110 69 6f 75 73 20 6f 75 74 70 75 74 2e 20 20 6d 65  ious output.  me
16120 6d 5b 72 65 67 50 72 65 76 5d 20 69 73 20 61 20  m[regPrev] is a 
16130 66 6c 61 67 20 74 68 61 74 20 69 73 20 66 61 6c  flag that is fal
16140 73 65 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 68  se.** if there h
16150 61 73 20 62 65 65 6e 20 6e 6f 20 70 72 65 76 69  as been no previ
16160 6f 75 73 20 6f 75 74 70 75 74 2e 20 20 49 66 20  ous output.  If 
16170 72 65 67 50 72 65 76 3e 30 20 74 68 65 6e 20 63  regPrev>0 then c
16180 6f 64 65 20 69 73 0a 2a 2a 20 67 65 6e 65 72 61  ode is.** genera
16190 74 65 64 20 74 6f 20 73 75 70 70 72 65 73 73 20  ted to suppress 
161a0 64 75 70 6c 69 63 61 74 65 73 2e 20 20 70 4b 65  duplicates.  pKe
161b0 79 49 6e 66 6f 20 69 73 20 75 73 65 64 20 66 6f  yInfo is used fo
161c0 72 20 63 6f 6d 70 61 72 69 6e 67 0a 2a 2a 20 6b  r comparing.** k
161d0 65 79 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  eys..**.** If th
161e0 65 20 4c 49 4d 49 54 20 66 6f 75 6e 64 20 69 6e  e LIMIT found in
161f0 20 70 2d 3e 69 4c 69 6d 69 74 20 69 73 20 72 65   p->iLimit is re
16200 61 63 68 65 64 2c 20 6a 75 6d 70 20 69 6d 6d 65  ached, jump imme
16210 64 69 61 74 65 6c 79 20 74 6f 0a 2a 2a 20 69 42  diately to.** iB
16220 72 65 61 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  reak..*/.static 
16230 69 6e 74 20 67 65 6e 65 72 61 74 65 4f 75 74 70  int generateOutp
16240 75 74 53 75 62 72 6f 75 74 69 6e 65 28 0a 20 20  utSubroutine(.  
16250 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
16260 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
16270 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
16280 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
16290 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53          /* The S
162a0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
162b0 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
162c0 2a 70 49 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20  *pIn,        /* 
162d0 43 6f 72 6f 75 74 69 6e 65 20 73 75 70 70 6c 79  Coroutine supply
162e0 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 53 65  ing data */.  Se
162f0 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c  lectDest *pDest,
16300 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74        /* Where t
16310 6f 20 73 65 6e 64 20 74 68 65 20 64 61 74 61 20  o send the data 
16320 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 74 75  */.  int regRetu
16330 72 6e 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  rn,          /* 
16340 54 68 65 20 72 65 74 75 72 6e 20 61 64 64 72 65  The return addre
16350 73 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20  ss register */. 
16360 20 69 6e 74 20 72 65 67 50 72 65 76 2c 20 20 20   int regPrev,   
16370 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76           /* Prev
16380 69 6f 75 73 20 72 65 73 75 6c 74 20 72 65 67 69  ious result regi
16390 73 74 65 72 2e 20 20 4e 6f 20 75 6e 69 71 75 65  ster.  No unique
163a0 6e 65 73 73 20 69 66 20 30 20 2a 2f 0a 20 20 4b  ness if 0 */.  K
163b0 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
163c0 2c 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f  ,      /* For co
163d0 6d 70 61 72 69 6e 67 20 77 69 74 68 20 70 72 65  mparing with pre
163e0 76 69 6f 75 73 20 65 6e 74 72 79 20 2a 2f 0a 20  vious entry */. 
163f0 20 69 6e 74 20 69 42 72 65 61 6b 20 20 20 20 20   int iBreak     
16400 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
16410 20 68 65 72 65 20 69 66 20 77 65 20 68 69 74 20   here if we hit 
16420 74 68 65 20 4c 49 4d 49 54 20 2a 2f 0a 29 7b 0a  the LIMIT */.){.
16430 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
16440 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
16450 20 69 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 6e   iContinue;.  in
16460 74 20 61 64 64 72 3b 0a 0a 20 20 61 64 64 72 20  t addr;..  addr 
16470 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
16480 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69  rentAddr(v);.  i
16490 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74  Continue = sqlit
164a0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
164b0 76 29 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65  v);..  /* Suppre
164c0 73 73 20 64 75 70 6c 69 63 61 74 65 73 20 66 6f  ss duplicates fo
164d0 72 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c  r UNION, EXCEPT,
164e0 20 61 6e 64 20 49 4e 54 45 52 53 45 43 54 20 0a   and INTERSECT .
164f0 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 67 50 72    */.  if( regPr
16500 65 76 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 31  ev ){.    int j1
16510 2c 20 6a 32 3b 0a 20 20 20 20 6a 31 20 3d 20 73  , j2;.    j1 = s
16520 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
16530 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65  (v, OP_IfNot, re
16540 67 50 72 65 76 29 3b 20 56 64 62 65 43 6f 76 65  gPrev); VdbeCove
16550 72 61 67 65 28 76 29 3b 0a 20 20 20 20 6a 32 20  rage(v);.    j2 
16560 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
16570 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72  Op4(v, OP_Compar
16580 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 72  e, pIn->iSdst, r
16590 65 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e  egPrev+1, pIn->n
165a0 53 64 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Sdst,.          
165b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
165c0 20 20 20 20 28 63 68 61 72 2a 29 73 71 6c 69 74      (char*)sqlit
165d0 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65  e3KeyInfoRef(pKe
165e0 79 49 6e 66 6f 29 2c 20 50 34 5f 4b 45 59 49 4e  yInfo), P4_KEYIN
165f0 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  FO);.    sqlite3
16600 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
16610 5f 4a 75 6d 70 2c 20 6a 32 2b 32 2c 20 69 43 6f  _Jump, j2+2, iCo
16620 6e 74 69 6e 75 65 2c 20 6a 32 2b 32 29 3b 20 56  ntinue, j2+2); V
16630 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
16640 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
16650 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a  umpHere(v, j1);.
16660 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16670 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79  ddOp3(v, OP_Copy
16680 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 72 65  , pIn->iSdst, re
16690 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53  gPrev+1, pIn->nS
166a0 64 73 74 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69  dst-1);.    sqli
166b0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
166c0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
166d0 72 65 67 50 72 65 76 29 3b 0a 20 20 7d 0a 20 20  regPrev);.  }.  
166e0 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  if( pParse->db->
166f0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
16700 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 53  eturn 0;..  /* S
16710 75 70 70 72 65 73 73 20 74 68 65 20 66 69 72 73  uppress the firs
16720 74 20 4f 46 46 53 45 54 20 65 6e 74 72 69 65 73  t OFFSET entries
16730 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   if there is an 
16740 4f 46 46 53 45 54 20 63 6c 61 75 73 65 0a 20 20  OFFSET clause.  
16750 2a 2f 0a 20 20 63 6f 64 65 4f 66 66 73 65 74 28  */.  codeOffset(
16760 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69  v, p->iOffset, i
16770 43 6f 6e 74 69 6e 75 65 29 3b 0a 0a 20 20 73 77  Continue);..  sw
16780 69 74 63 68 28 20 70 44 65 73 74 2d 3e 65 44 65  itch( pDest->eDe
16790 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 53 74 6f  st ){.    /* Sto
167a0 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 61 73  re the result as
167b0 20 64 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e   data using a un
167c0 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f  ique key..    */
167d0 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61  .    case SRT_Ta
167e0 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52  ble:.    case SR
167f0 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20  T_EphemTab: {.  
16800 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c      int r1 = sql
16810 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
16820 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 6e  Parse);.      in
16830 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65  t r2 = sqlite3Ge
16840 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
16850 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
16860 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  ( pDest->eDest==
16870 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20 20  SRT_Table );.   
16880 20 20 20 74 65 73 74 63 61 73 65 28 20 70 44 65     testcase( pDe
16890 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45  st->eDest==SRT_E
168a0 70 68 65 6d 54 61 62 20 29 3b 0a 20 20 20 20 20  phemTab );.     
168b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
168c0 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
168d0 6f 72 64 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c  ord, pIn->iSdst,
168e0 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 20 72 31 29   pIn->nSdst, r1)
168f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
16900 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
16910 4e 65 77 52 6f 77 69 64 2c 20 70 44 65 73 74 2d  NewRowid, pDest-
16920 3e 69 53 44 50 61 72 6d 2c 20 72 32 29 3b 0a 20  >iSDParm, r2);. 
16930 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
16940 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73  AddOp3(v, OP_Ins
16950 65 72 74 2c 20 70 44 65 73 74 2d 3e 69 53 44 50  ert, pDest->iSDP
16960 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20  arm, r1, r2);.  
16970 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
16980 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
16990 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20  G_APPEND);.     
169a0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
169b0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
169c0 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
169d0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
169e0 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
169f0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
16a00 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
16a10 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
16a20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63    /* If we are c
16a30 72 65 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f  reating a set fo
16a40 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53  r an "expr IN (S
16a50 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73  ELECT ...)" cons
16a60 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68  truct,.    ** th
16a70 65 6e 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20  en there should 
16a80 62 65 20 61 20 73 69 6e 67 6c 65 20 69 74 65 6d  be a single item
16a90 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20   on the stack.  
16aa0 57 72 69 74 65 20 74 68 69 73 0a 20 20 20 20 2a  Write this.    *
16ab0 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74 68 65 20  * item into the 
16ac0 73 65 74 20 74 61 62 6c 65 20 77 69 74 68 20 62  set table with b
16ad0 6f 67 75 73 20 64 61 74 61 2e 0a 20 20 20 20 2a  ogus data..    *
16ae0 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53  /.    case SRT_S
16af0 65 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  et: {.      int 
16b00 72 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  r1;.      assert
16b10 28 20 70 49 6e 2d 3e 6e 53 64 73 74 3d 3d 31 20  ( pIn->nSdst==1 
16b20 29 3b 0a 20 20 20 20 20 20 70 44 65 73 74 2d 3e  );.      pDest->
16b30 61 66 66 53 64 73 74 20 3d 20 0a 20 20 20 20 20  affSdst = .     
16b40 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 70 61      sqlite3Compa
16b50 72 65 41 66 66 69 6e 69 74 79 28 70 2d 3e 70 45  reAffinity(p->pE
16b60 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
16b70 2c 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74  , pDest->affSdst
16b80 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
16b90 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
16ba0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
16bb0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
16bc0 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
16bd0 64 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 31  d, pIn->iSdst, 1
16be0 2c 20 72 31 2c 20 26 70 44 65 73 74 2d 3e 61 66  , r1, &pDest->af
16bf0 66 53 64 73 74 2c 31 29 3b 0a 20 20 20 20 20 20  fSdst,1);.      
16c00 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
16c10 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
16c20 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73  Parse, pIn->iSds
16c30 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  t, 1);.      sql
16c40 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
16c50 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
16c60 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20  pDest->iSDParm, 
16c70 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r1);.      sqlit
16c80 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
16c90 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
16ca0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
16cb0 0a 0a 23 69 66 20 30 20 20 2f 2a 20 4e 65 76 65  ..#if 0  /* Neve
16cc0 72 20 6f 63 63 75 72 73 20 6f 6e 20 61 6e 20 4f  r occurs on an O
16cd0 52 44 45 52 20 42 59 20 71 75 65 72 79 20 2a 2f  RDER BY query */
16ce0 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 79 20 72  .    /* If any r
16cf0 6f 77 20 65 78 69 73 74 20 69 6e 20 74 68 65 20  ow exist in the 
16d00 72 65 73 75 6c 74 20 73 65 74 2c 20 72 65 63 6f  result set, reco
16d10 72 64 20 74 68 61 74 20 66 61 63 74 20 61 6e 64  rd that fact and
16d20 20 61 62 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a 20   abort..    */. 
16d30 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 69 73     case SRT_Exis
16d40 74 73 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  ts: {.      sqli
16d50 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
16d60 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
16d70 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b  pDest->iSDParm);
16d80 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49  .      /* The LI
16d90 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20  MIT clause will 
16da0 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f  terminate the lo
16db0 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20  op for us */.   
16dc0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
16dd0 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49  #endif..    /* I
16de0 66 20 74 68 69 73 20 69 73 20 61 20 73 63 61 6c  f this is a scal
16df0 61 72 20 73 65 6c 65 63 74 20 74 68 61 74 20 69  ar select that i
16e00 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70  s part of an exp
16e10 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20  ression, then.  
16e20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72    ** store the r
16e30 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70  esults in the ap
16e40 70 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79  propriate memory
16e50 20 63 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20   cell and break 
16e60 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  out.    ** of th
16e70 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20  e scan loop..   
16e80 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
16e90 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73  _Mem: {.      as
16ea0 73 65 72 74 28 20 70 49 6e 2d 3e 6e 53 64 73 74  sert( pIn->nSdst
16eb0 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==1 );.      sql
16ec0 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65  ite3ExprCodeMove
16ed0 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53  (pParse, pIn->iS
16ee0 64 73 74 2c 20 70 44 65 73 74 2d 3e 69 53 44 50  dst, pDest->iSDP
16ef0 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f  arm, 1);.      /
16f00 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75  * The LIMIT clau
16f10 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74  se will jump out
16f20 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72   of the loop for
16f30 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65   us */.      bre
16f40 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
16f50 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49   /* #ifndef SQLI
16f60 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
16f70 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20   */..    /* The 
16f80 72 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72  results are stor
16f90 65 64 20 69 6e 20 61 20 73 65 71 75 65 6e 63 65  ed in a sequence
16fa0 20 6f 66 20 72 65 67 69 73 74 65 72 73 0a 20 20   of registers.  
16fb0 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74    ** starting at
16fc0 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2e 20 20   pDest->iSdst.  
16fd0 54 68 65 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74  Then the co-rout
16fe0 69 6e 65 20 79 69 65 6c 64 73 2e 0a 20 20 20 20  ine yields..    
16ff0 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
17000 43 6f 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20  Coroutine: {.   
17010 20 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69 53     if( pDest->iS
17020 64 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  dst==0 ){.      
17030 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d    pDest->iSdst =
17040 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
17050 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e  ange(pParse, pIn
17060 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20  ->nSdst);.      
17070 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d    pDest->nSdst =
17080 20 70 49 6e 2d 3e 6e 53 64 73 74 3b 0a 20 20 20   pIn->nSdst;.   
17090 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
170a0 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70  e3ExprCodeMove(p
170b0 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73  Parse, pIn->iSds
170c0 74 2c 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2c  t, pDest->iSdst,
170d0 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 29 3b 0a   pDest->nSdst);.
170e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
170f0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69  eAddOp1(v, OP_Yi
17100 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50  eld, pDest->iSDP
17110 61 72 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61  arm);.      brea
17120 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
17130 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20   If none of the 
17140 61 62 6f 76 65 2c 20 74 68 65 6e 20 74 68 65 20  above, then the 
17150 72 65 73 75 6c 74 20 64 65 73 74 69 6e 61 74 69  result destinati
17160 6f 6e 20 6d 75 73 74 20 62 65 0a 20 20 20 20 2a  on must be.    *
17170 2a 20 53 52 54 5f 4f 75 74 70 75 74 2e 20 20 54  * SRT_Output.  T
17180 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
17190 65 76 65 72 20 63 61 6c 6c 65 64 20 77 69 74 68  ever called with
171a0 20 61 6e 79 20 6f 74 68 65 72 0a 20 20 20 20 2a   any other.    *
171b0 2a 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6f 74  * destination ot
171c0 68 65 72 20 74 68 61 6e 20 74 68 65 20 6f 6e 65  her than the one
171d0 73 20 68 61 6e 64 6c 65 64 20 61 62 6f 76 65 20  s handled above 
171e0 6f 72 20 53 52 54 5f 4f 75 74 70 75 74 2e 0a 20  or SRT_Output.. 
171f0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72     **.    ** For
17200 20 53 52 54 5f 4f 75 74 70 75 74 2c 20 72 65 73   SRT_Output, res
17210 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64 20  ults are stored 
17220 69 6e 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66  in a sequence of
17230 20 72 65 67 69 73 74 65 72 73 2e 20 20 0a 20 20   registers.  .  
17240 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 4f 50    ** Then the OP
17250 5f 52 65 73 75 6c 74 52 6f 77 20 6f 70 63 6f 64  _ResultRow opcod
17260 65 20 69 73 20 75 73 65 64 20 74 6f 20 63 61 75  e is used to cau
17270 73 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  se sqlite3_step(
17280 29 20 74 6f 0a 20 20 20 20 2a 2a 20 72 65 74 75  ) to.    ** retu
17290 72 6e 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20  rn the next row 
172a0 6f 66 20 72 65 73 75 6c 74 2e 0a 20 20 20 20 2a  of result..    *
172b0 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  /.    default: {
172c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
172d0 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
172e0 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20  _Output );.     
172f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17300 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(v, OP_ResultR
17310 6f 77 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  ow, pIn->iSdst, 
17320 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20  pIn->nSdst);.   
17330 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
17340 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
17350 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69  e(pParse, pIn->i
17360 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74  Sdst, pIn->nSdst
17370 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
17380 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
17390 4a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20  Jump to the end 
173a0 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74  of the loop if t
173b0 68 65 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63  he LIMIT is reac
173c0 68 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  hed..  */.  if( 
173d0 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20  p->iLimit ){.   
173e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
173f0 70 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75 6d  p2(v, OP_DecrJum
17400 70 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74  pZero, p->iLimit
17410 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43  , iBreak); VdbeC
17420 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a  overage(v);.  }.
17430 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74  .  /* Generate t
17440 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 72 65  he subroutine re
17450 74 75 72 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  turn.  */.  sqli
17460 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
17470 62 65 6c 28 76 2c 20 69 43 6f 6e 74 69 6e 75 65  bel(v, iContinue
17480 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
17490 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74  AddOp1(v, OP_Ret
174a0 75 72 6e 2c 20 72 65 67 52 65 74 75 72 6e 29 3b  urn, regReturn);
174b0 0a 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b  ..  return addr;
174c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 74 65 72 6e  .}../*.** Altern
174d0 61 74 69 76 65 20 63 6f 6d 70 6f 75 6e 64 20 73  ative compound s
174e0 65 6c 65 63 74 20 63 6f 64 65 20 67 65 6e 65 72  elect code gener
174f0 61 74 6f 72 20 66 6f 72 20 63 61 73 65 73 20 77  ator for cases w
17500 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 69 73 20  hen there.** is 
17510 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
17520 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73 73  se..**.** We ass
17530 75 6d 65 20 61 20 71 75 65 72 79 20 6f 66 20 74  ume a query of t
17540 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72  he following for
17550 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 3c 73  m:.**.**      <s
17560 65 6c 65 63 74 41 3e 20 20 3c 6f 70 65 72 61 74  electA>  <operat
17570 6f 72 3e 20 20 3c 73 65 6c 65 63 74 42 3e 20 20  or>  <selectB>  
17580 4f 52 44 45 52 20 42 59 20 3c 6f 72 64 65 72 62  ORDER BY <orderb
17590 79 6c 69 73 74 3e 0a 2a 2a 0a 2a 2a 20 3c 6f 70  ylist>.**.** <op
175a0 65 72 61 74 6f 72 3e 20 69 73 20 6f 6e 65 20 6f  erator> is one o
175b0 66 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 55 4e 49  f UNION ALL, UNI
175c0 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72 20 49  ON, EXCEPT, or I
175d0 4e 54 45 52 53 45 43 54 2e 20 20 54 68 65 20 69  NTERSECT.  The i
175e0 64 65 61 0a 2a 2a 20 69 73 20 74 6f 20 63 6f 64  dea.** is to cod
175f0 65 20 62 6f 74 68 20 3c 73 65 6c 65 63 74 41 3e  e both <selectA>
17600 20 61 6e 64 20 3c 73 65 6c 65 63 74 42 3e 20 77   and <selectB> w
17610 69 74 68 20 74 68 65 20 4f 52 44 45 52 20 42 59  ith the ORDER BY
17620 20 63 6c 61 75 73 65 20 61 73 0a 2a 2a 20 63 6f   clause as.** co
17630 2d 72 6f 75 74 69 6e 65 73 2e 20 20 54 68 65 6e  -routines.  Then
17640 20 72 75 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74   run the co-rout
17650 69 6e 65 73 20 69 6e 20 70 61 72 61 6c 6c 65 6c  ines in parallel
17660 20 61 6e 64 20 6d 65 72 67 65 20 74 68 65 20 72   and merge the r
17670 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 74  esults.** into t
17680 68 65 20 6f 75 74 70 75 74 2e 20 20 49 6e 20 61  he output.  In a
17690 64 64 69 74 69 6f 6e 20 74 6f 20 74 68 65 20 74  ddition to the t
176a0 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20 28 63  wo coroutines (c
176b0 61 6c 6c 65 64 20 73 65 6c 65 63 74 41 20 61 6e  alled selectA an
176c0 64 0a 2a 2a 20 73 65 6c 65 63 74 42 29 20 74 68  d.** selectB) th
176d0 65 72 65 20 61 72 65 20 37 20 73 75 62 72 6f 75  ere are 7 subrou
176e0 74 69 6e 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tines:.**.**    
176f0 6f 75 74 41 3a 20 20 20 20 4d 6f 76 65 20 74 68  outA:    Move th
17700 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20  e output of the 
17710 73 65 6c 65 63 74 41 20 63 6f 72 6f 75 74 69 6e  selectA coroutin
17720 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75  e into the outpu
17730 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
17740 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   of the compound
17750 20 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20   query..**.**   
17760 20 6f 75 74 42 3a 20 20 20 20 4d 6f 76 65 20 74   outB:    Move t
17770 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65  he output of the
17780 20 73 65 6c 65 63 74 42 20 63 6f 72 6f 75 74 69   selectB corouti
17790 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70  ne into the outp
177a0 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ut.**           
177b0 20 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e    of the compoun
177c0 64 20 71 75 65 72 79 2e 20 20 28 4f 6e 6c 79 20  d query.  (Only 
177d0 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 55 4e  generated for UN
177e0 49 4f 4e 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  ION and.**      
177f0 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c         UNION ALL
17800 2e 20 20 45 58 43 45 50 54 20 61 6e 64 20 49 4e  .  EXCEPT and IN
17810 53 45 52 54 53 45 43 54 20 6e 65 76 65 72 20 6f  SERTSECT never o
17820 75 74 70 75 74 20 61 20 72 6f 77 20 74 68 61 74  utput a row that
17830 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
17840 61 70 70 65 61 72 73 20 6f 6e 6c 79 20 69 6e 20  appears only in 
17850 42 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20 41 6c 74  B.).**.**    Alt
17860 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65  B:    Called whe
17870 6e 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20  n there is data 
17880 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74  from both corout
17890 69 6e 65 73 20 61 6e 64 20 41 3c 42 2e 0a 2a 2a  ines and A<B..**
178a0 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20 20 20 20  .**    AeqB:    
178b0 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72  Called when ther
178c0 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62  e is data from b
178d0 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61  oth coroutines a
178e0 6e 64 20 41 3d 3d 42 2e 0a 2a 2a 0a 2a 2a 20 20  nd A==B..**.**  
178f0 20 20 41 67 74 42 3a 20 20 20 20 43 61 6c 6c 65    AgtB:    Calle
17900 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  d when there is 
17910 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63  data from both c
17920 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3e  oroutines and A>
17930 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 41  B..**.**    EofA
17940 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e  :    Called when
17950 20 64 61 74 61 20 69 73 20 65 78 68 61 75 73 74   data is exhaust
17960 65 64 20 66 72 6f 6d 20 73 65 6c 65 63 74 41 2e  ed from selectA.
17970 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20  .**.**    EofB: 
17980 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 64     Called when d
17990 61 74 61 20 69 73 20 65 78 68 61 75 73 74 65 64  ata is exhausted
179a0 20 66 72 6f 6d 20 73 65 6c 65 63 74 42 2e 0a 2a   from selectB..*
179b0 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65  *.** The impleme
179c0 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c  ntation of the l
179d0 61 74 74 65 72 20 66 69 76 65 20 73 75 62 72 6f  atter five subro
179e0 75 74 69 6e 65 73 20 64 65 70 65 6e 64 20 6f 6e  utines depend on
179f0 20 77 68 69 63 68 20 0a 2a 2a 20 3c 6f 70 65 72   which .** <oper
17a00 61 74 6f 72 3e 20 69 73 20 75 73 65 64 3a 0a 2a  ator> is used:.*
17a10 2a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  *.**.**         
17a20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 20 20 20      UNION ALL   
17a30 20 20 20 20 20 20 55 4e 49 4f 4e 20 20 20 20 20        UNION     
17a40 20 20 20 20 20 20 20 45 58 43 45 50 54 20 20 20         EXCEPT   
17a50 20 20 20 20 20 20 20 49 4e 54 45 52 53 45 43 54         INTERSECT
17a60 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2d 2d 2d  .**          ---
17a70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d  ----------  ----
17a80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d  -------------  -
17a90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d  -------------  -
17aa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17ab0 0a 2a 2a 20 20 20 41 6c 74 42 3a 20 20 20 6f 75  .**   AltB:   ou
17ac0 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 6f  tA, nextA      o
17ad0 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
17ae0 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
17af0 20 20 20 20 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a       nextA.**.**
17b00 20 20 20 41 65 71 42 3a 20 20 20 6f 75 74 41 2c     AeqB:   outA,
17b10 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 6e   nextA         n
17b20 65 78 74 41 20 20 20 20 20 20 20 20 20 20 20 20  extA            
17b30 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 6f   nextA         o
17b40 75 74 41 2c 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a  utA, nextA.**.**
17b50 20 20 20 41 67 74 42 3a 20 20 20 6f 75 74 42 2c     AgtB:   outB,
17b60 20 6e 65 78 74 42 20 20 20 20 20 20 6f 75 74 42   nextB      outB
17b70 2c 20 6e 65 78 74 42 20 20 20 20 20 20 20 20 20  , nextB         
17b80 20 6e 65 78 74 42 20 20 20 20 20 20 20 20 20 20   nextB          
17b90 20 20 6e 65 78 74 42 0a 2a 2a 0a 2a 2a 20 20 20    nextB.**.**   
17ba0 45 6f 66 41 3a 20 20 20 6f 75 74 42 2c 20 6e 65  EofA:   outB, ne
17bb0 78 74 42 20 20 20 20 20 20 6f 75 74 42 2c 20 6e  xtB      outB, n
17bc0 65 78 74 42 20 20 20 20 20 20 20 20 20 20 68 61  extB          ha
17bd0 6c 74 20 20 20 20 20 20 20 20 20 20 20 20 20 68  lt             h
17be0 61 6c 74 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 42  alt.**.**   EofB
17bf0 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20  :   outA, nextA 
17c00 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41       outA, nextA
17c10 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78         outA, nex
17c20 74 41 20 20 20 20 20 20 20 20 20 68 61 6c 74 0a  tA         halt.
17c30 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 41 6c 74  **.** In the Alt
17c40 42 2c 20 41 65 71 42 2c 20 61 6e 64 20 41 67 74  B, AeqB, and Agt
17c50 42 20 73 75 62 72 6f 75 74 69 6e 65 73 2c 20 61  B subroutines, a
17c60 6e 20 45 4f 46 20 6f 6e 20 41 20 66 6f 6c 6c 6f  n EOF on A follo
17c70 77 69 6e 67 20 6e 65 78 74 41 0a 2a 2a 20 63 61  wing nextA.** ca
17c80 75 73 65 73 20 61 6e 20 69 6d 6d 65 64 69 61 74  uses an immediat
17c90 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66 41 20 61  e jump to EofA a
17ca0 6e 64 20 61 6e 20 45 4f 46 20 6f 6e 20 42 20 66  nd an EOF on B f
17cb0 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 42 20 63  ollowing nextB c
17cc0 61 75 73 65 73 0a 2a 2a 20 61 6e 20 69 6d 6d 65  auses.** an imme
17cd0 64 69 61 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f  diate jump to Eo
17ce0 66 42 2e 20 20 57 69 74 68 69 6e 20 45 6f 66 41  fB.  Within EofA
17cf0 20 61 6e 64 20 45 6f 66 42 2c 20 61 6e 64 20 45   and EofB, and E
17d00 4f 46 20 6f 6e 20 65 6e 74 72 79 20 6f 72 0a 2a  OF on entry or.*
17d10 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74  * following next
17d20 58 20 63 61 75 73 65 73 20 61 20 6a 75 6d 70 20  X causes a jump 
17d30 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
17d40 65 20 73 65 6c 65 63 74 20 70 72 6f 63 65 73 73  e select process
17d50 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 44 75 70 6c 69  ing..**.** Dupli
17d60 63 61 74 65 20 72 65 6d 6f 76 61 6c 20 69 6e 20  cate removal in 
17d70 74 68 65 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50  the UNION, EXCEP
17d80 54 2c 20 61 6e 64 20 49 4e 54 45 52 53 45 43 54  T, and INTERSECT
17d90 20 63 61 73 65 73 20 69 73 20 68 61 6e 64 6c 65   cases is handle
17da0 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20  d.** within the 
17db0 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e  output subroutin
17dc0 65 2e 20 20 54 68 65 20 72 65 67 50 72 65 76 20  e.  The regPrev 
17dd0 72 65 67 69 73 74 65 72 20 73 65 74 20 68 6f 6c  register set hol
17de0 64 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c  ds the previousl
17df0 79 0a 2a 2a 20 6f 75 74 70 75 74 20 76 61 6c 75  y.** output valu
17e00 65 2e 20 20 41 20 63 6f 6d 70 61 72 69 73 6f 6e  e.  A comparison
17e10 20 69 73 20 6d 61 64 65 20 61 67 61 69 6e 73 74   is made against
17e20 20 74 68 69 73 20 76 61 6c 75 65 20 61 6e 64 20   this value and 
17e30 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 69 73  the output.** is
17e40 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 65 20   skipped if the 
17e50 6e 65 78 74 20 72 65 73 75 6c 74 73 20 77 6f 75  next results wou
17e60 6c 64 20 62 65 20 74 68 65 20 73 61 6d 65 20 61  ld be the same a
17e70 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 2e 0a  s the previous..
17e80 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d  **.** The implem
17e90 65 6e 74 61 74 69 6f 6e 20 70 6c 61 6e 20 69 73  entation plan is
17ea0 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
17eb0 65 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73  e two coroutines
17ec0 20 61 6e 64 20 73 65 76 65 6e 0a 2a 2a 20 73 75   and seven.** su
17ed0 62 72 6f 75 74 69 6e 65 73 20 66 69 72 73 74 2c  broutines first,
17ee0 20 74 68 65 6e 20 70 75 74 20 74 68 65 20 63 6f   then put the co
17ef0 6e 74 72 6f 6c 20 6c 6f 67 69 63 20 61 74 20 74  ntrol logic at t
17f00 68 65 20 62 6f 74 74 6f 6d 2e 20 20 4c 69 6b 65  he bottom.  Like
17f10 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
17f20 20 20 20 20 20 20 67 6f 74 6f 20 49 6e 69 74 0a        goto Init.
17f30 2a 2a 20 20 20 20 20 63 6f 41 3a 20 63 6f 72 6f  **     coA: coro
17f40 75 74 69 6e 65 20 66 6f 72 20 6c 65 66 74 20 71  utine for left q
17f50 75 65 72 79 20 28 41 29 0a 2a 2a 20 20 20 20 20  uery (A).**     
17f60 63 6f 42 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66  coB: coroutine f
17f70 6f 72 20 72 69 67 68 74 20 71 75 65 72 79 20 28  or right query (
17f80 42 29 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20 6f  B).**    outA: o
17f90 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66  utput one row of
17fa0 20 41 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20 6f   A.**    outB: o
17fb0 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66  utput one row of
17fc0 20 42 20 28 55 4e 49 4f 4e 20 61 6e 64 20 55 4e   B (UNION and UN
17fd0 49 4f 4e 20 41 4c 4c 20 6f 6e 6c 79 29 0a 2a 2a  ION ALL only).**
17fe0 20 20 20 20 45 6f 66 41 3a 20 2e 2e 2e 0a 2a 2a      EofA: ....**
17ff0 20 20 20 20 45 6f 66 42 3a 20 2e 2e 2e 0a 2a 2a      EofB: ....**
18000 20 20 20 20 41 6c 74 42 3a 20 2e 2e 2e 0a 2a 2a      AltB: ....**
18010 20 20 20 20 41 65 71 42 3a 20 2e 2e 2e 0a 2a 2a      AeqB: ....**
18020 20 20 20 20 41 67 74 42 3a 20 2e 2e 2e 0a 2a 2a      AgtB: ....**
18030 20 20 20 20 49 6e 69 74 3a 20 69 6e 69 74 69 61      Init: initia
18040 6c 69 7a 65 20 63 6f 72 6f 75 74 69 6e 65 20 72  lize coroutine r
18050 65 67 69 73 74 65 72 73 0a 2a 2a 20 20 20 20 20  egisters.**     
18060 20 20 20 20 20 79 69 65 6c 64 20 63 6f 41 0a 2a       yield coA.*
18070 2a 20 20 20 20 20 20 20 20 20 20 69 66 20 65 6f  *          if eo
18080 66 28 41 29 20 67 6f 74 6f 20 45 6f 66 41 0a 2a  f(A) goto EofA.*
18090 2a 20 20 20 20 20 20 20 20 20 20 79 69 65 6c 64  *          yield
180a0 20 63 6f 42 0a 2a 2a 20 20 20 20 20 20 20 20 20   coB.**         
180b0 20 69 66 20 65 6f 66 28 42 29 20 67 6f 74 6f 20   if eof(B) goto 
180c0 45 6f 66 42 0a 2a 2a 20 20 20 20 43 6d 70 72 3a  EofB.**    Cmpr:
180d0 20 43 6f 6d 70 61 72 65 20 41 2c 20 42 0a 2a 2a   Compare A, B.**
180e0 20 20 20 20 20 20 20 20 20 20 4a 75 6d 70 20 41            Jump A
180f0 6c 74 42 2c 20 41 65 71 42 2c 20 41 67 74 42 0a  ltB, AeqB, AgtB.
18100 2a 2a 20 20 20 20 20 45 6e 64 3a 20 2e 2e 2e 0a  **     End: ....
18110 2a 2a 0a 2a 2a 20 57 65 20 63 61 6c 6c 20 41 6c  **.** We call Al
18120 74 42 2c 20 41 65 71 42 2c 20 41 67 74 42 2c 20  tB, AeqB, AgtB, 
18130 45 6f 66 41 2c 20 61 6e 64 20 45 6f 66 42 20 22  EofA, and EofB "
18140 73 75 62 72 6f 75 74 69 6e 65 73 22 20 62 75 74  subroutines" but
18150 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a 2a 2a   they are not.**
18160 20 61 63 74 75 61 6c 6c 79 20 63 61 6c 6c 65 64   actually called
18170 20 75 73 69 6e 67 20 47 6f 73 75 62 20 61 6e 64   using Gosub and
18180 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 52 65 74   they do not Ret
18190 75 72 6e 2e 20 20 45 6f 66 41 20 61 6e 64 20 45  urn.  EofA and E
181a0 6f 66 42 20 6c 6f 6f 70 0a 2a 2a 20 75 6e 74 69  ofB loop.** unti
181b0 6c 20 61 6c 6c 20 64 61 74 61 20 69 73 20 65 78  l all data is ex
181c0 68 61 75 73 74 65 64 20 74 68 65 6e 20 6a 75 6d  hausted then jum
181d0 70 20 74 6f 20 74 68 65 20 22 65 6e 64 22 20 6c  p to the "end" l
181e0 61 62 65 2e 20 20 41 6c 74 42 2c 20 41 65 71 42  abe.  AltB, AeqB
181f0 2c 0a 2a 2a 20 61 6e 64 20 41 67 74 42 20 6a 75  ,.** and AgtB ju
18200 6d 70 20 74 6f 20 65 69 74 68 65 72 20 4c 32 20  mp to either L2 
18210 6f 72 20 74 6f 20 6f 6e 65 20 6f 66 20 45 6f 66  or to one of Eof
18220 41 20 6f 72 20 45 6f 66 42 2e 0a 2a 2f 0a 23 69  A or EofB..*/.#i
18230 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
18240 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
18250 54 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c  T.static int mul
18260 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28  tiSelectOrderBy(
18270 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
18280 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
18290 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
182a0 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
182b0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
182c0 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45  ght-most of SELE
182d0 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20  CTs to be coded 
182e0 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
182f0 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68  *pDest     /* Wh
18300 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75  at to do with qu
18310 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29  ery results */.)
18320 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20  {.  int i, j;   
18330 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
18340 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
18350 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20  Select *pPrior; 
18360 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72        /* Another
18370 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69 61 74   SELECT immediat
18380 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66 74 20  ely to our left 
18390 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
183a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65             /* Ge
183b0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74  nerate code to t
183c0 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 53 65  his VDBE */.  Se
183d0 6c 65 63 74 44 65 73 74 20 64 65 73 74 41 3b 20  lectDest destA; 
183e0 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69      /* Destinati
183f0 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65  on for coroutine
18400 20 41 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65   A */.  SelectDe
18410 73 74 20 64 65 73 74 42 3b 20 20 20 20 20 2f 2a  st destB;     /*
18420 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72   Destination for
18430 20 63 6f 72 6f 75 74 69 6e 65 20 42 20 2a 2f 0a   coroutine B */.
18440 20 20 69 6e 74 20 72 65 67 41 64 64 72 41 3b 20    int regAddrA; 
18450 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
18460 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ss register for 
18470 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74 69  select-A corouti
18480 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41  ne */.  int regA
18490 64 64 72 42 3b 20 20 20 20 20 20 20 20 20 2f 2a  ddrB;         /*
184a0 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65   Address registe
184b0 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 42 20 63  r for select-B c
184c0 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  oroutine */.  in
184d0 74 20 61 64 64 72 53 65 6c 65 63 74 41 3b 20 20  t addrSelectA;  
184e0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
184f0 66 20 74 68 65 20 73 65 6c 65 63 74 2d 41 20 63  f the select-A c
18500 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  oroutine */.  in
18510 74 20 61 64 64 72 53 65 6c 65 63 74 42 3b 20 20  t addrSelectB;  
18520 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
18530 66 20 74 68 65 20 73 65 6c 65 63 74 2d 42 20 63  f the select-B c
18540 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  oroutine */.  in
18550 74 20 72 65 67 4f 75 74 41 3b 20 20 20 20 20 20  t regOutA;      
18560 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72      /* Address r
18570 65 67 69 73 74 65 72 20 66 6f 72 20 74 68 65 20  egister for the 
18580 6f 75 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74  output-A subrout
18590 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ine */.  int reg
185a0 4f 75 74 42 3b 20 20 20 20 20 20 20 20 20 20 2f  OutB;          /
185b0 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74  * Address regist
185c0 65 72 20 66 6f 72 20 74 68 65 20 6f 75 74 70 75  er for the outpu
185d0 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  t-B subroutine *
185e0 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f 75 74 41  /.  int addrOutA
185f0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
18600 72 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74 70  ress of the outp
18610 75 74 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 20  ut-A subroutine 
18620 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f 75 74  */.  int addrOut
18630 42 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 41 64  B = 0;     /* Ad
18640 64 72 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74  dress of the out
18650 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  put-B subroutine
18660 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f   */.  int addrEo
18670 66 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  fA;         /* A
18680 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65  ddress of the se
18690 6c 65 63 74 2d 41 2d 65 78 68 61 75 73 74 65 64  lect-A-exhausted
186a0 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
186b0 20 69 6e 74 20 61 64 64 72 45 6f 66 41 5f 6e 6f   int addrEofA_no
186c0 42 3b 20 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e  B;     /* Altern
186d0 61 74 65 20 61 64 64 72 45 6f 66 41 20 69 66 20  ate addrEofA if 
186e0 42 20 69 73 20 75 6e 69 6e 69 74 69 61 6c 69 7a  B is uninitializ
186f0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ed */.  int addr
18700 45 6f 66 42 3b 20 20 20 20 20 20 20 20 20 2f 2a  EofB;         /*
18710 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
18720 73 65 6c 65 63 74 2d 42 2d 65 78 68 61 75 73 74  select-B-exhaust
18730 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  ed subroutine */
18740 0a 20 20 69 6e 74 20 61 64 64 72 41 6c 74 42 3b  .  int addrAltB;
18750 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
18760 65 73 73 20 6f 66 20 74 68 65 20 41 3c 42 20 73  ess of the A<B s
18770 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
18780 6e 74 20 61 64 64 72 41 65 71 42 3b 20 20 20 20  nt addrAeqB;    
18790 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
187a0 6f 66 20 74 68 65 20 41 3d 3d 42 20 73 75 62 72  of the A==B subr
187b0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
187c0 61 64 64 72 41 67 74 42 3b 20 20 20 20 20 20 20  addrAgtB;       
187d0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
187e0 74 68 65 20 41 3e 42 20 73 75 62 72 6f 75 74 69  the A>B subrouti
187f0 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c  ne */.  int regL
18800 69 6d 69 74 41 3b 20 20 20 20 20 20 20 20 2f 2a  imitA;        /*
18810 20 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72 20   Limit register 
18820 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a  for select-A */.
18830 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 42 3b    int regLimitB;
18840 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74          /* Limit
18850 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65   register for se
18860 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20  lect-A */.  int 
18870 72 65 67 50 72 65 76 3b 20 20 20 20 20 20 20 20  regPrev;        
18880 20 20 2f 2a 20 41 20 72 61 6e 67 65 20 6f 66 20    /* A range of 
18890 72 65 67 69 73 74 65 72 73 20 74 6f 20 68 6f 6c  registers to hol
188a0 64 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75  d previous outpu
188b0 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64  t */.  int saved
188c0 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a 20  Limit;       /* 
188d0 53 61 76 65 64 20 76 61 6c 75 65 20 6f 66 20 70  Saved value of p
188e0 2d 3e 69 4c 69 6d 69 74 20 2a 2f 0a 20 20 69 6e  ->iLimit */.  in
188f0 74 20 73 61 76 65 64 4f 66 66 73 65 74 3b 20 20  t savedOffset;  
18900 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c      /* Saved val
18910 75 65 20 6f 66 20 70 2d 3e 69 4f 66 66 73 65 74  ue of p->iOffset
18920 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 43   */.  int labelC
18930 6d 70 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c  mpr;        /* L
18940 61 62 65 6c 20 66 6f 72 20 74 68 65 20 73 74 61  abel for the sta
18950 72 74 20 6f 66 20 74 68 65 20 6d 65 72 67 65 20  rt of the merge 
18960 61 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a 20 20 69  algorithm */.  i
18970 6e 74 20 6c 61 62 65 6c 45 6e 64 3b 20 20 20 20  nt labelEnd;    
18980 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f       /* Label fo
18990 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  r the end of the
189a0 20 6f 76 65 72 61 6c 6c 20 53 45 4c 45 43 54 20   overall SELECT 
189b0 73 74 6d 74 20 2a 2f 0a 20 20 69 6e 74 20 6a 31  stmt */.  int j1
189c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
189d0 2f 2a 20 4a 75 6d 70 20 69 6e 73 74 72 75 63 74  /* Jump instruct
189e0 69 6f 6e 73 20 74 68 61 74 20 67 65 74 20 72 65  ions that get re
189f0 74 61 72 67 65 74 74 65 64 20 2a 2f 0a 20 20 69  targetted */.  i
18a00 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20  nt op;          
18a10 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54       /* One of T
18a20 4b 5f 41 4c 4c 2c 20 54 4b 5f 55 4e 49 4f 4e 2c  K_ALL, TK_UNION,
18a30 20 54 4b 5f 45 58 43 45 50 54 2c 20 54 4b 5f 49   TK_EXCEPT, TK_I
18a40 4e 54 45 52 53 45 43 54 20 2a 2f 0a 20 20 4b 65  NTERSECT */.  Ke
18a50 79 49 6e 66 6f 20 2a 70 4b 65 79 44 75 70 20 3d  yInfo *pKeyDup =
18a60 20 30 3b 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f   0; /* Compariso
18a70 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  n information fo
18a80 72 20 64 75 70 6c 69 63 61 74 65 20 72 65 6d 6f  r duplicate remo
18a90 76 61 6c 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f  val */.  KeyInfo
18aa0 20 2a 70 4b 65 79 4d 65 72 67 65 3b 20 20 20 2f   *pKeyMerge;   /
18ab0 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66  * Comparison inf
18ac0 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 6d 65 72  ormation for mer
18ad0 67 69 6e 67 20 72 6f 77 73 20 2a 2f 0a 20 20 73  ging rows */.  s
18ae0 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
18af0 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
18b00 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
18b10 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
18b20 72 42 79 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52  rBy;   /* The OR
18b30 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
18b40 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b  .  int nOrderBy;
18b50 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
18b60 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 74  er of terms in t
18b70 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
18b80 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 50 65  se */.  int *aPe
18b90 72 6d 75 74 65 3b 20 20 20 20 20 20 20 20 2f 2a  rmute;        /*
18ba0 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 4f 52   Mapping from OR
18bb0 44 45 52 20 42 59 20 74 65 72 6d 73 20 74 6f 20  DER BY terms to 
18bc0 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6c 75 6d  result set colum
18bd0 6e 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  ns */.#ifndef SQ
18be0 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
18bf0 4e 0a 20 20 69 6e 74 20 69 53 75 62 31 3b 20 20  N.  int iSub1;  
18c00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50            /* EQP
18c10 20 69 64 20 6f 66 20 6c 65 66 74 2d 68 61 6e 64   id of left-hand
18c20 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20   query */.  int 
18c30 69 53 75 62 32 3b 20 20 20 20 20 20 20 20 20 20  iSub2;          
18c40 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 72    /* EQP id of r
18c50 69 67 68 74 2d 68 61 6e 64 20 71 75 65 72 79 20  ight-hand query 
18c60 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  */.#endif..  ass
18c70 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
18c80 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
18c90 20 70 4b 65 79 44 75 70 3d 3d 30 20 29 3b 20 2f   pKeyDup==0 ); /
18ca0 2a 20 22 4d 61 6e 61 67 65 64 22 20 63 6f 64 65  * "Managed" code
18cb0 20 6e 65 65 64 73 20 74 68 69 73 2e 20 20 54 69   needs this.  Ti
18cc0 63 6b 65 74 20 23 33 33 38 32 2e 20 2a 2f 0a 20  cket #3382. */. 
18cd0 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
18ce0 3b 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  v = pParse->
18cf0 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28  pVdbe;.  assert(
18d00 20 76 21 3d 30 20 29 3b 20 20 20 20 20 20 20 2f   v!=0 );       /
18d10 2a 20 41 6c 72 65 61 64 79 20 74 68 72 6f 77 6e  * Already thrown
18d20 20 74 68 65 20 65 72 72 6f 72 20 69 66 20 56 44   the error if VD
18d30 42 45 20 61 6c 6c 6f 63 20 66 61 69 6c 65 64 20  BE alloc failed 
18d40 2a 2f 0a 20 20 6c 61 62 65 6c 45 6e 64 20 3d 20  */.  labelEnd = 
18d50 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
18d60 61 62 65 6c 28 76 29 3b 0a 20 20 6c 61 62 65 6c  abel(v);.  label
18d70 43 6d 70 72 20 3d 20 73 71 6c 69 74 65 33 56 64  Cmpr = sqlite3Vd
18d80 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
18d90 0a 0a 20 20 2f 2a 20 50 61 74 63 68 20 75 70 20  ..  /* Patch up 
18da0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
18db0 75 73 65 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20  use.  */.  op = 
18dc0 70 2d 3e 6f 70 3b 20 20 0a 20 20 70 50 72 69 6f  p->op;  .  pPrio
18dd0 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  r = p->pPrior;. 
18de0 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d   assert( pPrior-
18df0 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a  >pOrderBy==0 );.
18e00 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e    pOrderBy = p->
18e10 70 4f 72 64 65 72 42 79 3b 0a 20 20 61 73 73 65  pOrderBy;.  asse
18e20 72 74 28 20 70 4f 72 64 65 72 42 79 20 29 3b 0a  rt( pOrderBy );.
18e30 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f 72    nOrderBy = pOr
18e40 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 0a 20  derBy->nExpr;.. 
18e50 20 2f 2a 20 46 6f 72 20 6f 70 65 72 61 74 6f 72   /* For operator
18e60 73 20 6f 74 68 65 72 20 74 68 61 6e 20 55 4e 49  s other than UNI
18e70 4f 4e 20 41 4c 4c 20 77 65 20 68 61 76 65 20 74  ON ALL we have t
18e80 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
18e90 0a 20 20 2a 2a 20 74 68 65 20 4f 52 44 45 52 20  .  ** the ORDER 
18ea0 42 59 20 63 6c 61 75 73 65 20 63 6f 76 65 72 73  BY clause covers
18eb0 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66 20 74   every term of t
18ec0 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20  he result set.  
18ed0 41 64 64 0a 20 20 2a 2a 20 74 65 72 6d 73 20 74  Add.  ** terms t
18ee0 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  o the ORDER BY c
18ef0 6c 61 75 73 65 20 61 73 20 6e 65 63 65 73 73 61  lause as necessa
18f00 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f  ry..  */.  if( o
18f10 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20  p!=TK_ALL ){.   
18f20 20 66 6f 72 28 69 3d 31 3b 20 64 62 2d 3e 6d 61   for(i=1; db->ma
18f30 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 26 26  llocFailed==0 &&
18f40 20 69 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e   i<=p->pEList->n
18f50 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
18f60 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
18f70 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
18f80 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49       for(j=0, pI
18f90 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b  tem=pOrderBy->a;
18fa0 20 6a 3c 6e 4f 72 64 65 72 42 79 3b 20 6a 2b 2b   j<nOrderBy; j++
18fb0 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
18fc0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
18fd0 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  m->u.x.iOrderByC
18fe0 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  ol>0 );.        
18ff0 69 66 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69  if( pItem->u.x.i
19000 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 69 20 29 20  OrderByCol==i ) 
19010 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
19020 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 4f 72 64       if( j==nOrd
19030 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
19040 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c  Expr *pNew = sql
19050 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f  ite3Expr(db, TK_
19060 49 4e 54 45 47 45 52 2c 20 30 29 3b 0a 20 20 20  INTEGER, 0);.   
19070 20 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30       if( pNew==0
19080 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
19090 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
190a0 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  pNew->flags |= E
190b0 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20  P_IntValue;.    
190c0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c      pNew->u.iVal
190d0 75 65 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  ue = i;.        
190e0 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74  pOrderBy = sqlit
190f0 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
19100 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42  (pParse, pOrderB
19110 79 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  y, pNew);.      
19120 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
19130 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 6e 4f 72   pOrderBy->a[nOr
19140 64 65 72 42 79 2b 2b 5d 2e 75 2e 78 2e 69 4f 72  derBy++].u.x.iOr
19150 64 65 72 42 79 43 6f 6c 20 3d 20 28 75 31 36 29  derByCol = (u16)
19160 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  i;.      }.    }
19170 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  .  }..  /* Compu
19180 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  te the compariso
19190 6e 20 70 65 72 6d 75 74 61 74 69 6f 6e 20 61 6e  n permutation an
191a0 64 20 6b 65 79 69 6e 66 6f 20 74 68 61 74 20 69  d keyinfo that i
191b0 73 20 75 73 65 64 20 77 69 74 68 0a 20 20 2a 2a  s used with.  **
191c0 20 74 68 65 20 70 65 72 6d 75 74 61 74 69 6f 6e   the permutation
191d0 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
191e0 6e 65 20 69 66 20 74 68 65 20 6e 65 78 74 0a 20  ne if the next. 
191f0 20 2a 2a 20 72 6f 77 20 6f 66 20 72 65 73 75 6c   ** row of resul
19200 74 73 20 63 6f 6d 65 73 20 66 72 6f 6d 20 73 65  ts comes from se
19210 6c 65 63 74 41 20 6f 72 20 73 65 6c 65 63 74 42  lectA or selectB
19220 2e 20 20 41 6c 73 6f 20 61 64 64 20 65 78 70 6c  .  Also add expl
19230 69 63 69 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74  icit.  ** collat
19240 69 6f 6e 73 20 74 6f 20 74 68 65 20 4f 52 44 45  ions to the ORDE
19250 52 20 42 59 20 63 6c 61 75 73 65 20 74 65 72 6d  R BY clause term
19260 73 20 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74  s so that when t
19270 68 65 20 73 75 62 71 75 65 72 69 65 73 0a 20 20  he subqueries.  
19280 2a 2a 20 74 6f 20 74 68 65 20 72 69 67 68 74 20  ** to the right 
19290 61 6e 64 20 74 68 65 20 6c 65 66 74 20 61 72 65  and the left are
192a0 20 65 76 61 6c 75 61 74 65 64 2c 20 74 68 65 79   evaluated, they
192b0 20 75 73 65 20 74 68 65 20 63 6f 72 72 65 63 74   use the correct
192c0 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 2e  .  ** collation.
192d0 0a 20 20 2a 2f 0a 20 20 61 50 65 72 6d 75 74 65  .  */.  aPermute
192e0 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
192f0 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66  ocRaw(db, sizeof
19300 28 69 6e 74 29 2a 28 6e 4f 72 64 65 72 42 79 20  (int)*(nOrderBy 
19310 2b 20 31 29 29 3b 0a 20 20 69 66 28 20 61 50 65  + 1));.  if( aPe
19320 72 6d 75 74 65 20 29 7b 0a 20 20 20 20 73 74 72  rmute ){.    str
19330 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
19340 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 61 50  m *pItem;.    aP
19350 65 72 6d 75 74 65 5b 30 5d 20 3d 20 6e 4f 72 64  ermute[0] = nOrd
19360 65 72 42 79 3b 0a 20 20 20 20 66 6f 72 28 69 3d  erBy;.    for(i=
19370 31 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42  1, pItem=pOrderB
19380 79 2d 3e 61 3b 20 69 3c 3d 6e 4f 72 64 65 72 42  y->a; i<=nOrderB
19390 79 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  y; i++, pItem++)
193a0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
193b0 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65  pItem->u.x.iOrde
193c0 72 42 79 43 6f 6c 3e 30 0a 20 20 20 20 20 20 20  rByCol>0.       
193d0 20 20 20 26 26 20 70 49 74 65 6d 2d 3e 75 2e 78     && pItem->u.x
193e0 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3c 3d 70 2d  .iOrderByCol<=p-
193f0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
19400 3b 0a 20 20 20 20 20 20 61 50 65 72 6d 75 74 65  ;.      aPermute
19410 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 75 2e 78  [i] = pItem->u.x
19420 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 2d 20 31  .iOrderByCol - 1
19430 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b 65 79  ;.    }.    pKey
19440 4d 65 72 67 65 20 3d 20 6d 75 6c 74 69 53 65 6c  Merge = multiSel
19450 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e 66  ectOrderByKeyInf
19460 6f 28 70 50 61 72 73 65 2c 20 70 2c 20 31 29 3b  o(pParse, p, 1);
19470 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4b  .  }else{.    pK
19480 65 79 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20 7d  eyMerge = 0;.  }
19490 0a 0a 20 20 2f 2a 20 52 65 61 74 74 61 63 68 20  ..  /* Reattach 
194a0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
194b0 75 73 65 20 74 6f 20 74 68 65 20 71 75 65 72 79  use to the query
194c0 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64  ..  */.  p->pOrd
194d0 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
194e0 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65  .  pPrior->pOrde
194f0 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  rBy = sqlite3Exp
19500 72 4c 69 73 74 44 75 70 28 70 50 61 72 73 65 2d  rListDup(pParse-
19510 3e 64 62 2c 20 70 4f 72 64 65 72 42 79 2c 20 30  >db, pOrderBy, 0
19520 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
19530 65 20 61 20 72 61 6e 67 65 20 6f 66 20 74 65 6d  e a range of tem
19540 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 73  porary registers
19550 20 61 6e 64 20 74 68 65 20 4b 65 79 49 6e 66 6f   and the KeyInfo
19560 20 6e 65 65 64 65 64 0a 20 20 2a 2a 20 66 6f 72   needed.  ** for
19570 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74 20   the logic that 
19580 72 65 6d 6f 76 65 73 20 64 75 70 6c 69 63 61 74  removes duplicat
19590 65 20 72 65 73 75 6c 74 20 72 6f 77 73 20 77 68  e result rows wh
195a0 65 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 70 65 72  en the.  ** oper
195b0 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 2c 20 45  ator is UNION, E
195c0 58 43 45 50 54 2c 20 6f 72 20 49 4e 54 45 52 53  XCEPT, or INTERS
195d0 45 43 54 20 28 62 75 74 20 6e 6f 74 20 55 4e 49  ECT (but not UNI
195e0 4f 4e 20 41 4c 4c 29 2e 0a 20 20 2a 2f 0a 20 20  ON ALL)..  */.  
195f0 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29  if( op==TK_ALL )
19600 7b 0a 20 20 20 20 72 65 67 50 72 65 76 20 3d 20  {.    regPrev = 
19610 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
19620 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 2d 3e 70  int nExpr = p->p
19630 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
19640 20 20 61 73 73 65 72 74 28 20 6e 4f 72 64 65 72    assert( nOrder
19650 42 79 3e 3d 6e 45 78 70 72 20 7c 7c 20 64 62 2d  By>=nExpr || db-
19660 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
19670 0a 20 20 20 20 72 65 67 50 72 65 76 20 3d 20 70  .    regPrev = p
19680 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
19690 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
196a0 2b 3d 20 6e 45 78 70 72 2b 31 3b 0a 20 20 20 20  += nExpr+1;.    
196b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
196c0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
196d0 20 30 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20   0, regPrev);.  
196e0 20 20 70 4b 65 79 44 75 70 20 3d 20 73 71 6c 69    pKeyDup = sqli
196f0 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28  te3KeyInfoAlloc(
19700 64 62 2c 20 6e 45 78 70 72 2c 20 31 29 3b 0a 20  db, nExpr, 1);. 
19710 20 20 20 69 66 28 20 70 4b 65 79 44 75 70 20 29     if( pKeyDup )
19720 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
19730 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73  sqlite3KeyInfoIs
19740 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 44 75  Writeable(pKeyDu
19750 70 29 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  p) );.      for(
19760 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b  i=0; i<nExpr; i+
19770 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4b 65 79  +){.        pKey
19780 44 75 70 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20  Dup->aColl[i] = 
19790 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53  multiSelectCollS
197a0 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29  eq(pParse, p, i)
197b0 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44 75  ;.        pKeyDu
197c0 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  p->aSortOrder[i]
197d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
197e0 20 20 7d 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 53    }.  }. .  /* S
197f0 65 70 61 72 61 74 65 20 74 68 65 20 6c 65 66 74  eparate the left
19800 20 61 6e 64 20 74 68 65 20 72 69 67 68 74 20 71   and the right q
19810 75 65 72 79 20 66 72 6f 6d 20 6f 6e 65 20 61 6e  uery from one an
19820 6f 74 68 65 72 0a 20 20 2a 2f 0a 20 20 70 2d 3e  other.  */.  p->
19830 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70 50  pPrior = 0;.  pP
19840 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 30 3b  rior->pNext = 0;
19850 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  .  sqlite3Resolv
19860 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70 50  eOrderGroupBy(pP
19870 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64  arse, p, p->pOrd
19880 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a  erBy, "ORDER");.
19890 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 50    if( pPrior->pP
198a0 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73  rior==0 ){.    s
198b0 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64  qlite3ResolveOrd
198c0 65 72 47 72 6f 75 70 42 79 28 70 50 61 72 73 65  erGroupBy(pParse
198d0 2c 20 70 50 72 69 6f 72 2c 20 70 50 72 69 6f 72  , pPrior, pPrior
198e0 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52 44  ->pOrderBy, "ORD
198f0 45 52 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ER");.  }..  /* 
19900 43 6f 6d 70 75 74 65 20 74 68 65 20 6c 69 6d 69  Compute the limi
19910 74 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20  t registers */. 
19920 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
19930 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70  isters(pParse, p
19940 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 69  , labelEnd);.  i
19950 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 26 26 20  f( p->iLimit && 
19960 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20  op==TK_ALL ){.  
19970 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 2b 2b    regLimitA = ++
19980 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
19990 20 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 2b 2b    regLimitB = ++
199a0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
199b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
199c0 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20  Op2(v, OP_Copy, 
199d0 70 2d 3e 69 4f 66 66 73 65 74 20 3f 20 70 2d 3e  p->iOffset ? p->
199e0 69 4f 66 66 73 65 74 2b 31 20 3a 20 70 2d 3e 69  iOffset+1 : p->i
199f0 4c 69 6d 69 74 2c 0a 20 20 20 20 20 20 20 20 20  Limit,.         
19a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a10 20 20 20 20 20 20 20 20 20 72 65 67 4c 69 6d 69           regLimi
19a20 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  tA);.    sqlite3
19a30 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
19a40 5f 43 6f 70 79 2c 20 72 65 67 4c 69 6d 69 74 41  _Copy, regLimitA
19a50 2c 20 72 65 67 4c 69 6d 69 74 42 29 3b 0a 20 20  , regLimitB);.  
19a60 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 4c 69  }else{.    regLi
19a70 6d 69 74 41 20 3d 20 72 65 67 4c 69 6d 69 74 42  mitA = regLimitB
19a80 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 0;.  }.  sqli
19a90 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
19aa0 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20  , p->pLimit);.  
19ab0 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  p->pLimit = 0;. 
19ac0 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
19ad0 74 65 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65  te(db, p->pOffse
19ae0 74 29 3b 0a 20 20 70 2d 3e 70 4f 66 66 73 65 74  t);.  p->pOffset
19af0 20 3d 20 30 3b 0a 0a 20 20 72 65 67 41 64 64 72   = 0;..  regAddr
19b00 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  A = ++pParse->nM
19b10 65 6d 3b 0a 20 20 72 65 67 41 64 64 72 42 20 3d  em;.  regAddrB =
19b20 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
19b30 0a 20 20 72 65 67 4f 75 74 41 20 3d 20 2b 2b 70  .  regOutA = ++p
19b40 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72  Parse->nMem;.  r
19b50 65 67 4f 75 74 42 20 3d 20 2b 2b 70 50 61 72 73  egOutB = ++pPars
19b60 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74  e->nMem;.  sqlit
19b70 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
19b80 28 26 64 65 73 74 41 2c 20 53 52 54 5f 43 6f 72  (&destA, SRT_Cor
19b90 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 41  outine, regAddrA
19ba0 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
19bb0 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
19bc0 42 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  B, SRT_Coroutine
19bd0 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 0a 20 20  , regAddrB);..  
19be0 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 63 6f  /* Generate a co
19bf0 72 6f 75 74 69 6e 65 20 74 6f 20 65 76 61 6c 75  routine to evalu
19c00 61 74 65 20 74 68 65 20 53 45 4c 45 43 54 20 73  ate the SELECT s
19c10 74 61 74 65 6d 65 6e 74 20 74 6f 20 74 68 65 0a  tatement to the.
19c20 20 20 2a 2a 20 6c 65 66 74 20 6f 66 20 74 68 65    ** left of the
19c30 20 63 6f 6d 70 6f 75 6e 64 20 6f 70 65 72 61 74   compound operat
19c40 6f 72 20 2d 20 74 68 65 20 22 41 22 20 73 65 6c  or - the "A" sel
19c50 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 61 64 64 72  ect..  */.  addr
19c60 53 65 6c 65 63 74 41 20 3d 20 73 71 6c 69 74 65  SelectA = sqlite
19c70 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
19c80 28 76 29 20 2b 20 31 3b 0a 20 20 6a 31 20 3d 20  (v) + 1;.  j1 = 
19c90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19ca0 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f  3(v, OP_InitCoro
19cb0 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 41 2c  utine, regAddrA,
19cc0 20 30 2c 20 61 64 64 72 53 65 6c 65 63 74 41 29   0, addrSelectA)
19cd0 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28  ;.  VdbeComment(
19ce0 28 76 2c 20 22 6c 65 66 74 20 53 45 4c 45 43 54  (v, "left SELECT
19cf0 22 29 29 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 69  "));.  pPrior->i
19d00 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69 74  Limit = regLimit
19d10 41 3b 0a 20 20 65 78 70 6c 61 69 6e 53 65 74 49  A;.  explainSetI
19d20 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70 50  nteger(iSub1, pP
19d30 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
19d40 74 49 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  tId);.  sqlite3S
19d50 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50  elect(pParse, pP
19d60 72 69 6f 72 2c 20 26 64 65 73 74 41 29 3b 0a 20  rior, &destA);. 
19d70 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19d80 70 31 28 76 2c 20 4f 50 5f 45 6e 64 43 6f 72 6f  p1(v, OP_EndCoro
19d90 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 41 29  utine, regAddrA)
19da0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a  ;.  sqlite3VdbeJ
19db0 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a  umpHere(v, j1);.
19dc0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
19dd0 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76   coroutine to ev
19de0 61 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45 43  aluate the SELEC
19df0 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 0a  T statement on .
19e00 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 2d    ** the right -
19e10 20 74 68 65 20 22 42 22 20 73 65 6c 65 63 74 0a   the "B" select.
19e20 20 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65 63    */.  addrSelec
19e30 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  tB = sqlite3Vdbe
19e40 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b  CurrentAddr(v) +
19e50 20 31 3b 0a 20 20 6a 31 20 3d 20 73 71 6c 69 74   1;.  j1 = sqlit
19e60 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
19e70 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65  OP_InitCoroutine
19e80 2c 20 72 65 67 41 64 64 72 42 2c 20 30 2c 20 61  , regAddrB, 0, a
19e90 64 64 72 53 65 6c 65 63 74 42 29 3b 0a 20 20 56  ddrSelectB);.  V
19ea0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
19eb0 72 69 67 68 74 20 53 45 4c 45 43 54 22 29 29 3b  right SELECT"));
19ec0 0a 20 20 73 61 76 65 64 4c 69 6d 69 74 20 3d 20  .  savedLimit = 
19ed0 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 73 61 76  p->iLimit;.  sav
19ee0 65 64 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f  edOffset = p->iO
19ef0 66 66 73 65 74 3b 0a 20 20 70 2d 3e 69 4c 69 6d  ffset;.  p->iLim
19f00 69 74 20 3d 20 72 65 67 4c 69 6d 69 74 42 3b 0a  it = regLimitB;.
19f10 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30    p->iOffset = 0
19f20 3b 20 20 0a 20 20 65 78 70 6c 61 69 6e 53 65 74  ;  .  explainSet
19f30 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20 70  Integer(iSub2, p
19f40 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
19f50 63 74 49 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  ctId);.  sqlite3
19f60 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
19f70 2c 20 26 64 65 73 74 42 29 3b 0a 20 20 70 2d 3e  , &destB);.  p->
19f80 69 4c 69 6d 69 74 20 3d 20 73 61 76 65 64 4c 69  iLimit = savedLi
19f90 6d 69 74 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65  mit;.  p->iOffse
19fa0 74 20 3d 20 73 61 76 65 64 4f 66 66 73 65 74 3b  t = savedOffset;
19fb0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
19fc0 64 4f 70 31 28 76 2c 20 4f 50 5f 45 6e 64 43 6f  dOp1(v, OP_EndCo
19fd0 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72  routine, regAddr
19fe0 42 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  B);..  /* Genera
19ff0 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
1a000 74 68 61 74 20 6f 75 74 70 75 74 73 20 74 68 65  that outputs the
1a010 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20   current row of 
1a020 74 68 65 20 41 0a 20 20 2a 2a 20 73 65 6c 65 63  the A.  ** selec
1a030 74 20 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75  t as the next ou
1a040 74 70 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20  tput row of the 
1a050 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e  compound select.
1a060 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70  .  */.  VdbeNoop
1a070 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74  Comment((v, "Out
1a080 70 75 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  put routine for 
1a090 41 22 29 29 3b 0a 20 20 61 64 64 72 4f 75 74 41  A"));.  addrOutA
1a0a0 20 3d 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75   = generateOutpu
1a0b0 74 53 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72  tSubroutine(pPar
1a0c0 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  se,.            
1a0d0 20 20 20 20 20 70 2c 20 26 64 65 73 74 41 2c 20       p, &destA, 
1a0e0 70 44 65 73 74 2c 20 72 65 67 4f 75 74 41 2c 0a  pDest, regOutA,.
1a0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a100 20 72 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75   regPrev, pKeyDu
1a110 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20  p, labelEnd);.  
1a120 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
1a130 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
1a140 20 6f 75 74 70 75 74 73 20 74 68 65 20 63 75 72   outputs the cur
1a150 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20  rent row of the 
1a160 42 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73  B.  ** select as
1a170 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74   the next output
1a180 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70   row of the comp
1a190 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a  ound select..  *
1a1a0 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41  /.  if( op==TK_A
1a1b0 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49  LL || op==TK_UNI
1a1c0 4f 4e 20 29 7b 0a 20 20 20 20 56 64 62 65 4e 6f  ON ){.    VdbeNo
1a1d0 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f  opComment((v, "O
1a1e0 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20 66 6f  utput routine fo
1a1f0 72 20 42 22 29 29 3b 0a 20 20 20 20 61 64 64 72  r B"));.    addr
1a200 4f 75 74 42 20 3d 20 67 65 6e 65 72 61 74 65 4f  OutB = generateO
1a210 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28  utputSubroutine(
1a220 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
1a230 20 20 20 20 20 20 20 20 20 70 2c 20 26 64 65 73           p, &des
1a240 74 42 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75  tB, pDest, regOu
1a250 74 42 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  tB,.            
1a260 20 20 20 20 20 72 65 67 50 72 65 76 2c 20 70 4b       regPrev, pK
1a270 65 79 44 75 70 2c 20 6c 61 62 65 6c 45 6e 64 29  eyDup, labelEnd)
1a280 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4b  ;.  }.  sqlite3K
1a290 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79  eyInfoUnref(pKey
1a2a0 44 75 70 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  Dup);..  /* Gene
1a2b0 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e  rate a subroutin
1a2c0 65 20 74 6f 20 72 75 6e 20 77 68 65 6e 20 74 68  e to run when th
1a2d0 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 73  e results from s
1a2e0 65 6c 65 63 74 20 41 0a 20 20 2a 2a 20 61 72 65  elect A.  ** are
1a2f0 20 65 78 68 61 75 73 74 65 64 20 61 6e 64 20 6f   exhausted and o
1a300 6e 6c 79 20 64 61 74 61 20 69 6e 20 73 65 6c 65  nly data in sele
1a310 63 74 20 42 20 72 65 6d 61 69 6e 73 2e 0a 20 20  ct B remains..  
1a320 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  */.  if( op==TK_
1a330 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b  EXCEPT || op==TK
1a340 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20  _INTERSECT ){.  
1a350 20 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 20 3d    addrEofA_noB =
1a360 20 61 64 64 72 45 6f 66 41 20 3d 20 6c 61 62 65   addrEofA = labe
1a370 6c 45 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 20 20  lEnd;.  }else{  
1a380 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  .    VdbeNoopCom
1a390 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 41 20  ment((v, "eof-A 
1a3a0 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20  subroutine"));. 
1a3b0 20 20 20 61 64 64 72 45 6f 66 41 20 3d 20 73 71     addrEofA = sq
1a3c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1a3d0 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
1a3e0 4f 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b  OutB, addrOutB);
1a3f0 0a 20 20 20 20 61 64 64 72 45 6f 66 41 5f 6e 6f  .    addrEofA_no
1a400 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  B = sqlite3VdbeA
1a410 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp2(v, OP_Yiel
1a420 64 2c 20 72 65 67 41 64 64 72 42 2c 20 6c 61 62  d, regAddrB, lab
1a430 65 6c 45 6e 64 29 3b 0a 20 20 20 20 20 20 20 20  elEnd);.        
1a440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a450 20 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62               Vdb
1a460 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1a470 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1a480 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
1a490 30 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20 20  0, addrEofA);.  
1a4a0 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
1a4b0 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65  += pPrior->nSele
1a4c0 63 74 52 6f 77 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ctRow;.  }..  /*
1a4d0 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
1a4e0 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 77 68  outine to run wh
1a4f0 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 66  en the results f
1a500 72 6f 6d 20 73 65 6c 65 63 74 20 42 0a 20 20 2a  rom select B.  *
1a510 2a 20 61 72 65 20 65 78 68 61 75 73 74 65 64 20  * are exhausted 
1a520 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e  and only data in
1a530 20 73 65 6c 65 63 74 20 41 20 72 65 6d 61 69 6e   select A remain
1a540 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70  s..  */.  if( op
1a550 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29  ==TK_INTERSECT )
1a560 7b 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20 3d  {.    addrEofB =
1a570 20 61 64 64 72 45 6f 66 41 3b 0a 20 20 20 20 69   addrEofA;.    i
1a580 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  f( p->nSelectRow
1a590 20 3e 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65   > pPrior->nSele
1a5a0 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65  ctRow ) p->nSele
1a5b0 63 74 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e  ctRow = pPrior->
1a5c0 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 7d 65  nSelectRow;.  }e
1a5d0 6c 73 65 7b 20 20 0a 20 20 20 20 56 64 62 65 4e  lse{  .    VdbeN
1a5e0 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
1a5f0 65 6f 66 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  eof-B subroutine
1a600 22 29 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66  "));.    addrEof
1a610 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  B = sqlite3VdbeA
1a620 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
1a630 62 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72  b, regOutA, addr
1a640 4f 75 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74  OutA);.    sqlit
1a650 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1a660 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
1a670 72 41 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 20 56  rA, labelEnd); V
1a680 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1a690 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1a6a0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
1a6b0 2c 20 30 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a  , 0, addrEofB);.
1a6c0 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
1a6d0 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c  te code to handl
1a6e0 65 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3c  e the case of A<
1a6f0 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f  B.  */.  VdbeNoo
1a700 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d  pComment((v, "A-
1a710 6c 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22  lt-B subroutine"
1a720 29 29 3b 0a 20 20 61 64 64 72 41 6c 74 42 20 3d  ));.  addrAltB =
1a730 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a740 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
1a750 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74  regOutA, addrOut
1a760 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  A);.  sqlite3Vdb
1a770 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69  eAddOp2(v, OP_Yi
1a780 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20 61  eld, regAddrA, a
1a790 64 64 72 45 6f 66 41 29 3b 20 56 64 62 65 43 6f  ddrEofA); VdbeCo
1a7a0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c  verage(v);.  sql
1a7b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1a7c0 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61  , OP_Goto, 0, la
1a7d0 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20  belCmpr);..  /* 
1a7e0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
1a7f0 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65   handle the case
1a800 20 6f 66 20 41 3d 3d 42 0a 20 20 2a 2f 0a 20 20   of A==B.  */.  
1a810 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29  if( op==TK_ALL )
1a820 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42 20 3d  {.    addrAeqB =
1a830 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 7d 65 6c   addrAltB;.  }el
1a840 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e  se if( op==TK_IN
1a850 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61  TERSECT ){.    a
1a860 64 64 72 41 65 71 42 20 3d 20 61 64 64 72 41 6c  ddrAeqB = addrAl
1a870 74 42 3b 0a 20 20 20 20 61 64 64 72 41 6c 74 42  tB;.    addrAltB
1a880 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ++;.  }else{.   
1a890 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
1a8a0 28 28 76 2c 20 22 41 2d 65 71 2d 42 20 73 75 62  ((v, "A-eq-B sub
1a8b0 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20  routine"));.    
1a8c0 61 64 64 72 41 65 71 42 20 3d 0a 20 20 20 20 73  addrAeqB =.    s
1a8d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1a8e0 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
1a8f0 67 41 64 64 72 41 2c 20 61 64 64 72 45 6f 66 41  gAddrA, addrEofA
1a900 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
1a910 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
1a920 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1a930 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d  Goto, 0, labelCm
1a940 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47  pr);.  }..  /* G
1a950 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
1a960 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20  handle the case 
1a970 6f 66 20 41 3e 42 0a 20 20 2a 2f 0a 20 20 56 64  of A>B.  */.  Vd
1a980 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
1a990 2c 20 22 41 2d 67 74 2d 42 20 73 75 62 72 6f 75  , "A-gt-B subrou
1a9a0 74 69 6e 65 22 29 29 3b 0a 20 20 61 64 64 72 41  tine"));.  addrA
1a9b0 67 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62  gtB = sqlite3Vdb
1a9c0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
1a9d0 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c  .  if( op==TK_AL
1a9e0 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  L || op==TK_UNIO
1a9f0 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  N ){.    sqlite3
1aa00 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1aa10 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 42 2c  _Gosub, regOutB,
1aa20 20 61 64 64 72 4f 75 74 42 29 3b 0a 20 20 7d 0a   addrOutB);.  }.
1aa30 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1aa40 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op2(v, OP_Yield,
1aa50 20 72 65 67 41 64 64 72 42 2c 20 61 64 64 72 45   regAddrB, addrE
1aa60 6f 66 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61  ofB); VdbeCovera
1aa70 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33  ge(v);.  sqlite3
1aa80 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1aa90 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43  _Goto, 0, labelC
1aaa0 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  mpr);..  /* This
1aab0 20 63 6f 64 65 20 72 75 6e 73 20 6f 6e 63 65 20   code runs once 
1aac0 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 65 76  to initialize ev
1aad0 65 72 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20  erything..  */. 
1aae0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
1aaf0 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 73  Here(v, j1);.  s
1ab00 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1ab10 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
1ab20 67 41 64 64 72 41 2c 20 61 64 64 72 45 6f 66 41  gAddrA, addrEofA
1ab30 5f 6e 6f 42 29 3b 20 56 64 62 65 43 6f 76 65 72  _noB); VdbeCover
1ab40 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65  age(v);.  sqlite
1ab50 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1ab60 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72  P_Yield, regAddr
1ab70 42 2c 20 61 64 64 72 45 6f 66 42 29 3b 20 56 64  B, addrEofB); Vd
1ab80 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a  beCoverage(v);..
1ab90 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 74    /* Implement t
1aba0 68 65 20 6d 61 69 6e 20 6d 65 72 67 65 20 6c 6f  he main merge lo
1abb0 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  op.  */.  sqlite
1abc0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1abd0 6c 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b  l(v, labelCmpr);
1abe0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
1abf0 64 4f 70 34 28 76 2c 20 4f 50 5f 50 65 72 6d 75  dOp4(v, OP_Permu
1ac00 74 61 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 2c  tation, 0, 0, 0,
1ac10 20 28 63 68 61 72 2a 29 61 50 65 72 6d 75 74 65   (char*)aPermute
1ac20 2c 20 50 34 5f 49 4e 54 41 52 52 41 59 29 3b 0a  , P4_INTARRAY);.
1ac30 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1ac40 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72  Op4(v, OP_Compar
1ac50 65 2c 20 64 65 73 74 41 2e 69 53 64 73 74 2c 20  e, destA.iSdst, 
1ac60 64 65 73 74 42 2e 69 53 64 73 74 2c 20 6e 4f 72  destB.iSdst, nOr
1ac70 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20 20  derBy,.         
1ac80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac90 28 63 68 61 72 2a 29 70 4b 65 79 4d 65 72 67 65  (char*)pKeyMerge
1aca0 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
1acb0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
1acc0 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 50  geP5(v, OPFLAG_P
1acd0 45 52 4d 55 54 45 29 3b 0a 20 20 73 71 6c 69 74  ERMUTE);.  sqlit
1ace0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
1acf0 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 41 6c 74  OP_Jump, addrAlt
1ad00 42 2c 20 61 64 64 72 41 65 71 42 2c 20 61 64 64  B, addrAeqB, add
1ad10 72 41 67 74 42 29 3b 20 56 64 62 65 43 6f 76 65  rAgtB); VdbeCove
1ad20 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 4a  rage(v);..  /* J
1ad30 75 6d 70 20 74 6f 20 74 68 65 20 74 68 69 73 20  ump to the this 
1ad40 70 6f 69 6e 74 20 69 6e 20 6f 72 64 65 72 20 74  point in order t
1ad50 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  o terminate the 
1ad60 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 73 71  query..  */.  sq
1ad70 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
1ad80 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 45 6e  Label(v, labelEn
1ad90 64 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68  d);..  /* Set th
1ada0 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70  e number of outp
1adb0 75 74 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a  ut columns.  */.
1adc0 20 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65    if( pDest->eDe
1add0 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
1ade0 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46  {.    Select *pF
1adf0 69 72 73 74 20 3d 20 70 50 72 69 6f 72 3b 0a 20  irst = pPrior;. 
1ae00 20 20 20 77 68 69 6c 65 28 20 70 46 69 72 73 74     while( pFirst
1ae10 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72 73  ->pPrior ) pFirs
1ae20 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69  t = pFirst->pPri
1ae30 6f 72 3b 0a 20 20 20 20 67 65 6e 65 72 61 74 65  or;.    generate
1ae40 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
1ae50 73 65 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e 70  se, 0, pFirst->p
1ae60 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f  EList);.  }..  /
1ae70 2a 20 52 65 61 73 73 65 6d 62 6c 79 20 74 68 65  * Reassembly the
1ae80 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20   compound query 
1ae90 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20  so that it will 
1aea0 62 65 20 66 72 65 65 64 20 63 6f 72 72 65 63 74  be freed correct
1aeb0 6c 79 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 63  ly.  ** by the c
1aec0 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
1aed0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  */.  if( p->pPri
1aee0 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  or ){.    sqlite
1aef0 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
1af00 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20  , p->pPrior);.  
1af10 7d 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20  }.  p->pPrior = 
1af20 70 50 72 69 6f 72 3b 0a 20 20 70 50 72 69 6f 72  pPrior;.  pPrior
1af30 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 0a 20 20  ->pNext = p;..  
1af40 2f 2a 2a 2a 20 54 42 44 3a 20 20 49 6e 73 65 72  /*** TBD:  Inser
1af50 74 20 73 75 62 72 6f 75 74 69 6e 65 20 63 61 6c  t subroutine cal
1af60 6c 73 20 74 6f 20 63 6c 6f 73 65 20 63 75 72 73  ls to close curs
1af70 6f 72 73 20 6f 6e 20 69 6e 63 6f 6d 70 6c 65 74  ors on incomplet
1af80 65 0a 20 20 2a 2a 2a 2a 20 73 75 62 71 75 65 72  e.  **** subquer
1af90 69 65 73 20 2a 2a 2a 2a 2f 0a 20 20 65 78 70 6c  ies ****/.  expl
1afa0 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 70 50 61  ainComposite(pPa
1afb0 72 73 65 2c 20 70 2d 3e 6f 70 2c 20 69 53 75 62  rse, p->op, iSub
1afc0 31 2c 20 69 53 75 62 32 2c 20 30 29 3b 0a 20 20  1, iSub2, 0);.  
1afd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1afe0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  ;.}.#endif..#if 
1aff0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1b000 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
1b010 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
1b020 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 20  E_OMIT_VIEW)./* 
1b030 46 6f 72 77 61 72 64 20 44 65 63 6c 61 72 61 74  Forward Declarat
1b040 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20 76  ions */.static v
1b050 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c 69 73  oid substExprLis
1b060 74 28 73 71 6c 69 74 65 33 2a 2c 20 45 78 70 72  t(sqlite3*, Expr
1b070 4c 69 73 74 2a 2c 20 69 6e 74 2c 20 45 78 70 72  List*, int, Expr
1b080 4c 69 73 74 2a 29 3b 0a 73 74 61 74 69 63 20 76  List*);.static v
1b090 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63 74 28  oid substSelect(
1b0a0 73 71 6c 69 74 65 33 2a 2c 20 53 65 6c 65 63 74  sqlite3*, Select
1b0b0 20 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69 73   *, int, ExprLis
1b0c0 74 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63 61  t *);../*.** Sca
1b0d0 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 65 78  n through the ex
1b0e0 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20  pression pExpr. 
1b0f0 20 52 65 70 6c 61 63 65 20 65 76 65 72 79 20 72   Replace every r
1b100 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61  eference to.** a
1b110 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65   column in table
1b120 20 6e 75 6d 62 65 72 20 69 54 61 62 6c 65 20 77   number iTable w
1b130 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ith a copy of th
1b140 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20  e iColumn-th.** 
1b150 65 6e 74 72 79 20 69 6e 20 70 45 4c 69 73 74 2e  entry in pEList.
1b160 20 20 28 42 75 74 20 6c 65 61 76 65 20 72 65 66    (But leave ref
1b170 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 52  erences to the R
1b180 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20  OWID column .** 
1b190 75 6e 63 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a  unchanged.).**.*
1b1a0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
1b1b0 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 6c  s part of the fl
1b1c0 61 74 74 65 6e 69 6e 67 20 70 72 6f 63 65 64 75  attening procedu
1b1d0 72 65 2e 20 20 41 20 73 75 62 71 75 65 72 79 0a  re.  A subquery.
1b1e0 2a 2a 20 77 68 6f 73 65 20 72 65 73 75 6c 74 20  ** whose result 
1b1f0 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62  set is defined b
1b200 79 20 70 45 4c 69 73 74 20 61 70 70 65 61 72 73  y pEList appears
1b210 20 61 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65   as entry in the
1b220 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  .** FROM clause 
1b230 6f 66 20 61 20 53 45 4c 45 43 54 20 73 75 63 68  of a SELECT such
1b240 20 74 68 61 74 20 74 68 65 20 56 44 42 45 20 63   that the VDBE c
1b250 75 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74  ursor assigned t
1b260 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63  o that.** FORM c
1b270 6c 61 75 73 65 20 65 6e 74 72 79 20 69 73 20 69  lause entry is i
1b280 54 61 62 6c 65 2e 20 20 54 68 69 73 20 72 6f 75  Table.  This rou
1b290 74 69 6e 65 20 6d 61 6b 65 20 74 68 65 20 6e 65  tine make the ne
1b2a0 63 65 73 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e  cessary .** chan
1b2b0 67 65 73 20 74 6f 20 70 45 78 70 72 20 73 6f 20  ges to pExpr so 
1b2c0 74 68 61 74 20 69 74 20 72 65 66 65 72 73 20 64  that it refers d
1b2d0 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 73  irectly to the s
1b2e0 6f 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f  ource table.** o
1b2f0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 72  f the subquery r
1b300 61 74 68 65 72 20 74 68 65 20 72 65 73 75 6c 74  ather the result
1b310 20 73 65 74 20 6f 66 20 74 68 65 20 73 75 62 71   set of the subq
1b320 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uery..*/.static 
1b330 45 78 70 72 20 2a 73 75 62 73 74 45 78 70 72 28  Expr *substExpr(
1b340 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
1b350 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74         /* Report
1b360 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 74   malloc errors t
1b370 6f 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  o this connectio
1b380 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  n */.  Expr *pEx
1b390 70 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 45 78  pr,        /* Ex
1b3a0 70 72 20 69 6e 20 77 68 69 63 68 20 73 75 62 73  pr in which subs
1b3b0 74 69 74 75 74 69 6f 6e 20 6f 63 63 75 72 73 20  titution occurs 
1b3c0 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
1b3d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
1b3e0 65 20 74 6f 20 62 65 20 73 75 62 73 74 69 74 75  e to be substitu
1b3f0 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ted */.  ExprLis
1b400 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20  t *pEList    /* 
1b410 53 75 62 73 74 69 74 75 74 65 20 65 78 70 72 65  Substitute expre
1b420 73 73 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69  ssions */.){.  i
1b430 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65  f( pExpr==0 ) re
1b440 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45  turn 0;.  if( pE
1b450 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
1b460 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61  MN && pExpr->iTa
1b470 62 6c 65 3d 3d 69 54 61 62 6c 65 20 29 7b 0a 20  ble==iTable ){. 
1b480 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43     if( pExpr->iC
1b490 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20  olumn<0 ){.     
1b4a0 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
1b4b0 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  NULL;.    }else{
1b4c0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65  .      Expr *pNe
1b4d0 77 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  w;.      assert(
1b4e0 20 70 45 4c 69 73 74 21 3d 30 20 26 26 20 70 45   pEList!=0 && pE
1b4f0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 45 4c  xpr->iColumn<pEL
1b500 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20  ist->nExpr );.  
1b510 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
1b520 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70  r->pLeft==0 && p
1b530 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20  Expr->pRight==0 
1b540 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  );.      pNew = 
1b550 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
1b560 62 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78  b, pEList->a[pEx
1b570 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78  pr->iColumn].pEx
1b580 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  pr, 0);.      sq
1b590 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
1b5a0 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  db, pExpr);.    
1b5b0 20 20 70 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a    pExpr = pNew;.
1b5c0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1b5d0 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20     pExpr->pLeft 
1b5e0 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20  = substExpr(db, 
1b5f0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69 54  pExpr->pLeft, iT
1b600 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
1b610 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74     pExpr->pRight
1b620 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c   = substExpr(db,
1b630 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
1b640 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
1b650 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73  .    if( ExprHas
1b660 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1b670 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
1b680 0a 20 20 20 20 20 20 73 75 62 73 74 53 65 6c 65  .      substSele
1b690 63 74 28 64 62 2c 20 70 45 78 70 72 2d 3e 78 2e  ct(db, pExpr->x.
1b6a0 70 53 65 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c  pSelect, iTable,
1b6b0 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 65   pEList);.    }e
1b6c0 6c 73 65 7b 0a 20 20 20 20 20 20 73 75 62 73 74  lse{.      subst
1b6d0 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 45 78  ExprList(db, pEx
1b6e0 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 54 61  pr->x.pList, iTa
1b6f0 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
1b700 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1b710 20 70 45 78 70 72 3b 0a 7d 0a 73 74 61 74 69 63   pExpr;.}.static
1b720 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c   void substExprL
1b730 69 73 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ist(.  sqlite3 *
1b740 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52  db,         /* R
1b750 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72  eport malloc err
1b760 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 45 78  ors here */.  Ex
1b770 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
1b780 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 73 63     /* List to sc
1b790 61 6e 20 61 6e 64 20 69 6e 20 77 68 69 63 68 20  an and in which 
1b7a0 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75  to make substitu
1b7b0 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  tes */.  int iTa
1b7c0 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ble,          /*
1b7d0 20 54 61 62 6c 65 20 74 6f 20 62 65 20 73 75 62   Table to be sub
1b7e0 73 74 69 74 75 74 65 64 20 2a 2f 0a 20 20 45 78  stituted */.  Ex
1b7f0 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20  prList *pEList  
1b800 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65     /* Substitute
1b810 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20   values */.){.  
1b820 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
1b830 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
1b840 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
1b850 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
1b860 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  .    pList->a[i]
1b870 2e 70 45 78 70 72 20 3d 20 73 75 62 73 74 45 78  .pExpr = substEx
1b880 70 72 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b  pr(db, pList->a[
1b890 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c 65  i].pExpr, iTable
1b8a0 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d  , pEList);.  }.}
1b8b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62  .static void sub
1b8c0 73 74 53 65 6c 65 63 74 28 0a 20 20 73 71 6c 69  stSelect(.  sqli
1b8d0 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
1b8e0 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f   /* Report mallo
1b8f0 63 20 65 72 72 6f 72 73 20 68 65 72 65 20 2a 2f  c errors here */
1b900 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
1b910 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43          /* SELEC
1b920 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 77  T statement in w
1b930 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62  hich to make sub
1b940 73 74 69 74 75 74 69 6f 6e 73 20 2a 2f 0a 20 20  stitutions */.  
1b950 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
1b960 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
1b970 20 62 65 20 72 65 70 6c 61 63 65 64 20 2a 2f 0a   be replaced */.
1b980 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
1b990 73 74 20 20 20 20 20 2f 2a 20 53 75 62 73 74 69  st     /* Substi
1b9a0 74 75 74 65 20 76 61 6c 75 65 73 20 2a 2f 0a 29  tute values */.)
1b9b0 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  {.  SrcList *pSr
1b9c0 63 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  c;.  struct SrcL
1b9d0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
1b9e0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
1b9f0 21 70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  !p ) return;.  s
1ba00 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c  ubstExprList(db,
1ba10 20 70 2d 3e 70 45 4c 69 73 74 2c 20 69 54 61 62   p->pEList, iTab
1ba20 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73  le, pEList);.  s
1ba30 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c  ubstExprList(db,
1ba40 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 54   p->pGroupBy, iT
1ba50 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
1ba60 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64   substExprList(d
1ba70 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  b, p->pOrderBy, 
1ba80 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
1ba90 0a 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20  .  p->pHaving = 
1baa0 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 2d  substExpr(db, p-
1bab0 3e 70 48 61 76 69 6e 67 2c 20 69 54 61 62 6c 65  >pHaving, iTable
1bac0 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 70 2d 3e  , pEList);.  p->
1bad0 70 57 68 65 72 65 20 3d 20 73 75 62 73 74 45 78  pWhere = substEx
1bae0 70 72 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65  pr(db, p->pWhere
1baf0 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
1bb00 29 3b 0a 20 20 73 75 62 73 74 53 65 6c 65 63 74  );.  substSelect
1bb10 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20  (db, p->pPrior, 
1bb20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
1bb30 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  .  pSrc = p->pSr
1bb40 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72  c;.  assert( pSr
1bb50 63 20 29 3b 20 20 2f 2a 20 45 76 65 6e 20 66 6f  c );  /* Even fo
1bb60 72 20 28 53 45 4c 45 43 54 20 31 29 20 77 65 20  r (SELECT 1) we 
1bb70 68 61 76 65 3a 20 70 53 72 63 21 3d 30 20 62 75  have: pSrc!=0 bu
1bb80 74 20 70 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20  t pSrc->nSrc==0 
1bb90 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  */.  if( ALWAYS(
1bba0 70 53 72 63 29 20 29 7b 0a 20 20 20 20 66 6f 72  pSrc) ){.    for
1bbb0 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2c 20 70  (i=pSrc->nSrc, p
1bbc0 49 74 65 6d 3d 70 53 72 63 2d 3e 61 3b 20 69 3e  Item=pSrc->a; i>
1bbd0 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29  0; i--, pItem++)
1bbe0 7b 0a 20 20 20 20 20 20 73 75 62 73 74 53 65 6c  {.      substSel
1bbf0 65 63 74 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70  ect(db, pItem->p
1bc00 53 65 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c 20  Select, iTable, 
1bc10 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20  pEList);.    }. 
1bc20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21   }.}.#endif /* !
1bc30 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1bc40 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
1bc50 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1bc60 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a  _OMIT_VIEW) */..
1bc70 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
1bc80 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
1bc90 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
1bca0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
1bcb0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1bcc0 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ine attempts to 
1bcd0 66 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72 69  flatten subqueri
1bce0 65 73 20 61 73 20 61 20 70 65 72 66 6f 72 6d 61  es as a performa
1bcf0 6e 63 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  nce optimization
1bd00 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
1bd10 65 20 72 65 74 75 72 6e 73 20 31 20 69 66 20 69  e returns 1 if i
1bd20 74 20 6d 61 6b 65 73 20 63 68 61 6e 67 65 73 20  t makes changes 
1bd30 61 6e 64 20 30 20 69 66 20 6e 6f 20 66 6c 61 74  and 0 if no flat
1bd40 74 65 6e 69 6e 67 20 6f 63 63 75 72 73 2e 0a 2a  tening occurs..*
1bd50 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74 61  *.** To understa
1bd60 6e 64 20 74 68 65 20 63 6f 6e 63 65 70 74 20 6f  nd the concept o
1bd70 66 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f  f flattening, co
1bd80 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f  nsider the follo
1bd90 77 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a  wing.** query:.*
1bda0 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
1bdb0 61 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78  a FROM (SELECT x
1bdc0 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20  +y AS a FROM t1 
1bdd0 57 48 45 52 45 20 7a 3c 31 30 30 29 20 57 48 45  WHERE z<100) WHE
1bde0 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65  RE a>5.**.** The
1bdf0 20 64 65 66 61 75 6c 74 20 77 61 79 20 6f 66 20   default way of 
1be00 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69  implementing thi
1be10 73 20 71 75 65 72 79 20 69 73 20 74 6f 20 65 78  s query is to ex
1be20 65 63 75 74 65 20 74 68 65 0a 2a 2a 20 73 75 62  ecute the.** sub
1be30 71 75 65 72 79 20 66 69 72 73 74 20 61 6e 64 20  query first and 
1be40 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
1be50 73 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  s in a temporary
1be60 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20   table, then.** 
1be70 72 75 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75  run the outer qu
1be80 65 72 79 20 6f 6e 20 74 68 61 74 20 74 65 6d 70  ery on that temp
1be90 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 20 54 68  orary table.  Th
1bea0 69 73 20 72 65 71 75 69 72 65 73 20 74 77 6f 0a  is requires two.
1beb0 2a 2a 20 70 61 73 73 65 73 20 6f 76 65 72 20 74  ** passes over t
1bec0 68 65 20 64 61 74 61 2e 20 20 46 75 72 74 68 65  he data.  Furthe
1bed0 72 6d 6f 72 65 2c 20 62 65 63 61 75 73 65 20 74  rmore, because t
1bee0 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
1bef0 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64  le.** has no ind
1bf00 69 63 65 73 2c 20 74 68 65 20 57 48 45 52 45 20  ices, the WHERE 
1bf10 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 6f 75  clause on the ou
1bf20 74 65 72 20 71 75 65 72 79 20 63 61 6e 6e 6f 74  ter query cannot
1bf30 20 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64   be.** optimized
1bf40 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1bf50 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f  tine attempts to
1bf60 20 72 65 77 72 69 74 65 20 71 75 65 72 69 65 73   rewrite queries
1bf70 20 73 75 63 68 20 61 73 20 74 68 65 20 61 62 6f   such as the abo
1bf80 76 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e  ve into.** a sin
1bf90 67 6c 65 20 66 6c 61 74 20 73 65 6c 65 63 74 2c  gle flat select,
1bfa0 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
1bfb0 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b 79  *     SELECT x+y
1bfc0 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48   AS a FROM t1 WH
1bfd0 45 52 45 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e  ERE z<100 AND a>
1bfe0 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65  5.**.** The code
1bff0 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74   generated for t
1c000 68 69 73 20 73 69 6d 70 6c 69 66 69 63 61 74 69  his simplificati
1c010 6f 6e 20 67 69 76 65 73 20 74 68 65 20 73 61 6d  on gives the sam
1c020 65 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20  e result.** but 
1c030 6f 6e 6c 79 20 68 61 73 20 74 6f 20 73 63 61 6e  only has to scan
1c040 20 74 68 65 20 64 61 74 61 20 6f 6e 63 65 2e 20   the data once. 
1c050 20 41 6e 64 20 62 65 63 61 75 73 65 20 69 6e 64   And because ind
1c060 69 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65  ices might .** e
1c070 78 69 73 74 20 6f 6e 20 74 68 65 20 74 61 62 6c  xist on the tabl
1c080 65 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65  e t1, a complete
1c090 20 73 63 61 6e 20 6f 66 20 74 68 65 20 64 61 74   scan of the dat
1c0a0 61 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 76  a might be.** av
1c0b0 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61  oided..**.** Fla
1c0c0 74 74 65 6e 69 6e 67 20 69 73 20 6f 6e 6c 79 20  ttening is only 
1c0d0 61 74 74 65 6d 70 74 65 64 20 69 66 20 61 6c 6c  attempted if all
1c0e0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1c0f0 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a  g are true:.**.*
1c100 2a 20 20 20 28 31 29 20 20 54 68 65 20 73 75 62  *   (1)  The sub
1c110 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75  query and the ou
1c120 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74  ter query do not
1c130 20 62 6f 74 68 20 75 73 65 20 61 67 67 72 65 67   both use aggreg
1c140 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32  ates..**.**   (2
1c150 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
1c160 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67  is not an aggreg
1c170 61 74 65 20 6f 72 20 28 32 61 29 20 74 68 65 20  ate or (2a) the 
1c180 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
1c190 6f 74 20 61 20 6a 6f 69 6e 0a 2a 2a 20 20 20 20  ot a join.**    
1c1a0 20 20 20 20 61 6e 64 20 28 32 62 29 20 74 68 65      and (2b) the
1c1b0 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65   outer query doe
1c1c0 73 20 6e 6f 74 20 75 73 65 20 73 75 62 71 75 65  s not use subque
1c1d0 72 69 65 73 20 6f 74 68 65 72 20 74 68 61 6e 20  ries other than 
1c1e0 74 68 65 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 20  the one.**      
1c1f0 20 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75    FROM-clause su
1c200 62 71 75 65 72 79 20 74 68 61 74 20 69 73 20 61  bquery that is a
1c210 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 66   candidate for f
1c220 6c 61 74 74 65 6e 69 6e 67 2e 20 20 28 32 62 20  lattening.  (2b 
1c230 69 73 0a 2a 2a 20 20 20 20 20 20 20 20 64 75 65  is.**        due
1c240 20 74 6f 20 74 69 63 6b 65 74 20 5b 32 66 37 31   to ticket [2f71
1c250 37 30 64 37 33 62 66 39 61 62 66 38 30 5d 20 66  70d73bf9abf80] f
1c260 72 6f 6d 20 32 30 31 35 2d 30 32 2d 30 39 2e 29  rom 2015-02-09.)
1c270 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 20 54 68  .**.**   (3)  Th
1c280 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f  e subquery is no
1c290 74 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  t the right oper
1c2a0 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f 75  and of a left ou
1c2b0 74 65 72 20 6a 6f 69 6e 0a 2a 2a 20 20 20 20 20  ter join.**     
1c2c0 20 20 20 28 4f 72 69 67 69 6e 61 6c 6c 79 20 74     (Originally t
1c2d0 69 63 6b 65 74 20 23 33 30 36 2e 20 20 53 74 72  icket #306.  Str
1c2e0 65 6e 67 74 68 65 6e 65 64 20 62 79 20 74 69 63  engthened by tic
1c2f0 6b 65 74 20 23 33 33 30 30 29 0a 2a 2a 0a 2a 2a  ket #3300).**.**
1c300 20 20 20 28 34 29 20 20 54 68 65 20 73 75 62 71     (4)  The subq
1c310 75 65 72 79 20 69 73 20 6e 6f 74 20 44 49 53 54  uery is not DIST
1c320 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a  INCT..**.**  (**
1c330 29 20 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20  )  At one point 
1c340 72 65 73 74 72 69 63 74 69 6f 6e 73 20 28 34 29  restrictions (4)
1c350 20 61 6e 64 20 28 35 29 20 64 65 66 69 6e 65 64   and (5) defined
1c360 20 61 20 73 75 62 73 65 74 20 6f 66 20 44 49 53   a subset of DIS
1c370 54 49 4e 43 54 0a 2a 2a 20 20 20 20 20 20 20 20  TINCT.**        
1c380 73 75 62 2d 71 75 65 72 69 65 73 20 74 68 61 74  sub-queries that
1c390 20 77 65 72 65 20 65 78 63 6c 75 64 65 64 20 66   were excluded f
1c3a0 72 6f 6d 20 74 68 69 73 20 6f 70 74 69 6d 69 7a  rom this optimiz
1c3b0 61 74 69 6f 6e 2e 20 52 65 73 74 72 69 63 74 69  ation. Restricti
1c3c0 6f 6e 20 0a 2a 2a 20 20 20 20 20 20 20 20 28 34  on .**        (4
1c3d0 29 20 68 61 73 20 73 69 6e 63 65 20 62 65 65 6e  ) has since been
1c3e0 20 65 78 70 61 6e 64 65 64 20 74 6f 20 65 78 63   expanded to exc
1c3f0 6c 75 64 65 20 61 6c 6c 20 44 49 53 54 49 4e 43  lude all DISTINC
1c400 54 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a  T subqueries..**
1c410 0a 2a 2a 20 20 20 28 36 29 20 20 54 68 65 20 73  .**   (6)  The s
1c420 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
1c430 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73 20   use aggregates 
1c440 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
1c450 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20  ry is not.**    
1c460 20 20 20 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a      DISTINCT..**
1c470 0a 2a 2a 20 20 20 28 37 29 20 20 54 68 65 20 73  .**   (7)  The s
1c480 75 62 71 75 65 72 79 20 68 61 73 20 61 20 46 52  ubquery has a FR
1c490 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 4f 44 4f  OM clause.  TODO
1c4a0 3a 20 20 46 6f 72 20 73 75 62 71 75 65 72 69 65  :  For subquerie
1c4b0 73 20 77 69 74 68 6f 75 74 0a 2a 2a 20 20 20 20  s without.**    
1c4c0 20 20 20 20 41 20 46 52 4f 4d 20 63 6c 61 75 73      A FROM claus
1c4d0 65 2c 20 63 6f 6e 73 69 64 65 72 20 61 64 64 69  e, consider addi
1c4e0 6e 67 20 61 20 46 52 4f 4d 20 63 6c 6f 73 65 20  ng a FROM close 
1c4f0 77 69 74 68 20 74 68 65 20 73 70 65 63 69 61 6c  with the special
1c500 0a 2a 2a 20 20 20 20 20 20 20 20 74 61 62 6c 65  .**        table
1c510 20 73 71 6c 69 74 65 5f 6f 6e 63 65 20 74 68 61   sqlite_once tha
1c520 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20  t consists of a 
1c530 73 69 6e 67 6c 65 20 72 6f 77 20 63 6f 6e 74 61  single row conta
1c540 69 6e 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20  ining a.**      
1c550 20 20 73 69 6e 67 6c 65 20 4e 55 4c 4c 2e 0a 2a    single NULL..*
1c560 2a 0a 2a 2a 20 20 20 28 38 29 20 20 54 68 65 20  *.**   (8)  The 
1c570 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
1c580 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74  t use LIMIT or t
1c590 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
1c5a0 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a  s not a join..**
1c5b0 0a 2a 2a 20 20 20 28 39 29 20 20 54 68 65 20 73  .**   (9)  The s
1c5c0 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
1c5d0 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68   use LIMIT or th
1c5e0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
1c5f0 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20  es not use.**   
1c600 20 20 20 20 20 61 67 67 72 65 67 61 74 65 73 2e       aggregates.
1c610 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 52 65  .**.**  (**)  Re
1c620 73 74 72 69 63 74 69 6f 6e 20 28 31 30 29 20 77  striction (10) w
1c630 61 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  as removed from 
1c640 74 68 65 20 63 6f 64 65 20 6f 6e 20 32 30 30 35  the code on 2005
1c650 2d 30 32 2d 30 35 20 62 75 74 20 77 65 0a 2a 2a  -02-05 but we.**
1c660 20 20 20 20 20 20 20 20 61 63 63 69 64 65 6e 74          accident
1c670 6c 79 20 63 61 72 72 69 65 64 20 74 68 65 20 63  ly carried the c
1c680 6f 6d 6d 65 6e 74 20 66 6f 72 77 61 72 64 20 75  omment forward u
1c690 6e 74 69 6c 20 32 30 31 34 2d 30 39 2d 31 35 2e  ntil 2014-09-15.
1c6a0 20 20 4f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20    Original.**   
1c6b0 20 20 20 20 20 74 65 78 74 3a 20 22 54 68 65 20       text: "The 
1c6c0 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
1c6d0 74 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73  t use aggregates
1c6e0 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
1c6f0 65 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20  ery does not.** 
1c700 20 20 20 20 20 20 20 75 73 65 20 4c 49 4d 49 54         use LIMIT
1c710 2e 22 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20  .".**.**  (11)  
1c720 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  The subquery and
1c730 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1c740 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 68 61 76   do not both hav
1c750 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1c760 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20  es..**.**  (**) 
1c770 20 4e 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64   Not implemented
1c780 2e 20 20 53 75 62 73 75 6d 65 64 20 69 6e 74 6f  .  Subsumed into
1c790 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 33 29   restriction (3)
1c7a0 2e 20 20 57 61 73 20 70 72 65 76 69 6f 75 73 6c  .  Was previousl
1c7b0 79 0a 2a 2a 20 20 20 20 20 20 20 20 61 20 73 65  y.**        a se
1c7c0 70 61 72 61 74 65 20 72 65 73 74 72 69 63 74 69  parate restricti
1c7d0 6f 6e 20 64 65 72 69 76 69 6e 67 20 66 72 6f 6d  on deriving from
1c7e0 20 74 69 63 6b 65 74 20 23 33 35 30 2e 0a 2a 2a   ticket #350..**
1c7f0 0a 2a 2a 20 20 28 31 33 29 20 20 54 68 65 20 73  .**  (13)  The s
1c800 75 62 71 75 65 72 79 20 61 6e 64 20 6f 75 74 65  ubquery and oute
1c810 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62  r query do not b
1c820 6f 74 68 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a  oth use LIMIT..*
1c830 2a 0a 2a 2a 20 20 28 31 34 29 20 20 54 68 65 20  *.**  (14)  The 
1c840 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
1c850 74 20 75 73 65 20 4f 46 46 53 45 54 2e 0a 2a 2a  t use OFFSET..**
1c860 0a 2a 2a 20 20 28 31 35 29 20 20 54 68 65 20 6f  .**  (15)  The o
1c870 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
1c880 74 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70  t part of a comp
1c890 6f 75 6e 64 20 73 65 6c 65 63 74 20 6f 72 20 74  ound select or t
1c8a0 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62  he.**        sub
1c8b0 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 68  query does not h
1c8c0 61 76 65 20 61 20 4c 49 4d 49 54 20 63 6c 61 75  ave a LIMIT clau
1c8d0 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 28 53  se..**        (S
1c8e0 65 65 20 74 69 63 6b 65 74 20 23 32 33 33 39 20  ee ticket #2339 
1c8f0 61 6e 64 20 74 69 63 6b 65 74 20 5b 30 32 61 38  and ticket [02a8
1c900 65 38 31 64 34 34 5d 29 2e 0a 2a 2a 0a 2a 2a 20  e81d44])..**.** 
1c910 20 28 31 36 29 20 20 54 68 65 20 6f 75 74 65 72   (16)  The outer
1c920 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e   query is not an
1c930 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 74 68   aggregate or th
1c940 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 0a  e subquery does.
1c950 2a 2a 20 20 20 20 20 20 20 20 6e 6f 74 20 63 6f  **        not co
1c960 6e 74 61 69 6e 20 4f 52 44 45 52 20 42 59 2e 20  ntain ORDER BY. 
1c970 20 28 54 69 63 6b 65 74 20 23 32 39 34 32 29 20   (Ticket #2942) 
1c980 20 54 68 69 73 20 75 73 65 64 20 74 6f 20 6e 6f   This used to no
1c990 74 20 6d 61 74 74 65 72 0a 2a 2a 20 20 20 20 20  t matter.**     
1c9a0 20 20 20 75 6e 74 69 6c 20 77 65 20 69 6e 74 72     until we intr
1c9b0 6f 64 75 63 65 64 20 74 68 65 20 67 72 6f 75 70  oduced the group
1c9c0 5f 63 6f 6e 63 61 74 28 29 20 66 75 6e 63 74 69  _concat() functi
1c9d0 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20 20 28 31 37  on.  .**.**  (17
1c9e0 29 20 20 54 68 65 20 73 75 62 2d 71 75 65 72 79  )  The sub-query
1c9f0 20 69 73 20 6e 6f 74 20 61 20 63 6f 6d 70 6f 75   is not a compou
1ca00 6e 64 20 73 65 6c 65 63 74 2c 20 6f 72 20 69 74  nd select, or it
1ca10 20 69 73 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20   is a UNION ALL 
1ca20 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f 6d 70 6f  .**        compo
1ca30 75 6e 64 20 63 6c 61 75 73 65 20 6d 61 64 65 20  und clause made 
1ca40 75 70 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 6e  up entirely of n
1ca50 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 71 75 65  on-aggregate que
1ca60 72 69 65 73 2c 20 61 6e 64 20 0a 2a 2a 20 20 20  ries, and .**   
1ca70 20 20 20 20 20 74 68 65 20 70 61 72 65 6e 74 20       the parent 
1ca80 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  query:.**.**    
1ca90 20 20 20 20 20 20 2a 20 69 73 20 6e 6f 74 20 69        * is not i
1caa0 74 73 65 6c 66 20 70 61 72 74 20 6f 66 20 61 20  tself part of a 
1cab0 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c  compound select,
1cac0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69  .**          * i
1cad0 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61  s not an aggrega
1cae0 74 65 20 6f 72 20 44 49 53 54 49 4e 43 54 20 71  te or DISTINCT q
1caf0 75 65 72 79 2c 20 61 6e 64 0a 2a 2a 20 20 20 20  uery, and.**    
1cb00 20 20 20 20 20 20 2a 20 69 73 20 6e 6f 74 20 61        * is not a
1cb10 20 6a 6f 69 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 20   join.**.**     
1cb20 20 20 20 54 68 65 20 70 61 72 65 6e 74 20 61 6e     The parent an
1cb30 64 20 73 75 62 2d 71 75 65 72 79 20 6d 61 79 20  d sub-query may 
1cb40 63 6f 6e 74 61 69 6e 20 57 48 45 52 45 20 63 6c  contain WHERE cl
1cb50 61 75 73 65 73 2e 20 53 75 62 6a 65 63 74 20 74  auses. Subject t
1cb60 6f 0a 2a 2a 20 20 20 20 20 20 20 20 72 75 6c 65  o.**        rule
1cb70 73 20 28 31 31 29 2c 20 28 31 33 29 20 61 6e 64  s (11), (13) and
1cb80 20 28 31 34 29 2c 20 74 68 65 79 20 6d 61 79 20   (14), they may 
1cb90 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 20 4f 52 44  also contain ORD
1cba0 45 52 20 42 59 2c 0a 2a 2a 20 20 20 20 20 20 20  ER BY,.**       
1cbb0 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
1cbc0 54 20 63 6c 61 75 73 65 73 2e 20 20 54 68 65 20  T clauses.  The 
1cbd0 73 75 62 71 75 65 72 79 20 63 61 6e 6e 6f 74 20  subquery cannot 
1cbe0 75 73 65 20 61 6e 79 20 63 6f 6d 70 6f 75 6e 64  use any compound
1cbf0 0a 2a 2a 20 20 20 20 20 20 20 20 6f 70 65 72 61  .**        opera
1cc00 74 6f 72 20 6f 74 68 65 72 20 74 68 61 6e 20 55  tor other than U
1cc10 4e 49 4f 4e 20 41 4c 4c 20 62 65 63 61 75 73 65  NION ALL because
1cc20 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 63   all the other c
1cc30 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20  ompound.**      
1cc40 20 20 6f 70 65 72 61 74 6f 72 73 20 68 61 76 65    operators have
1cc50 20 61 6e 20 69 6d 70 6c 69 65 64 20 44 49 53 54   an implied DIST
1cc60 49 4e 43 54 20 77 68 69 63 68 20 69 73 20 64 69  INCT which is di
1cc70 73 61 6c 6c 6f 77 65 64 20 62 79 0a 2a 2a 20 20  sallowed by.**  
1cc80 20 20 20 20 20 20 72 65 73 74 72 69 63 74 69 6f        restrictio
1cc90 6e 20 28 34 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  n (4)..**.**    
1cca0 20 20 20 20 41 6c 73 6f 2c 20 65 61 63 68 20 63      Also, each c
1ccb0 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20 74 68 65 20  omponent of the 
1ccc0 73 75 62 2d 71 75 65 72 79 20 6d 75 73 74 20 72  sub-query must r
1ccd0 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20 6e  eturn the same n
1cce0 75 6d 62 65 72 0a 2a 2a 20 20 20 20 20 20 20 20  umber.**        
1ccf0 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
1cd00 73 2e 20 54 68 69 73 20 69 73 20 61 63 74 75 61  s. This is actua
1cd10 6c 6c 79 20 61 20 72 65 71 75 69 72 65 6d 65 6e  lly a requiremen
1cd20 74 20 66 6f 72 20 61 6e 79 20 63 6f 6d 70 6f 75  t for any compou
1cd30 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 53 45 4c  nd.**        SEL
1cd40 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 62  ECT statement, b
1cd50 75 74 20 61 6c 6c 20 74 68 65 20 63 6f 64 65 20  ut all the code 
1cd60 68 65 72 65 20 64 6f 65 73 20 69 73 20 6d 61 6b  here does is mak
1cd70 65 20 73 75 72 65 20 74 68 61 74 20 6e 6f 0a 2a  e sure that no.*
1cd80 2a 20 20 20 20 20 20 20 20 73 75 63 68 20 28 69  *        such (i
1cd90 6c 6c 65 67 61 6c 29 20 73 75 62 2d 71 75 65 72  llegal) sub-quer
1cda0 79 20 69 73 20 66 6c 61 74 74 65 6e 65 64 2e 20  y is flattened. 
1cdb0 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  The caller will 
1cdc0 64 65 74 65 63 74 20 74 68 65 0a 2a 2a 20 20 20  detect the.**   
1cdd0 20 20 20 20 20 73 79 6e 74 61 78 20 65 72 72 6f       syntax erro
1cde0 72 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 64  r and return a d
1cdf0 65 74 61 69 6c 65 64 20 6d 65 73 73 61 67 65 2e  etailed message.
1ce00 0a 2a 2a 0a 2a 2a 20 20 28 31 38 29 20 20 49 66  .**.**  (18)  If
1ce10 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69   the sub-query i
1ce20 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  s a compound sel
1ce30 65 63 74 2c 20 74 68 65 6e 20 61 6c 6c 20 74 65  ect, then all te
1ce40 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20  rms of the.**   
1ce50 20 20 20 20 20 4f 52 44 45 52 20 62 79 20 63 6c       ORDER by cl
1ce60 61 75 73 65 20 6f 66 20 74 68 65 20 70 61 72 65  ause of the pare
1ce70 6e 74 20 6d 75 73 74 20 62 65 20 73 69 6d 70 6c  nt must be simpl
1ce80 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  e references to 
1ce90 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f 6c 75 6d  .**        colum
1cea0 6e 73 20 6f 66 20 74 68 65 20 73 75 62 2d 71 75  ns of the sub-qu
1ceb0 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 39 29  ery..**.**  (19)
1cec0 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
1ced0 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49  oes not use LIMI
1cee0 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  T or the outer q
1cef0 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a  uery does not.**
1cf00 20 20 20 20 20 20 20 20 68 61 76 65 20 61 20 57          have a W
1cf10 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  HERE clause..**.
1cf20 2a 2a 20 20 28 32 30 29 20 20 49 66 20 74 68 65  **  (20)  If the
1cf30 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20   sub-query is a 
1cf40 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c  compound select,
1cf50 20 74 68 65 6e 20 69 74 20 6d 75 73 74 20 6e 6f   then it must no
1cf60 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20  t use.**        
1cf70 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
1cf80 73 65 2e 20 20 54 69 63 6b 65 74 20 23 33 37 37  se.  Ticket #377
1cf90 33 2e 20 20 57 65 20 63 6f 75 6c 64 20 72 65 6c  3.  We could rel
1cfa0 61 78 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69  ax this constrai
1cfb0 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 73 6f 6d  nt.**        som
1cfc0 65 77 68 61 74 20 62 79 20 73 61 79 69 6e 67 20  ewhat by saying 
1cfd0 74 68 61 74 20 74 68 65 20 74 65 72 6d 73 20 6f  that the terms o
1cfe0 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
1cff0 6c 61 75 73 65 20 6d 75 73 74 0a 2a 2a 20 20 20  lause must.**   
1d000 20 20 20 20 20 61 70 70 65 61 72 20 61 73 20 75       appear as u
1d010 6e 6d 6f 64 69 66 69 65 64 20 72 65 73 75 6c 74  nmodified result
1d020 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
1d030 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 75  outer query.  Bu
1d040 74 20 77 65 0a 2a 2a 20 20 20 20 20 20 20 20 68  t we.**        h
1d050 61 76 65 20 6f 74 68 65 72 20 6f 70 74 69 6d 69  ave other optimi
1d060 7a 61 74 69 6f 6e 73 20 69 6e 20 6d 69 6e 64 20  zations in mind 
1d070 74 6f 20 64 65 61 6c 20 77 69 74 68 20 74 68 61  to deal with tha
1d080 74 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28  t case..**.**  (
1d090 32 31 29 20 20 54 68 65 20 73 75 62 71 75 65 72  21)  The subquer
1d0a0 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c  y does not use L
1d0b0 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65  IMIT or the oute
1d0c0 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a  r query is not.*
1d0d0 2a 20 20 20 20 20 20 20 20 44 49 53 54 49 4e 43  *        DISTINC
1d0e0 54 2e 20 20 28 53 65 65 20 74 69 63 6b 65 74 20  T.  (See ticket 
1d0f0 5b 37 35 32 65 31 36 34 36 66 63 5d 29 2e 0a 2a  [752e1646fc])..*
1d100 2a 0a 2a 2a 20 20 28 32 32 29 20 20 54 68 65 20  *.**  (22)  The 
1d110 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
1d120 61 20 72 65 63 75 72 73 69 76 65 20 43 54 45 2e  a recursive CTE.
1d130 0a 2a 2a 0a 2a 2a 20 20 28 32 33 29 20 20 54 68  .**.**  (23)  Th
1d140 65 20 70 61 72 65 6e 74 20 69 73 20 6e 6f 74 20  e parent is not 
1d150 61 20 72 65 63 75 72 73 69 76 65 20 43 54 45 2c  a recursive CTE,
1d160 20 6f 72 20 74 68 65 20 73 75 62 2d 71 75 65 72   or the sub-quer
1d170 79 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 20 20  y is not a.**   
1d180 20 20 20 20 20 63 6f 6d 70 6f 75 6e 64 20 71 75       compound qu
1d190 65 72 79 2e 20 54 68 69 73 20 72 65 73 74 72 69  ery. This restri
1d1a0 63 74 69 6f 6e 20 69 73 20 62 65 63 61 75 73 65  ction is because
1d1b0 20 74 72 61 6e 73 66 6f 72 6d 69 6e 67 20 74 68   transforming th
1d1c0 65 0a 2a 2a 20 20 20 20 20 20 20 20 70 61 72 65  e.**        pare
1d1d0 6e 74 20 74 6f 20 61 20 63 6f 6d 70 6f 75 6e 64  nt to a compound
1d1e0 20 71 75 65 72 79 20 63 6f 6e 66 75 73 65 73 20   query confuses 
1d1f0 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 68 61  the code that ha
1d200 6e 64 6c 65 73 0a 2a 2a 20 20 20 20 20 20 20 20  ndles.**        
1d210 72 65 63 75 72 73 69 76 65 20 71 75 65 72 69 65  recursive querie
1d220 73 20 69 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74  s in multiSelect
1d230 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 34 29 20  ()..**.**  (24) 
1d240 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
1d250 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74   not an aggregat
1d260 65 20 74 68 61 74 20 75 73 65 73 20 74 68 65 20  e that uses the 
1d270 62 75 69 6c 74 2d 69 6e 20 6d 69 6e 28 29 20 6f  built-in min() o
1d280 72 20 0a 2a 2a 20 20 20 20 20 20 20 20 6f 72 20  r .**        or 
1d290 6d 61 78 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e  max() functions.
1d2a0 20 20 28 57 69 74 68 6f 75 74 20 74 68 69 73 20    (Without this 
1d2b0 72 65 73 74 72 69 63 74 69 6f 6e 2c 20 61 20 71  restriction, a q
1d2c0 75 65 72 79 20 6c 69 6b 65 3a 0a 2a 2a 20 20 20  uery like:.**   
1d2d0 20 20 20 20 20 22 53 45 4c 45 43 54 20 78 20 46       "SELECT x F
1d2e0 52 4f 4d 20 28 53 45 4c 45 43 54 20 6d 61 78 28  ROM (SELECT max(
1d2f0 79 29 2c 20 78 20 46 52 4f 4d 20 74 31 29 22 20  y), x FROM t1)" 
1d300 77 6f 75 6c 64 20 6e 6f 74 20 6e 65 63 65 73 73  would not necess
1d310 61 72 69 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20  arily.**        
1d320 72 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65  return the value
1d330 20 58 20 66 6f 72 20 77 68 69 63 68 20 59 20 77   X for which Y w
1d340 61 73 20 6d 61 78 69 6d 61 6c 2e 29 0a 2a 2a 0a  as maximal.).**.
1d350 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f  **.** In this ro
1d360 75 74 69 6e 65 2c 20 74 68 65 20 22 70 22 20 70  utine, the "p" p
1d370 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f  arameter is a po
1d380 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6f 75 74  inter to the out
1d390 65 72 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65  er query..** The
1d3a0 20 73 75 62 71 75 65 72 79 20 69 73 20 70 2d 3e   subquery is p->
1d3b0 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20  pSrc->a[iFrom]. 
1d3c0 20 69 73 41 67 67 20 69 73 20 74 72 75 65 20 69   isAgg is true i
1d3d0 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
1d3e0 79 0a 2a 2a 20 75 73 65 73 20 61 67 67 72 65 67  y.** uses aggreg
1d3f0 61 74 65 73 20 61 6e 64 20 73 75 62 71 75 65 72  ates and subquer
1d400 79 49 73 41 67 67 20 69 73 20 74 72 75 65 20 69  yIsAgg is true i
1d410 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 75  f the subquery u
1d420 73 65 73 20 61 67 67 72 65 67 61 74 65 73 2e 0a  ses aggregates..
1d430 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e  **.** If flatten
1d440 69 6e 67 20 69 73 20 6e 6f 74 20 61 74 74 65 6d  ing is not attem
1d450 70 74 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69  pted, this routi
1d460 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 61 6e  ne is a no-op an
1d470 64 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 20  d returns 0..** 
1d480 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73  If flattening is
1d490 20 61 74 74 65 6d 70 74 65 64 20 74 68 69 73 20   attempted this 
1d4a0 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
1d4b0 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20  1..**.** All of 
1d4c0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61  the expression a
1d4d0 6e 61 6c 79 73 69 73 20 6d 75 73 74 20 6f 63 63  nalysis must occ
1d4e0 75 72 20 6f 6e 20 62 6f 74 68 20 74 68 65 20 6f  ur on both the o
1d4f0 75 74 65 72 20 71 75 65 72 79 20 61 6e 64 0a 2a  uter query and.*
1d500 2a 20 74 68 65 20 73 75 62 71 75 65 72 79 20 62  * the subquery b
1d510 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69  efore this routi
1d520 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74  ne runs..*/.stat
1d530 69 63 20 69 6e 74 20 66 6c 61 74 74 65 6e 53 75  ic int flattenSu
1d540 62 71 75 65 72 79 28 0a 20 20 50 61 72 73 65 20  bquery(.  Parse 
1d550 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
1d560 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
1d570 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
1d580 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
1d590 68 65 20 70 61 72 65 6e 74 20 6f 72 20 6f 75 74  he parent or out
1d5a0 65 72 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  er SELECT statem
1d5b0 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72  ent */.  int iFr
1d5c0 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  om,           /*
1d5d0 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e 70 53 72   Index in p->pSr
1d5e0 63 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20 69 6e  c->a[] of the in
1d5f0 6e 65 72 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  ner subquery */.
1d600 20 20 69 6e 74 20 69 73 41 67 67 2c 20 20 20 20    int isAgg,    
1d610 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1d620 66 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20 75  f outer SELECT u
1d630 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66 75  ses aggregate fu
1d640 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  nctions */.  int
1d650 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 20   subqueryIsAgg  
1d660 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
1d670 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20 61   subquery uses a
1d680 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
1d690 6e 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  ns */.){.  const
1d6a0 20 63 68 61 72 20 2a 7a 53 61 76 65 64 41 75 74   char *zSavedAut
1d6b0 68 43 6f 6e 74 65 78 74 20 3d 20 70 50 61 72 73  hContext = pPars
1d6c0 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b  e->zAuthContext;
1d6d0 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 61 72 65  .  Select *pPare
1d6e0 6e 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53  nt;.  Select *pS
1d6f0 75 62 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ub;       /* The
1d700 20 69 6e 6e 65 72 20 71 75 65 72 79 20 6f 72 20   inner query or 
1d710 22 73 75 62 71 75 65 72 79 22 20 2a 2f 0a 20 20  "subquery" */.  
1d720 53 65 6c 65 63 74 20 2a 70 53 75 62 31 3b 20 20  Select *pSub1;  
1d730 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
1d740 6f 20 74 68 65 20 72 69 67 68 74 6d 6f 73 74 20  o the rightmost 
1d750 73 65 6c 65 63 74 20 69 6e 20 73 75 62 2d 71 75  select in sub-qu
1d760 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ery */.  SrcList
1d770 20 2a 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20   *pSrc;      /* 
1d780 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
1d790 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
1d7a0 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  ry */.  SrcList 
1d7b0 2a 70 53 75 62 53 72 63 3b 20 20 20 2f 2a 20 54  *pSubSrc;   /* T
1d7c0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
1d7d0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 2a  f the subquery *
1d7e0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
1d7f0 69 73 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 72  ist;    /* The r
1d800 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
1d810 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a   outer query */.
1d820 20 20 69 6e 74 20 69 50 61 72 65 6e 74 3b 20 20    int iParent;  
1d830 20 20 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75        /* VDBE cu
1d840 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74  rsor number of t
1d850 68 65 20 70 53 75 62 20 72 65 73 75 6c 74 20 73  he pSub result s
1d860 65 74 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f  et temp table */
1d870 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
1d880 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
1d890 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70 72  ounter */.  Expr
1d8a0 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20 20   *pWhere;       
1d8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d8c0 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
1d8d0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
1d8e0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 75 62 69  List_item *pSubi
1d8f0 74 65 6d 3b 20 20 20 2f 2a 20 54 68 65 20 73 75  tem;   /* The su
1d900 62 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69  bquery */.  sqli
1d910 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
1d920 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  ->db;..  /* Chec
1d930 6b 20 74 6f 20 73 65 65 20 69 66 20 66 6c 61 74  k to see if flat
1d940 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74  tening is permit
1d950 74 65 64 2e 20 20 52 65 74 75 72 6e 20 30 20 69  ted.  Return 0 i
1d960 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 61 73  f not..  */.  as
1d970 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20  sert( p!=0 );.  
1d980 61 73 73 65 72 74 28 20 70 2d 3e 70 50 72 69 6f  assert( p->pPrio
1d990 72 3d 3d 30 20 29 3b 20 20 2f 2a 20 55 6e 61 62  r==0 );  /* Unab
1d9a0 6c 65 20 74 6f 20 66 6c 61 74 74 65 6e 20 63 6f  le to flatten co
1d9b0 6d 70 6f 75 6e 64 20 71 75 65 72 69 65 73 20 2a  mpound queries *
1d9c0 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61  /.  if( Optimiza
1d9d0 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c  tionDisabled(db,
1d9e0 20 53 51 4c 49 54 45 5f 51 75 65 72 79 46 6c 61   SQLITE_QueryFla
1d9f0 74 74 65 6e 65 72 29 20 29 20 72 65 74 75 72 6e  ttener) ) return
1da00 20 30 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e   0;.  pSrc = p->
1da10 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  pSrc;.  assert( 
1da20 70 53 72 63 20 26 26 20 69 46 72 6f 6d 3e 3d 30  pSrc && iFrom>=0
1da30 20 26 26 20 69 46 72 6f 6d 3c 70 53 72 63 2d 3e   && iFrom<pSrc->
1da40 6e 53 72 63 20 29 3b 0a 20 20 70 53 75 62 69 74  nSrc );.  pSubit
1da50 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69 46  em = &pSrc->a[iF
1da60 72 6f 6d 5d 3b 0a 20 20 69 50 61 72 65 6e 74 20  rom];.  iParent 
1da70 3d 20 70 53 75 62 69 74 65 6d 2d 3e 69 43 75 72  = pSubitem->iCur
1da80 73 6f 72 3b 0a 20 20 70 53 75 62 20 3d 20 70 53  sor;.  pSub = pS
1da90 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b  ubitem->pSelect;
1daa0 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62 21  .  assert( pSub!
1dab0 3d 30 20 29 3b 0a 20 20 69 66 28 20 73 75 62 71  =0 );.  if( subq
1dac0 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20  ueryIsAgg ){.   
1dad0 20 69 66 28 20 69 73 41 67 67 20 29 20 72 65 74   if( isAgg ) ret
1dae0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
1daf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db00 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1db10 74 69 6f 6e 20 28 31 29 20 20 20 2a 2f 0a 20 20  tion (1)   */.  
1db20 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63    if( pSrc->nSrc
1db30 3e 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  >1 ) return 0;  
1db40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db50 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
1db60 63 74 69 6f 6e 20 28 32 61 29 20 20 2a 2f 0a 20  ction (2a)  */. 
1db70 20 20 20 69 66 28 20 28 70 2d 3e 70 57 68 65 72     if( (p->pWher
1db80 65 20 26 26 20 45 78 70 72 48 61 73 50 72 6f 70  e && ExprHasProp
1db90 65 72 74 79 28 70 2d 3e 70 57 68 65 72 65 2c 45  erty(p->pWhere,E
1dba0 50 5f 53 75 62 71 75 65 72 79 29 29 0a 20 20 20  P_Subquery)).   
1dbb0 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 45 78 70    || (sqlite3Exp
1dbc0 72 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e 70 45  rListFlags(p->pE
1dbd0 4c 69 73 74 29 20 26 20 45 50 5f 53 75 62 71 75  List) & EP_Subqu
1dbe0 65 72 79 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20  ery)!=0.     || 
1dbf0 28 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74  (sqlite3ExprList
1dc00 46 6c 61 67 73 28 70 2d 3e 70 4f 72 64 65 72 42  Flags(p->pOrderB
1dc10 79 29 20 26 20 45 50 5f 53 75 62 71 75 65 72 79  y) & EP_Subquery
1dc20 29 21 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20  )!=0.    ){.    
1dc30 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20    return 0;     
1dc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc60 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1dc70 69 6f 6e 20 28 32 62 29 20 20 2a 2f 0a 20 20 20  ion (2b)  */.   
1dc80 20 7d 0a 20 20 7d 0a 20 20 20 20 0a 20 20 70 53   }.  }.    .  pS
1dc90 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53  ubSrc = pSub->pS
1dca0 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  rc;.  assert( pS
1dcb0 75 62 53 72 63 20 29 3b 0a 20 20 2f 2a 20 50 72  ubSrc );.  /* Pr
1dcc0 69 6f 72 20 74 6f 20 76 65 72 73 69 6f 6e 20 33  ior to version 3
1dcd0 2e 31 2e 32 2c 20 77 68 65 6e 20 4c 49 4d 49 54  .1.2, when LIMIT
1dce0 20 61 6e 64 20 4f 46 46 53 45 54 20 68 61 64 20   and OFFSET had 
1dcf0 74 6f 20 62 65 20 73 69 6d 70 6c 65 20 63 6f 6e  to be simple con
1dd00 73 74 61 6e 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74  stants,.  ** not
1dd10 20 61 72 62 69 74 72 61 72 79 20 65 78 70 72 65   arbitrary expre
1dd20 73 73 69 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f 77  ssions, we allow
1dd30 65 64 20 73 6f 6d 65 20 63 6f 6d 62 69 6e 69 6e  ed some combinin
1dd40 67 20 6f 66 20 4c 49 4d 49 54 20 61 6e 64 20 4f  g of LIMIT and O
1dd50 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 75  FFSET.  ** becau
1dd60 73 65 20 74 68 65 79 20 63 6f 75 6c 64 20 62 65  se they could be
1dd70 20 63 6f 6d 70 75 74 65 64 20 61 74 20 63 6f 6d   computed at com
1dd80 70 69 6c 65 2d 74 69 6d 65 2e 20 20 42 75 74 20  pile-time.  But 
1dd90 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f  when LIMIT and O
1dda0 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 6d  FFSET.  ** becam
1ddb0 65 20 61 72 62 69 74 72 61 72 79 20 65 78 70 72  e arbitrary expr
1ddc0 65 73 73 69 6f 6e 73 2c 20 77 65 20 77 65 72 65  essions, we were
1ddd0 20 66 6f 72 63 65 64 20 74 6f 20 61 64 64 20 72   forced to add r
1dde0 65 73 74 72 69 63 74 69 6f 6e 73 20 28 31 33 29  estrictions (13)
1ddf0 0a 20 20 2a 2a 20 61 6e 64 20 28 31 34 29 2e 20  .  ** and (14). 
1de00 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
1de10 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 4c 69 6d  Limit && p->pLim
1de20 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  it ) return 0;  
1de30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1de40 65 73 74 72 69 63 74 69 6f 6e 20 28 31 33 29 20  estriction (13) 
1de50 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
1de60 4f 66 66 73 65 74 20 29 20 72 65 74 75 72 6e 20  Offset ) return 
1de70 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1de80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1de90 65 73 74 72 69 63 74 69 6f 6e 20 28 31 34 29 20  estriction (14) 
1dea0 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c  */.  if( (p->sel
1deb0 46 6c 61 67 73 20 26 20 53 46 5f 43 6f 6d 70 6f  Flags & SF_Compo
1dec0 75 6e 64 29 21 3d 30 20 26 26 20 70 53 75 62 2d  und)!=0 && pSub-
1ded0 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 72  >pLimit ){.    r
1dee0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1def0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df10 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1df20 6f 6e 20 28 31 35 29 20 2a 2f 0a 20 20 7d 0a 20  on (15) */.  }. 
1df30 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53   if( pSubSrc->nS
1df40 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  rc==0 ) return 0
1df50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1df60 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1df70 69 63 74 69 6f 6e 20 28 37 29 20 20 2a 2f 0a 20  iction (7)  */. 
1df80 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c   if( pSub->selFl
1df90 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
1dfa0 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  t ) return 0;   
1dfb0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1dfc0 69 63 74 69 6f 6e 20 28 35 29 20 20 2a 2f 0a 20  iction (5)  */. 
1dfd0 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69   if( pSub->pLimi
1dfe0 74 20 26 26 20 28 70 53 72 63 2d 3e 6e 53 72 63  t && (pSrc->nSrc
1dff0 3e 31 20 7c 7c 20 69 73 41 67 67 29 20 29 7b 0a  >1 || isAgg) ){.
1e000 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
1e010 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
1e020 63 74 69 6f 6e 73 20 28 38 29 28 39 29 20 2a 2f  ctions (8)(9) */
1e030 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 73  .  }.  if( (p->s
1e040 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
1e050 74 69 6e 63 74 29 21 3d 30 20 26 26 20 73 75 62  tinct)!=0 && sub
1e060 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20  queryIsAgg ){.  
1e070 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
1e080 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1e090 69 6f 6e 20 28 36 29 20 20 2a 2f 0a 20 20 7d 0a  ion (6)  */.  }.
1e0a0 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
1e0b0 79 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65  y && pSub->pOrde
1e0c0 72 42 79 20 29 7b 0a 20 20 20 20 20 72 65 74 75  rBy ){.     retu
1e0d0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1e0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e100 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1e110 31 31 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  11) */.  }.  if(
1e120 20 69 73 41 67 67 20 26 26 20 70 53 75 62 2d 3e   isAgg && pSub->
1e130 70 4f 72 64 65 72 42 79 20 29 20 72 65 74 75 72  pOrderBy ) retur
1e140 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
1e150 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1e160 6f 6e 20 28 31 36 29 20 2a 2f 0a 20 20 69 66 28  on (16) */.  if(
1e170 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26   pSub->pLimit &&
1e180 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74   p->pWhere ) ret
1e190 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
1e1a0 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1e1b0 6f 6e 20 28 31 39 29 20 2a 2f 0a 20 20 69 66 28  on (19) */.  if(
1e1c0 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26   pSub->pLimit &&
1e1d0 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
1e1e0 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20  SF_Distinct)!=0 
1e1f0 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30  ){.     return 0
1e200 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73  ;         /* Res
1e210 74 72 69 63 74 69 6f 6e 20 28 32 31 29 20 2a 2f  triction (21) */
1e220 0a 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28  .  }.  testcase(
1e230 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20   pSub->selFlags 
1e240 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 20 29  & SF_Recursive )
1e250 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 53  ;.  testcase( pS
1e260 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ub->selFlags & S
1e270 46 5f 4d 69 6e 4d 61 78 41 67 67 20 29 3b 0a 20  F_MinMaxAgg );. 
1e280 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c   if( pSub->selFl
1e290 61 67 73 20 26 20 28 53 46 5f 52 65 63 75 72 73  ags & (SF_Recurs
1e2a0 69 76 65 7c 53 46 5f 4d 69 6e 4d 61 78 41 67 67  ive|SF_MinMaxAgg
1e2b0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
1e2c0 30 3b 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f  0; /* Restrictio
1e2d0 6e 73 20 28 32 32 29 20 61 6e 64 20 28 32 34 29  ns (22) and (24)
1e2e0 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 28 70   */.  }.  if( (p
1e2f0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
1e300 52 65 63 75 72 73 69 76 65 29 20 26 26 20 70 53  Recursive) && pS
1e310 75 62 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20  ub->pPrior ){.  
1e320 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 52    return 0; /* R
1e330 65 73 74 72 69 63 74 69 6f 6e 20 28 32 33 29 20  estriction (23) 
1e340 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 42 53  */.  }..  /* OBS
1e350 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 20 31 3a  OLETE COMMENT 1:
1e360 0a 20 20 2a 2a 20 52 65 73 74 72 69 63 74 69 6f  .  ** Restrictio
1e370 6e 20 33 3a 20 20 49 66 20 74 68 65 20 73 75 62  n 3:  If the sub
1e380 71 75 65 72 79 20 69 73 20 61 20 6a 6f 69 6e 2c  query is a join,
1e390 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73   make sure the s
1e3a0 75 62 71 75 65 72 79 20 69 73 20 0a 20 20 2a 2a  ubquery is .  **
1e3b0 20 6e 6f 74 20 75 73 65 64 20 61 73 20 74 68 65   not used as the
1e3c0 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f   right operand o
1e3d0 66 20 61 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 2e  f an outer join.
1e3e0 20 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 77 68    Examples of wh
1e3f0 79 20 74 68 69 73 0a 20 20 2a 2a 20 69 73 20 6e  y this.  ** is n
1e400 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a  ot allowed:.  **
1e410 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31  .  **         t1
1e420 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
1e430 20 28 74 32 20 4a 4f 49 4e 20 74 33 29 0a 20 20   (t2 JOIN t3).  
1e440 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c  **.  ** If we fl
1e450 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c  atten the above,
1e460 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20   we would get.  
1e470 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
1e480 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  (t1 LEFT OUTER J
1e490 4f 49 4e 20 74 32 29 20 4a 4f 49 4e 20 74 33 0a  OIN t2) JOIN t3.
1e4a0 20 20 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68 20    **.  ** which 
1e4b0 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 74 68  is not at all th
1e4c0 65 20 73 61 6d 65 20 74 68 69 6e 67 2e 0a 20 20  e same thing..  
1e4d0 2a 2a 0a 20 20 2a 2a 20 4f 42 53 4f 4c 45 54 45  **.  ** OBSOLETE
1e4e0 20 43 4f 4d 4d 45 4e 54 20 32 3a 0a 20 20 2a 2a   COMMENT 2:.  **
1e4f0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 32 3a   Restriction 12:
1e500 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72    If the subquer
1e510 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20 6f  y is the right o
1e520 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66 74  perand of a left
1e530 20 6f 75 74 65 72 0a 20 20 2a 2a 20 6a 6f 69 6e   outer.  ** join
1e540 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  , make sure the 
1e550 73 75 62 71 75 65 72 79 20 68 61 73 20 6e 6f 20  subquery has no 
1e560 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 20 20  WHERE clause..  
1e570 2a 2a 20 41 6e 20 65 78 61 6d 70 6c 65 73 20 6f  ** An examples o
1e580 66 20 77 68 79 20 74 68 69 73 20 69 73 20 6e 6f  f why this is no
1e590 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a  t allowed:.  **.
1e5a0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20    **         t1 
1e5b0 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
1e5c0 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74  (SELECT * FROM t
1e5d0 32 20 57 48 45 52 45 20 74 32 2e 78 3e 30 29 0a  2 WHERE t2.x>0).
1e5e0 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20    **.  ** If we 
1e5f0 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76  flatten the abov
1e600 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a  e, we would get.
1e610 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
1e620 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52    (t1 LEFT OUTER
1e630 20 4a 4f 49 4e 20 74 32 29 20 57 48 45 52 45 20   JOIN t2) WHERE 
1e640 74 32 2e 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a 2a  t2.x>0.  **.  **
1e650 20 42 75 74 20 74 68 65 20 74 32 2e 78 3e 30 20   But the t2.x>0 
1e660 74 65 73 74 20 77 69 6c 6c 20 61 6c 77 61 79 73  test will always
1e670 20 66 61 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c 20   fail on a NULL 
1e680 72 6f 77 20 6f 66 20 74 32 2c 20 77 68 69 63 68  row of t2, which
1e690 0a 20 20 2a 2a 20 65 66 66 65 63 74 69 76 65 6c  .  ** effectivel
1e6a0 79 20 63 6f 6e 76 65 72 74 73 20 74 68 65 20 4f  y converts the O
1e6b0 55 54 45 52 20 4a 4f 49 4e 20 69 6e 74 6f 20 61  UTER JOIN into a
1e6c0 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20 20  n INNER JOIN..  
1e6d0 2a 2a 0a 20 20 2a 2a 20 54 48 49 53 20 4f 56 45  **.  ** THIS OVE
1e6e0 52 52 49 44 45 53 20 4f 42 53 4f 4c 45 54 45 20  RRIDES OBSOLETE 
1e6f0 43 4f 4d 4d 45 4e 54 53 20 31 20 41 4e 44 20 32  COMMENTS 1 AND 2
1e700 20 41 42 4f 56 45 3a 0a 20 20 2a 2a 20 54 69 63   ABOVE:.  ** Tic
1e710 6b 65 74 20 23 33 33 30 30 20 73 68 6f 77 73 20  ket #3300 shows 
1e720 74 68 61 74 20 66 6c 61 74 74 65 6e 69 6e 67 20  that flattening 
1e730 74 68 65 20 72 69 67 68 74 20 74 65 72 6d 20 6f  the right term o
1e740 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 0a 20 20  f a LEFT JOIN.  
1e750 2a 2a 20 69 73 20 66 72 61 75 67 68 74 20 77 69  ** is fraught wi
1e760 74 68 20 64 61 6e 67 65 72 2e 20 20 42 65 73 74  th danger.  Best
1e770 20 74 6f 20 61 76 6f 69 64 20 74 68 65 20 77 68   to avoid the wh
1e780 6f 6c 65 20 74 68 69 6e 67 2e 20 20 49 66 20 74  ole thing.  If t
1e790 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79  he.  ** subquery
1e7a0 20 69 73 20 74 68 65 20 72 69 67 68 74 20 74 65   is the right te
1e7b0 72 6d 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  rm of a LEFT JOI
1e7c0 4e 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 66  N, then do not f
1e7d0 6c 61 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 69  latten..  */.  i
1e7e0 66 28 20 28 70 53 75 62 69 74 65 6d 2d 3e 6a 6f  f( (pSubitem->jo
1e7f0 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45  intype & JT_OUTE
1e800 52 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  R)!=0 ){.    ret
1e810 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
1e820 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 37 3a   Restriction 17:
1e830 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72   If the sub-quer
1e840 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20  y is a compound 
1e850 53 45 4c 45 43 54 2c 20 74 68 65 6e 20 69 74 20  SELECT, then it 
1e860 6d 75 73 74 0a 20 20 2a 2a 20 75 73 65 20 6f 6e  must.  ** use on
1e870 6c 79 20 74 68 65 20 55 4e 49 4f 4e 20 41 4c 4c  ly the UNION ALL
1e880 20 6f 70 65 72 61 74 6f 72 2e 20 41 6e 64 20 6e   operator. And n
1e890 6f 6e 65 20 6f 66 20 74 68 65 20 73 69 6d 70 6c  one of the simpl
1e8a0 65 20 73 65 6c 65 63 74 20 71 75 65 72 69 65 73  e select queries
1e8b0 0a 20 20 2a 2a 20 74 68 61 74 20 6d 61 6b 65 20  .  ** that make 
1e8c0 75 70 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  up the compound 
1e8d0 53 45 4c 45 43 54 20 61 72 65 20 61 6c 6c 6f 77  SELECT are allow
1e8e0 65 64 20 74 6f 20 62 65 20 61 67 67 72 65 67 61  ed to be aggrega
1e8f0 74 65 20 6f 72 20 64 69 73 74 69 6e 63 74 0a 20  te or distinct. 
1e900 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20 20 2a   ** queries..  *
1e910 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 50  /.  if( pSub->pP
1e920 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66 28 20  rior ){.    if( 
1e930 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29  pSub->pOrderBy )
1e940 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
1e950 3b 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f  ;  /* Restrictio
1e960 6e 20 32 30 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  n 20 */.    }.  
1e970 20 20 69 66 28 20 69 73 41 67 67 20 7c 7c 20 28    if( isAgg || (
1e980 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
1e990 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20 7c 7c  _Distinct)!=0 ||
1e9a0 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29   pSrc->nSrc!=1 )
1e9b0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
1e9c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
1e9d0 70 53 75 62 31 3d 70 53 75 62 3b 20 70 53 75 62  pSub1=pSub; pSub
1e9e0 31 3b 20 70 53 75 62 31 3d 70 53 75 62 31 2d 3e  1; pSub1=pSub1->
1e9f0 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 74  pPrior){.      t
1ea00 65 73 74 63 61 73 65 28 20 28 70 53 75 62 31 2d  estcase( (pSub1-
1ea10 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
1ea20 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
1ea30 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74  egate))==SF_Dist
1ea40 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 74 65  inct );.      te
1ea50 73 74 63 61 73 65 28 20 28 70 53 75 62 31 2d 3e  stcase( (pSub1->
1ea60 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
1ea70 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
1ea80 67 61 74 65 29 29 3d 3d 53 46 5f 41 67 67 72 65  gate))==SF_Aggre
1ea90 67 61 74 65 20 29 3b 0a 20 20 20 20 20 20 61 73  gate );.      as
1eaa0 73 65 72 74 28 20 70 53 75 62 2d 3e 70 53 72 63  sert( pSub->pSrc
1eab0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  !=0 );.      if(
1eac0 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67   (pSub1->selFlag
1ead0 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
1eae0 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 21  |SF_Aggregate))!
1eaf0 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 53  =0.       || (pS
1eb00 75 62 31 2d 3e 70 50 72 69 6f 72 20 26 26 20 70  ub1->pPrior && p
1eb10 53 75 62 31 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c  Sub1->op!=TK_ALL
1eb20 29 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 53 75  ) .       || pSu
1eb30 62 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3c 31  b1->pSrc->nSrc<1
1eb40 0a 20 20 20 20 20 20 20 7c 7c 20 70 53 75 62 2d  .       || pSub-
1eb50 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  >pEList->nExpr!=
1eb60 70 53 75 62 31 2d 3e 70 45 4c 69 73 74 2d 3e 6e  pSub1->pEList->n
1eb70 45 78 70 72 0a 20 20 20 20 20 20 29 7b 0a 20 20  Expr.      ){.  
1eb80 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
1eb90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65        }.      te
1eba0 73 74 63 61 73 65 28 20 70 53 75 62 31 2d 3e 70  stcase( pSub1->p
1ebb0 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 3b 0a 20  Src->nSrc>1 );. 
1ebc0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73     }..    /* Res
1ebd0 74 72 69 63 74 69 6f 6e 20 31 38 2e 20 2a 2f 0a  triction 18. */.
1ebe0 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65      if( p->pOrde
1ebf0 72 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  rBy ){.      int
1ec00 20 69 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69   ii;.      for(i
1ec10 69 3d 30 3b 20 69 69 3c 70 2d 3e 70 4f 72 64 65  i=0; ii<p->pOrde
1ec20 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b  rBy->nExpr; ii++
1ec30 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
1ec40 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 69  ->pOrderBy->a[ii
1ec50 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ].u.x.iOrderByCo
1ec60 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  l==0 ) return 0;
1ec70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1ec80 20 7d 0a 0a 20 20 2f 2a 2a 2a 2a 2a 20 49 66 20   }..  /***** If 
1ec90 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
1eca0 69 6e 74 2c 20 66 6c 61 74 74 65 6e 69 6e 67 20  int, flattening 
1ecb0 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 2a 2a  is permitted. **
1ecc0 2a 2a 2a 2f 0a 20 20 53 45 4c 45 43 54 54 52 41  ***/.  SELECTTRA
1ecd0 43 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 28 22  CE(1,pParse,p,("
1ece0 66 6c 61 74 74 65 6e 20 25 73 2e 25 70 20 66 72  flatten %s.%p fr
1ecf0 6f 6d 20 74 65 72 6d 20 25 64 5c 6e 22 2c 0a 20  om term %d\n",. 
1ed00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed10 20 20 70 53 75 62 2d 3e 7a 53 65 6c 4e 61 6d 65    pSub->zSelName
1ed20 2c 20 70 53 75 62 2c 20 69 46 72 6f 6d 29 29 3b  , pSub, iFrom));
1ed30 0a 0a 20 20 2f 2a 20 41 75 74 68 6f 72 69 7a 65  ..  /* Authorize
1ed40 20 74 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f   the subquery */
1ed50 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68  .  pParse->zAuth
1ed60 43 6f 6e 74 65 78 74 20 3d 20 70 53 75 62 69 74  Context = pSubit
1ed70 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 54 45 53  em->zName;.  TES
1ed80 54 4f 4e 4c 59 28 69 20 3d 29 20 73 71 6c 69 74  TONLY(i =) sqlit
1ed90 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
1eda0 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43  se, SQLITE_SELEC
1edb0 54 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 74  T, 0, 0, 0);.  t
1edc0 65 73 74 63 61 73 65 28 20 69 3d 3d 53 51 4c 49  estcase( i==SQLI
1edd0 54 45 5f 44 45 4e 59 20 29 3b 0a 20 20 70 50 61  TE_DENY );.  pPa
1ede0 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
1edf0 74 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43 6f  t = zSavedAuthCo
1ee00 6e 74 65 78 74 3b 0a 0a 20 20 2f 2a 20 49 66 20  ntext;..  /* If 
1ee10 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73  the sub-query is
1ee20 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   a compound SELE
1ee30 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  CT statement, th
1ee40 65 6e 20 28 62 79 20 72 65 73 74 72 69 63 74 69  en (by restricti
1ee50 6f 6e 73 0a 20 20 2a 2a 20 31 37 20 61 6e 64 20  ons.  ** 17 and 
1ee60 31 38 20 61 62 6f 76 65 29 20 69 74 20 6d 75 73  18 above) it mus
1ee70 74 20 62 65 20 61 20 55 4e 49 4f 4e 20 41 4c 4c  t be a UNION ALL
1ee80 20 61 6e 64 20 74 68 65 20 70 61 72 65 6e 74 20   and the parent 
1ee90 71 75 65 72 79 20 6d 75 73 74 20 0a 20 20 2a 2a  query must .  **
1eea0 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a   be of the form:
1eeb0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
1eec0 45 4c 45 43 54 20 3c 65 78 70 72 2d 6c 69 73 74  ELECT <expr-list
1eed0 3e 20 46 52 4f 4d 20 28 3c 73 75 62 2d 71 75 65  > FROM (<sub-que
1eee0 72 79 3e 29 20 3c 77 68 65 72 65 2d 63 6c 61 75  ry>) <where-clau
1eef0 73 65 3e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 66  se> .  **.  ** f
1ef00 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e 79 20 4f  ollowed by any O
1ef10 52 44 45 52 20 42 59 2c 20 4c 49 4d 49 54 20 61  RDER BY, LIMIT a
1ef20 6e 64 2f 6f 72 20 4f 46 46 53 45 54 20 63 6c 61  nd/or OFFSET cla
1ef30 75 73 65 73 2e 20 54 68 69 73 20 62 6c 6f 63 6b  uses. This block
1ef40 0a 20 20 2a 2a 20 63 72 65 61 74 65 73 20 4e 2d  .  ** creates N-
1ef50 31 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20  1 copies of the 
1ef60 70 61 72 65 6e 74 20 71 75 65 72 79 20 77 69 74  parent query wit
1ef70 68 6f 75 74 20 61 6e 79 20 4f 52 44 45 52 20 42  hout any ORDER B
1ef80 59 2c 20 4c 49 4d 49 54 20 6f 72 20 0a 20 20 2a  Y, LIMIT or .  *
1ef90 2a 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73  * OFFSET clauses
1efa0 20 61 6e 64 20 6a 6f 69 6e 73 20 74 68 65 6d 20   and joins them 
1efb0 74 6f 20 74 68 65 20 6c 65 66 74 2d 68 61 6e 64  to the left-hand
1efc0 2d 73 69 64 65 20 6f 66 20 74 68 65 20 6f 72 69  -side of the ori
1efd0 67 69 6e 61 6c 0a 20 20 2a 2a 20 75 73 69 6e 67  ginal.  ** using
1efe0 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61   UNION ALL opera
1eff0 74 6f 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61  tors. In this ca
1f000 73 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62  se N is the numb
1f010 65 72 20 6f 66 20 73 69 6d 70 6c 65 0a 20 20 2a  er of simple.  *
1f020 2a 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  * select stateme
1f030 6e 74 73 20 69 6e 20 74 68 65 20 63 6f 6d 70 6f  nts in the compo
1f040 75 6e 64 20 73 75 62 2d 71 75 65 72 79 2e 0a 20  und sub-query.. 
1f050 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65   **.  ** Example
1f060 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
1f070 53 45 4c 45 43 54 20 61 2b 31 20 46 52 4f 4d 20  SELECT a+1 FROM 
1f080 28 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45  (.  **        SE
1f090 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 61 62 0a  LECT x FROM tab.
1f0a0 20 20 2a 2a 20 20 20 20 20 20 20 20 55 4e 49 4f    **        UNIO
1f0b0 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20  N ALL.  **      
1f0c0 20 20 53 45 4c 45 43 54 20 79 20 46 52 4f 4d 20    SELECT y FROM 
1f0d0 74 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  tab.  **        
1f0e0 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20  UNION ALL.  **  
1f0f0 20 20 20 20 20 20 53 45 4c 45 43 54 20 61 62 73        SELECT abs
1f100 28 7a 2a 32 29 20 46 52 4f 4d 20 74 61 62 32 0a  (z*2) FROM tab2.
1f110 20 20 2a 2a 20 20 20 20 20 29 20 57 48 45 52 45    **     ) WHERE
1f120 20 61 21 3d 35 20 4f 52 44 45 52 20 42 59 20 31   a!=5 ORDER BY 1
1f130 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 72 61 6e 73  .  **.  ** Trans
1f140 66 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a 20 20 2a  formed into:.  *
1f150 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  *.  **     SELEC
1f160 54 20 78 2b 31 20 46 52 4f 4d 20 74 61 62 20 57  T x+1 FROM tab W
1f170 48 45 52 45 20 78 2b 31 21 3d 35 0a 20 20 2a 2a  HERE x+1!=5.  **
1f180 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20       UNION ALL. 
1f190 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 79   **     SELECT y
1f1a0 2b 31 20 46 52 4f 4d 20 74 61 62 20 57 48 45 52  +1 FROM tab WHER
1f1b0 45 20 79 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20  E y+1!=5.  **   
1f1c0 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a    UNION ALL.  **
1f1d0 20 20 20 20 20 53 45 4c 45 43 54 20 61 62 73 28       SELECT abs(
1f1e0 7a 2a 32 29 2b 31 20 46 52 4f 4d 20 74 61 62 32  z*2)+1 FROM tab2
1f1f0 20 57 48 45 52 45 20 61 62 73 28 7a 2a 32 29 2b   WHERE abs(z*2)+
1f200 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 4f 52  1!=5.  **     OR
1f210 44 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20  DER BY 1.  **.  
1f220 2a 2a 20 57 65 20 63 61 6c 6c 20 74 68 69 73 20  ** We call this 
1f230 74 68 65 20 22 63 6f 6d 70 6f 75 6e 64 2d 73 75  the "compound-su
1f240 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e  bquery flattenin
1f250 67 22 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70  g"..  */.  for(p
1f260 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72  Sub=pSub->pPrior
1f270 3b 20 70 53 75 62 3b 20 70 53 75 62 3d 70 53 75  ; pSub; pSub=pSu
1f280 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  b->pPrior){.    
1f290 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20  Select *pNew;.  
1f2a0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
1f2b0 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
1f2c0 42 79 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c  By;.    Expr *pL
1f2d0 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
1f2e0 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4f 66 66  ;.    Expr *pOff
1f2f0 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74  set = p->pOffset
1f300 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 50  ;.    Select *pP
1f310 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72  rior = p->pPrior
1f320 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42  ;.    p->pOrderB
1f330 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 53  y = 0;.    p->pS
1f340 72 63 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70  rc = 0;.    p->p
1f350 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70  Prior = 0;.    p
1f360 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
1f370 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30    p->pOffset = 0
1f380 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c  ;.    pNew = sql
1f390 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
1f3a0 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , p, 0);.    sql
1f3b0 69 74 65 33 53 65 6c 65 63 74 53 65 74 4e 61 6d  ite3SelectSetNam
1f3c0 65 28 70 4e 65 77 2c 20 70 53 75 62 2d 3e 7a 53  e(pNew, pSub->zS
1f3d0 65 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 70 2d 3e  elName);.    p->
1f3e0 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65  pOffset = pOffse
1f3f0 74 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  t;.    p->pLimit
1f400 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 70   = pLimit;.    p
1f410 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  ->pOrderBy = pOr
1f420 64 65 72 42 79 3b 0a 20 20 20 20 70 2d 3e 70 53  derBy;.    p->pS
1f430 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 20 20 70  rc = pSrc;.    p
1f440 2d 3e 6f 70 20 3d 20 54 4b 5f 41 4c 4c 3b 0a 20  ->op = TK_ALL;. 
1f450 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29     if( pNew==0 )
1f460 7b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  {.      p->pPrio
1f470 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
1f480 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e 65  }else{.      pNe
1f490 77 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  w->pPrior = pPri
1f4a0 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  or;.      if( pP
1f4b0 72 69 6f 72 20 29 20 70 50 72 69 6f 72 2d 3e 70  rior ) pPrior->p
1f4c0 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20  Next = pNew;.   
1f4d0 20 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d     pNew->pNext =
1f4e0 20 70 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72   p;.      p->pPr
1f4f0 69 6f 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  ior = pNew;.    
1f500 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 32 2c    SELECTTRACE(2,
1f510 70 50 61 72 73 65 2c 70 2c 0a 20 20 20 20 20 20  pParse,p,.      
1f520 20 20 20 28 22 63 6f 6d 70 6f 75 6e 64 2d 73 75     ("compound-su
1f530 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e 65 72  bquery flattener
1f540 20 63 72 65 61 74 65 73 20 25 73 2e 25 70 20 61   creates %s.%p a
1f550 73 20 70 65 65 72 5c 6e 22 2c 0a 20 20 20 20 20  s peer\n",.     
1f560 20 20 20 20 70 4e 65 77 2d 3e 7a 53 65 6c 4e 61      pNew->zSelNa
1f570 6d 65 2c 20 70 4e 65 77 29 29 3b 0a 20 20 20 20  me, pNew));.    
1f580 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  }.    if( db->ma
1f590 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
1f5a0 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 1;.  }..  /*
1f5b0 20 42 65 67 69 6e 20 66 6c 61 74 74 65 6e 69 6e   Begin flattenin
1f5c0 67 20 74 68 65 20 69 46 72 6f 6d 2d 74 68 20 65  g the iFrom-th e
1f5d0 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d  ntry of the FROM
1f5e0 20 63 6c 61 75 73 65 20 0a 20 20 2a 2a 20 69 6e   clause .  ** in
1f5f0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1f600 2e 0a 20 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20  ..  */.  pSub = 
1f610 70 53 75 62 31 20 3d 20 70 53 75 62 69 74 65 6d  pSub1 = pSubitem
1f620 2d 3e 70 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a  ->pSelect;..  /*
1f630 20 44 65 6c 65 74 65 20 74 68 65 20 74 72 61 6e   Delete the tran
1f640 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75  sient table stru
1f650 63 74 75 72 65 20 61 73 73 6f 63 69 61 74 65 64  cture associated
1f660 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73   with the.  ** s
1f670 75 62 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73  ubquery.  */.  s
1f680 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1f690 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61   pSubitem->zData
1f6a0 62 61 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  base);.  sqlite3
1f6b0 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 69  DbFree(db, pSubi
1f6c0 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73  tem->zName);.  s
1f6d0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1f6e0 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61   pSubitem->zAlia
1f6f0 73 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e  s);.  pSubitem->
1f700 7a 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20  zDatabase = 0;. 
1f710 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65   pSubitem->zName
1f720 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d   = 0;.  pSubitem
1f730 2d 3e 7a 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20  ->zAlias = 0;.  
1f740 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63  pSubitem->pSelec
1f750 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 65 66  t = 0;..  /* Def
1f760 65 72 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20  er deleting the 
1f770 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 61 73 73  Table object ass
1f780 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
1f790 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20 75  .  ** subquery u
1f7a0 6e 74 69 6c 20 63 6f 64 65 20 67 65 6e 65 72 61  ntil code genera
1f7b0 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d  tion is.  ** com
1f7c0 70 6c 65 74 65 2c 20 73 69 6e 63 65 20 74 68 65  plete, since the
1f7d0 72 65 20 6d 61 79 20 73 74 69 6c 6c 20 65 78 69  re may still exi
1f7e0 73 74 20 45 78 70 72 2e 70 54 61 62 20 65 6e 74  st Expr.pTab ent
1f7f0 72 69 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 72  ries that.  ** r
1f800 65 66 65 72 20 74 6f 20 74 68 65 20 73 75 62 71  efer to the subq
1f810 75 65 72 79 20 65 76 65 6e 20 61 66 74 65 72 20  uery even after 
1f820 66 6c 61 74 74 65 6e 69 6e 67 2e 20 20 54 69 63  flattening.  Tic
1f830 6b 65 74 20 23 33 33 34 36 2e 0a 20 20 2a 2a 0a  ket #3346..  **.
1f840 20 20 2a 2a 20 70 53 75 62 69 74 65 6d 2d 3e 70    ** pSubitem->p
1f850 54 61 62 20 69 73 20 61 6c 77 61 79 73 20 6e 6f  Tab is always no
1f860 6e 2d 4e 55 4c 4c 20 62 79 20 74 65 73 74 20 72  n-NULL by test r
1f870 65 73 74 72 69 63 74 69 6f 6e 73 20 61 6e 64 20  estrictions and 
1f880 74 65 73 74 73 20 61 62 6f 76 65 2e 0a 20 20 2a  tests above..  *
1f890 2f 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  /.  if( ALWAYS(p
1f8a0 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 21 3d 30  Subitem->pTab!=0
1f8b0 29 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  ) ){.    Table *
1f8c0 70 54 61 62 54 6f 44 65 6c 20 3d 20 70 53 75 62  pTabToDel = pSub
1f8d0 69 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  item->pTab;.    
1f8e0 69 66 28 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e  if( pTabToDel->n
1f8f0 52 65 66 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  Ref==1 ){.      
1f900 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c  Parse *pToplevel
1f910 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54   = sqlite3ParseT
1f920 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b  oplevel(pParse);
1f930 0a 20 20 20 20 20 20 70 54 61 62 54 6f 44 65 6c  .      pTabToDel
1f940 2d 3e 70 4e 65 78 74 5a 6f 6d 62 69 65 20 3d 20  ->pNextZombie = 
1f950 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62  pToplevel->pZomb
1f960 69 65 54 61 62 3b 0a 20 20 20 20 20 20 70 54 6f  ieTab;.      pTo
1f970 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54  plevel->pZombieT
1f980 61 62 20 3d 20 70 54 61 62 54 6f 44 65 6c 3b 0a  ab = pTabToDel;.
1f990 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1f9a0 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65 66   pTabToDel->nRef
1f9b0 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53  --;.    }.    pS
1f9c0 75 62 69 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30  ubitem->pTab = 0
1f9d0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
1f9e0 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72  following loop r
1f9f0 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  uns once for eac
1fa00 68 20 74 65 72 6d 20 69 6e 20 61 20 63 6f 6d 70  h term in a comp
1fa10 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 0a 20 20  ound-subquery.  
1fa20 2a 2a 20 66 6c 61 74 74 65 6e 69 6e 67 20 28 61  ** flattening (a
1fa30 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  s described abov
1fa40 65 29 2e 20 20 49 66 20 77 65 20 61 72 65 20 64  e).  If we are d
1fa50 6f 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74  oing a different
1fa60 20 6b 69 6e 64 0a 20 20 2a 2a 20 6f 66 20 66 6c   kind.  ** of fl
1fa70 61 74 74 65 6e 69 6e 67 20 2d 20 61 20 66 6c 61  attening - a fla
1fa80 74 74 65 6e 69 6e 67 20 6f 74 68 65 72 20 74 68  ttening other th
1fa90 61 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75  an a compound-su
1faa0 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e  bquery flattenin
1fab0 67 20 2d 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68  g -.  ** then th
1fac0 69 73 20 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e  is loop only run
1fad0 73 20 6f 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a  s once..  **.  *
1fae0 2a 20 54 68 69 73 20 6c 6f 6f 70 20 6d 6f 76 65  * This loop move
1faf0 73 20 61 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f  s all of the FRO
1fb00 4d 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68  M elements of th
1fb10 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20  e subquery into 
1fb20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f  the.  ** the FRO
1fb30 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
1fb40 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 65  outer query.  Be
1fb50 66 6f 72 65 20 64 6f 69 6e 67 20 74 68 69 73 2c  fore doing this,
1fb60 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74   remember.  ** t
1fb70 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
1fb80 20 66 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61   for the origina
1fb90 6c 20 6f 75 74 65 72 20 71 75 65 72 79 20 46 52  l outer query FR
1fba0 4f 4d 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20  OM element in.  
1fbb0 2a 2a 20 69 50 61 72 65 6e 74 2e 20 20 54 68 65  ** iParent.  The
1fbc0 20 69 50 61 72 65 6e 74 20 63 75 72 73 6f 72 20   iParent cursor 
1fbd0 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73  will never be us
1fbe0 65 64 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20  ed.  Subsequent 
1fbf0 63 6f 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73  code.  ** will s
1fc00 63 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20  can expressions 
1fc10 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61 72  looking for iPar
1fc20 65 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20 61  ent references a
1fc30 6e 64 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20  nd replace.  ** 
1fc40 74 68 6f 73 65 20 72 65 66 65 72 65 6e 63 65 73  those references
1fc50 20 77 69 74 68 20 65 78 70 72 65 73 73 69 6f 6e   with expression
1fc60 73 20 74 68 61 74 20 72 65 73 6f 6c 76 65 20 74  s that resolve t
1fc70 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 20 46  o the subquery F
1fc80 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74  ROM.  ** element
1fc90 73 20 77 65 20 61 72 65 20 6e 6f 77 20 63 6f 70  s we are now cop
1fca0 79 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20  ying in..  */.  
1fcb0 66 6f 72 28 70 50 61 72 65 6e 74 3d 70 3b 20 70  for(pParent=p; p
1fcc0 50 61 72 65 6e 74 3b 20 70 50 61 72 65 6e 74 3d  Parent; pParent=
1fcd0 70 50 61 72 65 6e 74 2d 3e 70 50 72 69 6f 72 2c  pParent->pPrior,
1fce0 20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69   pSub=pSub->pPri
1fcf0 6f 72 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75  or){.    int nSu
1fd00 62 53 72 63 3b 0a 20 20 20 20 75 38 20 6a 6f 69  bSrc;.    u8 joi
1fd10 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 70  ntype = 0;.    p
1fd20 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70  SubSrc = pSub->p
1fd30 53 72 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d  Src;     /* FROM
1fd40 20 63 6c 61 75 73 65 20 6f 66 20 73 75 62 71 75   clause of subqu
1fd50 65 72 79 20 2a 2f 0a 20 20 20 20 6e 53 75 62 53  ery */.    nSubS
1fd60 72 63 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53  rc = pSubSrc->nS
1fd70 72 63 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  rc;  /* Number o
1fd80 66 20 74 65 72 6d 73 20 69 6e 20 73 75 62 71 75  f terms in subqu
1fd90 65 72 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  ery FROM clause 
1fda0 2a 2f 0a 20 20 20 20 70 53 72 63 20 3d 20 70 50  */.    pSrc = pP
1fdb0 61 72 65 6e 74 2d 3e 70 53 72 63 3b 20 20 20 20  arent->pSrc;    
1fdc0 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
1fdd0 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
1fde0 72 79 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70  ry */..    if( p
1fdf0 53 72 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73  Src ){.      ass
1fe00 65 72 74 28 20 70 50 61 72 65 6e 74 3d 3d 70 20  ert( pParent==p 
1fe10 29 3b 20 20 2f 2a 20 46 69 72 73 74 20 74 69 6d  );  /* First tim
1fe20 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f  e through the lo
1fe30 6f 70 20 2a 2f 0a 20 20 20 20 20 20 6a 6f 69 6e  op */.      join
1fe40 74 79 70 65 20 3d 20 70 53 75 62 69 74 65 6d 2d  type = pSubitem-
1fe50 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d  >jointype;.    }
1fe60 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
1fe70 72 74 28 20 70 50 61 72 65 6e 74 21 3d 70 20 29  rt( pParent!=p )
1fe80 3b 20 20 2f 2a 20 32 6e 64 20 61 6e 64 20 73 75  ;  /* 2nd and su
1fe90 62 73 65 71 75 65 6e 74 20 74 69 6d 65 73 20 74  bsequent times t
1fea0 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20  hrough the loop 
1feb0 2a 2f 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20  */.      pSrc = 
1fec0 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20  pParent->pSrc = 
1fed0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
1fee0 70 65 6e 64 28 64 62 2c 20 30 2c 20 30 2c 20 30  pend(db, 0, 0, 0
1fef0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 72  );.      if( pSr
1ff00 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c==0 ){.        
1ff10 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
1ff20 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
1ff30 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1ff40 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1ff50 20 54 68 65 20 73 75 62 71 75 65 72 79 20 75 73   The subquery us
1ff60 65 73 20 61 20 73 69 6e 67 6c 65 20 73 6c 6f 74  es a single slot
1ff70 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
1ff80 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
1ff90 0a 20 20 20 20 2a 2a 20 71 75 65 72 79 2e 20 20  .    ** query.  
1ffa0 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
1ffb0 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  has more than on
1ffc0 65 20 65 6c 65 6d 65 6e 74 20 69 6e 20 69 74 73  e element in its
1ffd0 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 20 20   FROM clause,.  
1ffe0 20 20 2a 2a 20 74 68 65 6e 20 65 78 70 61 6e 64    ** then expand
1fff0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
20000 20 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 20 66   to make space f
20010 6f 72 20 69 74 20 74 6f 20 68 6f 6c 64 20 61 6c  or it to hold al
20020 6c 20 65 6c 65 6d 65 6e 74 73 0a 20 20 20 20 2a  l elements.    *
20030 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  * of the subquer
20040 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  y..    **.    **
20050 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a   Example:.    **
20060 0a 20 20 20 20 2a 2a 20 20 20 20 53 45 4c 45 43  .    **    SELEC
20070 54 20 2a 20 46 52 4f 4d 20 74 61 62 41 2c 20 28  T * FROM tabA, (
20080 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 75  SELECT * FROM su
20090 62 31 2c 20 73 75 62 32 29 2c 20 74 61 62 42 3b  b1, sub2), tabB;
200a0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
200b0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 68  he outer query h
200c0 61 73 20 33 20 73 6c 6f 74 73 20 69 6e 20 69 74  as 3 slots in it
200d0 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  s FROM clause.  
200e0 4f 6e 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 0a  One slot of the.
200f0 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65      ** outer que
20100 72 79 20 28 74 68 65 20 6d 69 64 64 6c 65 20 73  ry (the middle s
20110 6c 6f 74 29 20 69 73 20 75 73 65 64 20 62 79 20  lot) is used by 
20120 74 68 65 20 73 75 62 71 75 65 72 79 2e 20 20 54  the subquery.  T
20130 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 62  he next.    ** b
20140 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 77 69 6c  lock of code wil
20150 6c 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74  l expand the out
20160 20 71 75 65 72 79 20 74 6f 20 34 20 73 6c 6f 74   query to 4 slot
20170 73 2e 20 20 54 68 65 20 6d 69 64 64 6c 65 0a 20  s.  The middle. 
20180 20 20 20 2a 2a 20 73 6c 6f 74 20 69 73 20 65 78     ** slot is ex
20190 70 61 6e 64 65 64 20 74 6f 20 74 77 6f 20 73 6c  panded to two sl
201a0 6f 74 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ots in order to 
201b0 6d 61 6b 65 20 73 70 61 63 65 20 66 6f 72 20 74  make space for t
201c0 68 65 0a 20 20 20 20 2a 2a 20 74 77 6f 20 65 6c  he.    ** two el
201d0 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 46 52  ements in the FR
201e0 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
201f0 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a   subquery..    *
20200 2f 0a 20 20 20 20 69 66 28 20 6e 53 75 62 53 72  /.    if( nSubSr
20210 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 50 61  c>1 ){.      pPa
20220 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 70 53 72  rent->pSrc = pSr
20230 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  c = sqlite3SrcLi
20240 73 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 53  stEnlarge(db, pS
20250 72 63 2c 20 6e 53 75 62 53 72 63 2d 31 2c 69 46  rc, nSubSrc-1,iF
20260 72 6f 6d 2b 31 29 3b 0a 20 20 20 20 20 20 69 66  rom+1);.      if
20270 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
20280 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  ed ){.        br
20290 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
202a0 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 72 61 6e 73   }..    /* Trans
202b0 66 65 72 20 74 68 65 20 46 52 4f 4d 20 63 6c 61  fer the FROM cla
202c0 75 73 65 20 74 65 72 6d 73 20 66 72 6f 6d 20 74  use terms from t
202d0 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f  he subquery into
202e0 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65   the.    ** oute
202f0 72 20 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a  r query..    */.
20300 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
20310 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  SubSrc; i++){.  
20320 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73      sqlite3IdLis
20330 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 72 63  tDelete(db, pSrc
20340 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 2e 70 55 73  ->a[i+iFrom].pUs
20350 69 6e 67 29 3b 0a 20 20 20 20 20 20 70 53 72 63  ing);.      pSrc
20360 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70  ->a[i+iFrom] = p
20370 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20  SubSrc->a[i];.  
20380 20 20 20 20 6d 65 6d 73 65 74 28 26 70 53 75 62      memset(&pSub
20390 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69  Src->a[i], 0, si
203a0 7a 65 6f 66 28 70 53 75 62 53 72 63 2d 3e 61 5b  zeof(pSubSrc->a[
203b0 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  i]));.    }.    
203c0 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 6a  pSrc->a[iFrom].j
203d0 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79  ointype = jointy
203e0 70 65 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 4e 6f  pe;.  .    /* No
203f0 77 20 62 65 67 69 6e 20 73 75 62 73 74 69 74 75  w begin substitu
20400 74 69 6e 67 20 73 75 62 71 75 65 72 79 20 72 65  ting subquery re
20410 73 75 6c 74 20 73 65 74 20 65 78 70 72 65 73 73  sult set express
20420 69 6f 6e 73 20 66 6f 72 20 0a 20 20 20 20 2a 2a  ions for .    **
20430 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
20440 68 65 20 69 50 61 72 65 6e 74 20 69 6e 20 74 68  he iParent in th
20450 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20  e outer query.. 
20460 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 45 78     ** .    ** Ex
20470 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20  ample:.    **.  
20480 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 2b    **   SELECT a+
20490 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28 53 45  5, b*10 FROM (SE
204a0 4c 45 43 54 20 78 2a 33 20 41 53 20 61 2c 20 79  LECT x*3 AS a, y
204b0 2b 31 30 20 41 53 20 62 20 46 52 4f 4d 20 74 31  +10 AS b FROM t1
204c0 29 20 57 48 45 52 45 20 61 3e 62 3b 0a 20 20 20  ) WHERE a>b;.   
204d0 20 2a 2a 20 20 20 5c 20 20 20 20 20 20 20 20 20   **   \         
204e0 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f              \___
204f0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75  __________ subqu
20500 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20  ery __________/ 
20510 20 20 20 20 20 20 20 20 20 2f 0a 20 20 20 20 2a           /.    *
20520 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  *    \__________
20530 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65  ___________ oute
20540 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f  r query ________
20550 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
20560 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20  ______/.    **. 
20570 20 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74     ** We look at
20580 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f   every expressio
20590 6e 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  n in the outer q
205a0 75 65 72 79 20 61 6e 64 20 65 76 65 72 79 20 70  uery and every p
205b0 6c 61 63 65 20 77 65 20 73 65 65 0a 20 20 20 20  lace we see.    
205c0 2a 2a 20 22 61 22 20 77 65 20 73 75 62 73 74 69  ** "a" we substi
205d0 74 75 74 65 20 22 78 2a 33 22 20 61 6e 64 20 65  tute "x*3" and e
205e0 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73 65  very place we se
205f0 65 20 22 62 22 20 77 65 20 73 75 62 73 74 69 74  e "b" we substit
20600 75 74 65 20 22 79 2b 31 30 22 2e 0a 20 20 20 20  ute "y+10"..    
20610 2a 2f 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70  */.    pList = p
20620 50 61 72 65 6e 74 2d 3e 70 45 4c 69 73 74 3b 0a  Parent->pEList;.
20630 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
20640 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
20650 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69  ){.      if( pLi
20660 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d  st->a[i].zName==
20670 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  0 ){.        cha
20680 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  r *zName = sqlit
20690 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
206a0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e  List->a[i].zSpan
206b0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
206c0 65 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29  e3Dequote(zName)
206d0 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d  ;.        pList-
206e0 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 7a 4e  >a[i].zName = zN
206f0 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ame;.      }.   
20700 20 7d 0a 20 20 20 20 73 75 62 73 74 45 78 70 72   }.    substExpr
20710 4c 69 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74  List(db, pParent
20720 2d 3e 70 45 4c 69 73 74 2c 20 69 50 61 72 65 6e  ->pEList, iParen
20730 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
20740 3b 0a 20 20 20 20 69 66 28 20 69 73 41 67 67 20  ;.    if( isAgg 
20750 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 45 78  ){.      substEx
20760 70 72 4c 69 73 74 28 64 62 2c 20 70 50 61 72 65  prList(db, pPare
20770 6e 74 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 50  nt->pGroupBy, iP
20780 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
20790 69 73 74 29 3b 0a 20 20 20 20 20 20 70 50 61 72  ist);.      pPar
207a0 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73  ent->pHaving = s
207b0 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 50 61  ubstExpr(db, pPa
207c0 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 69  rent->pHaving, i
207d0 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
207e0 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  List);.    }.   
207f0 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65   if( pSub->pOrde
20800 72 42 79 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  rBy ){.      /* 
20810 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 61  At this point, a
20820 6e 79 20 6e 6f 6e 2d 7a 65 72 6f 20 69 4f 72 64  ny non-zero iOrd
20830 65 72 42 79 43 6f 6c 20 76 61 6c 75 65 73 20 69  erByCol values i
20840 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
20850 0a 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52 20  .      ** ORDER 
20860 42 59 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73  BY column expres
20870 73 69 6f 6e 20 69 73 20 69 64 65 6e 74 69 63 61  sion is identica
20880 6c 20 74 6f 20 74 68 65 20 69 4f 72 64 65 72 42  l to the iOrderB
20890 79 43 6f 6c 27 74 68 0a 20 20 20 20 20 20 2a 2a  yCol'th.      **
208a0 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 74 75   expression retu
208b0 72 6e 65 64 20 62 79 20 53 45 4c 45 43 54 20 73  rned by SELECT s
208c0 74 61 74 65 6d 65 6e 74 20 70 53 75 62 2e 20 53  tatement pSub. S
208d0 69 6e 63 65 20 74 68 65 73 65 20 76 61 6c 75 65  ince these value
208e0 73 0a 20 20 20 20 20 20 2a 2a 20 64 6f 20 6e 6f  s.      ** do no
208f0 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 63 6f  t necessarily co
20900 72 72 65 73 70 6f 6e 64 20 74 6f 20 63 6f 6c 75  rrespond to colu
20910 6d 6e 73 20 69 6e 20 53 45 4c 45 43 54 20 73 74  mns in SELECT st
20920 61 74 65 6d 65 6e 74 20 70 50 61 72 65 6e 74 2c  atement pParent,
20930 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 74  .      ** zero t
20940 68 65 6d 20 62 65 66 6f 72 65 20 74 72 61 6e 73  hem before trans
20950 66 65 72 69 6e 67 20 74 68 65 20 4f 52 44 45 52  fering the ORDER
20960 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20   BY clause..    
20970 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f    **.      ** No
20980 74 20 64 6f 69 6e 67 20 74 68 69 73 20 6d 61 79  t doing this may
20990 20 63 61 75 73 65 20 61 6e 20 65 72 72 6f 72 20   cause an error 
209a0 69 66 20 61 20 73 75 62 73 65 71 75 65 6e 74 20  if a subsequent 
209b0 63 61 6c 6c 20 74 6f 20 74 68 69 73 0a 20 20 20  call to this.   
209c0 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61     ** function a
209d0 74 74 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74  ttempts to flatt
209e0 65 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 75  en a compound su
209f0 62 2d 71 75 65 72 79 20 69 6e 74 6f 20 70 50 61  b-query into pPa
20a00 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 28 74  rent.      ** (t
20a10 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 68 69 73  he only way this
20a20 20 63 61 6e 20 68 61 70 70 65 6e 20 69 73 20 69   can happen is i
20a30 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  f the compound s
20a40 75 62 2d 71 75 65 72 79 20 69 73 0a 20 20 20 20  ub-query is.    
20a50 20 20 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 70    ** currently p
20a60 61 72 74 20 6f 66 20 70 53 75 62 2d 3e 70 53 72  art of pSub->pSr
20a70 63 29 2e 20 53 65 65 20 74 69 63 6b 65 74 20 5b  c). See ticket [
20a80 64 31 31 61 36 65 39 30 38 66 5d 2e 20 20 2a 2f  d11a6e908f].  */
20a90 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
20aa0 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 53 75 62  *pOrderBy = pSub
20ab0 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  ->pOrderBy;.    
20ac0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72    for(i=0; i<pOr
20ad0 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  derBy->nExpr; i+
20ae0 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 72 64  +){.        pOrd
20af0 65 72 42 79 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69  erBy->a[i].u.x.i
20b00 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 30 3b 0a  OrderByCol = 0;.
20b10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
20b20 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70  sert( pParent->p
20b30 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20  OrderBy==0 );.  
20b40 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62      assert( pSub
20b50 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 20  ->pPrior==0 );. 
20b60 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4f       pParent->pO
20b70 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
20b80 79 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70  y;.      pSub->p
20b90 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
20ba0 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 72 65   }else if( pPare
20bb0 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  nt->pOrderBy ){.
20bc0 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72 4c        substExprL
20bd0 69 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74 2d  ist(db, pParent-
20be0 3e 70 4f 72 64 65 72 42 79 2c 20 69 50 61 72 65  >pOrderBy, iPare
20bf0 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
20c00 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
20c10 20 70 53 75 62 2d 3e 70 57 68 65 72 65 20 29 7b   pSub->pWhere ){
20c20 0a 20 20 20 20 20 20 70 57 68 65 72 65 20 3d 20  .      pWhere = 
20c30 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
20c40 62 2c 20 70 53 75 62 2d 3e 70 57 68 65 72 65 2c  b, pSub->pWhere,
20c50 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
20c60 20 20 20 20 20 20 70 57 68 65 72 65 20 3d 20 30        pWhere = 0
20c70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
20c80 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29 7b  subqueryIsAgg ){
20c90 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
20ca0 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 3d  Parent->pHaving=
20cb0 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72  =0 );.      pPar
20cc0 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70  ent->pHaving = p
20cd0 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 3b 0a  Parent->pWhere;.
20ce0 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
20cf0 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a  Where = pWhere;.
20d00 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
20d10 48 61 76 69 6e 67 20 3d 20 73 75 62 73 74 45 78  Having = substEx
20d20 70 72 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e  pr(db, pParent->
20d30 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74  pHaving, iParent
20d40 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b  , pSub->pEList);
20d50 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
20d60 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65  pHaving = sqlite
20d70 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 50 61  3ExprAnd(db, pPa
20d80 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 0a  rent->pHaving, .
20d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20db0 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70    sqlite3ExprDup
20dc0 28 64 62 2c 20 70 53 75 62 2d 3e 70 48 61 76 69  (db, pSub->pHavi
20dd0 6e 67 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 61  ng, 0));.      a
20de0 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
20df0 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20  pGroupBy==0 );. 
20e00 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 47       pParent->pG
20e10 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33  roupBy = sqlite3
20e20 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
20e30 70 53 75 62 2d 3e 70 47 72 6f 75 70 42 79 2c 20  pSub->pGroupBy, 
20e40 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
20e50 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57       pParent->pW
20e60 68 65 72 65 20 3d 20 73 75 62 73 74 45 78 70 72  here = substExpr
20e70 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57  (db, pParent->pW
20e80 68 65 72 65 2c 20 69 50 61 72 65 6e 74 2c 20 70  here, iParent, p
20e90 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sub->pEList);.  
20ea0 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68      pParent->pWh
20eb0 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
20ec0 72 41 6e 64 28 64 62 2c 20 70 50 61 72 65 6e 74  rAnd(db, pParent
20ed0 2d 3e 70 57 68 65 72 65 2c 20 70 57 68 65 72 65  ->pWhere, pWhere
20ee0 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  );.    }.  .    
20ef0 2f 2a 20 54 68 65 20 66 6c 61 74 74 65 6e 65 64  /* The flattened
20f00 20 71 75 65 72 79 20 69 73 20 64 69 73 74 69 6e   query is distin
20f10 63 74 20 69 66 20 65 69 74 68 65 72 20 74 68 65  ct if either the
20f20 20 69 6e 6e 65 72 20 6f 72 20 74 68 65 0a 20 20   inner or the.  
20f30 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79    ** outer query
20f40 20 69 73 20 64 69 73 74 69 6e 63 74 2e 20 0a 20   is distinct. . 
20f50 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 65 6e     */.    pParen
20f60 74 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 70  t->selFlags |= p
20f70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  Sub->selFlags & 
20f80 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 0a  SF_Distinct;.  .
20f90 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 45      /*.    ** SE
20fa0 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 28 53  LECT ... FROM (S
20fb0 45 4c 45 43 54 20 2e 2e 2e 20 4c 49 4d 49 54 20  ELECT ... LIMIT 
20fc0 61 20 4f 46 46 53 45 54 20 62 29 20 4c 49 4d 49  a OFFSET b) LIMI
20fd0 54 20 78 20 4f 46 46 53 45 54 20 79 3b 0a 20 20  T x OFFSET y;.  
20fe0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 65 20    **.    ** One 
20ff0 69 73 20 74 65 6d 70 74 65 64 20 74 6f 20 74 72  is tempted to tr
21000 79 20 74 6f 20 61 64 64 20 61 20 61 6e 64 20 62  y to add a and b
21010 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65 20   to combine the 
21020 6c 69 6d 69 74 73 2e 20 20 42 75 74 20 74 68 69  limits.  But thi
21030 73 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f  s.    ** does no
21040 74 20 77 6f 72 6b 20 69 66 20 65 69 74 68 65 72  t work if either
21050 20 6c 69 6d 69 74 20 69 73 20 6e 65 67 61 74 69   limit is negati
21060 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ve..    */.    i
21070 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20  f( pSub->pLimit 
21080 29 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  ){.      pParent
21090 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d  ->pLimit = pSub-
210a0 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70  >pLimit;.      p
210b0 53 75 62 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b  Sub->pLimit = 0;
210c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
210d0 20 46 69 6e 69 61 6c 6c 79 2c 20 64 65 6c 65 74   Finially, delet
210e0 65 20 77 68 61 74 20 69 73 20 6c 65 66 74 20 6f  e what is left o
210f0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 61  f the subquery a
21100 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 73  nd return.  ** s
21110 75 63 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73  uccess..  */.  s
21120 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
21130 74 65 28 64 62 2c 20 70 53 75 62 31 29 3b 0a 0a  te(db, pSub1);..
21140 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f  #if SELECTTRACE_
21150 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71  ENABLED.  if( sq
21160 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65  lite3SelectTrace
21170 20 26 20 30 78 31 30 30 20 29 7b 0a 20 20 20 20   & 0x100 ){.    
21180 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
21190 74 66 28 22 41 66 74 65 72 20 66 6c 61 74 74 65  tf("After flatte
211a0 6e 69 6e 67 3a 5c 6e 22 29 3b 0a 20 20 20 20 73  ning:\n");.    s
211b0 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65  qlite3TreeViewSe
211c0 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20  lect(0, p, 0);. 
211d0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74   }.#endif..  ret
211e0 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 1;.}.#endif 
211f0 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
21200 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
21210 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
21220 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
21230 2a 2f 0a 0a 0a 0a 23 69 66 20 21 64 65 66 69 6e  */....#if !defin
21240 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
21250 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66  UBQUERY) || !def
21260 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
21270 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20 4d 61 6b  _VIEW)./*.** Mak
21280 65 20 63 6f 70 69 65 73 20 6f 66 20 72 65 6c 65  e copies of rele
21290 76 61 6e 74 20 57 48 45 52 45 20 63 6c 61 75 73  vant WHERE claus
212a0 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 6f  e terms of the o
212b0 75 74 65 72 20 71 75 65 72 79 20 69 6e 74 6f 0a  uter query into.
212c0 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  ** the WHERE cla
212d0 75 73 65 20 6f 66 20 73 75 62 71 75 65 72 79 2e  use of subquery.
212e0 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a    Example:.**.**
212f0 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
21300 4d 20 28 53 45 4c 45 43 54 20 61 20 41 53 20 78  M (SELECT a AS x
21310 2c 20 63 2d 64 20 41 53 20 79 20 46 52 4f 4d 20  , c-d AS y FROM 
21320 74 31 29 20 57 48 45 52 45 20 78 3d 35 20 41 4e  t1) WHERE x=5 AN
21330 44 20 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a 20 54 72  D y=10;.**.** Tr
21340 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a  ansformed into:.
21350 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20  **.**    SELECT 
21360 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 61  * FROM (SELECT a
21370 20 41 53 20 78 2c 20 63 2d 64 20 41 53 20 79 20   AS x, c-d AS y 
21380 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d  FROM t1 WHERE a=
21390 35 20 41 4e 44 20 63 2d 64 3d 31 30 29 0a 2a 2a  5 AND c-d=10).**
213a0 20 20 20 20 20 57 48 45 52 45 20 78 3d 35 20 41       WHERE x=5 A
213b0 4e 44 20 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a 20 54  ND y=10;.**.** T
213c0 68 65 20 68 6f 70 65 20 69 73 20 74 68 61 74 20  he hope is that 
213d0 74 68 65 20 74 65 72 6d 73 20 61 64 64 65 64 20  the terms added 
213e0 74 6f 20 74 68 65 20 69 6e 6e 65 72 20 71 75 65  to the inner que
213f0 72 79 20 77 69 6c 6c 20 6d 61 6b 65 20 69 74 20  ry will make it 
21400 6d 6f 72 65 0a 2a 2a 20 65 66 66 69 63 69 65 6e  more.** efficien
21410 74 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20  t..**.** Do not 
21420 61 74 74 65 6d 70 74 20 74 68 69 73 20 6f 70 74  attempt this opt
21430 69 6d 69 7a 61 74 69 6f 6e 20 69 66 3a 0a 2a 2a  imization if:.**
21440 0a 2a 2a 20 20 20 28 31 29 20 54 68 65 20 69 6e  .**   (1) The in
21450 6e 65 72 20 71 75 65 72 79 20 69 73 20 61 6e 20  ner query is an 
21460 61 67 67 72 65 67 61 74 65 2e 20 20 28 49 6e 20  aggregate.  (In 
21470 74 68 61 74 20 63 61 73 65 2c 20 77 65 27 64 20  that case, we'd 
21480 72 65 61 6c 6c 79 20 77 61 6e 74 0a 2a 2a 20 20  really want.**  
21490 20 20 20 20 20 74 6f 20 63 6f 70 79 20 74 68 65       to copy the
214a0 20 6f 75 74 65 72 20 57 48 45 52 45 2d 63 6c 61   outer WHERE-cla
214b0 75 73 65 20 74 65 72 6d 73 20 6f 6e 74 6f 20 74  use terms onto t
214c0 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65  he HAVING clause
214d0 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   of the.**      
214e0 20 69 6e 6e 65 72 20 71 75 65 72 79 2e 20 20 42   inner query.  B
214f0 75 74 20 74 68 65 79 20 70 72 6f 62 61 62 6c 79  ut they probably
21500 20 77 6f 6e 27 74 20 68 65 6c 70 20 74 68 65 72   won't help ther
21510 65 20 73 6f 20 64 6f 20 6e 6f 74 20 62 6f 74 68  e so do not both
21520 65 72 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29  er.).**.**   (2)
21530 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79   The inner query
21540 20 69 73 20 74 68 65 20 72 65 63 75 72 73 69 76   is the recursiv
21550 65 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 6d  e part of a comm
21560 6f 6e 20 74 61 62 6c 65 20 65 78 70 72 65 73 73  on table express
21570 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29  ion..**.**   (3)
21580 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79   The inner query
21590 20 68 61 73 20 61 20 4c 49 4d 49 54 20 63 6c 61   has a LIMIT cla
215a0 75 73 65 20 28 73 69 6e 63 65 20 74 68 65 20 63  use (since the c
215b0 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 57 48  hanges to the WH
215c0 45 52 45 0a 2a 2a 20 20 20 20 20 20 20 63 6c 6f  ERE.**       clo
215d0 73 65 20 77 6f 75 6c 64 20 63 68 61 6e 67 65 20  se would change 
215e0 74 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74  the meaning of t
215f0 68 65 20 4c 49 4d 49 54 29 2e 0a 2a 2a 0a 2a 2a  he LIMIT)..**.**
21600 20 20 20 28 34 29 20 54 68 65 20 69 6e 6e 65 72     (4) The inner
21610 20 71 75 65 72 79 20 69 73 20 74 68 65 20 72 69   query is the ri
21620 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61  ght operand of a
21630 20 4c 45 46 54 20 4a 4f 49 4e 2e 20 20 28 54 68   LEFT JOIN.  (Th
21640 65 20 63 61 6c 6c 65 72 0a 2a 2a 20 20 20 20 20  e caller.**     
21650 20 20 65 6e 66 6f 72 63 65 73 20 74 68 69 73 20    enforces this 
21660 72 65 73 74 72 69 63 74 69 6f 6e 20 73 69 6e 63  restriction sinc
21670 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 64  e this routine d
21680 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 65 6e 6f  oes not have eno
21690 75 67 68 0a 2a 2a 20 20 20 20 20 20 20 69 6e 66  ugh.**       inf
216a0 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 6b 6e 6f 77  ormation to know
216b0 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 28 35 29 20 54  .).**.**   (5) T
216c0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
216d0 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 69 67 69  expression origi
216e0 6e 61 74 65 73 20 69 6e 20 74 68 65 20 4f 4e 20  nates in the ON 
216f0 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 0a  or USING clause.
21700 2a 2a 20 20 20 20 20 20 20 6f 66 20 61 20 4c 45  **       of a LE
21710 46 54 20 4a 4f 49 4e 2e 0a 2a 2a 0a 2a 2a 20 52  FT JOIN..**.** R
21720 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 20 63 68  eturn 0 if no ch
21730 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 61  anges are made a
21740 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 6f  nd non-zero if o
21750 6e 65 20 6f 72 20 6d 6f 72 65 20 57 48 45 52 45  ne or more WHERE
21760 20 63 6c 61 75 73 65 0a 2a 2a 20 74 65 72 6d 73   clause.** terms
21770 20 61 72 65 20 64 75 70 6c 69 63 61 74 65 64 20   are duplicated 
21780 69 6e 74 6f 20 74 68 65 20 73 75 62 71 75 65 72  into the subquer
21790 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
217a0 20 70 75 73 68 44 6f 77 6e 57 68 65 72 65 54 65   pushDownWhereTe
217b0 72 6d 73 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  rms(.  sqlite3 *
217c0 64 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  db,          /* 
217d0 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
217e0 6e 65 63 74 69 6f 6e 20 28 66 6f 72 20 6d 61 6c  nection (for mal
217f0 6c 6f 63 28 29 29 20 2a 2f 0a 20 20 53 65 6c 65  loc()) */.  Sele
21800 63 74 20 2a 70 53 75 62 71 2c 20 20 20 20 20 20  ct *pSubq,      
21810 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72    /* The subquer
21820 79 20 77 68 6f 73 65 20 57 48 45 52 45 20 63 6c  y whose WHERE cl
21830 61 75 73 65 20 69 73 20 74 6f 20 62 65 20 61 75  ause is to be au
21840 67 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 45 78 70  gmented */.  Exp
21850 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20  r *pWhere,      
21860 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
21870 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75  clause of the ou
21880 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  ter query */.  i
21890 6e 74 20 69 43 75 72 73 6f 72 20 20 20 20 20 20  nt iCursor      
218a0 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e       /* Cursor n
218b0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 73 75 62  umber of the sub
218c0 71 75 65 72 79 20 2a 2f 0a 29 7b 0a 20 20 45 78  query */.){.  Ex
218d0 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  pr *pNew;.  int 
218e0 6e 43 68 6e 67 20 3d 20 30 3b 0a 20 20 53 65 6c  nChng = 0;.  Sel
218f0 65 63 74 20 2a 70 58 3b 20 20 20 20 20 20 20 20  ect *pX;        
21900 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
21910 67 20 6f 76 65 72 20 63 6f 6d 70 6f 75 6e 64 20  g over compound 
21920 53 45 4c 45 43 54 73 20 69 6e 20 70 53 75 62 71  SELECTs in pSubq
21930 20 2a 2f 0a 20 20 69 66 28 20 70 57 68 65 72 65   */.  if( pWhere
21940 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
21950 20 20 66 6f 72 28 70 58 3d 70 53 75 62 71 3b 20    for(pX=pSubq; 
21960 70 58 3b 20 70 58 3d 70 58 2d 3e 70 50 72 69 6f  pX; pX=pX->pPrio
21970 72 29 7b 0a 20 20 20 20 69 66 28 20 28 70 58 2d  r){.    if( (pX-
21980 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
21990 41 67 67 72 65 67 61 74 65 7c 53 46 5f 52 65 63  Aggregate|SF_Rec
219a0 75 72 73 69 76 65 29 29 21 3d 30 20 29 7b 0a 20  ursive))!=0 ){. 
219b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
219c0 58 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  X->selFlags & SF
219d0 5f 41 67 67 72 65 67 61 74 65 20 29 3b 0a 20 20  _Aggregate );.  
219e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58      testcase( pX
219f0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
21a00 52 65 63 75 72 73 69 76 65 20 29 3b 0a 20 20 20  Recursive );.   
21a10 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58 21     testcase( pX!
21a20 3d 70 53 75 62 71 20 29 3b 0a 20 20 20 20 20 20  =pSubq );.      
21a30 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72 65 73  return 0; /* res
21a40 74 72 69 63 74 69 6f 6e 73 20 28 31 29 20 61 6e  trictions (1) an
21a50 64 20 28 32 29 20 2a 2f 0a 20 20 20 20 7d 0a 20  d (2) */.    }. 
21a60 20 7d 0a 20 20 69 66 28 20 70 53 75 62 71 2d 3e   }.  if( pSubq->
21a70 70 4c 69 6d 69 74 21 3d 30 20 29 7b 0a 20 20 20  pLimit!=0 ){.   
21a80 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72 65   return 0; /* re
21a90 73 74 72 69 63 74 69 6f 6e 20 28 33 29 20 2a 2f  striction (3) */
21aa0 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 57  .  }.  while( pW
21ab0 68 65 72 65 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44  here->op==TK_AND
21ac0 20 29 7b 0a 20 20 20 20 6e 43 68 6e 67 20 2b 3d   ){.    nChng +=
21ad0 20 70 75 73 68 44 6f 77 6e 57 68 65 72 65 54 65   pushDownWhereTe
21ae0 72 6d 73 28 64 62 2c 20 70 53 75 62 71 2c 20 70  rms(db, pSubq, p
21af0 57 68 65 72 65 2d 3e 70 52 69 67 68 74 2c 20 69  Where->pRight, i
21b00 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 70 57 68  Cursor);.    pWh
21b10 65 72 65 20 3d 20 70 57 68 65 72 65 2d 3e 70 4c  ere = pWhere->pL
21b20 65 66 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 45  eft;.  }.  if( E
21b30 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
21b40 57 68 65 72 65 2c 45 50 5f 46 72 6f 6d 4a 6f 69  Where,EP_FromJoi
21b50 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 20 2f  n) ) return 0; /
21b60 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 20 35 20  * restriction 5 
21b70 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
21b80 45 78 70 72 49 73 54 61 62 6c 65 43 6f 6e 73 74  ExprIsTableConst
21b90 61 6e 74 28 70 57 68 65 72 65 2c 20 69 43 75 72  ant(pWhere, iCur
21ba0 73 6f 72 29 20 29 7b 0a 20 20 20 20 6e 43 68 6e  sor) ){.    nChn
21bb0 67 2b 2b 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  g++;.    while( 
21bc0 70 53 75 62 71 20 29 7b 0a 20 20 20 20 20 20 70  pSubq ){.      p
21bd0 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
21be0 72 44 75 70 28 64 62 2c 20 70 57 68 65 72 65 2c  rDup(db, pWhere,
21bf0 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20   0);.      pNew 
21c00 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20  = substExpr(db, 
21c10 70 4e 65 77 2c 20 69 43 75 72 73 6f 72 2c 20 70  pNew, iCursor, p
21c20 53 75 62 71 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  Subq->pEList);. 
21c30 20 20 20 20 20 70 53 75 62 71 2d 3e 70 57 68 65       pSubq->pWhe
21c40 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  re = sqlite3Expr
21c50 41 6e 64 28 64 62 2c 20 70 53 75 62 71 2d 3e 70  And(db, pSubq->p
21c60 57 68 65 72 65 2c 20 70 4e 65 77 29 3b 0a 20 20  Where, pNew);.  
21c70 20 20 20 20 70 53 75 62 71 20 3d 20 70 53 75 62      pSubq = pSub
21c80 71 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 7d  q->pPrior;.    }
21c90 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 43  .  }.  return nC
21ca0 68 6e 67 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  hng;.}.#endif /*
21cb0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
21cc0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
21cd0 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
21ce0 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f  TE_OMIT_VIEW) */
21cf0 0a 0a 2f 2a 0a 2a 2a 20 42 61 73 65 64 20 6f 6e  ../*.** Based on
21d00 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
21d10 20 74 68 65 20 41 67 67 49 6e 66 6f 20 73 74 72   the AggInfo str
21d20 75 63 74 75 72 65 20 69 6e 64 69 63 61 74 65 64  ucture indicated
21d30 20 62 79 20 74 68 65 20 66 69 72 73 74 0a 2a 2a   by the first.**
21d40 20 61 72 67 75 6d 65 6e 74 2c 20 74 68 69 73 20   argument, this 
21d50 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20  function checks 
21d60 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  if the following
21d70 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a   are true:.**.**
21d80 20 20 20 20 2a 20 74 68 65 20 71 75 65 72 79 20      * the query 
21d90 63 6f 6e 74 61 69 6e 73 20 6a 75 73 74 20 61 20  contains just a 
21da0 73 69 6e 67 6c 65 20 61 67 67 72 65 67 61 74 65  single aggregate
21db0 20 66 75 6e 63 74 69 6f 6e 2c 0a 2a 2a 20 20 20   function,.**   
21dc0 20 2a 20 74 68 65 20 61 67 67 72 65 67 61 74 65   * the aggregate
21dd0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 65 69 74   function is eit
21de0 68 65 72 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  her min() or max
21df0 28 29 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 2a 20  (), and.**    * 
21e00 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  the argument to 
21e10 74 68 65 20 61 67 67 72 65 67 61 74 65 20 66 75  the aggregate fu
21e20 6e 63 74 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75  nction is a colu
21e30 6d 6e 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20  mn value..**.** 
21e40 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 62  If all of the ab
21e50 6f 76 65 20 61 72 65 20 74 72 75 65 2c 20 74 68  ove are true, th
21e60 65 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59  en WHERE_ORDERBY
21e70 5f 4d 49 4e 20 6f 72 20 57 48 45 52 45 5f 4f 52  _MIN or WHERE_OR
21e80 44 45 52 42 59 5f 4d 41 58 0a 2a 2a 20 69 73 20  DERBY_MAX.** is 
21e90 72 65 74 75 72 6e 65 64 20 61 73 20 61 70 70 72  returned as appr
21ea0 6f 70 72 69 61 74 65 2e 20 41 6c 73 6f 2c 20 2a  opriate. Also, *
21eb0 70 70 4d 69 6e 4d 61 78 20 69 73 20 73 65 74 20  ppMinMax is set 
21ec0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
21ed0 0a 2a 2a 20 6c 69 73 74 20 6f 66 20 61 72 67 75  .** list of argu
21ee0 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20  ments passed to 
21ef0 74 68 65 20 61 67 67 72 65 67 61 74 65 20 62 65  the aggregate be
21f00 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
21f10 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65  **.** Or, if the
21f20 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76   conditions abov
21f30 65 20 61 72 65 20 6e 6f 74 20 6d 65 74 2c 20 2a  e are not met, *
21f40 70 70 4d 69 6e 4d 61 78 20 69 73 20 73 65 74 20  ppMinMax is set 
21f50 74 6f 20 30 20 61 6e 64 0a 2a 2a 20 57 48 45 52  to 0 and.** WHER
21f60 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c  E_ORDERBY_NORMAL
21f70 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
21f80 0a 73 74 61 74 69 63 20 75 38 20 6d 69 6e 4d 61  .static u8 minMa
21f90 78 51 75 65 72 79 28 41 67 67 49 6e 66 6f 20 2a  xQuery(AggInfo *
21fa0 70 41 67 67 49 6e 66 6f 2c 20 45 78 70 72 4c 69  pAggInfo, ExprLi
21fb0 73 74 20 2a 2a 70 70 4d 69 6e 4d 61 78 29 7b 0a  st **ppMinMax){.
21fc0 20 20 69 6e 74 20 65 52 65 74 20 3d 20 57 48 45    int eRet = WHE
21fd0 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41  RE_ORDERBY_NORMA
21fe0 4c 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  L;          /* R
21ff0 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a  eturn value */..
22000 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 30 3b    *ppMinMax = 0;
22010 0a 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d  .  if( pAggInfo-
22020 3e 6e 46 75 6e 63 3d 3d 31 20 29 7b 0a 20 20 20  >nFunc==1 ){.   
22030 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
22040 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30  AggInfo->aFunc[0
22050 5d 2e 70 45 78 70 72 3b 20 2f 2a 20 41 67 67 72  ].pExpr; /* Aggr
22060 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 2a  egate function *
22070 2f 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  /.    ExprList *
22080 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  pEList = pExpr->
22090 78 2e 70 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a  x.pList;      /*
220a0 20 41 72 67 75 6d 65 6e 74 73 20 74 6f 20 61 67   Arguments to ag
220b0 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20  g function */.. 
220c0 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
220d0 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e  ->op==TK_AGG_FUN
220e0 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 69 66 28  CTION );.    if(
220f0 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73   pEList && pELis
22100 74 2d 3e 6e 45 78 70 72 3d 3d 31 20 26 26 20 70  t->nExpr==1 && p
22110 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
22120 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f  r->op==TK_AGG_CO
22130 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 63 6f  LUMN ){.      co
22140 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 20  nst char *zFunc 
22150 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  = pExpr->u.zToke
22160 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  n;.      if( sql
22170 69 74 65 33 53 74 72 49 43 6d 70 28 7a 46 75 6e  ite3StrICmp(zFun
22180 63 2c 20 22 6d 69 6e 22 29 3d 3d 30 20 29 7b 0a  c, "min")==0 ){.
22190 20 20 20 20 20 20 20 20 65 52 65 74 20 3d 20 57          eRet = W
221a0 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e  HERE_ORDERBY_MIN
221b0 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 4d 69 6e  ;.        *ppMin
221c0 4d 61 78 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20  Max = pEList;.  
221d0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71      }else if( sq
221e0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 46 75  lite3StrICmp(zFu
221f0 6e 63 2c 20 22 6d 61 78 22 29 3d 3d 30 20 29 7b  nc, "max")==0 ){
22200 0a 20 20 20 20 20 20 20 20 65 52 65 74 20 3d 20  .        eRet = 
22210 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41  WHERE_ORDERBY_MA
22220 58 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 4d 69  X;.        *ppMi
22230 6e 4d 61 78 20 3d 20 70 45 4c 69 73 74 3b 0a 20  nMax = pEList;. 
22240 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
22250 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 70 4d  ..  assert( *ppM
22260 69 6e 4d 61 78 3d 3d 30 20 7c 7c 20 28 2a 70 70  inMax==0 || (*pp
22270 4d 69 6e 4d 61 78 29 2d 3e 6e 45 78 70 72 3d 3d  MinMax)->nExpr==
22280 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 65 52  1 );.  return eR
22290 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  et;.}../*.** The
222a0 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
222b0 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
222c0 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
222d0 73 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 71  s an aggregate q
222e0 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 65 63  uery..** The sec
222f0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
22300 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 61  the associated a
22310 67 67 72 65 67 61 74 65 2d 69 6e 66 6f 20 6f 62  ggregate-info ob
22320 6a 65 63 74 2e 20 54 68 69 73 20 0a 2a 2a 20 66  ject. This .** f
22330 75 6e 63 74 69 6f 6e 20 74 65 73 74 73 20 69 66  unction tests if
22340 20 74 68 65 20 53 45 4c 45 43 54 20 69 73 20 6f   the SELECT is o
22350 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  f the form:.**.*
22360 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74  *   SELECT count
22370 28 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 2a  (*) FROM <tbl>.*
22380 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61 62 6c 65  *.** where table
22390 20 69 73 20 61 20 64 61 74 61 62 61 73 65 20 74   is a database t
223a0 61 62 6c 65 2c 20 6e 6f 74 20 61 20 73 75 62 2d  able, not a sub-
223b0 73 65 6c 65 63 74 20 6f 72 20 76 69 65 77 2e 20  select or view. 
223c0 49 66 20 74 68 65 20 71 75 65 72 79 0a 2a 2a 20  If the query.** 
223d0 64 6f 65 73 20 6d 61 74 63 68 20 74 68 69 73 20  does match this 
223e0 70 61 74 74 65 72 6e 2c 20 74 68 65 6e 20 61 20  pattern, then a 
223f0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 54  pointer to the T
22400 61 62 6c 65 20 6f 62 6a 65 63 74 20 72 65 70 72  able object repr
22410 65 73 65 6e 74 69 6e 67 0a 2a 2a 20 3c 74 62 6c  esenting.** <tbl
22420 3e 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  > is returned. O
22430 74 68 65 72 77 69 73 65 2c 20 30 20 69 73 20 72  therwise, 0 is r
22440 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
22450 69 63 20 54 61 62 6c 65 20 2a 69 73 53 69 6d 70  ic Table *isSimp
22460 6c 65 43 6f 75 6e 74 28 53 65 6c 65 63 74 20 2a  leCount(Select *
22470 70 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67  p, AggInfo *pAgg
22480 49 6e 66 6f 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Info){.  Table *
22490 70 54 61 62 3b 0a 20 20 45 78 70 72 20 2a 70 45  pTab;.  Expr *pE
224a0 78 70 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  xpr;..  assert( 
224b0 21 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 3b 0a  !p->pGroupBy );.
224c0 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65  .  if( p->pWhere
224d0 20 7c 7c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e   || p->pEList->n
224e0 45 78 70 72 21 3d 31 20 0a 20 20 20 7c 7c 20 70  Expr!=1 .   || p
224f0 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20  ->pSrc->nSrc!=1 
22500 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d  || p->pSrc->a[0]
22510 2e 70 53 65 6c 65 63 74 0a 20 20 29 7b 0a 20 20  .pSelect.  ){.  
22520 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
22530 20 20 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63    pTab = p->pSrc
22540 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 70  ->a[0].pTab;.  p
22550 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74  Expr = p->pEList
22560 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
22570 61 73 73 65 72 74 28 20 70 54 61 62 20 26 26 20  assert( pTab && 
22580 21 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 26  !pTab->pSelect &
22590 26 20 70 45 78 70 72 20 29 3b 0a 0a 20 20 69 66  & pExpr );..  if
225a0 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
225b0 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
225c0 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
225d0 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29  K_AGG_FUNCTION )
225e0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
225f0 20 4e 45 56 45 52 28 70 41 67 67 49 6e 66 6f 2d   NEVER(pAggInfo-
22600 3e 6e 46 75 6e 63 3d 3d 30 29 20 29 20 72 65 74  >nFunc==0) ) ret
22610 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 41  urn 0;.  if( (pA
22620 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d  ggInfo->aFunc[0]
22630 2e 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67  .pFunc->funcFlag
22640 73 26 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f  s&SQLITE_FUNC_CO
22650 55 4e 54 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  UNT)==0 ) return
22660 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d   0;.  if( pExpr-
22670 3e 66 6c 61 67 73 26 45 50 5f 44 69 73 74 69 6e  >flags&EP_Distin
22680 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  ct ) return 0;..
22690 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d    return pTab;.}
226a0 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73  ../*.** If the s
226b0 6f 75 72 63 65 2d 6c 69 73 74 20 69 74 65 6d 20  ource-list item 
226c0 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67  passed as an arg
226d0 75 6d 65 6e 74 20 77 61 73 20 61 75 67 6d 65 6e  ument was augmen
226e0 74 65 64 20 77 69 74 68 20 61 6e 0a 2a 2a 20 49  ted with an.** I
226f0 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
22700 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 20 6c 6f  , then try to lo
22710 63 61 74 65 20 74 68 65 20 73 70 65 63 69 66 69  cate the specifi
22720 65 64 20 69 6e 64 65 78 2e 20 49 66 20 74 68 65  ed index. If the
22730 72 65 0a 2a 2a 20 77 61 73 20 73 75 63 68 20 61  re.** was such a
22740 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65 20   clause and the 
22750 6e 61 6d 65 64 20 69 6e 64 65 78 20 63 61 6e 6e  named index cann
22760 6f 74 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74  ot be found, ret
22770 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45  urn .** SQLITE_E
22780 52 52 4f 52 20 61 6e 64 20 6c 65 61 76 65 20 61  RROR and leave a
22790 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73  n error in pPars
227a0 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 70 6f  e. Otherwise, po
227b0 70 75 6c 61 74 65 20 0a 2a 2a 20 70 46 72 6f 6d  pulate .** pFrom
227c0 2d 3e 70 49 6e 64 65 78 20 61 6e 64 20 72 65 74  ->pIndex and ret
227d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  urn SQLITE_OK..*
227e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 64  /.int sqlite3Ind
227f0 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28 50 61 72  exedByLookup(Par
22800 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72 75  se *pParse, stru
22810 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
22820 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70  *pFrom){.  if( p
22830 46 72 6f 6d 2d 3e 70 54 61 62 20 26 26 20 70 46  From->pTab && pF
22840 72 6f 6d 2d 3e 7a 49 6e 64 65 78 20 29 7b 0a 20  rom->zIndex ){. 
22850 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
22860 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20   pFrom->pTab;.  
22870 20 20 63 68 61 72 20 2a 7a 49 6e 64 65 78 20 3d    char *zIndex =
22880 20 70 46 72 6f 6d 2d 3e 7a 49 6e 64 65 78 3b 0a   pFrom->zIndex;.
22890 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
228a0 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54  .    for(pIdx=pT
228b0 61 62 2d 3e 70 49 6e 64 65 78 3b 20 0a 20 20 20  ab->pIndex; .   
228c0 20 20 20 20 20 70 49 64 78 20 26 26 20 73 71 6c       pIdx && sql
228d0 69 74 65 33 53 74 72 49 43 6d 70 28 70 49 64 78  ite3StrICmp(pIdx
228e0 2d 3e 7a 4e 61 6d 65 2c 20 7a 49 6e 64 65 78 29  ->zName, zIndex)
228f0 3b 20 0a 20 20 20 20 20 20 20 20 70 49 64 78 3d  ; .        pIdx=
22900 70 49 64 78 2d 3e 70 4e 65 78 74 0a 20 20 20 20  pIdx->pNext.    
22910 29 3b 0a 20 20 20 20 69 66 28 20 21 70 49 64 78  );.    if( !pIdx
22920 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
22930 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
22940 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78  , "no such index
22950 3a 20 25 73 22 2c 20 7a 49 6e 64 65 78 2c 20 30  : %s", zIndex, 0
22960 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
22970 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31  >checkSchema = 1
22980 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
22990 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
229a0 20 7d 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 49   }.    pFrom->pI
229b0 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 7d  ndex = pIdx;.  }
229c0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
229d0 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 44 65 74  _OK;.}./*.** Det
229e0 65 63 74 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  ect compound SEL
229f0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74  ECT statements t
22a00 68 61 74 20 75 73 65 20 61 6e 20 4f 52 44 45 52  hat use an ORDER
22a10 20 42 59 20 63 6c 61 75 73 65 20 77 69 74 68 20   BY clause with 
22a20 0a 2a 2a 20 61 6e 20 61 6c 74 65 72 6e 61 74 69  .** an alternati
22a30 76 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  ve collating seq
22a40 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  uence..**.**    
22a50 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20  SELECT ... FROM 
22a60 74 31 20 45 58 43 45 50 54 20 53 45 4c 45 43 54  t1 EXCEPT SELECT
22a70 20 2e 2e 2e 20 46 52 4f 4d 20 74 32 20 4f 52 44   ... FROM t2 ORD
22a80 45 52 20 42 59 20 2e 2e 20 43 4f 4c 4c 41 54 45  ER BY .. COLLATE
22a90 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65   ....**.** These
22aa0 20 61 72 65 20 72 65 77 72 69 74 74 65 6e 20 61   are rewritten a
22ab0 73 20 61 20 73 75 62 71 75 65 72 79 3a 0a 2a 2a  s a subquery:.**
22ac0 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .**    SELECT * 
22ad0 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e  FROM (SELECT ...
22ae0 20 46 52 4f 4d 20 74 31 20 45 58 43 45 50 54 20   FROM t1 EXCEPT 
22af0 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20  SELECT ... FROM 
22b00 74 32 29 0a 2a 2a 20 20 20 20 20 4f 52 44 45 52  t2).**     ORDER
22b10 20 42 59 20 2e 2e 2e 20 43 4f 4c 4c 41 54 45 20   BY ... COLLATE 
22b20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 74  ....**.** This t
22b30 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73  ransformation is
22b40 20 6e 65 63 65 73 73 61 72 79 20 62 65 63 61 75   necessary becau
22b50 73 65 20 74 68 65 20 6d 75 6c 74 69 53 65 6c 65  se the multiSele
22b60 63 74 4f 72 64 65 72 42 79 28 29 20 72 6f 75 74  ctOrderBy() rout
22b70 69 6e 65 0a 2a 2a 20 61 62 6f 76 65 20 74 68 61  ine.** above tha
22b80 74 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20  t generates the 
22b90 63 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d 70 6f  code for a compo
22ba0 75 6e 64 20 53 45 4c 45 43 54 20 77 69 74 68 20  und SELECT with 
22bb0 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
22bc0 73 65 0a 2a 2a 20 75 73 65 73 20 61 20 6d 65 72  se.** uses a mer
22bd0 67 65 20 61 6c 67 6f 72 69 74 68 6d 20 74 68 61  ge algorithm tha
22be0 74 20 72 65 71 75 69 72 65 73 20 74 68 65 20 73  t requires the s
22bf0 61 6d 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ame collating se
22c00 71 75 65 6e 63 65 20 6f 6e 20 74 68 65 0a 2a 2a  quence on the.**
22c10 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
22c20 61 73 20 6f 6e 20 74 68 65 20 4f 52 44 45 52 20  as on the ORDER 
22c30 42 59 20 63 6c 61 75 73 65 2e 20 20 53 65 65 20  BY clause.  See 
22c40 74 69 63 6b 65 74 0a 2a 2a 20 68 74 74 70 3a 2f  ticket.** http:/
22c50 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f 72 67 2f  /www.sqlite.org/
22c60 73 72 63 2f 69 6e 66 6f 2f 36 37 30 39 35 37 34  src/info/6709574
22c70 64 32 61 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 74  d2a.**.** This t
22c80 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73  ransformation is
22c90 20 6f 6e 6c 79 20 6e 65 65 64 65 64 20 66 6f 72   only needed for
22ca0 20 45 58 43 45 50 54 2c 20 49 4e 54 45 52 53 45   EXCEPT, INTERSE
22cb0 43 54 2c 20 61 6e 64 20 55 4e 49 4f 4e 2e 0a 2a  CT, and UNION..*
22cc0 2a 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20  * The UNION ALL 
22cd0 6f 70 65 72 61 74 6f 72 20 77 6f 72 6b 73 20 66  operator works f
22ce0 69 6e 65 20 77 69 74 68 20 6d 75 6c 74 69 53 65  ine with multiSe
22cf0 6c 65 63 74 4f 72 64 65 72 42 79 28 29 20 65 76  lectOrderBy() ev
22d00 65 6e 20 77 68 65 6e 0a 2a 2a 20 74 68 65 72 65  en when.** there
22d10 20 61 72 65 20 43 4f 4c 4c 41 54 45 20 74 65 72   are COLLATE ter
22d20 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20  ms in the ORDER 
22d30 42 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  BY..*/.static in
22d40 74 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e  t convertCompoun
22d50 64 53 65 6c 65 63 74 54 6f 53 75 62 71 75 65 72  dSelectToSubquer
22d60 79 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  y(Walker *pWalke
22d70 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  r, Select *p){. 
22d80 20 69 6e 74 20 69 3b 0a 20 20 53 65 6c 65 63 74   int i;.  Select
22d90 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74   *pNew;.  Select
22da0 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74 65 33 20   *pX;.  sqlite3 
22db0 2a 64 62 3b 0a 20 20 73 74 72 75 63 74 20 45 78  *db;.  struct Ex
22dc0 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a  prList_item *a;.
22dd0 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 53    SrcList *pNewS
22de0 72 63 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  rc;.  Parse *pPa
22df0 72 73 65 3b 0a 20 20 54 6f 6b 65 6e 20 64 75 6d  rse;.  Token dum
22e00 6d 79 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 50  my;..  if( p->pP
22e10 72 69 6f 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  rior==0 ) return
22e20 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20   WRC_Continue;. 
22e30 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
22e40 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
22e50 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 66 6f 72  _Continue;.  for
22e60 28 70 58 3d 70 3b 20 70 58 20 26 26 20 28 70 58  (pX=p; pX && (pX
22e70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20  ->op==TK_ALL || 
22e80 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  pX->op==TK_SELEC
22e90 54 29 3b 20 70 58 3d 70 58 2d 3e 70 50 72 69 6f  T); pX=pX->pPrio
22ea0 72 29 7b 7d 0a 20 20 69 66 28 20 70 58 3d 3d 30  r){}.  if( pX==0
22eb0 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f   ) return WRC_Co
22ec0 6e 74 69 6e 75 65 3b 0a 20 20 61 20 3d 20 70 2d  ntinue;.  a = p-
22ed0 3e 70 4f 72 64 65 72 42 79 2d 3e 61 3b 0a 20 20  >pOrderBy->a;.  
22ee0 66 6f 72 28 69 3d 70 2d 3e 70 4f 72 64 65 72 42  for(i=p->pOrderB
22ef0 79 2d 3e 6e 45 78 70 72 2d 31 3b 20 69 3e 3d 30  y->nExpr-1; i>=0
22f00 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20  ; i--){.    if( 
22f10 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 66 6c 61 67  a[i].pExpr->flag
22f20 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29  s & EP_Collate )
22f30 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66   break;.  }.  if
22f40 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e 20 57  ( i<0 ) return W
22f50 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20  RC_Continue;..  
22f60 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  /* If we reach t
22f70 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 61 74 20  his point, that 
22f80 6d 65 61 6e 73 20 74 68 65 20 74 72 61 6e 73 66  means the transf
22f90 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72 65 71 75  ormation is requ
22fa0 69 72 65 64 2e 20 2a 2f 0a 0a 20 20 70 50 61 72  ired. */..  pPar
22fb0 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50  se = pWalker->pP
22fc0 61 72 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61  arse;.  db = pPa
22fd0 72 73 65 2d 3e 64 62 3b 0a 20 20 70 4e 65 77 20  rse->db;.  pNew 
22fe0 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
22ff0 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
23000 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28  (*pNew) );.  if(
23010 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
23020 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 6d  n WRC_Abort;.  m
23030 65 6d 73 65 74 28 26 64 75 6d 6d 79 2c 20 30 2c  emset(&dummy, 0,
23040 20 73 69 7a 65 6f 66 28 64 75 6d 6d 79 29 29 3b   sizeof(dummy));
23050 0a 20 20 70 4e 65 77 53 72 63 20 3d 20 73 71 6c  .  pNewSrc = sql
23060 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
23070 64 46 72 6f 6d 54 65 72 6d 28 70 50 61 72 73 65  dFromTerm(pParse
23080 2c 30 2c 30 2c 30 2c 26 64 75 6d 6d 79 2c 70 4e  ,0,0,0,&dummy,pN
23090 65 77 2c 30 2c 30 29 3b 0a 20 20 69 66 28 20 70  ew,0,0);.  if( p
230a0 4e 65 77 53 72 63 3d 3d 30 20 29 20 72 65 74 75  NewSrc==0 ) retu
230b0 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
230c0 2a 70 4e 65 77 20 3d 20 2a 70 3b 0a 20 20 70 2d  *pNew = *p;.  p-
230d0 3e 70 53 72 63 20 3d 20 70 4e 65 77 53 72 63 3b  >pSrc = pNewSrc;
230e0 0a 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 73  .  p->pEList = s
230f0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
23100 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20  pend(pParse, 0, 
23110 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20  sqlite3Expr(db, 
23120 54 4b 5f 41 4c 4c 2c 20 30 29 29 3b 0a 20 20 70  TK_ALL, 0));.  p
23130 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54  ->op = TK_SELECT
23140 3b 0a 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20  ;.  p->pWhere = 
23150 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75  0;.  pNew->pGrou
23160 70 42 79 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  pBy = 0;.  pNew-
23170 3e 70 48 61 76 69 6e 67 20 3d 20 30 3b 0a 20 20  >pHaving = 0;.  
23180 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d  pNew->pOrderBy =
23190 20 30 3b 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20   0;.  p->pPrior 
231a0 3d 20 30 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20  = 0;.  p->pNext 
231b0 3d 20 30 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61  = 0;.  p->selFla
231c0 67 73 20 26 3d 20 7e 53 46 5f 43 6f 6d 70 6f 75  gs &= ~SF_Compou
231d0 6e 64 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70  nd;.  assert( (p
231e0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
231f0 43 6f 6e 76 65 72 74 65 64 29 3d 3d 30 20 29 3b  Converted)==0 );
23200 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c  .  p->selFlags |
23210 3d 20 53 46 5f 43 6f 6e 76 65 72 74 65 64 3b 0a  = SF_Converted;.
23220 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
23230 70 50 72 69 6f 72 21 3d 30 20 29 3b 0a 20 20 70  pPrior!=0 );.  p
23240 4e 65 77 2d 3e 70 50 72 69 6f 72 2d 3e 70 4e 65  New->pPrior->pNe
23250 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 70 4e 65  xt = pNew;.  pNe
23260 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  w->pLimit = 0;. 
23270 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d   pNew->pOffset =
23280 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43   0;.  return WRC
23290 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 23 69  _Continue;.}..#i
232a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
232b0 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 41 72 67 75  T_CTE./*.** Argu
232c0 6d 65 6e 74 20 70 57 69 74 68 20 28 77 68 69 63  ment pWith (whic
232d0 68 20 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20 70  h may be NULL) p
232e0 6f 69 6e 74 73 20 74 6f 20 61 20 6c 69 6e 6b 65  oints to a linke
232f0 64 20 6c 69 73 74 20 6f 66 20 6e 65 73 74 65 64  d list of nested
23300 20 0a 2a 2a 20 57 49 54 48 20 63 6f 6e 74 65 78   .** WITH contex
23310 74 73 2c 20 66 72 6f 6d 20 69 6e 6e 65 72 20 74  ts, from inner t
23320 6f 20 6f 75 74 65 72 6d 6f 73 74 2e 20 49 66 20  o outermost. If 
23330 74 68 65 20 74 61 62 6c 65 20 69 64 65 6e 74 69  the table identi
23340 66 69 65 64 20 62 79 20 0a 2a 2a 20 46 52 4f 4d  fied by .** FROM
23350 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 20   clause element 
23360 70 49 74 65 6d 20 69 73 20 72 65 61 6c 6c 79 20  pItem is really 
23370 61 20 63 6f 6d 6d 6f 6e 2d 74 61 62 6c 65 2d 65  a common-table-e
23380 78 70 72 65 73 73 69 6f 6e 20 28 43 54 45 29 20  xpression (CTE) 
23390 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20  .** then return 
233a0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
233b0 20 43 54 45 20 64 65 66 69 6e 69 74 69 6f 6e 20   CTE definition 
233c0 66 6f 72 20 74 68 61 74 20 74 61 62 6c 65 2e 20  for that table. 
233d0 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 72 65 74  Otherwise.** ret
233e0 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  urn NULL..**.** 
233f0 49 66 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61  If a non-NULL va
23400 6c 75 65 20 69 73 20 72 65 74 75 72 6e 65 64 2c  lue is returned,
23410 20 73 65 74 20 2a 70 70 43 6f 6e 74 65 78 74 20   set *ppContext 
23420 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
23430 57 69 74 68 0a 2a 2a 20 6f 62 6a 65 63 74 20 74  With.** object t
23440 68 61 74 20 74 68 65 20 72 65 74 75 72 6e 65 64  hat the returned
23450 20 43 54 45 20 62 65 6c 6f 6e 67 73 20 74 6f 2e   CTE belongs to.
23460 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63  .*/.static struc
23470 74 20 43 74 65 20 2a 73 65 61 72 63 68 57 69 74  t Cte *searchWit
23480 68 28 0a 20 20 57 69 74 68 20 2a 70 57 69 74 68  h(.  With *pWith
23490 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
234a0 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
234b0 6f 75 74 65 72 6d 6f 73 74 20 57 49 54 48 20 63  outermost WITH c
234c0 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63  lause */.  struc
234d0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
234e0 70 49 74 65 6d 2c 20 20 20 20 20 2f 2a 20 46 52  pItem,     /* FR
234f0 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e  OM clause elemen
23500 74 20 74 6f 20 72 65 73 6f 6c 76 65 20 2a 2f 0a  t to resolve */.
23510 20 20 57 69 74 68 20 2a 2a 70 70 43 6f 6e 74 65    With **ppConte
23520 78 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  xt              
23530 20 20 2f 2a 20 4f 55 54 3a 20 57 49 54 48 20 63    /* OUT: WITH c
23540 6c 61 75 73 65 20 72 65 74 75 72 6e 20 76 61 6c  lause return val
23550 75 65 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f  ue belongs to */
23560 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
23570 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20 70   *zName;.  if( p
23580 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 3d  Item->zDatabase=
23590 3d 30 20 26 26 20 28 7a 4e 61 6d 65 20 3d 20 70  =0 && (zName = p
235a0 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20  Item->zName)!=0 
235b0 29 7b 0a 20 20 20 20 57 69 74 68 20 2a 70 3b 0a  ){.    With *p;.
235c0 20 20 20 20 66 6f 72 28 70 3d 70 57 69 74 68 3b      for(p=pWith;
235d0 20 70 3b 20 70 3d 70 2d 3e 70 4f 75 74 65 72 29   p; p=p->pOuter)
235e0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
235f0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
23600 70 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20  p->nCte; i++){. 
23610 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
23620 65 33 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c  e3StrICmp(zName,
23630 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d   p->a[i].zName)=
23640 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
23650 2a 70 70 43 6f 6e 74 65 78 74 20 3d 20 70 3b 0a  *ppContext = p;.
23660 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
23670 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20   &p->a[i];.     
23680 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
23690 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
236a0 30 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f 64  0;.}../* The cod
236b0 65 20 67 65 6e 65 72 61 74 6f 72 20 6d 61 69 6e  e generator main
236c0 74 61 69 6e 73 20 61 20 73 74 61 63 6b 20 6f 66  tains a stack of
236d0 20 61 63 74 69 76 65 20 57 49 54 48 20 63 6c 61   active WITH cla
236e0 75 73 65 73 0a 2a 2a 20 77 69 74 68 20 74 68 65  uses.** with the
236f0 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 57 49 54 48   inner-most WITH
23700 20 63 6c 61 75 73 65 20 62 65 69 6e 67 20 61 74   clause being at
23710 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20   the top of the 
23720 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  stack..**.** Thi
23730 73 20 72 6f 75 74 69 6e 65 20 70 75 73 68 65 73  s routine pushes
23740 20 74 68 65 20 57 49 54 48 20 63 6c 61 75 73 65   the WITH clause
23750 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
23760 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a  econd argument.*
23770 2a 20 6f 6e 74 6f 20 74 68 65 20 74 6f 70 20 6f  * onto the top o
23780 66 20 74 68 65 20 73 74 61 63 6b 2e 20 49 66 20  f the stack. If 
23790 61 72 67 75 6d 65 6e 74 20 62 46 72 65 65 20 69  argument bFree i
237a0 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 69  s true, then thi
237b0 73 0a 2a 2a 20 57 49 54 48 20 63 6c 61 75 73 65  s.** WITH clause
237c0 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 70   will never be p
237d0 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20 73  opped from the s
237e0 74 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61  tack. In this ca
237f0 73 65 20 69 74 0a 2a 2a 20 73 68 6f 75 6c 64 20  se it.** should 
23800 62 65 20 66 72 65 65 64 20 61 6c 6f 6e 67 20 77  be freed along w
23810 69 74 68 20 74 68 65 20 50 61 72 73 65 20 6f 62  ith the Parse ob
23820 6a 65 63 74 2e 20 49 6e 20 6f 74 68 65 72 20 63  ject. In other c
23830 61 73 65 73 2c 20 77 68 65 6e 0a 2a 2a 20 62 46  ases, when.** bF
23840 72 65 65 3d 3d 30 2c 20 74 68 65 20 57 69 74 68  ree==0, the With
23850 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 62 65 20   object will be 
23860 66 72 65 65 64 20 61 6c 6f 6e 67 20 77 69 74 68  freed along with
23870 20 74 68 65 20 53 45 4c 45 43 54 20 0a 2a 2a 20   the SELECT .** 
23880 73 74 61 74 65 6d 65 6e 74 20 77 69 74 68 20 77  statement with w
23890 68 69 63 68 20 69 74 20 69 73 20 61 73 73 6f 63  hich it is assoc
238a0 69 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  iated..*/.void s
238b0 71 6c 69 74 65 33 57 69 74 68 50 75 73 68 28 50  qlite3WithPush(P
238c0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 57 69  arse *pParse, Wi
238d0 74 68 20 2a 70 57 69 74 68 2c 20 75 38 20 62 46  th *pWith, u8 bF
238e0 72 65 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ree){.  assert( 
238f0 62 46 72 65 65 3d 3d 30 20 7c 7c 20 70 50 61 72  bFree==0 || pPar
23900 73 65 2d 3e 70 57 69 74 68 3d 3d 30 20 29 3b 0a  se->pWith==0 );.
23910 20 20 69 66 28 20 70 57 69 74 68 20 29 7b 0a 20    if( pWith ){. 
23920 20 20 20 70 57 69 74 68 2d 3e 70 4f 75 74 65 72     pWith->pOuter
23930 20 3d 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68   = pParse->pWith
23940 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57  ;.    pParse->pW
23950 69 74 68 20 3d 20 70 57 69 74 68 3b 0a 20 20 20  ith = pWith;.   
23960 20 70 50 61 72 73 65 2d 3e 62 46 72 65 65 57 69   pParse->bFreeWi
23970 74 68 20 3d 20 62 46 72 65 65 3b 0a 20 20 7d 0a  th = bFree;.  }.
23980 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
23990 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20 69 66  nction checks if
239a0 20 61 72 67 75 6d 65 6e 74 20 70 46 72 6f 6d 20   argument pFrom 
239b0 72 65 66 65 72 73 20 74 6f 20 61 20 43 54 45 20  refers to a CTE 
239c0 64 65 63 6c 61 72 65 64 20 62 79 20 0a 2a 2a 20  declared by .** 
239d0 61 20 57 49 54 48 20 63 6c 61 75 73 65 20 6f 6e  a WITH clause on
239e0 20 74 68 65 20 73 74 61 63 6b 20 63 75 72 72 65   the stack curre
239f0 6e 74 6c 79 20 6d 61 69 6e 74 61 69 6e 65 64 20  ntly maintained 
23a00 62 79 20 74 68 65 20 70 61 72 73 65 72 2e 20 41  by the parser. A
23a10 6e 64 2c 0a 2a 2a 20 69 66 20 63 75 72 72 65 6e  nd,.** if curren
23a20 74 6c 79 20 70 72 6f 63 65 73 73 69 6e 67 20 61  tly processing a
23a30 20 43 54 45 20 65 78 70 72 65 73 73 69 6f 6e 2c   CTE expression,
23a40 20 69 66 20 69 74 20 69 73 20 61 20 72 65 63 75   if it is a recu
23a50 72 73 69 76 65 0a 2a 2a 20 72 65 66 65 72 65 6e  rsive.** referen
23a60 63 65 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  ce to the curren
23a70 74 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  t CTE..**.** If 
23a80 70 46 72 6f 6d 20 66 61 6c 6c 73 20 69 6e 74 6f  pFrom falls into
23a90 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 74   either of the t
23aa0 77 6f 20 63 61 74 65 67 6f 72 69 65 73 20 61 62  wo categories ab
23ab0 6f 76 65 2c 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ove, pFrom->pTab
23ac0 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72 20 66 69  .** and other fi
23ad0 65 6c 64 73 20 61 72 65 20 70 6f 70 75 6c 61 74  elds are populat
23ae0 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20  ed accordingly. 
23af0 54 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c  The caller shoul
23b00 64 20 63 68 65 63 6b 0a 2a 2a 20 28 70 46 72 6f  d check.** (pFro
23b10 6d 2d 3e 70 54 61 62 21 3d 30 29 20 74 6f 20 64  m->pTab!=0) to d
23b20 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72  etermine whether
23b30 20 6f 72 20 6e 6f 74 20 61 20 73 75 63 63 65 73   or not a succes
23b40 73 66 75 6c 20 6d 61 74 63 68 0a 2a 2a 20 77 61  sful match.** wa
23b50 73 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57  s found..**.** W
23b60 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20  hether or not a 
23b70 6d 61 74 63 68 20 69 73 20 66 6f 75 6e 64 2c 20  match is found, 
23b80 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
23b90 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f  urned if no erro
23ba0 72 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 49 66 20  r.** occurs. If 
23bb0 61 6e 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63  an error does oc
23bc0 63 75 72 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65  cur, an error me
23bd0 73 73 61 67 65 20 69 73 20 73 74 6f 72 65 64 20  ssage is stored 
23be0 69 6e 20 74 68 65 0a 2a 2a 20 70 61 72 73 65 72  in the.** parser
23bf0 20 61 6e 64 20 73 6f 6d 65 20 65 72 72 6f 72 20   and some error 
23c00 63 6f 64 65 20 6f 74 68 65 72 20 74 68 61 6e 20  code other than 
23c10 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
23c20 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
23c30 74 20 77 69 74 68 45 78 70 61 6e 64 28 0a 20 20  t withExpand(.  
23c40 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
23c50 20 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69   .  struct SrcLi
23c60 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 0a 29  st_item *pFrom.)
23c70 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
23c80 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61  e = pWalker->pPa
23c90 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  rse;.  sqlite3 *
23ca0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
23cb0 0a 20 20 73 74 72 75 63 74 20 43 74 65 20 2a 70  .  struct Cte *p
23cc0 43 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  Cte;            
23cd0 20 20 20 2f 2a 20 4d 61 74 63 68 65 64 20 43 54     /* Matched CT
23ce0 45 20 28 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f  E (or NULL if no
23cf0 20 6d 61 74 63 68 29 20 2a 2f 0a 20 20 57 69 74   match) */.  Wit
23d00 68 20 2a 70 57 69 74 68 3b 20 20 20 20 20 20 20  h *pWith;       
23d10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23d20 57 49 54 48 20 63 6c 61 75 73 65 20 74 68 61 74  WITH clause that
23d30 20 70 43 74 65 20 62 65 6c 6f 6e 67 73 20 74 6f   pCte belongs to
23d40 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
23d50 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b  From->pTab==0 );
23d60 0a 0a 20 20 70 43 74 65 20 3d 20 73 65 61 72 63  ..  pCte = searc
23d70 68 57 69 74 68 28 70 50 61 72 73 65 2d 3e 70 57  hWith(pParse->pW
23d80 69 74 68 2c 20 70 46 72 6f 6d 2c 20 26 70 57 69  ith, pFrom, &pWi
23d90 74 68 29 3b 0a 20 20 69 66 28 20 70 43 74 65 20  th);.  if( pCte 
23da0 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
23db0 61 62 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74  ab;.    ExprList
23dc0 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20 53 65   *pEList;.    Se
23dd0 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 20 20 20 20  lect *pSel;.    
23de0 53 65 6c 65 63 74 20 2a 70 4c 65 66 74 3b 20 20  Select *pLeft;  
23df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23e00 20 4c 65 66 74 2d 6d 6f 73 74 20 53 45 4c 45 43   Left-most SELEC
23e10 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  T statement */. 
23e20 20 20 20 69 6e 74 20 62 4d 61 79 52 65 63 75 72     int bMayRecur
23e30 73 69 76 65 3b 20 20 20 20 20 20 20 20 20 20 20  sive;           
23e40 20 2f 2a 20 54 72 75 65 20 69 66 20 63 6f 6d 70   /* True if comp
23e50 6f 75 6e 64 20 6a 6f 69 6e 65 64 20 62 79 20 55  ound joined by U
23e60 4e 49 4f 4e 20 5b 41 4c 4c 5d 20 2a 2f 0a 20 20  NION [ALL] */.  
23e70 20 20 57 69 74 68 20 2a 70 53 61 76 65 64 57 69    With *pSavedWi
23e80 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
23e90 2f 2a 20 49 6e 69 74 69 61 6c 20 76 61 6c 75 65  /* Initial value
23ea0 20 6f 66 20 70 50 61 72 73 65 2d 3e 70 57 69 74   of pParse->pWit
23eb0 68 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49 66 20  h */..    /* If 
23ec0 70 43 74 65 2d 3e 7a 45 72 72 20 69 73 20 6e 6f  pCte->zErr is no
23ed0 6e 2d 4e 55 4c 4c 20 61 74 20 74 68 69 73 20 70  n-NULL at this p
23ee0 6f 69 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20  oint, then this 
23ef0 69 73 20 61 6e 20 69 6c 6c 65 67 61 6c 0a 20 20  is an illegal.  
23f00 20 20 2a 2a 20 72 65 63 75 72 73 69 76 65 20 72    ** recursive r
23f10 65 66 65 72 65 6e 63 65 20 74 6f 20 43 54 45 20  eference to CTE 
23f20 70 43 74 65 2e 20 4c 65 61 76 65 20 61 6e 20 65  pCte. Leave an e
23f30 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65 20 61  rror in pParse a
23f40 6e 64 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a  nd return.    **
23f50 20 65 61 72 6c 79 2e 20 49 66 20 70 43 74 65 2d   early. If pCte-
23f60 3e 7a 45 72 72 20 69 73 20 4e 55 4c 4c 2c 20 74  >zErr is NULL, t
23f70 68 65 6e 20 74 68 69 73 20 69 73 20 6e 6f 74 20  hen this is not 
23f80 61 20 72 65 63 75 72 73 69 76 65 20 72 65 66 65  a recursive refe
23f90 72 65 6e 63 65 2e 0a 20 20 20 20 2a 2a 20 49 6e  rence..    ** In
23fa0 20 74 68 69 73 20 63 61 73 65 2c 20 70 72 6f 63   this case, proc
23fb0 65 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  eed.  */.    if(
23fc0 20 70 43 74 65 2d 3e 7a 45 72 72 20 29 7b 0a 20   pCte->zErr ){. 
23fd0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
23fe0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 70 43 74  rMsg(pParse, pCt
23ff0 65 2d 3e 7a 45 72 72 2c 20 70 43 74 65 2d 3e 7a  e->zErr, pCte->z
24000 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Name);.      ret
24010 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
24020 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73  ;.    }..    ass
24030 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ert( pFrom->pTab
24040 3d 3d 30 20 29 3b 0a 20 20 20 20 70 46 72 6f 6d  ==0 );.    pFrom
24050 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20  ->pTab = pTab = 
24060 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
24070 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54  ero(db, sizeof(T
24080 61 62 6c 65 29 29 3b 0a 20 20 20 20 69 66 28 20  able));.    if( 
24090 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e  pTab==0 ) return
240a0 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
240b0 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a  pTab->nRef = 1;.
240c0 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20      pTab->zName 
240d0 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
240e0 70 28 64 62 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d  p(db, pCte->zNam
240f0 65 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50  e);.    pTab->iP
24100 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20 20 70 54  Key = -1;.    pT
24110 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d  ab->nRowLogEst =
24120 20 32 30 30 3b 20 61 73 73 65 72 74 28 20 32 30   200; assert( 20
24130 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  0==sqlite3LogEst
24140 28 31 30 34 38 35 37 36 29 20 29 3b 0a 20 20 20  (1048576) );.   
24150 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20   pTab->tabFlags 
24160 7c 3d 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 3b  |= TF_Ephemeral;
24170 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  .    pFrom->pSel
24180 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
24190 65 63 74 44 75 70 28 64 62 2c 20 70 43 74 65 2d  ectDup(db, pCte-
241a0 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20  >pSelect, 0);.  
241b0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
241c0 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20  Failed ) return 
241d0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
241e0 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
241f0 3e 70 53 65 6c 65 63 74 20 29 3b 0a 0a 20 20 20  >pSelect );..   
24200 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 69   /* Check if thi
24210 73 20 69 73 20 61 20 72 65 63 75 72 73 69 76 65  s is a recursive
24220 20 43 54 45 2e 20 2a 2f 0a 20 20 20 20 70 53 65   CTE. */.    pSe
24230 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  l = pFrom->pSele
24240 63 74 3b 0a 20 20 20 20 62 4d 61 79 52 65 63 75  ct;.    bMayRecu
24250 72 73 69 76 65 20 3d 20 28 20 70 53 65 6c 2d 3e  rsive = ( pSel->
24260 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 53  op==TK_ALL || pS
24270 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e  el->op==TK_UNION
24280 20 29 3b 0a 20 20 20 20 69 66 28 20 62 4d 61 79   );.    if( bMay
24290 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20  Recursive ){.   
242a0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
242b0 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20  SrcList *pSrc = 
242c0 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e  pFrom->pSelect->
242d0 70 53 72 63 3b 0a 20 20 20 20 20 20 66 6f 72 28  pSrc;.      for(
242e0 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72  i=0; i<pSrc->nSr
242f0 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  c; i++){.       
24300 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
24310 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
24320 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20  Src->a[i];.     
24330 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 44     if( pItem->zD
24340 61 74 61 62 61 73 65 3d 3d 30 20 0a 20 20 20 20  atabase==0 .    
24350 20 20 20 20 20 26 26 20 70 49 74 65 6d 2d 3e 7a       && pItem->z
24360 4e 61 6d 65 21 3d 30 20 0a 20 20 20 20 20 20 20  Name!=0 .       
24370 20 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53    && 0==sqlite3S
24380 74 72 49 43 6d 70 28 70 49 74 65 6d 2d 3e 7a 4e  trICmp(pItem->zN
24390 61 6d 65 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65  ame, pCte->zName
243a0 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20  ).          ){. 
243b0 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
243c0 70 54 61 62 20 3d 20 70 54 61 62 3b 0a 20 20 20  pTab = pTab;.   
243d0 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 73         pItem->is
243e0 52 65 63 75 72 73 69 76 65 20 3d 20 31 3b 0a 20  Recursive = 1;. 
243f0 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e           pTab->n
24400 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Ref++;.         
24410 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20   pSel->selFlags 
24420 7c 3d 20 53 46 5f 52 65 63 75 72 73 69 76 65 3b  |= SF_Recursive;
24430 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
24440 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
24450 20 4f 6e 6c 79 20 6f 6e 65 20 72 65 63 75 72 73   Only one recurs
24460 69 76 65 20 72 65 66 65 72 65 6e 63 65 20 69 73  ive reference is
24470 20 70 65 72 6d 69 74 74 65 64 2e 20 2a 2f 20 0a   permitted. */ .
24480 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 52      if( pTab->nR
24490 65 66 3e 32 20 29 7b 0a 20 20 20 20 20 20 73 71  ef>2 ){.      sq
244a0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 0a 20  lite3ErrorMsg(. 
244b0 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c           pParse,
244c0 20 22 6d 75 6c 74 69 70 6c 65 20 72 65 66 65 72   "multiple refer
244d0 65 6e 63 65 73 20 74 6f 20 72 65 63 75 72 73 69  ences to recursi
244e0 76 65 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 70  ve table: %s", p
244f0 43 74 65 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20  Cte->zName.     
24500 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
24510 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
24520 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
24530 20 70 54 61 62 2d 3e 6e 52 65 66 3d 3d 31 20 7c   pTab->nRef==1 |
24540 7c 20 28 28 70 53 65 6c 2d 3e 73 65 6c 46 6c 61  | ((pSel->selFla
24550 67 73 26 53 46 5f 52 65 63 75 72 73 69 76 65 29  gs&SF_Recursive)
24560 20 26 26 20 70 54 61 62 2d 3e 6e 52 65 66 3d 3d   && pTab->nRef==
24570 32 20 29 29 3b 0a 0a 20 20 20 20 70 43 74 65 2d  2 ));..    pCte-
24580 3e 7a 45 72 72 20 3d 20 22 63 69 72 63 75 6c 61  >zErr = "circula
24590 72 20 72 65 66 65 72 65 6e 63 65 3a 20 25 73 22  r reference: %s"
245a0 3b 0a 20 20 20 20 70 53 61 76 65 64 57 69 74 68  ;.    pSavedWith
245b0 20 3d 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68   = pParse->pWith
245c0 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57  ;.    pParse->pW
245d0 69 74 68 20 3d 20 70 57 69 74 68 3b 0a 20 20 20  ith = pWith;.   
245e0 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
245f0 63 74 28 70 57 61 6c 6b 65 72 2c 20 62 4d 61 79  ct(pWalker, bMay
24600 52 65 63 75 72 73 69 76 65 20 3f 20 70 53 65 6c  Recursive ? pSel
24610 2d 3e 70 50 72 69 6f 72 20 3a 20 70 53 65 6c 29  ->pPrior : pSel)
24620 3b 0a 0a 20 20 20 20 66 6f 72 28 70 4c 65 66 74  ;..    for(pLeft
24630 3d 70 53 65 6c 3b 20 70 4c 65 66 74 2d 3e 70 50  =pSel; pLeft->pP
24640 72 69 6f 72 3b 20 70 4c 65 66 74 3d 70 4c 65 66  rior; pLeft=pLef
24650 74 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 20 20  t->pPrior);.    
24660 70 45 4c 69 73 74 20 3d 20 70 4c 65 66 74 2d 3e  pEList = pLeft->
24670 70 45 4c 69 73 74 3b 0a 20 20 20 20 69 66 28 20  pEList;.    if( 
24680 70 43 74 65 2d 3e 70 43 6f 6c 73 20 29 7b 0a 20  pCte->pCols ){. 
24690 20 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 20       if( pEList 
246a0 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  && pEList->nExpr
246b0 21 3d 70 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e  !=pCte->pCols->n
246c0 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
246d0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
246e0 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25  pParse, "table %
246f0 73 20 68 61 73 20 25 64 20 76 61 6c 75 65 73 20  s has %d values 
24700 66 6f 72 20 25 64 20 63 6f 6c 75 6d 6e 73 22 2c  for %d columns",
24710 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 74  .            pCt
24720 65 2d 3e 7a 4e 61 6d 65 2c 20 70 45 4c 69 73 74  e->zName, pEList
24730 2d 3e 6e 45 78 70 72 2c 20 70 43 74 65 2d 3e 70  ->nExpr, pCte->p
24740 43 6f 6c 73 2d 3e 6e 45 78 70 72 0a 20 20 20 20  Cols->nExpr.    
24750 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 70      );.        p
24760 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70  Parse->pWith = p
24770 53 61 76 65 64 57 69 74 68 3b 0a 20 20 20 20 20  SavedWith;.     
24780 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
24790 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
247a0 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70        pEList = p
247b0 43 74 65 2d 3e 70 43 6f 6c 73 3b 0a 20 20 20 20  Cte->pCols;.    
247c0 7d 0a 0a 20 20 20 20 73 65 6c 65 63 74 43 6f 6c  }..    selectCol
247d0 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74  umnsFromExprList
247e0 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2c  (pParse, pEList,
247f0 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70   &pTab->nCol, &p
24800 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20  Tab->aCol);.    
24810 69 66 28 20 62 4d 61 79 52 65 63 75 72 73 69 76  if( bMayRecursiv
24820 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  e ){.      if( p
24830 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  Sel->selFlags & 
24840 53 46 5f 52 65 63 75 72 73 69 76 65 20 29 7b 0a  SF_Recursive ){.
24850 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a 45          pCte->zE
24860 72 72 20 3d 20 22 6d 75 6c 74 69 70 6c 65 20 72  rr = "multiple r
24870 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e  ecursive referen
24880 63 65 73 3a 20 25 73 22 3b 0a 20 20 20 20 20 20  ces: %s";.      
24890 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
248a0 43 74 65 2d 3e 7a 45 72 72 20 3d 20 22 72 65 63  Cte->zErr = "rec
248b0 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63 65  ursive reference
248c0 20 69 6e 20 61 20 73 75 62 71 75 65 72 79 3a 20   in a subquery: 
248d0 25 73 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  %s";.      }.   
248e0 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65     sqlite3WalkSe
248f0 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53  lect(pWalker, pS
24900 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  el);.    }.    p
24910 43 74 65 2d 3e 7a 45 72 72 20 3d 20 30 3b 0a 20  Cte->zErr = 0;. 
24920 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68     pParse->pWith
24930 20 3d 20 70 53 61 76 65 64 57 69 74 68 3b 0a 20   = pSavedWith;. 
24940 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
24950 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
24960 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
24970 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20  _OMIT_CTE./*.** 
24980 49 66 20 74 68 65 20 53 45 4c 45 43 54 20 70 61  If the SELECT pa
24990 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
249a0 6e 64 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20  nd argument has 
249b0 61 6e 20 61 73 73 6f 63 69 61 74 65 64 20 57 49  an associated WI
249c0 54 48 20 0a 2a 2a 20 63 6c 61 75 73 65 2c 20 70  TH .** clause, p
249d0 6f 70 20 69 74 20 66 72 6f 6d 20 74 68 65 20 73  op it from the s
249e0 74 61 63 6b 20 73 74 6f 72 65 64 20 61 73 20 70  tack stored as p
249f0 61 72 74 20 6f 66 20 74 68 65 20 50 61 72 73 65  art of the Parse
24a00 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54   object..**.** T
24a10 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
24a20 75 73 65 64 20 61 73 20 74 68 65 20 78 53 65 6c  used as the xSel
24a30 65 63 74 43 61 6c 6c 62 61 63 6b 32 28 29 20 63  ectCallback2() c
24a40 61 6c 6c 62 61 63 6b 20 62 79 0a 2a 2a 20 73 71  allback by.** sq
24a50 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e  lite3SelectExpan
24a60 64 28 29 20 77 68 65 6e 20 77 61 6c 6b 69 6e 67  d() when walking
24a70 20 61 20 53 45 4c 45 43 54 20 74 72 65 65 20 74   a SELECT tree t
24a80 6f 20 72 65 73 6f 6c 76 65 20 74 61 62 6c 65 0a  o resolve table.
24a90 2a 2a 20 6e 61 6d 65 73 20 61 6e 64 20 6f 74 68  ** names and oth
24aa0 65 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65  er FROM clause e
24ab0 6c 65 6d 65 6e 74 73 2e 20 0a 2a 2f 0a 73 74 61  lements. .*/.sta
24ac0 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74 50  tic void selectP
24ad0 6f 70 57 69 74 68 28 57 61 6c 6b 65 72 20 2a 70  opWith(Walker *p
24ae0 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a  Walker, Select *
24af0 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  p){.  Parse *pPa
24b00 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70  rse = pWalker->p
24b10 50 61 72 73 65 3b 0a 20 20 57 69 74 68 20 2a 70  Parse;.  With *p
24b20 57 69 74 68 20 3d 20 66 69 6e 64 52 69 67 68 74  With = findRight
24b30 6d 6f 73 74 28 70 29 2d 3e 70 57 69 74 68 3b 0a  most(p)->pWith;.
24b40 20 20 69 66 28 20 70 57 69 74 68 21 3d 30 20 29    if( pWith!=0 )
24b50 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
24b60 61 72 73 65 2d 3e 70 57 69 74 68 3d 3d 70 57 69  arse->pWith==pWi
24b70 74 68 20 29 3b 0a 20 20 20 20 70 50 61 72 73 65  th );.    pParse
24b80 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68 2d  ->pWith = pWith-
24b90 3e 70 4f 75 74 65 72 3b 0a 20 20 7d 0a 7d 0a 23  >pOuter;.  }.}.#
24ba0 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 73 65 6c  else.#define sel
24bb0 65 63 74 50 6f 70 57 69 74 68 20 30 0a 23 65 6e  ectPopWith 0.#en
24bc0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
24bd0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 57 61 6c  routine is a Wal
24be0 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72  ker callback for
24bf0 20 22 65 78 70 61 6e 64 69 6e 67 22 20 61 20 53   "expanding" a S
24c00 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
24c10 0a 2a 2a 20 22 45 78 70 61 6e 64 69 6e 67 22 20  .** "Expanding" 
24c20 6d 65 61 6e 73 20 74 6f 20 64 6f 20 74 68 65 20  means to do the 
24c30 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
24c40 20 20 20 20 28 31 29 20 20 4d 61 6b 65 20 73 75      (1)  Make su
24c50 72 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e  re VDBE cursor n
24c60 75 6d 62 65 72 73 20 68 61 76 65 20 62 65 65 6e  umbers have been
24c70 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65 76 65   assigned to eve
24c80 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 65 6c  ry.**         el
24c90 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 46 52 4f  ement of the FRO
24ca0 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  M clause..**.** 
24cb0 20 20 20 28 32 29 20 20 46 69 6c 6c 20 69 6e 20     (2)  Fill in 
24cc0 74 68 65 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  the pTabList->a[
24cd0 5d 2e 70 54 61 62 20 66 69 65 6c 64 73 20 69 6e  ].pTab fields in
24ce0 20 74 68 65 20 53 72 63 4c 69 73 74 20 74 68 61   the SrcList tha
24cf0 74 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 65  t .**         de
24d00 66 69 6e 65 73 20 46 52 4f 4d 20 63 6c 61 75 73  fines FROM claus
24d10 65 2e 20 20 57 68 65 6e 20 76 69 65 77 73 20 61  e.  When views a
24d20 70 70 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f  ppear in the FRO
24d30 4d 20 63 6c 61 75 73 65 2c 0a 2a 2a 20 20 20 20  M clause,.**    
24d40 20 20 20 20 20 66 69 6c 6c 20 70 54 61 62 4c 69       fill pTabLi
24d50 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74 20  st->a[].pSelect 
24d60 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74  with a copy of t
24d70 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
24d80 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 74  ent.**         t
24d90 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  hat implements t
24da0 68 65 20 76 69 65 77 2e 20 20 41 20 63 6f 70 79  he view.  A copy
24db0 20 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20   is made of the 
24dc0 76 69 65 77 27 73 20 53 45 4c 45 43 54 0a 2a 2a  view's SELECT.**
24dd0 20 20 20 20 20 20 20 20 20 73 74 61 74 65 6d 65           stateme
24de0 6e 74 20 73 6f 20 74 68 61 74 20 77 65 20 63 61  nt so that we ca
24df0 6e 20 66 72 65 65 6c 79 20 6d 6f 64 69 66 79 20  n freely modify 
24e00 6f 72 20 64 65 6c 65 74 65 20 74 68 61 74 20 73  or delete that s
24e10 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20  tatement.**     
24e20 20 20 20 20 77 69 74 68 6f 75 74 20 77 6f 72 72      without worr
24e30 79 69 6e 67 20 61 62 6f 75 74 20 6d 65 73 73 69  ying about messi
24e40 6e 67 20 75 70 20 74 68 65 20 70 65 72 73 69 73  ng up the persis
24e50 74 65 6e 74 20 72 65 70 72 65 73 65 6e 74 61 74  tent representat
24e60 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f  ion.**         o
24e70 66 20 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a  f the view..**.*
24e80 2a 20 20 20 20 28 33 29 20 20 41 64 64 20 74 65  *    (3)  Add te
24e90 72 6d 73 20 74 6f 20 74 68 65 20 57 48 45 52 45  rms to the WHERE
24ea0 20 63 6c 61 75 73 65 20 74 6f 20 61 63 63 6f 6d   clause to accom
24eb0 6d 6f 64 61 74 65 20 74 68 65 20 4e 41 54 55 52  modate the NATUR
24ec0 41 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a 20 20 20  AL keyword.**   
24ed0 20 20 20 20 20 20 6f 6e 20 6a 6f 69 6e 73 20 61        on joins a
24ee0 6e 64 20 74 68 65 20 4f 4e 20 61 6e 64 20 55 53  nd the ON and US
24ef0 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 6a 6f  ING clause of jo
24f00 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34  ins..**.**    (4
24f10 29 20 20 53 63 61 6e 20 74 68 65 20 6c 69 73 74  )  Scan the list
24f20 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
24f30 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 28 70  he result set (p
24f40 45 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a  EList) looking.*
24f50 2a 20 20 20 20 20 20 20 20 20 66 6f 72 20 69 6e  *         for in
24f60 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20 22  stances of the "
24f70 2a 22 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 74  *" operator or t
24f80 68 65 20 54 41 42 4c 45 2e 2a 20 6f 70 65 72 61  he TABLE.* opera
24f90 74 6f 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20  tor..**         
24fa0 49 66 20 66 6f 75 6e 64 2c 20 65 78 70 61 6e 64  If found, expand
24fb0 20 65 61 63 68 20 22 2a 22 20 74 6f 20 62 65 20   each "*" to be 
24fc0 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20  every column in 
24fd0 65 76 65 72 79 20 74 61 62 6c 65 0a 2a 2a 20 20  every table.**  
24fe0 20 20 20 20 20 20 20 61 6e 64 20 54 41 42 4c 45         and TABLE
24ff0 2e 2a 20 74 6f 20 62 65 20 65 76 65 72 79 20 63  .* to be every c
25000 6f 6c 75 6d 6e 20 69 6e 20 54 41 42 4c 45 2e 0a  olumn in TABLE..
25010 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  **.*/.static int
25020 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72 28   selectExpander(
25030 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
25040 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50   Select *p){.  P
25050 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
25060 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a  Walker->pParse;.
25070 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20    int i, j, k;. 
25080 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
25090 73 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  st;.  ExprList *
250a0 70 45 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74  pEList;.  struct
250b0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
250c0 46 72 6f 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20  From;.  sqlite3 
250d0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
250e0 3b 0a 20 20 45 78 70 72 20 2a 70 45 2c 20 2a 70  ;.  Expr *pE, *p
250f0 52 69 67 68 74 2c 20 2a 70 45 78 70 72 3b 0a 20  Right, *pExpr;. 
25100 20 75 31 36 20 73 65 6c 46 6c 61 67 73 20 3d 20   u16 selFlags = 
25110 70 2d 3e 73 65 6c 46 6c 61 67 73 3b 0a 0a 20 20  p->selFlags;..  
25120 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  p->selFlags |= S
25130 46 5f 45 78 70 61 6e 64 65 64 3b 0a 20 20 69 66  F_Expanded;.  if
25140 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
25150 65 64 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ed  ){.    retur
25160 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d  n WRC_Abort;.  }
25170 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e  .  if( NEVER(p->
25180 70 53 72 63 3d 3d 30 29 20 7c 7c 20 28 73 65 6c  pSrc==0) || (sel
25190 46 6c 61 67 73 20 26 20 53 46 5f 45 78 70 61 6e  Flags & SF_Expan
251a0 64 65 64 29 21 3d 30 20 29 7b 0a 20 20 20 20 72  ded)!=0 ){.    r
251b0 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
251c0 0a 20 20 7d 0a 20 20 70 54 61 62 4c 69 73 74 20  .  }.  pTabList 
251d0 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c  = p->pSrc;.  pEL
251e0 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
251f0 0a 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e  .  if( pWalker->
25200 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32  xSelectCallback2
25210 3d 3d 73 65 6c 65 63 74 50 6f 70 57 69 74 68 20  ==selectPopWith 
25220 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 69  ){.    sqlite3Wi
25230 74 68 50 75 73 68 28 70 50 61 72 73 65 2c 20 66  thPush(pParse, f
25240 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29 2d  indRightmost(p)-
25250 3e 70 57 69 74 68 2c 20 30 29 3b 0a 20 20 7d 0a  >pWith, 0);.  }.
25260 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
25270 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68  cursor numbers h
25280 61 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65  ave been assigne
25290 64 20 74 6f 20 61 6c 6c 20 65 6e 74 72 69 65 73  d to all entries
252a0 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f   in.  ** the FRO
252b0 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
252c0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
252d0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
252e0 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72  SrcListAssignCur
252f0 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 54 61  sors(pParse, pTa
25300 62 4c 69 73 74 29 3b 0a 0a 20 20 2f 2a 20 4c 6f  bList);..  /* Lo
25310 6f 6b 20 75 70 20 65 76 65 72 79 20 74 61 62 6c  ok up every tabl
25320 65 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46  e named in the F
25330 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
25340 65 20 73 65 6c 65 63 74 2e 20 20 49 66 0a 20 20  e select.  If.  
25350 2a 2a 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74  ** an entry of t
25360 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
25370 73 20 61 20 73 75 62 71 75 65 72 79 20 69 6e 73  s a subquery ins
25380 74 65 61 64 20 6f 66 20 61 20 74 61 62 6c 65 20  tead of a table 
25390 6f 72 20 76 69 65 77 2c 0a 20 20 2a 2a 20 74 68  or view,.  ** th
253a0 65 6e 20 63 72 65 61 74 65 20 61 20 74 72 61 6e  en create a tran
253b0 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75  sient table stru
253c0 63 74 75 72 65 20 74 6f 20 64 65 73 63 72 69 62  cture to describ
253d0 65 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a  e the subquery..
253e0 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20    */.  for(i=0, 
253f0 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e  pFrom=pTabList->
25400 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  a; i<pTabList->n
25410 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b  Src; i++, pFrom+
25420 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  +){.    Table *p
25430 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Tab;.    assert(
25440 20 70 46 72 6f 6d 2d 3e 69 73 52 65 63 75 72 73   pFrom->isRecurs
25450 69 76 65 3d 3d 30 20 7c 7c 20 70 46 72 6f 6d 2d  ive==0 || pFrom-
25460 3e 70 54 61 62 20 29 3b 0a 20 20 20 20 69 66 28  >pTab );.    if(
25470 20 70 46 72 6f 6d 2d 3e 69 73 52 65 63 75 72 73   pFrom->isRecurs
25480 69 76 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ive ) continue;.
25490 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70      if( pFrom->p
254a0 54 61 62 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tab!=0 ){.      
254b0 2f 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e  /* This statemen
254c0 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  t has already be
254d0 65 6e 20 70 72 65 70 61 72 65 64 2e 20 20 54 68  en prepared.  Th
254e0 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20  ere is no need. 
254f0 20 20 20 20 20 2a 2a 20 74 6f 20 67 6f 20 66 75       ** to go fu
25500 72 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  rther. */.      
25510 61 73 73 65 72 74 28 20 69 3d 3d 30 20 29 3b 0a  assert( i==0 );.
25520 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
25530 4d 49 54 5f 43 54 45 0a 20 20 20 20 20 20 73 65  MIT_CTE.      se
25540 6c 65 63 74 50 6f 70 57 69 74 68 28 70 57 61 6c  lectPopWith(pWal
25550 6b 65 72 2c 20 70 29 3b 0a 23 65 6e 64 69 66 0a  ker, p);.#endif.
25560 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
25570 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 23 69  _Prune;.    }.#i
25580 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
25590 54 5f 43 54 45 0a 20 20 20 20 69 66 28 20 77 69  T_CTE.    if( wi
255a0 74 68 45 78 70 61 6e 64 28 70 57 61 6c 6b 65 72  thExpand(pWalker
255b0 2c 20 70 46 72 6f 6d 29 20 29 20 72 65 74 75 72  , pFrom) ) retur
255c0 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
255d0 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62   if( pFrom->pTab
255e0 20 29 20 7b 7d 20 65 6c 73 65 0a 23 65 6e 64 69   ) {} else.#endi
255f0 66 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d  f.    if( pFrom-
25600 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69 66  >zName==0 ){.#if
25610 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
25620 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 20 20  _SUBQUERY.      
25630 53 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70  Select *pSel = p
25640 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  From->pSelect;. 
25650 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75       /* A sub-qu
25660 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ery in the FROM 
25670 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45  clause of a SELE
25680 43 54 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  CT */.      asse
25690 72 74 28 20 70 53 65 6c 21 3d 30 20 29 3b 0a 20  rt( pSel!=0 );. 
256a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72       assert( pFr
256b0 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20  om->pTab==0 );. 
256c0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
256d0 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b  WalkSelect(pWalk
256e0 65 72 2c 20 70 53 65 6c 29 20 29 20 72 65 74 75  er, pSel) ) retu
256f0 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
25700 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20      pFrom->pTab 
25710 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33  = pTab = sqlite3
25720 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
25730 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b   sizeof(Table));
25740 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d  .      if( pTab=
25750 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
25760 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 70 54 61  Abort;.      pTa
25770 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  b->nRef = 1;.   
25780 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d     pTab->zName =
25790 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
257a0 64 62 2c 20 22 73 71 6c 69 74 65 5f 73 71 5f 25  db, "sqlite_sq_%
257b0 70 22 2c 20 28 76 6f 69 64 2a 29 70 54 61 62 29  p", (void*)pTab)
257c0 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70  ;.      while( p
257d0 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29 7b 20 70  Sel->pPrior ){ p
257e0 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69  Sel = pSel->pPri
257f0 6f 72 3b 20 7d 0a 20 20 20 20 20 20 73 65 6c 65  or; }.      sele
25800 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70  ctColumnsFromExp
25810 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53  rList(pParse, pS
25820 65 6c 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54 61  el->pEList, &pTa
25830 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e  b->nCol, &pTab->
25840 61 43 6f 6c 29 3b 0a 20 20 20 20 20 20 70 54 61  aCol);.      pTa
25850 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20  b->iPKey = -1;. 
25860 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c       pTab->nRowL
25870 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73  ogEst = 200; ass
25880 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65  ert( 200==sqlite
25890 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36 29  3LogEst(1048576)
258a0 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e   );.      pTab->
258b0 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45  tabFlags |= TF_E
258c0 70 68 65 6d 65 72 61 6c 3b 0a 23 65 6e 64 69 66  phemeral;.#endif
258d0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
258e0 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79    /* An ordinary
258f0 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e   table or view n
25900 61 6d 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ame in the FROM 
25910 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
25920 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
25930 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Tab==0 );.      
25940 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54  pFrom->pTab = pT
25950 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  ab = sqlite3Loca
25960 74 65 54 61 62 6c 65 49 74 65 6d 28 70 50 61 72  teTableItem(pPar
25970 73 65 2c 20 30 2c 20 70 46 72 6f 6d 29 3b 0a 20  se, 0, pFrom);. 
25980 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30       if( pTab==0
25990 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
259a0 6f 72 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ort;.      if( p
259b0 54 61 62 2d 3e 6e 52 65 66 3d 3d 30 78 66 66 66  Tab->nRef==0xfff
259c0 66 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  f ){.        sql
259d0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
259e0 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 72  rse, "too many r
259f0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 5c 22 25  eferences to \"%
25a00 73 5c 22 3a 20 6d 61 78 20 36 35 35 33 35 22 2c  s\": max 65535",
25a10 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62  .           pTab
25a20 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
25a30 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20    pFrom->pTab = 
25a40 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  0;.        retur
25a50 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
25a60 20 20 20 7d 0a 20 20 20 20 20 20 70 54 61 62 2d     }.      pTab-
25a70 3e 6e 52 65 66 2b 2b 3b 0a 23 69 66 20 21 64 65  >nRef++;.#if !de
25a80 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
25a90 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69  T_VIEW) || !defi
25aa0 6e 65 64 20 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ned (SQLITE_OMIT
25ab0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20  _VIRTUALTABLE). 
25ac0 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70       if( pTab->p
25ad0 53 65 6c 65 63 74 20 7c 7c 20 49 73 56 69 72 74  Select || IsVirt
25ae0 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
25af0 20 20 20 20 20 2f 2a 20 57 65 20 72 65 61 63 68       /* We reach
25b00 20 68 65 72 65 20 69 66 20 74 68 65 20 6e 61 6d   here if the nam
25b10 65 64 20 74 61 62 6c 65 20 69 73 20 61 20 72 65  ed table is a re
25b20 61 6c 6c 79 20 61 20 76 69 65 77 20 2a 2f 0a 20  ally a view */. 
25b30 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
25b40 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  e3ViewGetColumnN
25b50 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ames(pParse, pTa
25b60 62 29 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  b) ) return WRC_
25b70 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 20 20 61  Abort;.        a
25b80 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53  ssert( pFrom->pS
25b90 65 6c 65 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20  elect==0 );.    
25ba0 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65      pFrom->pSele
25bb0 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ct = sqlite3Sele
25bc0 63 74 44 75 70 28 64 62 2c 20 70 54 61 62 2d 3e  ctDup(db, pTab->
25bd0 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20  pSelect, 0);.   
25be0 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
25bf0 63 74 53 65 74 4e 61 6d 65 28 70 46 72 6f 6d 2d  ctSetName(pFrom-
25c00 3e 70 53 65 6c 65 63 74 2c 20 70 54 61 62 2d 3e  >pSelect, pTab->
25c10 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
25c20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
25c30 74 28 70 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d  t(pWalker, pFrom
25c40 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  ->pSelect);.    
25c50 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
25c60 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 61 74 65 20  ..    /* Locate 
25c70 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 64 20  the index named 
25c80 62 79 20 74 68 65 20 49 4e 44 45 58 45 44 20 42  by the INDEXED B
25c90 59 20 63 6c 61 75 73 65 2c 20 69 66 20 61 6e 79  Y clause, if any
25ca0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c  . */.    if( sql
25cb0 69 74 65 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f  ite3IndexedByLoo
25cc0 6b 75 70 28 70 50 61 72 73 65 2c 20 70 46 72 6f  kup(pParse, pFro
25cd0 6d 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  m) ){.      retu
25ce0 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
25cf0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72    }.  }..  /* Pr
25d00 6f 63 65 73 73 20 4e 41 54 55 52 41 4c 20 6b 65  ocess NATURAL ke
25d10 79 77 6f 72 64 73 2c 20 61 6e 64 20 4f 4e 20 61  ywords, and ON a
25d20 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
25d30 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a   of joins..  */.
25d40 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
25d50 46 61 69 6c 65 64 20 7c 7c 20 73 71 6c 69 74 65  Failed || sqlite
25d60 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70 50 61 72  ProcessJoin(pPar
25d70 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 72 65  se, p) ){.    re
25d80 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
25d90 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 76    }..  /* For ev
25da0 65 72 79 20 22 2a 22 20 74 68 61 74 20 6f 63 63  ery "*" that occ
25db0 75 72 73 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d  urs in the colum
25dc0 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72 74 20 74  n list, insert t
25dd0 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20 20 2a 2a  he names of.  **
25de0 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   all columns in 
25df0 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20 41 6e 64  all tables.  And
25e00 20 66 6f 72 20 65 76 65 72 79 20 54 41 42 4c 45   for every TABLE
25e10 2e 2a 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61  .* insert the na
25e20 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c 20  mes.  ** of all 
25e30 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41 42 4c 45  columns in TABLE
25e40 2e 20 20 54 68 65 20 70 61 72 73 65 72 20 69 6e  .  The parser in
25e50 73 65 72 74 65 64 20 61 20 73 70 65 63 69 61 6c  serted a special
25e60 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a   expression.  **
25e70 20 77 69 74 68 20 74 68 65 20 54 4b 5f 41 4c 4c   with the TK_ALL
25e80 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 65 61   operator for ea
25e90 63 68 20 22 2a 22 20 74 68 61 74 20 69 74 20 66  ch "*" that it f
25ea0 6f 75 6e 64 20 69 6e 20 74 68 65 20 63 6f 6c 75  ound in the colu
25eb0 6d 6e 20 6c 69 73 74 2e 0a 20 20 2a 2a 20 54 68  mn list..  ** Th
25ec0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65  e following code
25ed0 20 6a 75 73 74 20 68 61 73 20 74 6f 20 6c 6f 63   just has to loc
25ee0 61 74 65 20 74 68 65 20 54 4b 5f 41 4c 4c 20 65  ate the TK_ALL e
25ef0 78 70 72 65 73 73 69 6f 6e 73 20 61 6e 64 20 65  xpressions and e
25f00 78 70 61 6e 64 0a 20 20 2a 2a 20 65 61 63 68 20  xpand.  ** each 
25f10 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69 73 74 20  one to the list 
25f20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69  of all columns i
25f30 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a 20 20  n all tables..  
25f40 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73  **.  ** The firs
25f50 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63 68 65 63  t loop just chec
25f60 6b 73 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ks to see if the
25f70 72 65 20 61 72 65 20 61 6e 79 20 22 2a 22 20 6f  re are any "*" o
25f80 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a 20 74 68  perators.  ** th
25f90 61 74 20 6e 65 65 64 20 65 78 70 61 6e 64 69 6e  at need expandin
25fa0 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d  g..  */.  for(k=
25fb0 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; k<pEList->nEx
25fc0 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 70 45  pr; k++){.    pE
25fd0 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e   = pEList->a[k].
25fe0 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70  pExpr;.    if( p
25ff0 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20  E->op==TK_ALL ) 
26000 62 72 65 61 6b 3b 0a 20 20 20 20 61 73 73 65 72  break;.    asser
26010 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f  t( pE->op!=TK_DO
26020 54 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 21  T || pE->pRight!
26030 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
26040 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54  ( pE->op!=TK_DOT
26050 20 7c 7c 20 28 70 45 2d 3e 70 4c 65 66 74 21 3d   || (pE->pLeft!=
26060 30 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e  0 && pE->pLeft->
26070 6f 70 3d 3d 54 4b 5f 49 44 29 20 29 3b 0a 20 20  op==TK_ID) );.  
26080 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b    if( pE->op==TK
26090 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70 52 69 67  _DOT && pE->pRig
260a0 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29  ht->op==TK_ALL )
260b0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66   break;.  }.  if
260c0 28 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ( k<pEList->nExp
260d0 72 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20  r ){.    /*.    
260e0 2a 2a 20 49 66 20 77 65 20 67 65 74 20 68 65 72  ** If we get her
260f0 65 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 72  e it means the r
26100 65 73 75 6c 74 20 73 65 74 20 63 6f 6e 74 61 69  esult set contai
26110 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22  ns one or more "
26120 2a 22 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74  *".    ** operat
26130 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f  ors that need to
26140 20 62 65 20 65 78 70 61 6e 64 65 64 2e 20 20 4c   be expanded.  L
26150 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63 68  oop through each
26160 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20   expression.    
26170 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ** in the result
26180 20 73 65 74 20 61 6e 64 20 65 78 70 61 6e 64 20   set and expand 
26190 74 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e  them one by one.
261a0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 72 75  .    */.    stru
261b0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
261c0 20 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b   *a = pEList->a;
261d0 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
261e0 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  New = 0;.    int
261f0 20 66 6c 61 67 73 20 3d 20 70 50 61 72 73 65 2d   flags = pParse-
26200 3e 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20  >db->flags;.    
26210 69 6e 74 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20  int longNames = 
26220 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
26230 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30  FullColNames)!=0
26240 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26250 20 20 20 20 20 20 20 26 26 20 28 66 6c 61 67 73         && (flags
26260 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43   & SQLITE_ShortC
26270 6f 6c 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20  olNames)==0;..  
26280 20 20 2f 2a 20 57 68 65 6e 20 70 72 6f 63 65 73    /* When proces
26290 73 69 6e 67 20 46 52 4f 4d 2d 63 6c 61 75 73 65  sing FROM-clause
262a0 20 73 75 62 71 75 65 72 69 65 73 2c 20 69 74 20   subqueries, it 
262b0 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 63 61  is always the ca
262c0 73 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 66  se.    ** that f
262d0 75 6c 6c 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 73  ull_column_names
262e0 3d 4f 46 46 20 61 6e 64 20 73 68 6f 72 74 5f 63  =OFF and short_c
262f0 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 3d 4f 4e 2e 20  olumn_names=ON. 
26300 20 54 68 65 0a 20 20 20 20 2a 2a 20 73 71 6c 69   The.    ** sqli
26310 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
26320 6c 65 63 74 28 29 20 72 6f 75 74 69 6e 65 20 6d  lect() routine m
26330 61 6b 65 73 20 69 74 20 73 6f 2e 20 2a 2f 0a 20  akes it so. */. 
26340 20 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73     assert( (p->s
26350 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e 65 73  elFlags & SF_Nes
26360 74 65 64 46 72 6f 6d 29 3d 3d 30 0a 20 20 20 20  tedFrom)==0.    
26370 20 20 20 20 20 20 7c 7c 20 28 28 66 6c 61 67 73        || ((flags
26380 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f   & SQLITE_FullCo
26390 6c 4e 61 6d 65 73 29 3d 3d 30 20 26 26 0a 20 20  lNames)==0 &&.  
263a0 20 20 20 20 20 20 20 20 20 20 20 20 28 66 6c 61              (fla
263b0 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72  gs & SQLITE_Shor
263c0 74 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 29 20 29  tColNames)!=0) )
263d0 3b 0a 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20  ;..    for(k=0; 
263e0 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  k<pEList->nExpr;
263f0 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 70 45 20   k++){.      pE 
26400 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20  = a[k].pExpr;.  
26410 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 45 2d      pRight = pE-
26420 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 61  >pRight;.      a
26430 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54  ssert( pE->op!=T
26440 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67 68 74 21  K_DOT || pRight!
26450 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
26460 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26  pE->op!=TK_ALL &
26470 26 20 28 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f  & (pE->op!=TK_DO
26480 54 20 7c 7c 20 70 52 69 67 68 74 2d 3e 6f 70 21  T || pRight->op!
26490 3d 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20 20 20  =TK_ALL) ){.    
264a0 20 20 20 20 2f 2a 20 54 68 69 73 20 70 61 72 74      /* This part
264b0 69 63 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f  icular expressio
264c0 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  n does not need 
264d0 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 0a  to be expanded..
264e0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
264f0 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
26500 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
26510 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 61 5b  pParse, pNew, a[
26520 6b 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  k].pExpr);.     
26530 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20     if( pNew ){. 
26540 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61           pNew->a
26550 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e  [pNew->nExpr-1].
26560 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61  zName = a[k].zNa
26570 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e  me;.          pN
26580 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70  ew->a[pNew->nExp
26590 72 2d 31 5d 2e 7a 53 70 61 6e 20 3d 20 61 5b 6b  r-1].zSpan = a[k
265a0 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 20  ].zSpan;.       
265b0 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20     a[k].zName = 
265c0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61 5b 6b  0;.          a[k
265d0 5d 2e 7a 53 70 61 6e 20 3d 20 30 3b 0a 20 20 20  ].zSpan = 0;.   
265e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
265f0 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20  [k].pExpr = 0;. 
26600 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
26610 20 20 20 20 2f 2a 20 54 68 69 73 20 65 78 70 72      /* This expr
26620 65 73 73 69 6f 6e 20 69 73 20 61 20 22 2a 22 20  ession is a "*" 
26630 6f 72 20 61 20 22 54 41 42 4c 45 2e 2a 22 20 61  or a "TABLE.*" a
26640 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20  nd needs to be. 
26650 20 20 20 20 20 20 20 2a 2a 20 65 78 70 61 6e 64         ** expand
26660 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ed. */.        i
26670 6e 74 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 30  nt tableSeen = 0
26680 3b 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f  ;      /* Set to
26690 20 31 20 77 68 65 6e 20 54 41 42 4c 45 20 6d 61   1 when TABLE ma
266a0 74 63 68 65 73 20 2a 2f 0a 20 20 20 20 20 20 20  tches */.       
266b0 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65 20 3d 20   char *zTName = 
266c0 30 3b 20 20 20 20 20 20 20 2f 2a 20 74 65 78 74  0;       /* text
266d0 20 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c   of name of TABL
266e0 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  E */.        if(
266f0 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20   pE->op==TK_DOT 
26700 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
26710 65 72 74 28 20 70 45 2d 3e 70 4c 65 66 74 21 3d  ert( pE->pLeft!=
26720 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  0 );.          a
26730 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
26740 72 6f 70 65 72 74 79 28 70 45 2d 3e 70 4c 65 66  roperty(pE->pLef
26750 74 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  t, EP_IntValue) 
26760 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e  );.          zTN
26770 61 6d 65 20 3d 20 70 45 2d 3e 70 4c 65 66 74 2d  ame = pE->pLeft-
26780 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20  >u.zToken;.     
26790 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72     }.        for
267a0 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62  (i=0, pFrom=pTab
267b0 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c  List->a; i<pTabL
267c0 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
267d0 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pFrom++){.      
267e0 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
267f0 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20  = pFrom->pTab;. 
26800 20 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20           Select 
26810 2a 70 53 75 62 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pSub = pFrom->p
26820 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20  Select;.        
26830 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65    char *zTabName
26840 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73   = pFrom->zAlias
26850 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73  ;.          cons
26860 74 20 63 68 61 72 20 2a 7a 53 63 68 65 6d 61 4e  t char *zSchemaN
26870 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ame = 0;.       
26880 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20     int iDb;.    
26890 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61        if( zTabNa
268a0 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  me==0 ){.       
268b0 20 20 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20       zTabName = 
268c0 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  pTab->zName;.   
268d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
268e0 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
268f0 63 46 61 69 6c 65 64 20 29 20 62 72 65 61 6b 3b  cFailed ) break;
26900 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
26910 53 75 62 3d 3d 30 20 7c 7c 20 28 70 53 75 62 2d  Sub==0 || (pSub-
26920 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e  >selFlags & SF_N
26930 65 73 74 65 64 46 72 6f 6d 29 3d 3d 30 20 29 7b  estedFrom)==0 ){
26940 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53 75  .            pSu
26950 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  b = 0;.         
26960 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26     if( zTName &&
26970 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
26980 7a 54 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65  zTName, zTabName
26990 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
269a0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
269b0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
269c0 20 20 20 20 20 20 20 20 20 20 69 44 62 20 3d 20            iDb = 
269d0 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
269e0 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70  ndex(db, pTab->p
269f0 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20  Schema);.       
26a00 20 20 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65       zSchemaName
26a10 20 3d 20 69 44 62 3e 3d 30 20 3f 20 64 62 2d 3e   = iDb>=0 ? db->
26a20 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 20 3a  aDb[iDb].zName :
26a30 20 22 2a 22 3b 0a 20 20 20 20 20 20 20 20 20 20   "*";.          
26a40 7d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  }.          for(
26a50 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f  j=0; j<pTab->nCo
26a60 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
26a70 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
26a80 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d   = pTab->aCol[j]
26a90 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
26aa0 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6e 61      char *zColna
26ab0 6d 65 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70  me;  /* The comp
26ac0 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  uted column name
26ad0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
26ae0 63 68 61 72 20 2a 7a 54 6f 46 72 65 65 3b 20 20  char *zToFree;  
26af0 20 2f 2a 20 4d 61 6c 6c 6f 63 65 64 20 73 74 72   /* Malloced str
26b00 69 6e 67 20 74 68 61 74 20 6e 65 65 64 73 20 74  ing that needs t
26b10 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20  o be freed */.  
26b20 20 20 20 20 20 20 20 20 20 20 54 6f 6b 65 6e 20            Token 
26b30 73 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 43 6f  sColname;  /* Co
26b40 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61  mputed column na
26b50 6d 65 20 61 73 20 61 20 74 6f 6b 65 6e 20 2a 2f  me as a token */
26b60 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  ..            as
26b70 73 65 72 74 28 20 7a 4e 61 6d 65 20 29 3b 0a 20  sert( zName );. 
26b80 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a             if( z
26b90 54 4e 61 6d 65 20 26 26 20 70 53 75 62 0a 20 20  TName && pSub.  
26ba0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71             && sq
26bb0 6c 69 74 65 33 4d 61 74 63 68 53 70 61 6e 4e 61  lite3MatchSpanNa
26bc0 6d 65 28 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d  me(pSub->pEList-
26bd0 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 2c 20 30 2c 20  >a[j].zSpan, 0, 
26be0 7a 54 4e 61 6d 65 2c 20 30 29 3d 3d 30 0a 20 20  zTName, 0)==0.  
26bf0 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
26c00 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
26c10 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
26c20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
26c30 2f 2a 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20 69  /* If a column i
26c40 73 20 6d 61 72 6b 65 64 20 61 73 20 27 68 69 64  s marked as 'hid
26c50 64 65 6e 27 20 28 63 75 72 72 65 6e 74 6c 79 20  den' (currently 
26c60 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 0a 20 20  only possible.  
26c70 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72            ** for
26c80 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 29   virtual tables)
26c90 2c 20 64 6f 20 6e 6f 74 20 69 6e 63 6c 75 64 65  , do not include
26ca0 20 69 74 20 69 6e 20 74 68 65 20 65 78 70 61 6e   it in the expan
26cb0 64 65 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  ded.            
26cc0 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 6c 69  ** result-set li
26cd0 73 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  st..            
26ce0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  */.            i
26cf0 66 28 20 49 73 48 69 64 64 65 6e 43 6f 6c 75 6d  f( IsHiddenColum
26d00 6e 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d  n(&pTab->aCol[j]
26d10 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
26d20 20 20 20 61 73 73 65 72 74 28 49 73 56 69 72 74     assert(IsVirt
26d30 75 61 6c 28 70 54 61 62 29 29 3b 0a 20 20 20 20  ual(pTab));.    
26d40 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
26d50 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
26d60 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 61  }.            ta
26d70 62 6c 65 53 65 65 6e 20 3d 20 31 3b 0a 0a 20 20  bleSeen = 1;..  
26d80 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e            if( i>
26d90 30 20 26 26 20 7a 54 4e 61 6d 65 3d 3d 30 20 29  0 && zTName==0 )
26da0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
26db0 69 66 28 20 28 70 46 72 6f 6d 2d 3e 6a 6f 69 6e  if( (pFrom->join
26dc0 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41  type & JT_NATURA
26dd0 4c 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20  L)!=0.          
26de0 20 20 20 20 20 20 26 26 20 74 61 62 6c 65 41 6e        && tableAn
26df0 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 54 61  dColumnIndex(pTa
26e00 62 4c 69 73 74 2c 20 69 2c 20 7a 4e 61 6d 65 2c  bList, i, zName,
26e10 20 30 2c 20 30 29 0a 20 20 20 20 20 20 20 20 20   0, 0).         
26e20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
26e30 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20          /* In a 
26e40 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d  NATURAL join, om
26e50 69 74 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75  it the join colu
26e60 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 0a 20 20  mns from the .  
26e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
26e80 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20 72 69   table to the ri
26e90 67 68 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20  ght of the join 
26ea0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
26eb0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
26ec0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
26ed0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
26ee0 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65  qlite3IdListInde
26ef0 78 28 70 46 72 6f 6d 2d 3e 70 55 73 69 6e 67 2c  x(pFrom->pUsing,
26f00 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20   zName)>=0 ){.  
26f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26f20 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74 68 20   In a join with 
26f30 61 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2c 20  a USING clause, 
26f40 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  omit columns in 
26f50 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  the.            
26f60 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61      ** using cla
26f70 75 73 65 20 66 72 6f 6d 20 74 68 65 20 74 61 62  use from the tab
26f80 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e  le on the right.
26f90 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
26fa0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
26fb0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
26fc0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
26fd0 20 20 20 20 20 20 20 20 70 52 69 67 68 74 20 3d          pRight =
26fe0 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
26ff0 20 54 4b 5f 49 44 2c 20 7a 4e 61 6d 65 29 3b 0a   TK_ID, zName);.
27000 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c              zCol
27010 6e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  name = zName;.  
27020 20 20 20 20 20 20 20 20 20 20 7a 54 6f 46 72 65            zToFre
27030 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
27040 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73     if( longNames
27050 20 7c 7c 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53   || pTabList->nS
27060 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20  rc>1 ){.        
27070 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66        Expr *pLef
27080 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t;.             
27090 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33   pLeft = sqlite3
270a0 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20  Expr(db, TK_ID, 
270b0 7a 54 61 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20  zTabName);.     
270c0 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d           pExpr =
270d0 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
270e0 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c  arse, TK_DOT, pL
270f0 65 66 74 2c 20 70 52 69 67 68 74 2c 20 30 29 3b  eft, pRight, 0);
27100 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
27110 66 28 20 7a 53 63 68 65 6d 61 4e 61 6d 65 20 29  f( zSchemaName )
27120 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
27130 20 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65    pLeft = sqlite
27140 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c  3Expr(db, TK_ID,
27150 20 7a 53 63 68 65 6d 61 4e 61 6d 65 29 3b 0a 20   zSchemaName);. 
27160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
27170 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45  Expr = sqlite3PE
27180 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44  xpr(pParse, TK_D
27190 4f 54 2c 20 70 4c 65 66 74 2c 20 70 45 78 70 72  OT, pLeft, pExpr
271a0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
271b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
271c0 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65      if( longName
271d0 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  s ){.           
271e0 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20       zColname = 
271f0 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
27200 62 2c 20 22 25 73 2e 25 73 22 2c 20 7a 54 61 62  b, "%s.%s", zTab
27210 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  Name, zName);.  
27220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 54                zT
27230 6f 46 72 65 65 20 3d 20 7a 43 6f 6c 6e 61 6d 65  oFree = zColname
27240 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
27250 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  }.            }e
27260 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
27270 20 20 20 70 45 78 70 72 20 3d 20 70 52 69 67 68     pExpr = pRigh
27280 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  t;.            }
27290 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65  .            pNe
272a0 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  w = sqlite3ExprL
272b0 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
272c0 2c 20 70 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a  , pNew, pExpr);.
272d0 20 20 20 20 20 20 20 20 20 20 20 20 73 43 6f 6c              sCol
272e0 6e 61 6d 65 2e 7a 20 3d 20 7a 43 6f 6c 6e 61 6d  name.z = zColnam
272f0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  e;.            s
27300 43 6f 6c 6e 61 6d 65 2e 6e 20 3d 20 73 71 6c 69  Colname.n = sqli
27310 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 43 6f 6c  te3Strlen30(zCol
27320 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  name);.         
27330 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
27340 73 74 53 65 74 4e 61 6d 65 28 70 50 61 72 73 65  stSetName(pParse
27350 2c 20 70 4e 65 77 2c 20 26 73 43 6f 6c 6e 61 6d  , pNew, &sColnam
27360 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  e, 0);.         
27370 20 20 20 69 66 28 20 70 4e 65 77 20 26 26 20 28     if( pNew && (
27380 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
27390 5f 4e 65 73 74 65 64 46 72 6f 6d 29 21 3d 30 20  _NestedFrom)!=0 
273a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
273b0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
273c0 5f 69 74 65 6d 20 2a 70 58 20 3d 20 26 70 4e 65  _item *pX = &pNe
273d0 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72  w->a[pNew->nExpr
273e0 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  -1];.           
273f0 20 20 20 69 66 28 20 70 53 75 62 20 29 7b 0a 20     if( pSub ){. 
27400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
27410 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74  X->zSpan = sqlit
27420 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
27430 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a  Sub->pEList->a[j
27440 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20 20  ].zSpan);.      
27450 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
27460 73 65 28 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30  se( pX->zSpan==0
27470 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
27480 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
27490 20 20 20 20 20 20 20 20 20 70 58 2d 3e 7a 53 70           pX->zSp
274a0 61 6e 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  an = sqlite3MPri
274b0 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73 2e 25  ntf(db, "%s.%s.%
274c0 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
274d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
274e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
274f0 53 63 68 65 6d 61 4e 61 6d 65 2c 20 7a 54 61 62  SchemaName, zTab
27500 4e 61 6d 65 2c 20 7a 43 6f 6c 6e 61 6d 65 29 3b  Name, zColname);
27510 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27520 20 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e 7a   testcase( pX->z
27530 53 70 61 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Span==0 );.     
27540 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
27550 20 20 20 20 20 20 20 20 20 70 58 2d 3e 62 53 70           pX->bSp
27560 61 6e 49 73 54 61 62 20 3d 20 31 3b 0a 20 20 20  anIsTab = 1;.   
27570 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
27580 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
27590 46 72 65 65 28 64 62 2c 20 7a 54 6f 46 72 65 65  Free(db, zToFree
275a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
275b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
275c0 20 69 66 28 20 21 74 61 62 6c 65 53 65 65 6e 20   if( !tableSeen 
275d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
275e0 20 7a 54 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20   zTName ){.     
275f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
27600 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
27610 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25  no such table: %
27620 73 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20 20 20  s", zTName);.   
27630 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
27640 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
27650 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
27660 2c 20 22 6e 6f 20 74 61 62 6c 65 73 20 73 70 65  , "no tables spe
27670 63 69 66 69 65 64 22 29 3b 0a 20 20 20 20 20 20  cified");.      
27680 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
27690 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
276a0 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
276b0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 45 4c 69  tDelete(db, pELi
276c0 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 45 4c 69  st);.    p->pELi
276d0 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 23  st = pNew;.  }.#
276e0 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  if SQLITE_MAX_CO
276f0 4c 55 4d 4e 0a 20 20 69 66 28 20 70 2d 3e 70 45  LUMN.  if( p->pE
27700 4c 69 73 74 20 26 26 20 70 2d 3e 70 45 4c 69 73  List && p->pELis
27710 74 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e 61 4c 69  t->nExpr>db->aLi
27720 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
27730 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20  _COLUMN] ){.    
27740 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
27750 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e  pParse, "too man
27760 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73  y columns in res
27770 75 6c 74 20 73 65 74 22 29 3b 0a 20 20 7d 0a 23  ult set");.  }.#
27780 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 57  endif.  return W
27790 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a  RC_Continue;.}..
277a0 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 72 6f 75 74  /*.** No-op rout
277b0 69 6e 65 20 66 6f 72 20 74 68 65 20 70 61 72 73  ine for the pars
277c0 65 2d 74 72 65 65 20 77 61 6c 6b 65 72 2e 0a 2a  e-tree walker..*
277d0 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72  *.** When this r
277e0 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 57 61  outine is the Wa
277f0 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61  lker.xExprCallba
27800 63 6b 20 74 68 65 6e 20 65 78 70 72 65 73 73 69  ck then expressi
27810 6f 6e 20 74 72 65 65 73 0a 2a 2a 20 61 72 65 20  on trees.** are 
27820 77 61 6c 6b 65 64 20 77 69 74 68 6f 75 74 20 61  walked without a
27830 6e 79 20 61 63 74 69 6f 6e 73 20 62 65 69 6e 67  ny actions being
27840 20 74 61 6b 65 6e 20 61 74 20 65 61 63 68 20 6e   taken at each n
27850 6f 64 65 2e 20 20 50 72 65 73 75 6d 61 62 6c 79  ode.  Presumably
27860 2c 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 72  ,.** when this r
27870 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
27880 6f 72 20 57 61 6c 6b 65 72 2e 78 45 78 70 72 43  or Walker.xExprC
27890 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20 0a 2a 2a  allback then .**
278a0 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43   Walker.xSelectC
278b0 61 6c 6c 62 61 63 6b 20 69 73 20 73 65 74 20 74  allback is set t
278c0 6f 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20 75  o do something u
278d0 73 65 66 75 6c 20 66 6f 72 20 65 76 65 72 79 20  seful for every 
278e0 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 69 6e 20  .** subquery in 
278f0 74 68 65 20 70 61 72 73 65 72 20 74 72 65 65 2e  the parser tree.
27900 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
27910 78 70 72 57 61 6c 6b 4e 6f 6f 70 28 57 61 6c 6b  xprWalkNoop(Walk
27920 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20 45 78 70  er *NotUsed, Exp
27930 72 20 2a 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20  r *NotUsed2){.  
27940 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
27950 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73  2(NotUsed, NotUs
27960 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 57  ed2);.  return W
27970 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a  RC_Continue;.}..
27980 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
27990 6e 65 20 22 65 78 70 61 6e 64 73 22 20 61 20 53  ne "expands" a S
279a0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
279b0 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73  and all of its s
279c0 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20 46 6f  ubqueries..** Fo
279d0 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
279e0 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 77 68 61 74  ormation on what
279f0 20 69 74 20 6d 65 61 6e 73 20 74 6f 20 22 65 78   it means to "ex
27a00 70 61 6e 64 22 20 61 20 53 45 4c 45 43 54 0a 2a  pand" a SELECT.*
27a10 2a 20 73 74 61 74 65 6d 65 6e 74 2c 20 73 65 65  * statement, see
27a20 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20   the comment on 
27a30 74 68 65 20 73 65 6c 65 63 74 45 78 70 61 6e 64  the selectExpand
27a40 20 77 6f 72 6b 65 72 20 63 61 6c 6c 62 61 63 6b   worker callback
27a50 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 45 78   above..**.** Ex
27a60 70 61 6e 64 69 6e 67 20 61 20 53 45 4c 45 43 54  panding a SELECT
27a70 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 74 68   statement is th
27a80 65 20 66 69 72 73 74 20 73 74 65 70 20 69 6e 20  e first step in 
27a90 70 72 6f 63 65 73 73 69 6e 67 20 61 0a 2a 2a 20  processing a.** 
27aa0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
27ab0 2e 20 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  .  The SELECT st
27ac0 61 74 65 6d 65 6e 74 20 6d 75 73 74 20 62 65 20  atement must be 
27ad0 65 78 70 61 6e 64 65 64 20 62 65 66 6f 72 65 0a  expanded before.
27ae0 2a 2a 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69  ** name resoluti
27af0 6f 6e 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e  on is performed.
27b00 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 74 68 69  .**.** If anythi
27b10 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 61  ng goes wrong, a
27b20 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
27b30 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
27b40 70 50 61 72 73 65 2e 0a 2a 2a 20 54 68 65 20 63  pParse..** The c
27b50 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
27b60 63 61 6e 20 64 65 74 65 63 74 20 74 68 65 20 70  can detect the p
27b70 72 6f 62 6c 65 6d 20 62 79 20 6c 6f 6f 6b 69 6e  roblem by lookin
27b80 67 20 61 74 20 70 50 61 72 73 65 2d 3e 6e 45 72  g at pParse->nEr
27b90 72 0a 2a 2a 20 61 6e 64 2f 6f 72 20 70 50 61 72  r.** and/or pPar
27ba0 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
27bb0 69 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  iled..*/.static 
27bc0 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65  void sqlite3Sele
27bd0 63 74 45 78 70 61 6e 64 28 50 61 72 73 65 20 2a  ctExpand(Parse *
27be0 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
27bf0 70 53 65 6c 65 63 74 29 7b 0a 20 20 57 61 6c 6b  pSelect){.  Walk
27c00 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26  er w;.  memset(&
27c10 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29  w, 0, sizeof(w))
27c20 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62  ;.  w.xExprCallb
27c30 61 63 6b 20 3d 20 65 78 70 72 57 61 6c 6b 4e 6f  ack = exprWalkNo
27c40 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d  op;.  w.pParse =
27c50 20 70 50 61 72 73 65 3b 0a 20 20 69 66 28 20 70   pParse;.  if( p
27c60 50 61 72 73 65 2d 3e 68 61 73 43 6f 6d 70 6f 75  Parse->hasCompou
27c70 6e 64 20 29 7b 0a 20 20 20 20 77 2e 78 53 65 6c  nd ){.    w.xSel
27c80 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 63 6f  ectCallback = co
27c90 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65 6c  nvertCompoundSel
27ca0 65 63 74 54 6f 53 75 62 71 75 65 72 79 3b 0a 20  ectToSubquery;. 
27cb0 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65     sqlite3WalkSe
27cc0 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74  lect(&w, pSelect
27cd0 29 3b 0a 20 20 7d 0a 20 20 77 2e 78 53 65 6c 65  );.  }.  w.xSele
27ce0 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c  ctCallback = sel
27cf0 65 63 74 45 78 70 61 6e 64 65 72 3b 0a 20 20 69  ectExpander;.  i
27d00 66 28 20 28 70 53 65 6c 65 63 74 2d 3e 73 65 6c  f( (pSelect->sel
27d10 46 6c 61 67 73 20 26 20 53 46 5f 41 6c 6c 56 61  Flags & SF_AllVa
27d20 6c 75 65 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20  lues)==0 ){.    
27d30 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
27d40 6b 32 20 3d 20 73 65 6c 65 63 74 50 6f 70 57 69  k2 = selectPopWi
27d50 74 68 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  th;.  }.  sqlite
27d60 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20  3WalkSelect(&w, 
27d70 70 53 65 6c 65 63 74 29 3b 0a 7d 0a 0a 0a 23 69  pSelect);.}...#i
27d80 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
27d90 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a  T_SUBQUERY./*.**
27da0 20 54 68 69 73 20 69 73 20 61 20 57 61 6c 6b 65   This is a Walke
27db0 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  r.xSelectCallbac
27dc0 6b 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74  k callback for t
27dd0 68 65 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  he sqlite3Select
27de0 54 79 70 65 49 6e 66 6f 28 29 0a 2a 2a 20 69 6e  TypeInfo().** in
27df0 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 46  terface..**.** F
27e00 6f 72 20 65 61 63 68 20 46 52 4f 4d 2d 63 6c 61  or each FROM-cla
27e10 75 73 65 20 73 75 62 71 75 65 72 79 2c 20 61 64  use subquery, ad
27e20 64 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 20 61  d Column.zType a
27e30 6e 64 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 0a  nd Column.zColl.
27e40 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  ** information t
27e50 6f 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75  o the Table stru
27e60 63 74 75 72 65 20 74 68 61 74 20 72 65 70 72 65  cture that repre
27e70 73 65 6e 74 73 20 74 68 65 20 72 65 73 75 6c 74  sents the result
27e80 20 73 65 74 0a 2a 2a 20 6f 66 20 74 68 61 74 20   set.** of that 
27e90 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20  subquery..**.** 
27ea0 54 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  The Table struct
27eb0 75 72 65 20 74 68 61 74 20 72 65 70 72 65 73 65  ure that represe
27ec0 6e 74 73 20 74 68 65 20 72 65 73 75 6c 74 20 73  nts the result s
27ed0 65 74 20 77 61 73 20 63 6f 6e 73 74 72 75 63 74  et was construct
27ee0 65 64 0a 2a 2a 20 62 79 20 73 65 6c 65 63 74 45  ed.** by selectE
27ef0 78 70 61 6e 64 65 72 28 29 20 62 75 74 20 74 68  xpander() but th
27f00 65 20 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61  e type and colla
27f10 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tion information
27f20 20 77 61 73 20 6f 6d 69 74 74 65 64 0a 2a 2a 20   was omitted.** 
27f30 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20 62 65  at that point be
27f40 63 61 75 73 65 20 69 64 65 6e 74 69 66 69 65 72  cause identifier
27f50 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20 62 65  s had not yet be
27f60 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 20 54 68  en resolved.  Th
27f70 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73  is.** routine is
27f80 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 69 64   called after id
27f90 65 6e 74 69 66 69 65 72 20 72 65 73 6f 6c 75 74  entifier resolut
27fa0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
27fb0 6f 69 64 20 73 65 6c 65 63 74 41 64 64 53 75 62  oid selectAddSub
27fc0 71 75 65 72 79 54 79 70 65 49 6e 66 6f 28 57 61  queryTypeInfo(Wa
27fd0 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53  lker *pWalker, S
27fe0 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72  elect *p){.  Par
27ff0 73 65 20 2a 70 50 61 72 73 65 3b 0a 20 20 69 6e  se *pParse;.  in
28000 74 20 69 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a  t i;.  SrcList *
28010 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74 72 75  pTabList;.  stru
28020 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
28030 2a 70 46 72 6f 6d 3b 0a 0a 20 20 61 73 73 65 72  *pFrom;..  asser
28040 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  t( p->selFlags &
28050 20 53 46 5f 52 65 73 6f 6c 76 65 64 20 29 3b 0a   SF_Resolved );.
28060 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61    if( (p->selFla
28070 67 73 20 26 20 53 46 5f 48 61 73 54 79 70 65 49  gs & SF_HasTypeI
28080 6e 66 6f 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70  nfo)==0 ){.    p
28090 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
280a0 5f 48 61 73 54 79 70 65 49 6e 66 6f 3b 0a 20 20  _HasTypeInfo;.  
280b0 20 20 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b    pParse = pWalk
280c0 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20  er->pParse;.    
280d0 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53  pTabList = p->pS
280e0 72 63 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c  rc;.    for(i=0,
280f0 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d   pFrom=pTabList-
28100 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e  >a; i<pTabList->
28110 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d  nSrc; i++, pFrom
28120 2b 2b 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65  ++){.      Table
28130 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e   *pTab = pFrom->
28140 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20  pTab;.      if( 
28150 41 4c 57 41 59 53 28 70 54 61 62 21 3d 30 29 20  ALWAYS(pTab!=0) 
28160 26 26 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61  && (pTab->tabFla
28170 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61  gs & TF_Ephemera
28180 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  l)!=0 ){.       
28190 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20   /* A sub-query 
281a0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
281b0 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a  se of a SELECT *
281c0 2f 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63 74  /.        Select
281d0 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e   *pSel = pFrom->
281e0 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20  pSelect;.       
281f0 20 69 66 28 20 70 53 65 6c 20 29 7b 0a 20 20 20   if( pSel ){.   
28200 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53         while( pS
28210 65 6c 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65  el->pPrior ) pSe
28220 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72  l = pSel->pPrior
28230 3b 0a 20 20 20 20 20 20 20 20 20 20 73 65 6c 65  ;.          sele
28240 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41  ctAddColumnTypeA
28250 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72  ndCollation(pPar
28260 73 65 2c 20 70 54 61 62 2c 20 70 53 65 6c 29 3b  se, pTab, pSel);
28270 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
28280 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23   }.    }.  }.}.#
28290 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  endif.../*.** Th
282a0 69 73 20 72 6f 75 74 69 6e 65 20 61 64 64 73 20  is routine adds 
282b0 64 61 74 61 74 79 70 65 20 61 6e 64 20 63 6f 6c  datatype and col
282c0 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
282d0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 0a 2a  information to.*
282e0 2a 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75  * the Table stru
282f0 63 74 75 72 65 73 20 6f 66 20 61 6c 6c 20 46 52  ctures of all FR
28300 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65  OM-clause subque
28310 72 69 65 73 20 69 6e 20 61 0a 2a 2a 20 53 45 4c  ries in a.** SEL
28320 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  ECT statement..*
28330 2a 0a 2a 2a 20 55 73 65 20 74 68 69 73 20 72 6f  *.** Use this ro
28340 75 74 69 6e 65 20 61 66 74 65 72 20 6e 61 6d 65  utine after name
28350 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a   resolution..*/.
28360 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
28370 74 65 33 53 65 6c 65 63 74 41 64 64 54 79 70 65  te3SelectAddType
28380 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72  Info(Parse *pPar
28390 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  se, Select *pSel
283a0 65 63 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  ect){.#ifndef SQ
283b0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
283c0 52 59 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  RY.  Walker w;. 
283d0 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73   memset(&w, 0, s
283e0 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78  izeof(w));.  w.x
283f0 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20  SelectCallback2 
28400 3d 20 73 65 6c 65 63 74 41 64 64 53 75 62 71 75  = selectAddSubqu
28410 65 72 79 54 79 70 65 49 6e 66 6f 3b 0a 20 20 77  eryTypeInfo;.  w
28420 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
28430 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20   exprWalkNoop;. 
28440 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72   w.pParse = pPar
28450 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c  se;.  sqlite3Wal
28460 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c  kSelect(&w, pSel
28470 65 63 74 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ect);.#endif.}..
28480 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
28490 69 6e 65 20 73 65 74 73 20 75 70 20 61 20 53 45  ine sets up a SE
284a0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 66  LECT statement f
284b0 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20  or processing.  
284c0 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  The.** following
284d0 20 69 73 20 61 63 63 6f 6d 70 6c 69 73 68 65 64   is accomplished
284e0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 20 56  :.**.**     *  V
284f0 44 42 45 20 43 75 72 73 6f 72 20 6e 75 6d 62 65  DBE Cursor numbe
28500 72 73 20 61 72 65 20 61 73 73 69 67 6e 65 64 20  rs are assigned 
28510 74 6f 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75  to all FROM-clau
28520 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 20 20 20 20  se terms..**    
28530 20 2a 20 20 45 70 68 65 6d 65 72 61 6c 20 54 61   *  Ephemeral Ta
28540 62 6c 65 20 6f 62 6a 65 63 74 73 20 61 72 65 20  ble objects are 
28550 63 72 65 61 74 65 64 20 66 6f 72 20 61 6c 6c 20  created for all 
28560 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71  FROM-clause subq
28570 75 65 72 69 65 73 2e 0a 2a 2a 20 20 20 20 20 2a  ueries..**     *
28580 20 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63    ON and USING c
28590 6c 61 75 73 65 73 20 61 72 65 20 73 68 69 66 74  lauses are shift
285a0 65 64 20 69 6e 74 6f 20 57 48 45 52 45 20 73 74  ed into WHERE st
285b0 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 20 20 20 20  atements.**     
285c0 2a 20 20 57 69 6c 64 63 61 72 64 73 20 22 2a 22  *  Wildcards "*"
285d0 20 61 6e 64 20 22 54 41 42 4c 45 2e 2a 22 20 69   and "TABLE.*" i
285e0 6e 20 72 65 73 75 6c 74 20 73 65 74 73 20 61 72  n result sets ar
285f0 65 20 65 78 70 61 6e 64 65 64 2e 0a 2a 2a 20 20  e expanded..**  
28600 20 20 20 2a 20 20 49 64 65 6e 74 69 66 69 65 72     *  Identifier
28610 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  s in expression 
28620 61 72 65 20 6d 61 74 63 68 65 64 20 74 6f 20 74  are matched to t
28630 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ables..**.** Thi
28640 73 20 72 6f 75 74 69 6e 65 20 61 63 74 73 20 72  s routine acts r
28650 65 63 75 72 73 69 76 65 6c 79 20 6f 6e 20 61 6c  ecursively on al
28660 6c 20 73 75 62 71 75 65 72 69 65 73 20 77 69 74  l subqueries wit
28670 68 69 6e 20 74 68 65 20 53 45 4c 45 43 54 2e 0a  hin the SELECT..
28680 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
28690 65 6c 65 63 74 50 72 65 70 28 0a 20 20 50 61 72  electPrep(.  Par
286a0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
286b0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
286c0 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
286d0 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
286e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
286f0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65  ECT statement be
28700 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20  ing coded. */.  
28710 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75  NameContext *pOu
28720 74 65 72 4e 43 20 20 2f 2a 20 4e 61 6d 65 20 63  terNC  /* Name c
28730 6f 6e 74 65 78 74 20 66 6f 72 20 63 6f 6e 74 61  ontext for conta
28740 69 6e 65 72 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  iner */.){.  sql
28750 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20  ite3 *db;.  if( 
28760 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20 72 65  NEVER(p==0) ) re
28770 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70 50 61  turn;.  db = pPa
28780 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64  rse->db;.  if( d
28790 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
287a0 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
287b0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
287c0 5f 48 61 73 54 79 70 65 49 6e 66 6f 20 29 20 72  _HasTypeInfo ) r
287d0 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
287e0 53 65 6c 65 63 74 45 78 70 61 6e 64 28 70 50 61  SelectExpand(pPa
287f0 72 73 65 2c 20 70 29 3b 0a 20 20 69 66 28 20 70  rse, p);.  if( p
28800 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64  Parse->nErr || d
28810 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
28820 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69  ) return;.  sqli
28830 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 65 63 74  te3ResolveSelect
28840 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 2c  Names(pParse, p,
28850 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20 20 69 66   pOuterNC);.  if
28860 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
28870 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
28880 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  ed ) return;.  s
28890 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64 54  qlite3SelectAddT
288a0 79 70 65 49 6e 66 6f 28 70 50 61 72 73 65 2c 20  ypeInfo(pParse, 
288b0 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73  p);.}../*.** Res
288c0 65 74 20 74 68 65 20 61 67 67 72 65 67 61 74 65  et the aggregate
288d0 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a   accumulator..**
288e0 0a 2a 2a 20 54 68 65 20 61 67 67 72 65 67 61 74  .** The aggregat
288f0 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 69 73  e accumulator is
28900 20 61 20 73 65 74 20 6f 66 20 6d 65 6d 6f 72 79   a set of memory
28910 20 63 65 6c 6c 73 20 74 68 61 74 20 68 6f 6c 64   cells that hold
28920 0a 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65  .** intermediate
28930 20 72 65 73 75 6c 74 73 20 77 68 69 6c 65 20 63   results while c
28940 61 6c 63 75 6c 61 74 69 6e 67 20 61 6e 20 61 67  alculating an ag
28950 67 72 65 67 61 74 65 2e 20 20 54 68 69 73 0a 2a  gregate.  This.*
28960 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  * routine genera
28970 74 65 73 20 63 6f 64 65 20 74 68 61 74 20 73 74  tes code that st
28980 6f 72 65 73 20 4e 55 4c 4c 73 20 69 6e 20 61 6c  ores NULLs in al
28990 6c 20 6f 66 20 74 68 6f 73 65 20 6d 65 6d 6f 72  l of those memor
289a0 79 0a 2a 2a 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73  y.** cells..*/.s
289b0 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 65 74  tatic void reset
289c0 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73  Accumulator(Pars
289d0 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e  e *pParse, AggIn
289e0 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20  fo *pAggInfo){. 
289f0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
28a00 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
28a10 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49  i;.  struct AggI
28a20 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 75 6e 63 3b  nfo_func *pFunc;
28a30 0a 20 20 69 6e 74 20 6e 52 65 67 20 3d 20 70 41  .  int nReg = pA
28a40 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 2b 20  ggInfo->nFunc + 
28a50 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d  pAggInfo->nColum
28a60 6e 3b 0a 20 20 69 66 28 20 6e 52 65 67 3d 3d 30  n;.  if( nReg==0
28a70 20 29 20 72 65 74 75 72 6e 3b 0a 23 69 66 64 65   ) return;.#ifde
28a80 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
28a90 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20   /* Verify that 
28aa0 61 6c 6c 20 41 67 67 49 6e 66 6f 20 72 65 67 69  all AggInfo regi
28ab0 73 74 65 72 73 20 61 72 65 20 77 69 74 68 69 6e  sters are within
28ac0 20 74 68 65 20 72 61 6e 67 65 20 73 70 65 63 69   the range speci
28ad0 66 69 65 64 20 62 79 0a 20 20 2a 2a 20 41 67 67  fied by.  ** Agg
28ae0 49 6e 66 6f 2e 6d 6e 52 65 67 2e 2e 41 67 67 49  Info.mnReg..AggI
28af0 6e 66 6f 2e 6d 78 52 65 67 20 2a 2f 0a 20 20 61  nfo.mxReg */.  a
28b00 73 73 65 72 74 28 20 6e 52 65 67 3d 3d 70 41 67  ssert( nReg==pAg
28b10 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 2d 70 41 67  gInfo->mxReg-pAg
28b20 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2b 31 20 29  gInfo->mnReg+1 )
28b30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
28b40 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e  AggInfo->nColumn
28b50 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  ; i++){.    asse
28b60 72 74 28 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43  rt( pAggInfo->aC
28b70 6f 6c 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41 67 67  ol[i].iMem>=pAgg
28b80 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20 20 20  Info->mnReg.    
28b90 20 20 20 20 20 26 26 20 70 41 67 67 49 6e 66 6f       && pAggInfo
28ba0 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3c 3d  ->aCol[i].iMem<=
28bb0 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 20  pAggInfo->mxReg 
28bc0 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  );.  }.  for(i=0
28bd0 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  ; i<pAggInfo->nF
28be0 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61  unc; i++){.    a
28bf0 73 73 65 72 74 28 20 70 41 67 67 49 6e 66 6f 2d  ssert( pAggInfo-
28c00 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d 3e 3d  >aFunc[i].iMem>=
28c10 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a  pAggInfo->mnReg.
28c20 20 20 20 20 20 20 20 20 20 26 26 20 70 41 67 67           && pAgg
28c30 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69  Info->aFunc[i].i
28c40 4d 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d  Mem<=pAggInfo->m
28c50 78 52 65 67 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  xReg );.  }.#end
28c60 69 66 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  if.  sqlite3Vdbe
28c70 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp3(v, OP_Nul
28c80 6c 2c 20 30 2c 20 70 41 67 67 49 6e 66 6f 2d 3e  l, 0, pAggInfo->
28c90 6d 6e 52 65 67 2c 20 70 41 67 67 49 6e 66 6f 2d  mnReg, pAggInfo-
28ca0 3e 6d 78 52 65 67 29 3b 0a 20 20 66 6f 72 28 70  >mxReg);.  for(p
28cb0 46 75 6e 63 3d 70 41 67 67 49 6e 66 6f 2d 3e 61  Func=pAggInfo->a
28cc0 46 75 6e 63 2c 20 69 3d 30 3b 20 69 3c 70 41 67  Func, i=0; i<pAg
28cd0 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b  gInfo->nFunc; i+
28ce0 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a 20 20 20  +, pFunc++){.   
28cf0 20 69 66 28 20 70 46 75 6e 63 2d 3e 69 44 69 73   if( pFunc->iDis
28d00 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20  tinct>=0 ){.    
28d10 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 46 75    Expr *pE = pFu
28d20 6e 63 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  nc->pExpr;.     
28d30 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
28d40 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50  sProperty(pE, EP
28d50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
28d60 20 20 20 20 20 69 66 28 20 70 45 2d 3e 78 2e 70       if( pE->x.p
28d70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 78  List==0 || pE->x
28d80 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31  .pList->nExpr!=1
28d90 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
28da0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
28db0 73 65 2c 20 22 44 49 53 54 49 4e 43 54 20 61 67  se, "DISTINCT ag
28dc0 67 72 65 67 61 74 65 73 20 6d 75 73 74 20 68 61  gregates must ha
28dd0 76 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 22  ve exactly one "
28de0 0a 20 20 20 20 20 20 20 20 20 20 20 22 61 72 67  .           "arg
28df0 75 6d 65 6e 74 22 29 3b 0a 20 20 20 20 20 20 20  ument");.       
28e00 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63   pFunc->iDistinc
28e10 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65  t = -1;.      }e
28e20 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 4b 65 79  lse{.        Key
28e30 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
28e40 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72   keyInfoFromExpr
28e50 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 45 2d  List(pParse, pE-
28e60 3e 78 2e 70 4c 69 73 74 2c 20 30 2c 20 30 29 3b  >x.pList, 0, 0);
28e70 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
28e80 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
28e90 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
28ea0 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74  pFunc->iDistinct
28eb0 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
28ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ed0 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66    (char*)pKeyInf
28ee0 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  o, P4_KEYINFO);.
28ef0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
28f00 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  }.}../*.** Invok
28f10 65 20 74 68 65 20 4f 50 5f 41 67 67 46 69 6e 61  e the OP_AggFina
28f20 6c 69 7a 65 20 6f 70 63 6f 64 65 20 66 6f 72 20  lize opcode for 
28f30 65 76 65 72 79 20 61 67 67 72 65 67 61 74 65 20  every aggregate 
28f40 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74  function.** in t
28f50 68 65 20 41 67 67 49 6e 66 6f 20 73 74 72 75 63  he AggInfo struc
28f60 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
28f70 76 6f 69 64 20 66 69 6e 61 6c 69 7a 65 41 67 67  void finalizeAgg
28f80 46 75 6e 63 74 69 6f 6e 73 28 50 61 72 73 65 20  Functions(Parse 
28f90 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f  *pParse, AggInfo
28fa0 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56   *pAggInfo){.  V
28fb0 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
28fc0 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
28fd0 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66  .  struct AggInf
28fe0 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 66 6f  o_func *pF;.  fo
28ff0 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e  r(i=0, pF=pAggIn
29000 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67  fo->aFunc; i<pAg
29010 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b  gInfo->nFunc; i+
29020 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 45 78  +, pF++){.    Ex
29030 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
29040 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69  pF->pExpr->x.pLi
29050 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  st;.    assert( 
29060 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
29070 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78  (pF->pExpr, EP_x
29080 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
29090 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
290a0 70 34 28 76 2c 20 4f 50 5f 41 67 67 46 69 6e 61  p4(v, OP_AggFina
290b0 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 70 4c 69  l, pF->iMem, pLi
290c0 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70  st ? pList->nExp
290d0 72 20 3a 20 30 2c 20 30 2c 0a 20 20 20 20 20 20  r : 0, 0,.      
290e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
290f0 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63  (void*)pF->pFunc
29100 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20  , P4_FUNCDEF);. 
29110 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61   }.}../*.** Upda
29120 74 65 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74  te the accumulat
29130 6f 72 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  or memory cells 
29140 66 6f 72 20 61 6e 20 61 67 67 72 65 67 61 74 65  for an aggregate
29150 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65   based on.** the
29160 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
29170 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  position..*/.sta
29180 74 69 63 20 76 6f 69 64 20 75 70 64 61 74 65 41  tic void updateA
29190 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65  ccumulator(Parse
291a0 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66   *pParse, AggInf
291b0 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20  o *pAggInfo){.  
291c0 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
291d0 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
291e0 3b 0a 20 20 69 6e 74 20 72 65 67 48 69 74 20 3d  ;.  int regHit =
291f0 20 30 3b 0a 20 20 69 6e 74 20 61 64 64 72 48 69   0;.  int addrHi
29200 74 54 65 73 74 20 3d 20 30 3b 0a 20 20 73 74 72  tTest = 0;.  str
29210 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63  uct AggInfo_func
29220 20 2a 70 46 3b 0a 20 20 73 74 72 75 63 74 20 41   *pF;.  struct A
29230 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a  ggInfo_col *pC;.
29240 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72  .  pAggInfo->dir
29250 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 66  ectMode = 1;.  f
29260 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49  or(i=0, pF=pAggI
29270 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41  nfo->aFunc; i<pA
29280 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
29290 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 69  ++, pF++){.    i
292a0 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20 69 6e 74  nt nArg;.    int
292b0 20 61 64 64 72 4e 65 78 74 20 3d 20 30 3b 0a 20   addrNext = 0;. 
292c0 20 20 20 69 6e 74 20 72 65 67 41 67 67 3b 0a 20     int regAgg;. 
292d0 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
292e0 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e  st = pF->pExpr->
292f0 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73 73  x.pList;.    ass
29300 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
29310 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72 2c  perty(pF->pExpr,
29320 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
29330 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 20  ;.    if( pList 
29340 29 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20  ){.      nArg = 
29350 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
29360 20 20 20 20 72 65 67 41 67 67 20 3d 20 73 71 6c      regAgg = sql
29370 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
29380 28 70 50 61 72 73 65 2c 20 6e 41 72 67 29 3b 0a  (pParse, nArg);.
29390 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
293a0 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
293b0 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 72 65 67  arse, pList, reg
293c0 41 67 67 2c 20 53 51 4c 49 54 45 5f 45 43 45 4c  Agg, SQLITE_ECEL
293d0 5f 44 55 50 29 3b 0a 20 20 20 20 7d 65 6c 73 65  _DUP);.    }else
293e0 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20 30  {.      nArg = 0
293f0 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67 20 3d  ;.      regAgg =
29400 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
29410 28 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 3e  ( pF->iDistinct>
29420 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72  =0 ){.      addr
29430 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Next = sqlite3Vd
29440 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
29450 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 41        assert( nA
29460 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 63  rg==1 );.      c
29470 6f 64 65 44 69 73 74 69 6e 63 74 28 70 50 61 72  odeDistinct(pPar
29480 73 65 2c 20 70 46 2d 3e 69 44 69 73 74 69 6e 63  se, pF->iDistinc
29490 74 2c 20 61 64 64 72 4e 65 78 74 2c 20 31 2c 20  t, addrNext, 1, 
294a0 72 65 67 41 67 67 29 3b 0a 20 20 20 20 7d 0a 20  regAgg);.    }. 
294b0 20 20 20 69 66 28 20 70 46 2d 3e 70 46 75 6e 63     if( pF->pFunc
294c0 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
294d0 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f  LITE_FUNC_NEEDCO
294e0 4c 4c 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c  LL ){.      Coll
294f0 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a  Seq *pColl = 0;.
29500 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
29510 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
29520 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  m;.      int j;.
29530 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
29540 69 73 74 21 3d 30 20 29 3b 20 20 2f 2a 20 70 4c  ist!=0 );  /* pL
29550 69 73 74 21 3d 30 20 69 66 20 70 46 2d 3e 70 46  ist!=0 if pF->pF
29560 75 6e 63 20 68 61 73 20 4e 45 45 44 43 4f 4c 4c  unc has NEEDCOLL
29570 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   */.      for(j=
29580 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  0, pItem=pList->
29590 61 3b 20 21 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e  a; !pColl && j<n
295a0 41 72 67 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b  Arg; j++, pItem+
295b0 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  +){.        pCol
295c0 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
295d0 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
295e0 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
295f0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
29600 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  !pColl ){.      
29610 20 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65    pColl = pParse
29620 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  ->db->pDfltColl;
29630 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
29640 66 28 20 72 65 67 48 69 74 3d 3d 30 20 26 26 20  f( regHit==0 && 
29650 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d  pAggInfo->nAccum
29660 75 6c 61 74 6f 72 20 29 20 72 65 67 48 69 74 20  ulator ) regHit 
29670 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
29680 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
29690 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
296a0 43 6f 6c 6c 53 65 71 2c 20 72 65 67 48 69 74 2c  CollSeq, regHit,
296b0 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70   0, 0, (char *)p
296c0 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  Coll, P4_COLLSEQ
296d0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
296e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
296f0 2c 20 4f 50 5f 41 67 67 53 74 65 70 2c 20 30 2c  , OP_AggStep, 0,
29700 20 72 65 67 41 67 67 2c 20 70 46 2d 3e 69 4d 65   regAgg, pF->iMe
29710 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  m,.             
29720 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29           (void*)
29730 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55  pF->pFunc, P4_FU
29740 4e 43 44 45 46 29 3b 0a 20 20 20 20 73 71 6c 69  NCDEF);.    sqli
29750 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
29760 76 2c 20 28 75 38 29 6e 41 72 67 29 3b 0a 20 20  v, (u8)nArg);.  
29770 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
29780 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
29790 28 70 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c  (pParse, regAgg,
297a0 20 6e 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69   nArg);.    sqli
297b0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
297c0 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 41  nge(pParse, regA
297d0 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 69  gg, nArg);.    i
297e0 66 28 20 61 64 64 72 4e 65 78 74 20 29 7b 0a 20  f( addrNext ){. 
297f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
29800 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
29810 61 64 64 72 4e 65 78 74 29 3b 0a 20 20 20 20 20  addrNext);.     
29820 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
29830 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
29840 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
29850 42 65 66 6f 72 65 20 70 6f 70 75 6c 61 74 69 6e  Before populatin
29860 67 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f  g the accumulato
29870 72 20 72 65 67 69 73 74 65 72 73 2c 20 63 6c 65  r registers, cle
29880 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  ar the column ca
29890 63 68 65 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77  che..  ** Otherw
298a0 69 73 65 2c 20 69 66 20 61 6e 79 20 6f 66 20 74  ise, if any of t
298b0 68 65 20 72 65 71 75 69 72 65 64 20 63 6f 6c 75  he required colu
298c0 6d 6e 20 76 61 6c 75 65 73 20 61 72 65 20 61 6c  mn values are al
298d0 72 65 61 64 79 20 70 72 65 73 65 6e 74 20 0a 20  ready present . 
298e0 20 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 73   ** in registers
298f0 2c 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  , sqlite3ExprCod
29900 65 28 29 20 6d 61 79 20 75 73 65 20 4f 50 5f 53  e() may use OP_S
29910 43 6f 70 79 20 74 6f 20 63 6f 70 79 20 74 68 65  Copy to copy the
29920 20 76 61 6c 75 65 0a 20 20 2a 2a 20 74 6f 20 70   value.  ** to p
29930 43 2d 3e 69 4d 65 6d 2e 20 42 75 74 20 62 79 20  C->iMem. But by 
29940 74 68 65 20 74 69 6d 65 20 74 68 65 20 76 61 6c  the time the val
29950 75 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 20  ue is used, the 
29960 6f 72 69 67 69 6e 61 6c 20 72 65 67 69 73 74 65  original registe
29970 72 0a 20 20 2a 2a 20 6d 61 79 20 68 61 76 65 20  r.  ** may have 
29980 62 65 65 6e 20 75 73 65 64 2c 20 69 6e 76 61 6c  been used, inval
29990 69 64 61 74 69 6e 67 20 74 68 65 20 75 6e 64 65  idating the unde
299a0 72 6c 79 69 6e 67 20 62 75 66 66 65 72 20 68 6f  rlying buffer ho
299b0 6c 64 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 74  lding the.  ** t
299c0 65 78 74 20 6f 72 20 62 6c 6f 62 20 76 61 6c 75  ext or blob valu
299d0 65 2e 20 53 65 65 20 74 69 63 6b 65 74 20 5b 38  e. See ticket [8
299e0 38 33 30 33 34 64 63 62 35 5d 2e 0a 20 20 2a 2a  83034dcb5]..  **
299f0 0a 20 20 2a 2a 20 41 6e 6f 74 68 65 72 20 73 6f  .  ** Another so
29a00 6c 75 74 69 6f 6e 20 77 6f 75 6c 64 20 62 65 20  lution would be 
29a10 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50  to change the OP
29a20 5f 53 43 6f 70 79 20 75 73 65 64 20 74 6f 20 63  _SCopy used to c
29a30 6f 70 79 20 63 61 63 68 65 64 0a 20 20 2a 2a 20  opy cached.  ** 
29a40 76 61 6c 75 65 73 20 74 6f 20 61 6e 20 4f 50 5f  values to an OP_
29a50 43 6f 70 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  Copy..  */.  if(
29a60 20 72 65 67 48 69 74 20 29 7b 0a 20 20 20 20 61   regHit ){.    a
29a70 64 64 72 48 69 74 54 65 73 74 20 3d 20 73 71 6c  ddrHitTest = sql
29a80 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
29a90 2c 20 4f 50 5f 49 66 2c 20 72 65 67 48 69 74 29  , OP_If, regHit)
29aa0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
29ab0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
29ac0 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
29ad0 50 61 72 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d  Parse);.  for(i=
29ae0 30 2c 20 70 43 3d 70 41 67 67 49 6e 66 6f 2d 3e  0, pC=pAggInfo->
29af0 61 43 6f 6c 3b 20 69 3c 70 41 67 67 49 6e 66 6f  aCol; i<pAggInfo
29b00 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 3b 20  ->nAccumulator; 
29b10 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20 20 20  i++, pC++){.    
29b20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
29b30 70 50 61 72 73 65 2c 20 70 43 2d 3e 70 45 78 70  pParse, pC->pExp
29b40 72 2c 20 70 43 2d 3e 69 4d 65 6d 29 3b 0a 20 20  r, pC->iMem);.  
29b50 7d 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69  }.  pAggInfo->di
29b60 72 65 63 74 4d 6f 64 65 20 3d 20 30 3b 0a 20 20  rectMode = 0;.  
29b70 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
29b80 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
29b90 20 69 66 28 20 61 64 64 72 48 69 74 54 65 73 74   if( addrHitTest
29ba0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
29bb0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
29bc0 64 64 72 48 69 74 54 65 73 74 29 3b 0a 20 20 7d  ddrHitTest);.  }
29bd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
29be0 73 69 6e 67 6c 65 20 4f 50 5f 45 78 70 6c 61 69  single OP_Explai
29bf0 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  n instruction to
29c00 20 74 68 65 20 56 44 42 45 20 74 6f 20 65 78 70   the VDBE to exp
29c10 6c 61 69 6e 20 61 20 73 69 6d 70 6c 65 0a 2a 2a  lain a simple.**
29c20 20 63 6f 75 6e 74 28 2a 29 20 71 75 65 72 79 20   count(*) query 
29c30 28 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a  ("SELECT count(*
29c40 29 20 46 52 4f 4d 20 70 54 61 62 22 29 2e 0a 2a  ) FROM pTab")..*
29c50 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
29c60 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 73 74  _OMIT_EXPLAIN.st
29c70 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69  atic void explai
29c80 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 0a 20 20  nSimpleCount(.  
29c90 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
29ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29cb0 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  /* Parse context
29cc0 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
29cd0 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
29ce0 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 62        /* Table b
29cf0 65 69 6e 67 20 71 75 65 72 69 65 64 20 2a 2f 0a  eing queried */.
29d00 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20    Index *pIdx   
29d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d20 20 20 2f 2a 20 49 6e 64 65 78 20 75 73 65 64 20    /* Index used 
29d30 74 6f 20 6f 70 74 69 6d 69 7a 65 20 73 63 61 6e  to optimize scan
29d40 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a  , or NULL */.){.
29d50 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
29d60 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20  plain==2 ){.    
29d70 69 6e 74 20 62 43 6f 76 65 72 20 3d 20 28 70 49  int bCover = (pI
29d80 64 78 21 3d 30 20 26 26 20 28 48 61 73 52 6f 77  dx!=0 && (HasRow
29d90 69 64 28 70 54 61 62 29 20 7c 7c 20 21 49 73 50  id(pTab) || !IsP
29da0 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
29db0 49 64 78 29 29 29 3b 0a 20 20 20 20 63 68 61 72  Idx)));.    char
29dc0 20 2a 7a 45 71 70 20 3d 20 73 71 6c 69 74 65 33   *zEqp = sqlite3
29dd0 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e  MPrintf(pParse->
29de0 64 62 2c 20 22 53 43 41 4e 20 54 41 42 4c 45 20  db, "SCAN TABLE 
29df0 25 73 25 73 25 73 22 2c 0a 20 20 20 20 20 20 20  %s%s%s",.       
29e00 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20   pTab->zName,.  
29e10 20 20 20 20 20 20 62 43 6f 76 65 72 20 3f 20 22        bCover ? "
29e20 20 55 53 49 4e 47 20 43 4f 56 45 52 49 4e 47 20   USING COVERING 
29e30 49 4e 44 45 58 20 22 20 3a 20 22 22 2c 0a 20 20  INDEX " : "",.  
29e40 20 20 20 20 20 20 62 43 6f 76 65 72 20 3f 20 70        bCover ? p
29e50 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 22 0a  Idx->zName : "".
29e60 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74      );.    sqlit
29e70 65 33 56 64 62 65 41 64 64 4f 70 34 28 0a 20 20  e3VdbeAddOp4(.  
29e80 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70 56        pParse->pV
29e90 64 62 65 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c  dbe, OP_Explain,
29ea0 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74   pParse->iSelect
29eb0 49 64 2c 20 30 2c 20 30 2c 20 7a 45 71 70 2c 20  Id, 0, 0, zEqp, 
29ec0 50 34 5f 44 59 4e 41 4d 49 43 0a 20 20 20 20 29  P4_DYNAMIC.    )
29ed0 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20  ;.  }.}.#else.# 
29ee0 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 53 69  define explainSi
29ef0 6d 70 6c 65 43 6f 75 6e 74 28 61 2c 62 2c 63 29  mpleCount(a,b,c)
29f00 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
29f10 53 51 4c 49 54 45 5f 43 4f 55 4e 54 4f 46 56 49  SQLITE_COUNTOFVI
29f20 45 57 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a  EW_OPTIMIZATION.
29f30 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
29f40 20 74 72 61 6e 73 66 6f 72 6d 20 61 20 71 75 65   transform a que
29f50 72 79 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a  ry of the form.*
29f60 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 63  *.**    SELECT c
29f70 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 28 53 45  ount(*) FROM (SE
29f80 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 31 20 55  LECT x FROM t1 U
29f90 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20  NION ALL SELECT 
29fa0 79 20 46 52 4f 4d 20 74 32 29 0a 2a 2a 0a 2a 2a  y FROM t2).**.**
29fb0 20 49 6e 74 6f 20 74 68 69 73 3a 0a 2a 2a 0a 2a   Into this:.**.*
29fc0 2a 20 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c  *    SELECT (SEL
29fd0 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
29fe0 4d 20 74 31 29 2b 28 53 45 4c 45 43 54 20 63 6f  M t1)+(SELECT co
29ff0 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32 29 0a  unt(*) FROM t2).
2a000 2a 2a 0a 2a 2a 20 54 68 65 20 74 72 61 6e 73 66  **.** The transf
2a010 6f 72 6d 61 74 69 6f 6e 20 6f 6e 6c 79 20 77 6f  ormation only wo
2a020 72 6b 73 20 69 66 20 61 6c 6c 20 6f 66 20 74 68  rks if all of th
2a030 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
2a040 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  true:.**.**   * 
2a050 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
2a060 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 66 20   a UNION ALL of 
2a070 74 77 6f 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d  two or more term
2a080 73 0a 2a 2a 20 20 20 2a 20 20 54 68 65 72 65 20  s.**   *  There 
2a090 69 73 20 6e 6f 20 57 48 45 52 45 20 6f 72 20 47  is no WHERE or G
2a0a0 52 4f 55 50 20 42 59 20 6f 72 20 48 41 56 49 4e  ROUP BY or HAVIN
2a0b0 47 20 63 6c 61 75 73 65 73 20 6f 6e 20 74 68 65  G clauses on the
2a0c0 20 73 75 62 71 75 65 72 69 65 73 0a 2a 2a 20 20   subqueries.**  
2a0d0 20 2a 20 20 54 68 65 20 6f 75 74 65 72 20 71 75   *  The outer qu
2a0e0 65 72 79 20 69 73 20 61 20 73 69 6d 70 6c 65 20  ery is a simple 
2a0f0 63 6f 75 6e 74 28 2a 29 0a 2a 2a 0a 2a 2a 20 52  count(*).**.** R
2a100 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
2a110 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  e optimization i
2a120 73 20 75 6e 64 65 72 74 61 6b 65 6e 2e 0a 2a 2f  s undertaken..*/
2a130 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e  .static int coun
2a140 74 4f 66 56 69 65 77 4f 70 74 69 6d 69 7a 61 74  tOfViewOptimizat
2a150 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
2a160 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  e, Select *p){. 
2a170 20 53 65 6c 65 63 74 20 2a 70 53 75 62 2c 20 2a   Select *pSub, *
2a180 70 50 72 69 6f 72 3b 0a 20 20 45 78 70 72 20 2a  pPrior;.  Expr *
2a190 70 45 78 70 72 3b 0a 20 20 45 78 70 72 20 2a 70  pExpr;.  Expr *p
2a1a0 43 6f 75 6e 74 3b 0a 20 20 73 71 6c 69 74 65 33  Count;.  sqlite3
2a1b0 20 2a 64 62 3b 0a 20 20 69 66 28 20 28 70 2d 3e   *db;.  if( (p->
2a1c0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67  selFlags & SF_Ag
2a1d0 67 72 65 67 61 74 65 29 3d 3d 30 20 29 20 72 65  gregate)==0 ) re
2a1e0 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20 54 68 69  turn 0;   /* Thi
2a1f0 73 20 69 73 20 61 6e 20 61 67 67 72 65 67 61 74  s is an aggregat
2a200 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 66 28  e query */.  if(
2a210 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
2a220 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  r!=1 ) return 0;
2a230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a240 2a 20 53 69 6e 67 6c 65 20 72 65 73 75 6c 74 20  * Single result 
2a250 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 70 45 78 70  column */.  pExp
2a260 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  r = p->pEList->a
2a270 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28  [0].pExpr;.  if(
2a280 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41   pExpr->op!=TK_A
2a290 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72 65  GG_FUNCTION ) re
2a2a0 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 2f  turn 0;        /
2a2b0 2a 20 52 65 73 75 6c 74 20 69 73 20 61 6e 20 61  * Result is an a
2a2c0 67 67 72 65 67 61 74 65 20 2a 2f 0a 20 20 69 66  ggregate */.  if
2a2d0 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ( sqlite3_stricm
2a2e0 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  p(pExpr->u.zToke
2a2f0 6e 2c 22 63 6f 75 6e 74 22 29 20 29 20 72 65 74  n,"count") ) ret
2a300 75 72 6e 20 30 3b 20 20 2f 2a 20 4d 75 73 74 20  urn 0;  /* Must 
2a310 62 65 20 63 6f 75 6e 74 28 29 20 2a 2f 0a 20 20  be count() */.  
2a320 69 66 28 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  if( pExpr->x.pLi
2a330 73 74 21 3d 30 20 29 20 72 65 74 75 72 6e 20 30  st!=0 ) return 0
2a340 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2a350 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 75    /* Must be cou
2a360 6e 74 28 2a 29 20 2a 2f 0a 20 20 69 66 28 20 70  nt(*) */.  if( p
2a370 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20  ->pSrc->nSrc!=1 
2a380 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
2a390 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a3a0 4f 6e 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65  One table in the
2a3b0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
2a3c0 20 20 70 53 75 62 20 3d 20 70 2d 3e 70 53 72 63    pSub = p->pSrc
2a3d0 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 3b 0a  ->a[0].pSelect;.
2a3e0 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20 29 20    if( pSub==0 ) 
2a3f0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
2a400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a410 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20      /* The FROM 
2a420 69 73 20 61 20 73 75 62 71 75 65 72 79 20 2a 2f  is a subquery */
2a430 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 50 72  .  if( pSub->pPr
2a440 69 6f 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ior==0 ) return 
2a450 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
2a460 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20       /* Must be 
2a470 61 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62 71 75  a compound subqu
2a480 65 72 79 20 2a 2f 0a 20 20 64 6f 7b 0a 20 20 20  ery */.  do{.   
2a490 20 69 66 28 20 70 53 75 62 2d 3e 6f 70 21 3d 54   if( pSub->op!=T
2a4a0 4b 5f 41 4c 4c 20 26 26 20 70 53 75 62 2d 3e 70  K_ALL && pSub->p
2a4b0 50 72 69 6f 72 20 29 20 72 65 74 75 72 6e 20 30  Prior ) return 0
2a4c0 3b 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 55 4e  ;  /* Must be UN
2a4d0 49 4f 4e 20 41 4c 4c 20 2a 2f 0a 20 20 20 20 69  ION ALL */.    i
2a4e0 66 28 20 70 53 75 62 2d 3e 70 57 68 65 72 65 20  f( pSub->pWhere 
2a4f0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
2a500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a510 20 2f 2a 20 4e 6f 20 57 48 45 52 45 20 63 6c 61   /* No WHERE cla
2a520 75 73 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  use */.    if( p
2a530 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  Sub->selFlags & 
2a540 53 46 5f 41 67 67 72 65 67 61 74 65 20 29 20 72  SF_Aggregate ) r
2a550 65 74 75 72 6e 20 30 3b 20 20 20 20 20 2f 2a 20  eturn 0;     /* 
2a560 4e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65  Not an aggregate
2a570 20 2a 2f 0a 20 20 20 20 70 53 75 62 20 3d 20 70   */.    pSub = p
2a580 53 75 62 2d 3e 70 50 72 69 6f 72 3b 20 20 20 20  Sub->pPrior;    
2a590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a5a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70            /* Rep
2a5b0 65 61 74 20 6f 76 65 72 20 63 6f 6d 70 6f 75 6e  eat over compoun
2a5c0 64 20 74 65 72 6d 73 20 2a 2f 0a 20 20 7d 77 68  d terms */.  }wh
2a5d0 69 6c 65 28 20 70 53 75 62 20 29 3b 0a 0a 20 20  ile( pSub );..  
2a5e0 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  /* If we reach t
2a5f0 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 61 74 20  his point, that 
2a600 6d 65 61 6e 73 20 69 74 20 69 73 20 4f 4b 20 74  means it is OK t
2a610 6f 20 70 65 72 66 6f 72 6d 20 74 68 65 20 74 72  o perform the tr
2a620 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a  ansformation */.
2a630 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
2a640 64 62 3b 0a 20 20 70 43 6f 75 6e 74 20 3d 20 70  db;.  pCount = p
2a650 45 78 70 72 3b 0a 20 20 70 45 78 70 72 20 3d 20  Expr;.  pExpr = 
2a660 30 3b 0a 20 20 70 53 75 62 20 3d 20 70 2d 3e 70  0;.  pSub = p->p
2a670 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63  Src->a[0].pSelec
2a680 74 3b 0a 20 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  t;.  p->pSrc->a[
2a690 30 5d 2e 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a  0].pSelect = 0;.
2a6a0 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
2a6b0 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 53  Delete(db, p->pS
2a6c0 72 63 29 3b 0a 20 20 70 2d 3e 70 53 72 63 20 3d  rc);.  p->pSrc =
2a6d0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
2a6e0 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c  Zero(pParse->db,
2a6f0 20 73 69 7a 65 6f 66 28 2a 70 2d 3e 70 53 72 63   sizeof(*p->pSrc
2a700 29 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 75  ));.  while( pSu
2a710 62 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  b ){.    Expr *p
2a720 54 65 72 6d 3b 0a 20 20 20 20 70 50 72 69 6f 72  Term;.    pPrior
2a730 20 3d 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 3b   = pSub->pPrior;
2a740 0a 20 20 20 20 70 53 75 62 2d 3e 70 50 72 69 6f  .    pSub->pPrio
2a750 72 20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62 2d  r = 0;.    pSub-
2a760 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  >pNext = 0;.    
2a770 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 7c  pSub->selFlags |
2a780 3d 20 53 46 5f 41 67 67 72 65 67 61 74 65 3b 0a  = SF_Aggregate;.
2a790 20 20 20 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61      pSub->selFla
2a7a0 67 73 20 26 3d 20 7e 53 46 5f 43 6f 6d 70 6f 75  gs &= ~SF_Compou
2a7b0 6e 64 3b 0a 20 20 20 20 70 53 75 62 2d 3e 6e 53  nd;.    pSub->nS
2a7c0 65 6c 65 63 74 52 6f 77 20 3d 20 30 3b 0a 20 20  electRow = 0;.  
2a7d0 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
2a7e0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62  tDelete(db, pSub
2a7f0 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70  ->pEList);.    p
2a800 54 65 72 6d 20 3d 20 70 50 72 69 6f 72 20 3f 20  Term = pPrior ? 
2a810 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
2a820 62 2c 20 70 43 6f 75 6e 74 2c 20 30 29 20 3a 20  b, pCount, 0) : 
2a830 70 43 6f 75 6e 74 3b 0a 20 20 20 20 70 53 75 62  pCount;.    pSub
2a840 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74  ->pEList = sqlit
2a850 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
2a860 28 70 50 61 72 73 65 2c 20 30 2c 20 70 54 65 72  (pParse, 0, pTer
2a870 6d 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20  m);.    pTerm = 
2a880 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
2a890 72 73 65 2c 20 54 4b 5f 53 45 4c 45 43 54 2c 20  rse, TK_SELECT, 
2a8a0 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  0, 0, 0);.    if
2a8b0 28 20 70 54 65 72 6d 20 29 7b 0a 20 20 20 20 20  ( pTerm ){.     
2a8c0 20 70 54 65 72 6d 2d 3e 78 2e 70 53 65 6c 65 63   pTerm->x.pSelec
2a8d0 74 20 3d 20 70 53 75 62 3b 0a 20 20 20 20 20 20  t = pSub;.      
2a8e0 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
2a8f0 70 54 65 72 6d 2c 20 45 50 5f 78 49 73 53 65 6c  pTerm, EP_xIsSel
2a900 65 63 74 7c 45 50 5f 53 75 62 71 75 65 72 79 29  ect|EP_Subquery)
2a910 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
2a920 78 70 72 53 65 74 48 65 69 67 68 74 41 6e 64 46  xprSetHeightAndF
2a930 6c 61 67 73 28 70 50 61 72 73 65 2c 20 70 54 65  lags(pParse, pTe
2a940 72 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  rm);.      if( p
2a950 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Expr==0 ){.     
2a960 20 20 20 70 45 78 70 72 20 3d 20 70 54 65 72 6d     pExpr = pTerm
2a970 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2a980 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73         pExpr = s
2a990 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
2a9a0 73 65 2c 20 54 4b 5f 50 4c 55 53 2c 20 70 54 65  se, TK_PLUS, pTe
2a9b0 72 6d 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20  rm, pExpr, 0);. 
2a9c0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
2a9d0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  {.      sqlite3S
2a9e0 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
2a9f0 70 53 75 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pSub);.    }.   
2aa00 20 70 53 75 62 20 3d 20 70 50 72 69 6f 72 3b 0a   pSub = pPrior;.
2aa10 20 20 7d 0a 20 20 70 2d 3e 70 45 4c 69 73 74 2d    }.  p->pEList-
2aa20 3e 61 5b 30 5d 2e 70 45 78 70 72 20 3d 20 70 45  >a[0].pExpr = pE
2aa30 78 70 72 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61  xpr;.  p->selFla
2aa40 67 73 20 26 3d 20 7e 53 46 5f 41 67 67 72 65 67  gs &= ~SF_Aggreg
2aa50 61 74 65 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54  ate;..#if SELECT
2aa60 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
2aa70 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
2aa80 74 54 72 61 63 65 20 26 20 30 78 34 30 30 20 29  tTrace & 0x400 )
2aa90 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43  {.    SELECTTRAC
2aaa0 45 28 30 78 34 30 30 2c 70 50 61 72 73 65 2c 70  E(0x400,pParse,p
2aab0 2c 28 22 41 66 74 65 72 20 63 6f 75 6e 74 2d 6f  ,("After count-o
2aac0 66 2d 76 69 65 77 20 6f 70 74 69 6d 69 7a 61 74  f-view optimizat
2aad0 69 6f 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73  ion:\n"));.    s
2aae0 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65  qlite3TreeViewSe
2aaf0 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20  lect(0, p, 0);. 
2ab00 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
2ab10 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 1;.}.#endif /
2ab20 2a 20 53 51 4c 49 54 45 5f 43 4f 55 4e 54 4f 46  * SQLITE_COUNTOF
2ab30 56 49 45 57 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  VIEW_OPTIMIZATIO
2ab40 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  N */../*.** Gene
2ab50 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68  rate code for th
2ab60 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
2ab70 6e 74 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20  nt given in the 
2ab80 70 20 61 72 67 75 6d 65 6e 74 2e 20 20 0a 2a 2a  p argument.  .**
2ab90 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20  .** The results 
2aba0 61 72 65 20 72 65 74 75 72 6e 65 64 20 61 63 63  are returned acc
2abb0 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 53 65  ording to the Se
2abc0 6c 65 63 74 44 65 73 74 20 73 74 72 75 63 74 75  lectDest structu
2abd0 72 65 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d 65  re..** See comme
2abe0 6e 74 73 20 69 6e 20 73 71 6c 69 74 65 49 6e 74  nts in sqliteInt
2abf0 2e 68 20 66 6f 72 20 66 75 72 74 68 65 72 20 69  .h for further i
2ac00 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a  nformation..**.*
2ac10 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
2ac20 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65  eturns the numbe
2ac30 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66  r of errors.  If
2ac40 20 61 6e 79 20 65 72 72 6f 72 73 20 61 72 65 0a   any errors are.
2ac50 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20  ** encountered, 
2ac60 74 68 65 6e 20 61 6e 20 61 70 70 72 6f 70 72 69  then an appropri
2ac70 61 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  ate error messag
2ac80 65 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a 2a 20  e is left in.** 
2ac90 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e  pParse->zErrMsg.
2aca0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
2acb0 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66 72 65  ine does NOT fre
2acc0 65 20 74 68 65 20 53 65 6c 65 63 74 20 73 74 72  e the Select str
2acd0 75 63 74 75 72 65 20 70 61 73 73 65 64 20 69 6e  ucture passed in
2ace0 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e  .  The.** callin
2acf0 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73  g function needs
2ad00 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a   to do that..*/.
2ad10 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63  int sqlite3Selec
2ad20 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
2ad30 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  se,         /* T
2ad40 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
2ad50 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
2ad60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
2ad70 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
2ad80 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65  ement being code
2ad90 64 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  d. */.  SelectDe
2ada0 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 20 2f  st *pDest      /
2adb0 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
2adc0 68 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75  h the query resu
2add0 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lts */.){.  int 
2ade0 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
2adf0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
2ae00 65 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e  ers */.  WhereIn
2ae10 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20  fo *pWInfo;     
2ae20 2f 2a 20 52 65 74 75 72 6e 20 66 72 6f 6d 20 73  /* Return from s
2ae30 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
2ae40 28 29 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  () */.  Vdbe *v;
2ae50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ae60 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 6d 61  * The virtual ma
2ae70 63 68 69 6e 65 20 75 6e 64 65 72 20 63 6f 6e 73  chine under cons
2ae80 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  truction */.  in
2ae90 74 20 69 73 41 67 67 3b 20 20 20 20 20 20 20 20  t isAgg;        
2aea0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
2aeb0 20 73 65 6c 65 63 74 20 6c 69 73 74 73 20 6c 69   select lists li
2aec0 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f  ke "count(*)" */
2aed0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
2aee0 69 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73  ist;      /* Lis
2aef0 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  t of columns to 
2af00 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20 53 72  extract. */.  Sr
2af10 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b  cList *pTabList;
2af20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
2af30 74 61 62 6c 65 73 20 74 6f 20 73 65 6c 65 63 74  tables to select
2af40 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20   from */.  Expr 
2af50 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20 20 20  *pWhere;        
2af60 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
2af70 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e  lause.  May be N
2af80 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ULL */.  ExprLis
2af90 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 20  t *pGroupBy;    
2afa0 2f 2a 20 54 68 65 20 47 52 4f 55 50 20 42 59 20  /* The GROUP BY 
2afb0 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20  clause.  May be 
2afc0 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a  NULL */.  Expr *
2afd0 70 48 61 76 69 6e 67 3b 20 20 20 20 20 20 20 20  pHaving;        
2afe0 20 2f 2a 20 54 68 65 20 48 41 56 49 4e 47 20 63   /* The HAVING c
2aff0 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e  lause.  May be N
2b000 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ULL */.  int rc 
2b010 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 1;            
2b020 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75  /* Value to retu
2b030 72 6e 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e  rn from this fun
2b040 63 74 69 6f 6e 20 2a 2f 0a 20 20 44 69 73 74 69  ction */.  Disti
2b050 6e 63 74 43 74 78 20 73 44 69 73 74 69 6e 63 74  nctCtx sDistinct
2b060 3b 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f 77  ; /* Info on how
2b070 20 74 6f 20 63 6f 64 65 20 74 68 65 20 44 49 53   to code the DIS
2b080 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 2a 2f  TINCT keyword */
2b090 0a 20 20 53 6f 72 74 43 74 78 20 73 53 6f 72 74  .  SortCtx sSort
2b0a0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66  ;         /* Inf
2b0b0 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 63 6f 64 65  o on how to code
2b0c0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
2b0d0 61 75 73 65 20 2a 2f 0a 20 20 41 67 67 49 6e 66  ause */.  AggInf
2b0e0 6f 20 73 41 67 67 49 6e 66 6f 3b 20 20 20 20 20  o sAggInfo;     
2b0f0 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20   /* Information 
2b100 75 73 65 64 20 62 79 20 61 67 67 72 65 67 61 74  used by aggregat
2b110 65 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 69  e queries */.  i
2b120 6e 74 20 69 45 6e 64 3b 20 20 20 20 20 20 20 20  nt iEnd;        
2b130 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
2b140 20 6f 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74   of the end of t
2b150 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 73 71  he query */.  sq
2b160 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
2b170 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
2b180 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
2b190 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
2b1a0 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
2b1b0 20 20 69 6e 74 20 69 52 65 73 74 6f 72 65 53 65    int iRestoreSe
2b1c0 6c 65 63 74 49 64 20 3d 20 70 50 61 72 73 65 2d  lectId = pParse-
2b1d0 3e 69 53 65 6c 65 63 74 49 64 3b 0a 20 20 70 50  >iSelectId;.  pP
2b1e0 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 20  arse->iSelectId 
2b1f0 3d 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  = pParse->iNextS
2b200 65 6c 65 63 74 49 64 2b 2b 3b 0a 23 65 6e 64 69  electId++;.#endi
2b210 66 0a 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  f..  db = pParse
2b220 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30  ->db;.  if( p==0
2b230 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
2b240 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e  iled || pParse->
2b250 6e 45 72 72 20 29 7b 0a 20 20 20 20 72 65 74 75  nErr ){.    retu
2b260 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 1;.  }.  if( 
2b270 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
2b280 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
2b290 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29  SELECT, 0, 0, 0)
2b2a0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d   ) return 1;.  m
2b2b0 65 6d 73 65 74 28 26 73 41 67 67 49 6e 66 6f 2c  emset(&sAggInfo,
2b2c0 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 67 67 49   0, sizeof(sAggI
2b2d0 6e 66 6f 29 29 3b 0a 23 69 66 20 53 45 4c 45 43  nfo));.#if SELEC
2b2e0 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  TTRACE_ENABLED. 
2b2f0 20 70 50 61 72 73 65 2d 3e 6e 53 65 6c 65 63 74   pParse->nSelect
2b300 49 6e 64 65 6e 74 2b 2b 3b 0a 20 20 53 45 4c 45  Indent++;.  SELE
2b310 43 54 54 52 41 43 45 28 31 2c 70 50 61 72 73 65  CTTRACE(1,pParse
2b320 2c 70 2c 20 28 22 62 65 67 69 6e 20 70 72 6f 63  ,p, ("begin proc
2b330 65 73 73 69 6e 67 3a 5c 6e 22 29 29 3b 0a 20 20  essing:\n"));.  
2b340 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
2b350 74 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29  tTrace & 0x100 )
2b360 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65  {.    sqlite3Tre
2b370 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70  eViewSelect(0, p
2b380 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  , 0);.  }.#endif
2b390 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ..  assert( p->p
2b3a0 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44  OrderBy==0 || pD
2b3b0 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f  est->eDest!=SRT_
2b3c0 44 69 73 74 46 69 66 6f 20 29 3b 0a 20 20 61 73  DistFifo );.  as
2b3d0 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42  sert( p->pOrderB
2b3e0 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65  y==0 || pDest->e
2b3f0 44 65 73 74 21 3d 53 52 54 5f 46 69 66 6f 20 29  Dest!=SRT_Fifo )
2b400 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
2b410 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44  OrderBy==0 || pD
2b420 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f  est->eDest!=SRT_
2b430 44 69 73 74 51 75 65 75 65 20 29 3b 0a 20 20 61  DistQueue );.  a
2b440 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
2b450 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e  By==0 || pDest->
2b460 65 44 65 73 74 21 3d 53 52 54 5f 51 75 65 75 65  eDest!=SRT_Queue
2b470 20 29 3b 0a 20 20 69 66 28 20 49 67 6e 6f 72 61   );.  if( Ignora
2b480 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73 74  bleOrderby(pDest
2b490 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
2b4a0 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
2b4b0 54 5f 45 78 69 73 74 73 20 7c 7c 20 70 44 65 73  T_Exists || pDes
2b4c0 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 55 6e  t->eDest==SRT_Un
2b4d0 69 6f 6e 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  ion || .        
2b4e0 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d     pDest->eDest=
2b4f0 3d 53 52 54 5f 45 78 63 65 70 74 20 7c 7c 20 70  =SRT_Except || p
2b500 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
2b510 5f 44 69 73 63 61 72 64 20 7c 7c 0a 20 20 20 20  _Discard ||.    
2b520 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44         pDest->eD
2b530 65 73 74 3d 3d 53 52 54 5f 51 75 65 75 65 20 20  est==SRT_Queue  
2b540 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  || pDest->eDest=
2b550 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20 7c 7c  =SRT_DistFifo ||
2b560 0a 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73  .           pDes
2b570 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69  t->eDest==SRT_Di
2b580 73 74 51 75 65 75 65 20 7c 7c 20 70 44 65 73 74  stQueue || pDest
2b590 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 46 69 66  ->eDest==SRT_Fif
2b5a0 6f 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 4f 52  o);.    /* If OR
2b5b0 44 45 52 20 42 59 20 6d 61 6b 65 73 20 6e 6f 20  DER BY makes no 
2b5c0 64 69 66 66 65 72 65 6e 63 65 20 69 6e 20 74 68  difference in th
2b5d0 65 20 6f 75 74 70 75 74 20 74 68 65 6e 20 6e 65  e output then ne
2b5e0 69 74 68 65 72 20 64 6f 65 73 0a 20 20 20 20 2a  ither does.    *
2b5f0 2a 20 44 49 53 54 49 4e 43 54 20 73 6f 20 69 74  * DISTINCT so it
2b600 20 63 61 6e 20 62 65 20 72 65 6d 6f 76 65 64 20   can be removed 
2b610 74 6f 6f 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69  too. */.    sqli
2b620 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
2b630 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  e(db, p->pOrderB
2b640 79 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65  y);.    p->pOrde
2b650 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  rBy = 0;.    p->
2b660 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f  selFlags &= ~SF_
2b670 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a 20 20  Distinct;.  }.  
2b680 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65  sqlite3SelectPre
2b690 70 28 70 50 61 72 73 65 2c 20 70 2c 20 30 29 3b  p(pParse, p, 0);
2b6a0 0a 20 20 6d 65 6d 73 65 74 28 26 73 53 6f 72 74  .  memset(&sSort
2b6b0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 53 6f 72  , 0, sizeof(sSor
2b6c0 74 29 29 3b 0a 20 20 73 53 6f 72 74 2e 70 4f 72  t));.  sSort.pOr
2b6d0 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
2b6e0 72 42 79 3b 0a 20 20 70 54 61 62 4c 69 73 74 20  rBy;.  pTabList 
2b6f0 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c  = p->pSrc;.  pEL
2b700 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
2b710 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
2b720 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  Err || db->mallo
2b730 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67  cFailed ){.    g
2b740 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
2b750 20 20 7d 0a 20 20 69 73 41 67 67 20 3d 20 28 70    }.  isAgg = (p
2b760 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
2b770 41 67 67 72 65 67 61 74 65 29 21 3d 30 3b 0a 20  Aggregate)!=0;. 
2b780 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21   assert( pEList!
2b790 3d 30 20 29 3b 0a 23 69 66 20 53 45 4c 45 43 54  =0 );.#if SELECT
2b7a0 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
2b7b0 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
2b7c0 74 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29  tTrace & 0x100 )
2b7d0 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43  {.    SELECTTRAC
2b7e0 45 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70  E(0x100,pParse,p
2b7f0 2c 20 28 22 61 66 74 65 72 20 6e 61 6d 65 20 72  , ("after name r
2b800 65 73 6f 6c 75 74 69 6f 6e 3a 5c 6e 22 29 29 3b  esolution:\n"));
2b810 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65  .    sqlite3Tree
2b820 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c  ViewSelect(0, p,
2b830 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
2b840 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e  ..  /* Begin gen
2b850 65 72 61 74 69 6e 67 20 63 6f 64 65 2e 0a 20 20  erating code..  
2b860 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  */.  v = sqlite3
2b870 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
2b880 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f  .  if( v==0 ) go
2b890 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a  to select_end;..
2b8a0 20 20 2f 2a 20 49 66 20 77 72 69 74 69 6e 67 20    /* If writing 
2b8b0 74 6f 20 6d 65 6d 6f 72 79 20 6f 72 20 67 65 6e  to memory or gen
2b8c0 65 72 61 74 69 6e 67 20 61 20 73 65 74 0a 20 20  erating a set.  
2b8d0 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  ** only a single
2b8e0 20 63 6f 6c 75 6d 6e 20 6d 61 79 20 62 65 20 6f   column may be o
2b8f0 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e  utput..  */.#ifn
2b900 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2b910 53 55 42 51 55 45 52 59 0a 20 20 69 66 28 20 63  SUBQUERY.  if( c
2b920 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75  heckForMultiColu
2b930 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72 28 70 50  mnSelectError(pP
2b940 61 72 73 65 2c 20 70 44 65 73 74 2c 20 70 45 4c  arse, pDest, pEL
2b950 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20  ist->nExpr) ){. 
2b960 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
2b970 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  nd;.  }.#endif..
2b980 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
2b990 64 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71  de for all sub-q
2b9a0 75 65 72 69 65 73 20 69 6e 20 74 68 65 20 46 52  ueries in the FR
2b9b0 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 23  OM clause.  */.#
2b9c0 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
2b9d0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
2b9e0 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
2b9f0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a  LITE_OMIT_VIEW).
2ba00 20 20 66 6f 72 28 69 3d 30 3b 20 21 70 2d 3e 70    for(i=0; !p->p
2ba10 50 72 69 6f 72 20 26 26 20 69 3c 70 54 61 62 4c  Prior && i<pTabL
2ba20 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  ist->nSrc; i++){
2ba30 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
2ba40 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
2ba50 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  = &pTabList->a[i
2ba60 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74 44 65 73  ];.    SelectDes
2ba70 74 20 64 65 73 74 3b 0a 20 20 20 20 53 65 6c 65  t dest;.    Sele
2ba80 63 74 20 2a 70 53 75 62 20 3d 20 70 49 74 65 6d  ct *pSub = pItem
2ba90 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 69  ->pSelect;.    i
2baa0 6e 74 20 69 73 41 67 67 53 75 62 3b 0a 0a 20 20  nt isAggSub;..  
2bab0 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20 29 20    if( pSub==0 ) 
2bac0 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f  continue;..    /
2bad0 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74 68 65 20  * Sometimes the 
2bae0 63 6f 64 65 20 66 6f 72 20 61 20 73 75 62 71 75  code for a subqu
2baf0 65 72 79 20 77 69 6c 6c 20 62 65 20 67 65 6e 65  ery will be gene
2bb00 72 61 74 65 64 20 6d 6f 72 65 20 74 68 61 6e 0a  rated more than.
2bb10 20 20 20 20 2a 2a 20 6f 6e 63 65 2c 20 69 66 20      ** once, if 
2bb20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
2bb30 70 61 72 74 20 6f 66 20 74 68 65 20 57 48 45 52  part of the WHER
2bb40 45 20 63 6c 61 75 73 65 20 69 6e 20 61 20 4c 45  E clause in a LE
2bb50 46 54 20 4a 4f 49 4e 2c 0a 20 20 20 20 2a 2a 20  FT JOIN,.    ** 
2bb60 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20 20 49 6e  for example.  In
2bb70 20 74 68 61 74 20 63 61 73 65 2c 20 64 6f 20 6e   that case, do n
2bb80 6f 74 20 72 65 67 65 6e 65 72 61 74 65 20 74 68  ot regenerate th
2bb90 65 20 63 6f 64 65 20 74 6f 20 6d 61 6e 69 66 65  e code to manife
2bba0 73 74 0a 20 20 20 20 2a 2a 20 61 20 76 69 65 77  st.    ** a view
2bbb0 20 6f 72 20 74 68 65 20 63 6f 2d 72 6f 75 74 69   or the co-routi
2bbc0 6e 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ne to implement 
2bbd0 61 20 76 69 65 77 2e 20 20 54 68 65 20 66 69 72  a view.  The fir
2bbe0 73 74 20 69 6e 73 74 61 6e 63 65 0a 20 20 20 20  st instance.    
2bbf0 2a 2a 20 69 73 20 73 75 66 66 69 63 69 65 6e 74  ** is sufficient
2bc00 2c 20 74 68 6f 75 67 68 20 74 68 65 20 73 75 62  , though the sub
2bc10 72 6f 75 74 69 6e 65 20 74 6f 20 6d 61 6e 69 66  routine to manif
2bc20 65 73 74 20 74 68 65 20 76 69 65 77 20 64 6f 65  est the view doe
2bc30 73 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f  s need.    ** to
2bc40 20 62 65 20 69 6e 76 6f 6b 65 64 20 61 67 61 69   be invoked agai
2bc50 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 49  n. */.    if( pI
2bc60 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
2bc70 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49   ){.      if( pI
2bc80 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e  tem->viaCoroutin
2bc90 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
2bca0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2bcb0 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70  2(v, OP_Gosub, p
2bcc0 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 2c  Item->regReturn,
2bcd0 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c   pItem->addrFill
2bce0 53 75 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Sub);.      }.  
2bcf0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
2bd00 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72    }..    /* Incr
2bd10 65 6d 65 6e 74 20 50 61 72 73 65 2e 6e 48 65 69  ement Parse.nHei
2bd20 67 68 74 20 62 79 20 74 68 65 20 68 65 69 67 68  ght by the heigh
2bd30 74 20 6f 66 20 74 68 65 20 6c 61 72 67 65 73 74  t of the largest
2bd40 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20   expression.    
2bd50 2a 2a 20 74 72 65 65 20 72 65 66 65 72 72 65 64  ** tree referred
2bd60 20 74 6f 20 62 79 20 74 68 69 73 2c 20 74 68 65   to by this, the
2bd70 20 70 61 72 65 6e 74 20 73 65 6c 65 63 74 2e 20   parent select. 
2bd80 54 68 65 20 63 68 69 6c 64 20 73 65 6c 65 63 74  The child select
2bd90 0a 20 20 20 20 2a 2a 20 6d 61 79 20 63 6f 6e 74  .    ** may cont
2bda0 61 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74  ain expression t
2bdb0 72 65 65 73 20 6f 66 20 61 74 20 6d 6f 73 74 0a  rees of at most.
2bdc0 20 20 20 20 2a 2a 20 28 53 51 4c 49 54 45 5f 4d      ** (SQLITE_M
2bdd0 41 58 5f 45 58 50 52 5f 44 45 50 54 48 2d 50 61  AX_EXPR_DEPTH-Pa
2bde0 72 73 65 2e 6e 48 65 69 67 68 74 29 20 68 65 69  rse.nHeight) hei
2bdf0 67 68 74 2e 20 54 68 69 73 20 69 73 20 61 20 62  ght. This is a b
2be00 69 74 0a 20 20 20 20 2a 2a 20 6d 6f 72 65 20 63  it.    ** more c
2be10 6f 6e 73 65 72 76 61 74 69 76 65 20 74 68 61 6e  onservative than
2be20 20 6e 65 63 65 73 73 61 72 79 2c 20 62 75 74 20   necessary, but 
2be30 6d 75 63 68 20 65 61 73 69 65 72 20 74 68 61 6e  much easier than
2be40 20 65 6e 66 6f 72 63 69 6e 67 0a 20 20 20 20 2a   enforcing.    *
2be50 2a 20 61 6e 20 65 78 61 63 74 20 6c 69 6d 69 74  * an exact limit
2be60 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61  ..    */.    pPa
2be70 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20  rse->nHeight += 
2be80 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70  sqlite3SelectExp
2be90 72 48 65 69 67 68 74 28 70 29 3b 0a 0a 20 20 20  rHeight(p);..   
2bea0 20 69 73 41 67 67 53 75 62 20 3d 20 28 70 53 75   isAggSub = (pSu
2beb0 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  b->selFlags & SF
2bec0 5f 41 67 67 72 65 67 61 74 65 29 21 3d 30 3b 0a  _Aggregate)!=0;.
2bed0 20 20 20 20 69 66 28 20 66 6c 61 74 74 65 6e 53      if( flattenS
2bee0 75 62 71 75 65 72 79 28 70 50 61 72 73 65 2c 20  ubquery(pParse, 
2bef0 70 2c 20 69 2c 20 69 73 41 67 67 2c 20 69 73 41  p, i, isAgg, isA
2bf00 67 67 53 75 62 29 20 29 7b 0a 20 20 20 20 20 20  ggSub) ){.      
2bf10 2f 2a 20 54 68 69 73 20 73 75 62 71 75 65 72 79  /* This subquery
2bf20 20 63 61 6e 20 62 65 20 61 62 73 6f 72 62 65 64   can be absorbed
2bf30 20 69 6e 74 6f 20 69 74 73 20 70 61 72 65 6e 74   into its parent
2bf40 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69  . */.      if( i
2bf50 73 41 67 67 53 75 62 20 29 7b 0a 20 20 20 20 20  sAggSub ){.     
2bf60 20 20 20 69 73 41 67 67 20 3d 20 31 3b 0a 20 20     isAgg = 1;.  
2bf70 20 20 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67        p->selFlag
2bf80 73 20 7c 3d 20 53 46 5f 41 67 67 72 65 67 61 74  s |= SF_Aggregat
2bf90 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
2bfa0 20 69 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c   i = -1;.    }el
2bfb0 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70  se{.      if( (p
2bfc0 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26  Item->jointype &
2bfd0 20 4a 54 5f 4f 55 54 45 52 29 3d 3d 30 0a 20 20   JT_OUTER)==0.  
2bfe0 20 20 20 20 20 26 26 20 70 75 73 68 44 6f 77 6e       && pushDown
2bff0 57 68 65 72 65 54 65 72 6d 73 28 64 62 2c 20 70  WhereTerms(db, p
2c000 53 75 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20  Sub, p->pWhere, 
2c010 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 0a  pItem->iCursor).
2c020 20 20 20 20 20 20 29 7b 0a 23 69 66 20 53 45 4c        ){.#if SEL
2c030 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ECTTRACE_ENABLED
2c040 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
2c050 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20  ite3SelectTrace 
2c060 26 20 30 78 31 30 30 20 29 7b 0a 20 20 20 20 20  & 0x100 ){.     
2c070 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
2c080 67 50 72 69 6e 74 66 28 22 41 66 74 65 72 20 57  gPrintf("After W
2c090 48 45 52 45 2d 63 6c 61 75 73 65 20 70 75 73 68  HERE-clause push
2c0a0 2d 64 6f 77 6e 3a 5c 6e 22 29 3b 0a 20 20 20 20  -down:\n");.    
2c0b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65        sqlite3Tre
2c0c0 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70  eViewSelect(0, p
2c0d0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 0);.        }.
2c0e0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20  #endif.      }. 
2c0f0 20 20 20 20 20 69 66 28 20 70 54 61 62 4c 69 73       if( pTabLis
2c100 74 2d 3e 6e 53 72 63 3d 3d 31 0a 20 20 20 20 20  t->nSrc==1.     
2c110 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f    && Optimizatio
2c120 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c  nEnabled(db, SQL
2c130 49 54 45 5f 53 75 62 71 43 6f 72 6f 75 74 69 6e  ITE_SubqCoroutin
2c140 65 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  e).      ){.    
2c150 20 20 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74      /* Implement
2c160 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74 68   a co-routine th
2c170 61 74 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61  at will return a
2c180 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74   single row of t
2c190 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20  he result.      
2c1a0 20 20 2a 2a 20 73 65 74 20 6f 6e 20 65 61 63 68    ** set on each
2c1b0 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a 20 20 20   invocation..   
2c1c0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2c1d0 69 6e 74 20 61 64 64 72 54 6f 70 20 3d 20 73 71  int addrTop = sq
2c1e0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
2c1f0 41 64 64 72 28 76 29 2b 31 3b 0a 20 20 20 20 20  Addr(v)+1;.     
2c200 20 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74     pItem->regRet
2c210 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  urn = ++pParse->
2c220 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 73 71  nMem;.        sq
2c230 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
2c240 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74  v, OP_InitCorout
2c250 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52  ine, pItem->regR
2c260 65 74 75 72 6e 2c 20 30 2c 20 61 64 64 72 54 6f  eturn, 0, addrTo
2c270 70 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  p);.        Vdbe
2c280 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22  Comment((v, "%s"
2c290 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a  , pItem->pTab->z
2c2a0 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 20 20  Name));.        
2c2b0 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
2c2c0 75 62 20 3d 20 61 64 64 72 54 6f 70 3b 0a 20 20  ub = addrTop;.  
2c2d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
2c2e0 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
2c2f0 74 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t, SRT_Coroutine
2c300 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  , pItem->regRetu
2c310 72 6e 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70  rn);.        exp
2c320 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 70  lainSetInteger(p
2c330 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49 64 2c  Item->iSelectId,
2c340 20 28 75 38 29 70 50 61 72 73 65 2d 3e 69 4e 65   (u8)pParse->iNe
2c350 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  xtSelectId);.   
2c360 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
2c370 63 74 28 70 50 61 72 73 65 2c 20 70 53 75 62 2c  ct(pParse, pSub,
2c380 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 20   &dest);.       
2c390 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52   pItem->pTab->nR
2c3a0 6f 77 4c 6f 67 45 73 74 20 3d 20 73 71 6c 69 74  owLogEst = sqlit
2c3b0 65 33 4c 6f 67 45 73 74 28 70 53 75 62 2d 3e 6e  e3LogEst(pSub->n
2c3c0 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20 20 20  SelectRow);.    
2c3d0 20 20 20 20 70 49 74 65 6d 2d 3e 76 69 61 43 6f      pItem->viaCo
2c3e0 72 6f 75 74 69 6e 65 20 3d 20 31 3b 0a 20 20 20  routine = 1;.   
2c3f0 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 67 52       pItem->regR
2c400 65 73 75 6c 74 20 3d 20 64 65 73 74 2e 69 53 64  esult = dest.iSd
2c410 73 74 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  st;.        sqli
2c420 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
2c430 20 4f 50 5f 45 6e 64 43 6f 72 6f 75 74 69 6e 65   OP_EndCoroutine
2c440 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  , pItem->regRetu
2c450 72 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  rn);.        sql
2c460 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
2c470 28 76 2c 20 61 64 64 72 54 6f 70 2d 31 29 3b 0a  (v, addrTop-1);.
2c480 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
2c490 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63 68 65  learTempRegCache
2c4a0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
2c4b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
2c4c0 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
2c4d0 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c  routine that wil
2c4e0 6c 20 66 69 6c 6c 20 61 6e 20 65 70 68 65 6d 65  l fill an epheme
2c4f0 72 61 6c 20 74 61 62 6c 65 20 77 69 74 68 0a 20  ral table with. 
2c500 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 6f         ** the co
2c510 6e 74 65 6e 74 20 6f 66 20 74 68 69 73 20 73 75  ntent of this su
2c520 62 71 75 65 72 79 2e 20 20 70 49 74 65 6d 2d 3e  bquery.  pItem->
2c530 61 64 64 72 46 69 6c 6c 53 75 62 20 77 69 6c 6c  addrFillSub will
2c540 20 70 6f 69 6e 74 0a 20 20 20 20 20 20 20 20 2a   point.        *
2c550 2a 20 74 6f 20 74 68 65 20 61 64 64 72 65 73 73  * to the address
2c560 20 6f 66 20 74 68 65 20 67 65 6e 65 72 61 74 65   of the generate
2c570 64 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 70  d subroutine.  p
2c580 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 0a  Item->regReturn.
2c590 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 61 20          ** is a 
2c5a0 72 65 67 69 73 74 65 72 20 61 6c 6c 6f 63 61 74  register allocat
2c5b0 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 73  ed to hold the s
2c5c0 75 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  ubroutine return
2c5d0 20 61 64 64 72 65 73 73 0a 20 20 20 20 20 20 20   address.       
2c5e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
2c5f0 74 6f 70 41 64 64 72 3b 0a 20 20 20 20 20 20 20  topAddr;.       
2c600 20 69 6e 74 20 6f 6e 63 65 41 64 64 72 20 3d 20   int onceAddr = 
2c610 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  0;.        int r
2c620 65 74 41 64 64 72 3b 0a 20 20 20 20 20 20 20 20  etAddr;.        
2c630 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 61  assert( pItem->a
2c640 64 64 72 46 69 6c 6c 53 75 62 3d 3d 30 20 29 3b  ddrFillSub==0 );
2c650 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  .        pItem->
2c660 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50  regReturn = ++pP
2c670 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
2c680 20 20 20 20 74 6f 70 41 64 64 72 20 3d 20 73 71      topAddr = sq
2c690 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2c6a0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
2c6b0 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  , pItem->regRetu
2c6c0 72 6e 29 3b 0a 20 20 20 20 20 20 20 20 70 49 74  rn);.        pIt
2c6d0 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20  em->addrFillSub 
2c6e0 3d 20 74 6f 70 41 64 64 72 2b 31 3b 0a 20 20 20  = topAddr+1;.   
2c6f0 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
2c700 69 73 43 6f 72 72 65 6c 61 74 65 64 3d 3d 30 20  isCorrelated==0 
2c710 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
2c720 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
2c730 69 73 20 6e 6f 74 20 63 6f 72 72 65 6c 61 74 65  is not correlate
2c740 64 20 61 6e 64 20 69 66 20 77 65 20 61 72 65 20  d and if we are 
2c750 6e 6f 74 20 69 6e 73 69 64 65 20 6f 66 0a 20 20  not inside of.  
2c760 20 20 20 20 20 20 20 20 2a 2a 20 61 20 74 72 69          ** a tri
2c770 67 67 65 72 2c 20 74 68 65 6e 20 77 65 20 6f 6e  gger, then we on
2c780 6c 79 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75  ly need to compu
2c790 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  te the value of 
2c7a0 74 68 65 20 73 75 62 71 75 65 72 79 0a 20 20 20  the subquery.   
2c7b0 20 20 20 20 20 20 20 2a 2a 20 6f 6e 63 65 2e 20         ** once. 
2c7c0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6f 6e 63  */.          onc
2c7d0 65 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 43  eAddr = sqlite3C
2c7e0 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b  odeOnce(pParse);
2c7f0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
2c800 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65  ;.          Vdbe
2c810 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6d 61 74  Comment((v, "mat
2c820 65 72 69 61 6c 69 7a 65 20 5c 22 25 73 5c 22 22  erialize \"%s\""
2c830 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a  , pItem->pTab->z
2c840 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 20 20  Name));.        
2c850 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2c860 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
2c870 28 28 76 2c 20 22 6d 61 74 65 72 69 61 6c 69 7a  ((v, "materializ
2c880 65 20 5c 22 25 73 5c 22 22 2c 20 70 49 74 65 6d  e \"%s\"", pItem
2c890 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b  ->pTab->zName));
2c8a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2c8b0 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
2c8c0 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20  DestInit(&dest, 
2c8d0 53 52 54 5f 45 70 68 65 6d 54 61 62 2c 20 70 49  SRT_EphemTab, pI
2c8e0 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  tem->iCursor);. 
2c8f0 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65         explainSe
2c900 74 49 6e 74 65 67 65 72 28 70 49 74 65 6d 2d 3e  tInteger(pItem->
2c910 69 53 65 6c 65 63 74 49 64 2c 20 28 75 38 29 70  iSelectId, (u8)p
2c920 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
2c930 63 74 49 64 29 3b 0a 20 20 20 20 20 20 20 20 73  ctId);.        s
2c940 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
2c950 72 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74  rse, pSub, &dest
2c960 29 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d  );.        pItem
2c970 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45  ->pTab->nRowLogE
2c980 73 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  st = sqlite3LogE
2c990 73 74 28 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74  st(pSub->nSelect
2c9a0 52 6f 77 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Row);.        if
2c9b0 28 20 6f 6e 63 65 41 64 64 72 20 29 20 73 71 6c  ( onceAddr ) sql
2c9c0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
2c9d0 28 76 2c 20 6f 6e 63 65 41 64 64 72 29 3b 0a 20  (v, onceAddr);. 
2c9e0 20 20 20 20 20 20 20 72 65 74 41 64 64 72 20 3d         retAddr =
2c9f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2ca00 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p1(v, OP_Return,
2ca10 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72   pItem->regRetur
2ca20 6e 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  n);.        Vdbe
2ca30 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64  Comment((v, "end
2ca40 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61   %s", pItem->pTa
2ca50 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  b->zName));.    
2ca60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
2ca70 68 61 6e 67 65 50 31 28 76 2c 20 74 6f 70 41 64  hangeP1(v, topAd
2ca80 64 72 2c 20 72 65 74 41 64 64 72 29 3b 0a 20 20  dr, retAddr);.  
2ca90 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65        sqlite3Cle
2caa0 61 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 70  arTempRegCache(p
2cab0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a  Parse);.      }.
2cac0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62      }.    if( db
2cad0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
2cae0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c  {.      goto sel
2caf0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20  ect_end;.    }. 
2cb00 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67     pParse->nHeig
2cb10 68 74 20 2d 3d 20 73 71 6c 69 74 65 33 53 65 6c  ht -= sqlite3Sel
2cb20 65 63 74 45 78 70 72 48 65 69 67 68 74 28 70 29  ectExprHeight(p)
2cb30 3b 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d  ;.    pTabList =
2cb40 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 69 66   p->pSrc;.    if
2cb50 28 20 21 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65  ( !IgnorableOrde
2cb60 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20  rby(pDest) ){.  
2cb70 20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72      sSort.pOrder
2cb80 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
2cb90 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 45  ;.    }.  }.  pE
2cba0 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
2cbb0 3b 0a 23 65 6e 64 69 66 0a 20 20 70 57 68 65 72  ;.#endif.  pWher
2cbc0 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20  e = p->pWhere;. 
2cbd0 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70   pGroupBy = p->p
2cbe0 47 72 6f 75 70 42 79 3b 0a 20 20 70 48 61 76 69  GroupBy;.  pHavi
2cbf0 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b  ng = p->pHaving;
2cc00 0a 20 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54  .  sDistinct.isT
2cc10 6e 63 74 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61  nct = (p->selFla
2cc20 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74  gs & SF_Distinct
2cc30 29 21 3d 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53  )!=0;..#ifndef S
2cc40 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
2cc50 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 2f 2a 20  UND_SELECT.  /* 
2cc60 49 66 20 74 68 65 72 65 20 69 73 20 61 72 65 20  If there is are 
2cc70 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 71 75  a sequence of qu
2cc80 65 72 69 65 73 2c 20 64 6f 20 74 68 65 20 65 61  eries, do the ea
2cc90 72 6c 69 65 72 20 6f 6e 65 73 20 66 69 72 73 74  rlier ones first
2cca0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
2ccb0 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 72 63  pPrior ){.    rc
2ccc0 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 70   = multiSelect(p
2ccd0 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29  Parse, p, pDest)
2cce0 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74  ;.    explainSet
2ccf0 49 6e 74 65 67 65 72 28 70 50 61 72 73 65 2d 3e  Integer(pParse->
2cd00 69 53 65 6c 65 63 74 49 64 2c 20 69 52 65 73 74  iSelectId, iRest
2cd10 6f 72 65 53 65 6c 65 63 74 49 64 29 3b 0a 23 69  oreSelectId);.#i
2cd20 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e  f SELECTTRACE_EN
2cd30 41 42 4c 45 44 0a 20 20 20 20 53 45 4c 45 43 54  ABLED.    SELECT
2cd40 54 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70  TRACE(1,pParse,p
2cd50 2c 28 22 65 6e 64 20 63 6f 6d 70 6f 75 6e 64 2d  ,("end compound-
2cd60 73 65 6c 65 63 74 20 70 72 6f 63 65 73 73 69 6e  select processin
2cd70 67 5c 6e 22 29 29 3b 0a 20 20 20 20 70 50 61 72  g\n"));.    pPar
2cd80 73 65 2d 3e 6e 53 65 6c 65 63 74 49 6e 64 65 6e  se->nSelectInden
2cd90 74 2d 2d 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  t--;.#endif.    
2cda0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23  return rc;.  }.#
2cdb0 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
2cdc0 4c 49 54 45 5f 43 4f 55 4e 54 4f 46 56 49 45 57  LITE_COUNTOFVIEW
2cdd0 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20  _OPTIMIZATION.  
2cde0 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e  if( Optimization
2cdf0 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49  Enabled(db, SQLI
2ce00 54 45 5f 51 75 65 72 79 46 6c 61 74 74 65 6e 65  TE_QueryFlattene
2ce10 72 7c 53 51 4c 49 54 45 5f 43 6f 75 6e 74 4f 66  r|SQLITE_CountOf
2ce20 56 69 65 77 29 0a 20 20 20 26 26 20 63 6f 75 6e  View).   && coun
2ce30 74 4f 66 56 69 65 77 4f 70 74 69 6d 69 7a 61 74  tOfViewOptimizat
2ce40 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 29 0a 20  ion(pParse, p). 
2ce50 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e   ){.    if( db->
2ce60 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
2ce70 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
2ce80 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e      pEList = p->
2ce90 70 45 4c 69 73 74 3b 0a 20 20 20 20 70 54 61 62  pEList;.    pTab
2cea0 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  List = p->pSrc;.
2ceb0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
2cec0 20 49 66 20 74 68 65 20 71 75 65 72 79 20 69 73   If the query is
2ced0 20 44 49 53 54 49 4e 43 54 20 77 69 74 68 20 61   DISTINCT with a
2cee0 6e 20 4f 52 44 45 52 20 42 59 20 62 75 74 20 69  n ORDER BY but i
2cef0 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61  s not an aggrega
2cf00 74 65 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 69 66  te, and .  ** if
2cf10 20 74 68 65 20 73 65 6c 65 63 74 2d 6c 69 73 74   the select-list
2cf20 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
2cf30 74 68 65 20 4f 52 44 45 52 20 42 59 20 6c 69 73  the ORDER BY lis
2cf40 74 2c 20 74 68 65 6e 20 74 68 69 73 20 71 75 65  t, then this que
2cf50 72 79 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20 72  ry.  ** can be r
2cf60 65 77 72 69 74 74 65 6e 20 61 73 20 61 20 47 52  ewritten as a GR
2cf70 4f 55 50 20 42 59 2e 20 49 6e 20 6f 74 68 65 72  OUP BY. In other
2cf80 20 77 6f 72 64 73 2c 20 74 68 69 73 3a 0a 20 20   words, this:.  
2cf90 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  **.  **     SELE
2cfa0 43 54 20 44 49 53 54 49 4e 43 54 20 78 79 7a 20  CT DISTINCT xyz 
2cfb0 46 52 4f 4d 20 2e 2e 2e 20 4f 52 44 45 52 20 42  FROM ... ORDER B
2cfc0 59 20 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  Y xyz.  **.  ** 
2cfd0 69 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 74  is transformed t
2cfe0 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  o:.  **.  **    
2cff0 20 53 45 4c 45 43 54 20 78 79 7a 20 46 52 4f 4d   SELECT xyz FROM
2d000 20 2e 2e 2e 20 47 52 4f 55 50 20 42 59 20 78 79   ... GROUP BY xy
2d010 7a 20 4f 52 44 45 52 20 42 59 20 78 79 7a 0a 20  z ORDER BY xyz. 
2d020 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 65 63   **.  ** The sec
2d030 6f 6e 64 20 66 6f 72 6d 20 69 73 20 70 72 65 66  ond form is pref
2d040 65 72 72 65 64 20 61 73 20 61 20 73 69 6e 67 6c  erred as a singl
2d050 65 20 69 6e 64 65 78 20 28 6f 72 20 74 65 6d 70  e index (or temp
2d060 2d 74 61 62 6c 65 29 20 6d 61 79 20 62 65 20 0a  -table) may be .
2d070 20 20 2a 2a 20 75 73 65 64 20 66 6f 72 20 62 6f    ** used for bo
2d080 74 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  th the ORDER BY 
2d090 61 6e 64 20 44 49 53 54 49 4e 43 54 20 70 72 6f  and DISTINCT pro
2d0a0 63 65 73 73 69 6e 67 2e 20 41 73 20 6f 72 69 67  cessing. As orig
2d0b0 69 6e 61 6c 6c 79 20 0a 20 20 2a 2a 20 77 72 69  inally .  ** wri
2d0c0 74 74 65 6e 20 74 68 65 20 71 75 65 72 79 20 6d  tten the query m
2d0d0 75 73 74 20 75 73 65 20 61 20 74 65 6d 70 2d 74  ust use a temp-t
2d0e0 61 62 6c 65 20 66 6f 72 20 61 74 20 6c 65 61 73  able for at leas
2d0f0 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 4f 52 44  t one of the ORD
2d100 45 52 20 0a 20 20 2a 2a 20 42 59 20 61 6e 64 20  ER .  ** BY and 
2d110 44 49 53 54 49 4e 43 54 2c 20 61 6e 64 20 61 6e  DISTINCT, and an
2d120 20 69 6e 64 65 78 20 6f 72 20 73 65 70 61 72 61   index or separa
2d130 74 65 20 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f  te temp-table fo
2d140 72 20 74 68 65 20 6f 74 68 65 72 2e 0a 20 20 2a  r the other..  *
2d150 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46  /.  if( (p->selF
2d160 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
2d170 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
2d180 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20  ))==SF_Distinct 
2d190 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78  .   && sqlite3Ex
2d1a0 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 73 53  prListCompare(sS
2d1b0 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 70 2d  ort.pOrderBy, p-
2d1c0 3e 70 45 4c 69 73 74 2c 20 2d 31 29 3d 3d 30 0a  >pEList, -1)==0.
2d1d0 20 20 29 7b 0a 20 20 20 20 70 2d 3e 73 65 6c 46    ){.    p->selF
2d1e0 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44 69 73 74  lags &= ~SF_Dist
2d1f0 69 6e 63 74 3b 0a 20 20 20 20 70 2d 3e 70 47 72  inct;.    p->pGr
2d200 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45  oupBy = sqlite3E
2d210 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
2d220 2d 3e 70 45 4c 69 73 74 2c 20 30 29 3b 0a 20 20  ->pEList, 0);.  
2d230 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e    pGroupBy = p->
2d240 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 2f 2a  pGroupBy;.    /*
2d250 20 4e 6f 74 69 63 65 20 74 68 61 74 20 65 76 65   Notice that eve
2d260 6e 20 74 68 6f 75 67 68 74 20 53 46 5f 44 69 73  n thought SF_Dis
2d270 74 69 6e 63 74 20 68 61 73 20 62 65 65 6e 20 63  tinct has been c
2d280 6c 65 61 72 65 64 20 66 72 6f 6d 20 70 2d 3e 73  leared from p->s
2d290 65 6c 46 6c 61 67 73 2c 0a 20 20 20 20 2a 2a 20  elFlags,.    ** 
2d2a0 74 68 65 20 73 44 69 73 74 69 6e 63 74 2e 69 73  the sDistinct.is
2d2b0 54 6e 63 74 20 69 73 20 73 74 69 6c 6c 20 73 65  Tnct is still se
2d2c0 74 2e 20 20 48 65 6e 63 65 2c 20 69 73 54 6e 63  t.  Hence, isTnc
2d2d0 74 20 72 65 70 72 65 73 65 6e 74 73 20 74 68 65  t represents the
2d2e0 0a 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c  .    ** original
2d2f0 20 73 65 74 74 69 6e 67 20 6f 66 20 74 68 65 20   setting of the 
2d300 53 46 5f 44 69 73 74 69 6e 63 74 20 66 6c 61 67  SF_Distinct flag
2d310 2c 20 6e 6f 74 20 74 68 65 20 63 75 72 72 65 6e  , not the curren
2d320 74 20 73 65 74 74 69 6e 67 20 2a 2f 0a 20 20 20  t setting */.   
2d330 20 61 73 73 65 72 74 28 20 73 44 69 73 74 69 6e   assert( sDistin
2d340 63 74 2e 69 73 54 6e 63 74 20 29 3b 0a 20 20 7d  ct.isTnct );.  }
2d350 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
2d360 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
2d370 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 68 69 73  lause, then this
2d380 20 73 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 69 6e   sorting.  ** in
2d390 64 65 78 20 6d 69 67 68 74 20 65 6e 64 20 75 70  dex might end up
2d3a0 20 62 65 69 6e 67 20 75 6e 75 73 65 64 20 69 66   being unused if
2d3b0 20 74 68 65 20 64 61 74 61 20 63 61 6e 20 62 65   the data can be
2d3c0 20 0a 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64   .  ** extracted
2d3d0 20 69 6e 20 70 72 65 2d 73 6f 72 74 65 64 20 6f   in pre-sorted o
2d3e0 72 64 65 72 2e 20 20 49 66 20 74 68 61 74 20 69  rder.  If that i
2d3f0 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e  s the case, then
2d400 20 74 68 65 0a 20 20 2a 2a 20 4f 50 5f 4f 70 65   the.  ** OP_Ope
2d410 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72  nEphemeral instr
2d420 75 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63  uction will be c
2d430 68 61 6e 67 65 64 20 74 6f 20 61 6e 20 4f 50 5f  hanged to an OP_
2d440 4e 6f 6f 70 20 6f 6e 63 65 0a 20 20 2a 2a 20 77  Noop once.  ** w
2d450 65 20 66 69 67 75 72 65 20 6f 75 74 20 74 68 61  e figure out tha
2d460 74 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e  t the sorting in
2d470 64 65 78 20 69 73 20 6e 6f 74 20 6e 65 65 64 65  dex is not neede
2d480 64 2e 20 20 54 68 65 20 61 64 64 72 53 6f 72 74  d.  The addrSort
2d490 49 6e 64 65 78 0a 20 20 2a 2a 20 76 61 72 69 61  Index.  ** varia
2d4a0 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 66  ble is used to f
2d4b0 61 63 69 6c 69 74 61 74 65 20 74 68 61 74 20 63  acilitate that c
2d4c0 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  hange..  */.  if
2d4d0 28 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79  ( sSort.pOrderBy
2d4e0 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20   ){.    KeyInfo 
2d4f0 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 70  *pKeyInfo;.    p
2d500 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66  KeyInfo = keyInf
2d510 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  oFromExprList(pP
2d520 61 72 73 65 2c 20 73 53 6f 72 74 2e 70 4f 72 64  arse, sSort.pOrd
2d530 65 72 42 79 2c 20 30 2c 20 70 45 4c 69 73 74 2d  erBy, 0, pEList-
2d540 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 73 53 6f  >nExpr);.    sSo
2d550 72 74 2e 69 45 43 75 72 73 6f 72 20 3d 20 70 50  rt.iECursor = pP
2d560 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
2d570 20 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74    sSort.addrSort
2d580 49 6e 64 65 78 20 3d 0a 20 20 20 20 20 20 73 71  Index =.      sq
2d590 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
2d5a0 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
2d5b0 72 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 73  ral,.          s
2d5c0 53 6f 72 74 2e 69 45 43 75 72 73 6f 72 2c 20 73  Sort.iECursor, s
2d5d0 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2d 3e 6e  Sort.pOrderBy->n
2d5e0 45 78 70 72 2b 31 2b 70 45 4c 69 73 74 2d 3e 6e  Expr+1+pEList->n
2d5f0 45 78 70 72 2c 20 30 2c 0a 20 20 20 20 20 20 20  Expr, 0,.       
2d600 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e     (char*)pKeyIn
2d610 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 0a 20  fo, P4_KEYINFO. 
2d620 20 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b       );.  }else{
2d630 0a 20 20 20 20 73 53 6f 72 74 2e 61 64 64 72 53  .    sSort.addrS
2d640 6f 72 74 49 6e 64 65 78 20 3d 20 2d 31 3b 0a 20  ortIndex = -1;. 
2d650 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
2d660 6f 75 74 70 75 74 20 69 73 20 64 65 73 74 69 6e  output is destin
2d670 65 64 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61  ed for a tempora
2d680 72 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74  ry table, open t
2d690 68 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  hat table..  */.
2d6a0 20 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65    if( pDest->eDe
2d6b0 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62  st==SRT_EphemTab
2d6c0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
2d6d0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2d6e0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70  OpenEphemeral, p
2d6f0 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 70  Dest->iSDParm, p
2d700 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
2d710 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65   }..  /* Set the
2d720 20 6c 69 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a 20   limiter..  */. 
2d730 20 69 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56   iEnd = sqlite3V
2d740 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
2d750 0a 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  .  p->nSelectRow
2d760 20 3d 20 4c 41 52 47 45 53 54 5f 49 4e 54 36 34   = LARGEST_INT64
2d770 3b 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74  ;.  computeLimit
2d780 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65  Registers(pParse
2d790 2c 20 70 2c 20 69 45 6e 64 29 3b 0a 20 20 69 66  , p, iEnd);.  if
2d7a0 28 20 70 2d 3e 69 4c 69 6d 69 74 3d 3d 30 20 26  ( p->iLimit==0 &
2d7b0 26 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74  & sSort.addrSort
2d7c0 49 6e 64 65 78 3e 3d 30 20 29 7b 0a 20 20 20 20  Index>=0 ){.    
2d7d0 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
2d7e0 28 76 2c 20 73 53 6f 72 74 2e 61 64 64 72 53 6f  (v, sSort.addrSo
2d7f0 72 74 49 6e 64 65 78 29 2d 3e 6f 70 63 6f 64 65  rtIndex)->opcode
2d800 20 3d 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e   = OP_SorterOpen
2d810 3b 0a 20 20 20 20 73 53 6f 72 74 2e 73 6f 72 74  ;.    sSort.sort
2d820 46 6c 61 67 73 20 7c 3d 20 53 4f 52 54 46 4c 41  Flags |= SORTFLA
2d830 47 5f 55 73 65 53 6f 72 74 65 72 3b 0a 20 20 7d  G_UseSorter;.  }
2d840 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 20 76 69  ..  /* Open a vi
2d850 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 20 75  rtual index to u
2d860 73 65 20 66 6f 72 20 74 68 65 20 64 69 73 74 69  se for the disti
2d870 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20  nct set..  */.  
2d880 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
2d890 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29 7b  & SF_Distinct ){
2d8a0 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 74  .    sDistinct.t
2d8b0 61 62 54 6e 63 74 20 3d 20 70 50 61 72 73 65 2d  abTnct = pParse-
2d8c0 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 44 69  >nTab++;.    sDi
2d8d0 73 74 69 6e 63 74 2e 61 64 64 72 54 6e 63 74 20  stinct.addrTnct 
2d8e0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
2d8f0 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op4(v, OP_OpenEp
2d900 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20 20  hemeral,.       
2d910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d920 20 20 20 20 20 20 20 20 20 73 44 69 73 74 69 6e           sDistin
2d930 63 74 2e 74 61 62 54 6e 63 74 2c 20 30 2c 20 30  ct.tabTnct, 0, 0
2d940 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2d950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d960 20 20 28 63 68 61 72 2a 29 6b 65 79 49 6e 66 6f    (char*)keyInfo
2d970 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
2d980 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 30  rse, p->pEList,0
2d990 2c 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ,0),.           
2d9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d9b0 20 20 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29       P4_KEYINFO)
2d9c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
2d9d0 65 43 68 61 6e 67 65 50 35 28 76 2c 20 42 54 52  eChangeP5(v, BTR
2d9e0 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20  EE_UNORDERED);. 
2d9f0 20 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e     sDistinct.eTn
2da00 63 74 54 79 70 65 20 3d 20 57 48 45 52 45 5f 44  ctType = WHERE_D
2da10 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45  ISTINCT_UNORDERE
2da20 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  D;.  }else{.    
2da30 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54  sDistinct.eTnctT
2da40 79 70 65 20 3d 20 57 48 45 52 45 5f 44 49 53 54  ype = WHERE_DIST
2da50 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a  INCT_NOOP;.  }..
2da60 20 20 69 66 28 20 21 69 73 41 67 67 20 26 26 20    if( !isAgg && 
2da70 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20  pGroupBy==0 ){. 
2da80 20 20 20 2f 2a 20 4e 6f 20 61 67 67 72 65 67 61     /* No aggrega
2da90 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64  te functions and
2daa0 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61   no GROUP BY cla
2dab0 75 73 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 77  use */.    u16 w
2dac0 63 74 72 6c 46 6c 61 67 73 20 3d 20 28 73 44 69  ctrlFlags = (sDi
2dad0 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 3f 20  stinct.isTnct ? 
2dae0 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49  WHERE_WANT_DISTI
2daf0 4e 43 54 20 3a 20 30 29 3b 0a 0a 20 20 20 20 2f  NCT : 0);..    /
2db00 2a 20 42 65 67 69 6e 20 74 68 65 20 64 61 74 61  * Begin the data
2db10 62 61 73 65 20 73 63 61 6e 2e 20 2a 2f 0a 20 20  base scan. */.  
2db20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74    pWInfo = sqlit
2db30 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61  e3WhereBegin(pPa
2db40 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
2db50 57 68 65 72 65 2c 20 73 53 6f 72 74 2e 70 4f 72  Where, sSort.pOr
2db60 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20 20  derBy,.         
2db70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2db80 20 20 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 2c        p->pEList,
2db90 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 30 29 3b   wctrlFlags, 0);
2dba0 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d  .    if( pWInfo=
2dbb0 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  =0 ) goto select
2dbc0 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 73 71  _end;.    if( sq
2dbd0 6c 69 74 65 33 57 68 65 72 65 4f 75 74 70 75 74  lite3WhereOutput
2dbe0 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66 6f 29  RowCount(pWInfo)
2dbf0 20 3c 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77   < p->nSelectRow
2dc00 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65   ){.      p->nSe
2dc10 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65  lectRow = sqlite
2dc20 33 57 68 65 72 65 4f 75 74 70 75 74 52 6f 77 43  3WhereOutputRowC
2dc30 6f 75 6e 74 28 70 57 49 6e 66 6f 29 3b 0a 20 20  ount(pWInfo);.  
2dc40 20 20 7d 0a 20 20 20 20 69 66 28 20 73 44 69 73    }.    if( sDis
2dc50 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 26 26 20  tinct.isTnct && 
2dc60 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 44 69  sqlite3WhereIsDi
2dc70 73 74 69 6e 63 74 28 70 57 49 6e 66 6f 29 20 29  stinct(pWInfo) )
2dc80 7b 0a 20 20 20 20 20 20 73 44 69 73 74 69 6e 63  {.      sDistinc
2dc90 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 73 71  t.eTnctType = sq
2dca0 6c 69 74 65 33 57 68 65 72 65 49 73 44 69 73 74  lite3WhereIsDist
2dcb0 69 6e 63 74 28 70 57 49 6e 66 6f 29 3b 0a 20 20  inct(pWInfo);.  
2dcc0 20 20 7d 0a 20 20 20 20 69 66 28 20 73 53 6f 72    }.    if( sSor
2dcd0 74 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  t.pOrderBy ){.  
2dce0 20 20 20 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74      sSort.nOBSat
2dcf0 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 49   = sqlite3WhereI
2dd00 73 4f 72 64 65 72 65 64 28 70 57 49 6e 66 6f 29  sOrdered(pWInfo)
2dd10 3b 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 62 4f  ;.      sSort.bO
2dd20 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 20  rderedInnerLoop 
2dd30 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f 72  = sqlite3WhereOr
2dd40 64 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 28 70  deredInnerLoop(p
2dd50 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66  WInfo);.      if
2dd60 28 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74 3d 3d  ( sSort.nOBSat==
2dd70 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2d 3e  sSort.pOrderBy->
2dd80 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  nExpr ){.       
2dd90 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20   sSort.pOrderBy 
2dda0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
2ddb0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 6f   }..    /* If so
2ddc0 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74  rting index that
2ddd0 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20   was created by 
2dde0 61 20 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 45  a prior OP_OpenE
2ddf0 70 68 65 6d 65 72 61 6c 20 0a 20 20 20 20 2a 2a  phemeral .    **
2de00 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e 64   instruction end
2de10 65 64 20 75 70 20 6e 6f 74 20 62 65 69 6e 67 20  ed up not being 
2de20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 63 68 61  needed, then cha
2de30 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45  nge the OP_OpenE
2de40 70 68 65 6d 65 72 61 6c 0a 20 20 20 20 2a 2a 20  phemeral.    ** 
2de50 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e  into an OP_Noop.
2de60 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2de70 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e  sSort.addrSortIn
2de80 64 65 78 3e 3d 30 20 26 26 20 73 53 6f 72 74 2e  dex>=0 && sSort.
2de90 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20  pOrderBy==0 ){. 
2dea0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2deb0 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20  ChangeToNoop(v, 
2dec0 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e  sSort.addrSortIn
2ded0 64 65 78 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  dex);.    }..   
2dee0 20 2f 2a 20 55 73 65 20 74 68 65 20 73 74 61 6e   /* Use the stan
2def0 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e  dard inner loop.
2df00 20 2a 2f 0a 20 20 20 20 73 65 6c 65 63 74 49 6e   */.    selectIn
2df10 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
2df20 70 2c 20 70 45 4c 69 73 74 2c 20 2d 31 2c 20 26  p, pEList, -1, &
2df30 73 53 6f 72 74 2c 20 26 73 44 69 73 74 69 6e 63  sSort, &sDistinc
2df40 74 2c 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20  t, pDest,.      
2df50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
2df60 6c 69 74 65 33 57 68 65 72 65 43 6f 6e 74 69 6e  lite3WhereContin
2df70 75 65 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 2c  ueLabel(pWInfo),
2df80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2df90 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
2dfa0 65 42 72 65 61 6b 4c 61 62 65 6c 28 70 57 49 6e  eBreakLabel(pWIn
2dfb0 66 6f 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e  fo));..    /* En
2dfc0 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
2dfd0 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f  can loop..    */
2dfe0 0a 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72  .    sqlite3Wher
2dff0 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20  eEnd(pWInfo);.  
2e000 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
2e010 69 73 20 63 61 73 65 20 77 68 65 6e 20 74 68 65  is case when the
2e020 72 65 20 65 78 69 73 74 20 61 67 67 72 65 67 61  re exist aggrega
2e030 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20  te functions or 
2e040 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  a GROUP BY claus
2e050 65 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68  e.    ** or both
2e060 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74   */.    NameCont
2e070 65 78 74 20 73 4e 43 3b 20 20 20 20 2f 2a 20 4e  ext sNC;    /* N
2e080 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20  ame context for 
2e090 70 72 6f 63 65 73 73 69 6e 67 20 61 67 67 72 65  processing aggre
2e0a0 67 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  gate information
2e0b0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 4d 65   */.    int iAMe
2e0c0 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  m;          /* F
2e0d0 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73  irst Mem address
2e0e0 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 63 75 72   for storing cur
2e0f0 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 2a 2f  rent GROUP BY */
2e100 0a 20 20 20 20 69 6e 74 20 69 42 4d 65 6d 3b 20  .    int iBMem; 
2e110 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
2e120 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f  t Mem address fo
2e130 72 20 70 72 65 76 69 6f 75 73 20 47 52 4f 55 50  r previous GROUP
2e140 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69   BY */.    int i
2e150 55 73 65 46 6c 61 67 3b 20 20 20 20 20 20 20 2f  UseFlag;       /
2e160 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20 68 6f  * Mem address ho
2e170 6c 64 69 6e 67 20 66 6c 61 67 20 69 6e 64 69 63  lding flag indic
2e180 61 74 69 6e 67 20 74 68 61 74 20 61 74 20 6c 65  ating that at le
2e190 61 73 74 0a 20 20 20 20 20 20 20 20 20 20 20 20  ast.            
2e1a0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f              ** o
2e1b0 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20 69 6e  ne row of the in
2e1c0 70 75 74 20 74 6f 20 74 68 65 20 61 67 67 72 65  put to the aggre
2e1d0 67 61 74 6f 72 20 68 61 73 20 62 65 65 6e 0a 20  gator has been. 
2e1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e1f0 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73         ** proces
2e200 73 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  sed */.    int i
2e210 41 62 6f 72 74 46 6c 61 67 3b 20 20 20 20 20 2f  AbortFlag;     /
2e220 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20 77 68  * Mem address wh
2e230 69 63 68 20 63 61 75 73 65 73 20 71 75 65 72 79  ich causes query
2e240 20 61 62 6f 72 74 20 69 66 20 70 6f 73 69 74 69   abort if positi
2e250 76 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 67 72  ve */.    int gr
2e260 6f 75 70 42 79 53 6f 72 74 3b 20 20 20 20 2f 2a  oupBySort;    /*
2e270 20 52 6f 77 73 20 63 6f 6d 65 20 66 72 6f 6d 20   Rows come from 
2e280 73 6f 75 72 63 65 20 69 6e 20 47 52 4f 55 50 20  source in GROUP 
2e290 42 59 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20  BY order */.    
2e2a0 69 6e 74 20 61 64 64 72 45 6e 64 3b 20 20 20 20  int addrEnd;    
2e2b0 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 72      /* End of pr
2e2c0 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 74 68 69  ocessing for thi
2e2d0 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20  s SELECT */.    
2e2e0 69 6e 74 20 73 6f 72 74 50 54 61 62 20 3d 20 30  int sortPTab = 0
2e2f0 3b 20 20 20 2f 2a 20 50 73 65 75 64 6f 74 61 62  ;   /* Pseudotab
2e300 6c 65 20 75 73 65 64 20 74 6f 20 64 65 63 6f 64  le used to decod
2e310 65 20 73 6f 72 74 69 6e 67 20 72 65 73 75 6c 74  e sorting result
2e320 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72  s */.    int sor
2e330 74 4f 75 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  tOut = 0;    /* 
2e340 4f 75 74 70 75 74 20 72 65 67 69 73 74 65 72 20  Output register 
2e350 66 72 6f 6d 20 74 68 65 20 73 6f 72 74 65 72 20  from the sorter 
2e360 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 72 64 65 72  */.    int order
2e370 42 79 47 72 70 20 3d 20 30 3b 20 2f 2a 20 54 72  ByGrp = 0; /* Tr
2e380 75 65 20 69 66 20 74 68 65 20 47 52 4f 55 50 20  ue if the GROUP 
2e390 42 59 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20  BY and ORDER BY 
2e3a0 61 72 65 20 74 68 65 20 73 61 6d 65 20 2a 2f 0a  are the same */.
2e3b0 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61  .    /* Remove a
2e3c0 6e 79 20 61 6e 64 20 61 6c 6c 20 61 6c 69 61 73  ny and all alias
2e3d0 65 73 20 62 65 74 77 65 65 6e 20 74 68 65 20 72  es between the r
2e3e0 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20 74 68  esult set and th
2e3f0 65 0a 20 20 20 20 2a 2a 20 47 52 4f 55 50 20 42  e.    ** GROUP B
2e400 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2f  Y clause..    */
2e410 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42  .    if( pGroupB
2e420 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b  y ){.      int k
2e430 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2e440 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
2e450 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
2e460 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
2e470 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20  t_item *pItem;  
2e480 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
2e490 76 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ver expression i
2e4a0 6e 20 61 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 20  n a list */..   
2e4b0 20 20 20 66 6f 72 28 6b 3d 70 2d 3e 70 45 4c 69     for(k=p->pELi
2e4c0 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d  st->nExpr, pItem
2e4d0 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 20 6b  =p->pEList->a; k
2e4e0 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b  >0; k--, pItem++
2e4f0 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d  ){.        pItem
2e500 2d 3e 75 2e 78 2e 69 41 6c 69 61 73 20 3d 20 30  ->u.x.iAlias = 0
2e510 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2e520 66 6f 72 28 6b 3d 70 47 72 6f 75 70 42 79 2d 3e  for(k=pGroupBy->
2e530 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 47 72  nExpr, pItem=pGr
2e540 6f 75 70 42 79 2d 3e 61 3b 20 6b 3e 30 3b 20 6b  oupBy->a; k>0; k
2e550 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  --, pItem++){.  
2e560 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78        pItem->u.x
2e570 2e 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20  .iAlias = 0;.   
2e580 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
2e590 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 31 30 30  ->nSelectRow>100
2e5a0 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77   ) p->nSelectRow
2e5b0 20 3d 20 31 30 30 3b 0a 20 20 20 20 7d 65 6c 73   = 100;.    }els
2e5c0 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c  e{.      p->nSel
2e5d0 65 63 74 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20  ectRow = 1;.    
2e5e0 7d 0a 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  }...    /* If th
2e5f0 65 72 65 20 69 73 20 62 6f 74 68 20 61 20 47 52  ere is both a GR
2e600 4f 55 50 20 42 59 20 61 6e 64 20 61 6e 20 4f 52  OUP BY and an OR
2e610 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e  DER BY clause an
2e620 64 20 74 68 65 79 20 61 72 65 0a 20 20 20 20 2a  d they are.    *
2e630 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20 74 68 65  * identical, the
2e640 6e 20 69 74 20 6d 61 79 20 62 65 20 70 6f 73 73  n it may be poss
2e650 69 62 6c 65 20 74 6f 20 64 69 73 61 62 6c 65 20  ible to disable 
2e660 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
2e670 75 73 65 20 0a 20 20 20 20 2a 2a 20 6f 6e 20 74  use .    ** on t
2e680 68 65 20 67 72 6f 75 6e 64 73 20 74 68 61 74 20  he grounds that 
2e690 74 68 65 20 47 52 4f 55 50 20 42 59 20 77 69 6c  the GROUP BY wil
2e6a0 6c 20 63 61 75 73 65 20 65 6c 65 6d 65 6e 74 73  l cause elements
2e6b0 20 74 6f 20 63 6f 6d 65 20 6f 75 74 20 0a 20 20   to come out .  
2e6c0 20 20 2a 2a 20 69 6e 20 74 68 65 20 63 6f 72 72    ** in the corr
2e6d0 65 63 74 20 6f 72 64 65 72 2e 20 49 74 20 61 6c  ect order. It al
2e6e0 73 6f 20 6d 61 79 20 6e 6f 74 20 2d 20 74 68 65  so may not - the
2e6f0 20 47 52 4f 55 50 20 42 59 20 6d 61 79 20 75 73   GROUP BY may us
2e700 65 20 61 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  e a.    ** datab
2e710 61 73 65 20 69 6e 64 65 78 20 74 68 61 74 20 63  ase index that c
2e720 61 75 73 65 73 20 72 6f 77 73 20 74 6f 20 62 65  auses rows to be
2e730 20 67 72 6f 75 70 65 64 20 74 6f 67 65 74 68 65   grouped togethe
2e740 72 20 61 73 20 72 65 71 75 69 72 65 64 0a 20 20  r as required.  
2e750 20 20 2a 2a 20 62 75 74 20 6e 6f 74 20 61 63 74    ** but not act
2e760 75 61 6c 6c 79 20 73 6f 72 74 65 64 2e 20 45 69  ually sorted. Ei
2e770 74 68 65 72 20 77 61 79 2c 20 72 65 63 6f 72 64  ther way, record
2e780 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74   the fact that t
2e790 68 65 0a 20 20 20 20 2a 2a 20 4f 52 44 45 52 20  he.    ** ORDER 
2e7a0 42 59 20 61 6e 64 20 47 52 4f 55 50 20 42 59 20  BY and GROUP BY 
2e7b0 63 6c 61 75 73 65 73 20 61 72 65 20 74 68 65 20  clauses are the 
2e7c0 73 61 6d 65 20 62 79 20 73 65 74 74 69 6e 67 20  same by setting 
2e7d0 74 68 65 20 6f 72 64 65 72 42 79 47 72 70 0a 20  the orderByGrp. 
2e7e0 20 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 2e 20     ** variable. 
2e7f0 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
2e800 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61  te3ExprListCompa
2e810 72 65 28 70 47 72 6f 75 70 42 79 2c 20 73 53 6f  re(pGroupBy, sSo
2e820 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 2d 31 29  rt.pOrderBy, -1)
2e830 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 72 64  ==0 ){.      ord
2e840 65 72 42 79 47 72 70 20 3d 20 31 3b 0a 20 20 20  erByGrp = 1;.   
2e850 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 43 72 65 61   }. .    /* Crea
2e860 74 65 20 61 20 6c 61 62 65 6c 20 74 6f 20 6a 75  te a label to ju
2e870 6d 70 20 74 6f 20 77 68 65 6e 20 77 65 20 77 61  mp to when we wa
2e880 6e 74 20 74 6f 20 61 62 6f 72 74 20 74 68 65 20  nt to abort the 
2e890 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 61 64 64  query */.    add
2e8a0 72 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64  rEnd = sqlite3Vd
2e8b0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
2e8c0 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20  .    /* Convert 
2e8d0 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20  TK_COLUMN nodes 
2e8e0 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  into TK_AGG_COLU
2e8f0 4d 4e 20 61 6e 64 20 6d 61 6b 65 20 65 6e 74 72  MN and make entr
2e900 69 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20 73 41  ies in.    ** sA
2e910 67 67 49 6e 66 6f 20 66 6f 72 20 61 6c 6c 20 54  ggInfo for all T
2e920 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e  K_AGG_FUNCTION n
2e930 6f 64 65 73 20 69 6e 20 65 78 70 72 65 73 73 69  odes in expressi
2e940 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  ons of the.    *
2e950 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
2e960 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d  nt..    */.    m
2e970 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73  emset(&sNC, 0, s
2e980 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20  izeof(sNC));.   
2e990 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50   sNC.pParse = pP
2e9a0 61 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53  arse;.    sNC.pS
2e9b0 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73  rcList = pTabLis
2e9c0 74 3b 0a 20 20 20 20 73 4e 43 2e 70 41 67 67 49  t;.    sNC.pAggI
2e9d0 6e 66 6f 20 3d 20 26 73 41 67 67 49 6e 66 6f 3b  nfo = &sAggInfo;
2e9e0 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d 6e  .    sAggInfo.mn
2e9f0 52 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Reg = pParse->nM
2ea00 65 6d 2b 31 3b 0a 20 20 20 20 73 41 67 67 49 6e  em+1;.    sAggIn
2ea10 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d  fo.nSortingColum
2ea20 6e 20 3d 20 70 47 72 6f 75 70 42 79 20 3f 20 70  n = pGroupBy ? p
2ea30 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 20 3a  GroupBy->nExpr :
2ea40 20 30 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f   0;.    sAggInfo
2ea50 2e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f  .pGroupBy = pGro
2ea60 75 70 42 79 3b 0a 20 20 20 20 73 71 6c 69 74 65  upBy;.    sqlite
2ea70 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c  3ExprAnalyzeAggL
2ea80 69 73 74 28 26 73 4e 43 2c 20 70 45 4c 69 73 74  ist(&sNC, pEList
2ea90 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
2eaa0 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74  prAnalyzeAggList
2eab0 28 26 73 4e 43 2c 20 73 53 6f 72 74 2e 70 4f 72  (&sNC, sSort.pOr
2eac0 64 65 72 42 79 29 3b 0a 20 20 20 20 69 66 28 20  derBy);.    if( 
2ead0 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20  pHaving ){.     
2eae0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
2eaf0 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 26 73  yzeAggregates(&s
2eb00 4e 43 2c 20 70 48 61 76 69 6e 67 29 3b 0a 20 20  NC, pHaving);.  
2eb10 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e 66 6f    }.    sAggInfo
2eb20 2e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 3d 20  .nAccumulator = 
2eb30 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e  sAggInfo.nColumn
2eb40 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
2eb50 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b  <sAggInfo.nFunc;
2eb60 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73   i++){.      ass
2eb70 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
2eb80 70 65 72 74 79 28 73 41 67 67 49 6e 66 6f 2e 61  perty(sAggInfo.a
2eb90 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2c 20 45  Func[i].pExpr, E
2eba0 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
2ebb0 20 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67        sNC.ncFlag
2ebc0 73 20 7c 3d 20 4e 43 5f 49 6e 41 67 67 46 75 6e  s |= NC_InAggFun
2ebd0 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  c;.      sqlite3
2ebe0 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69  ExprAnalyzeAggLi
2ebf0 73 74 28 26 73 4e 43 2c 20 73 41 67 67 49 6e 66  st(&sNC, sAggInf
2ec00 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72  o.aFunc[i].pExpr
2ec10 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20  ->x.pList);.    
2ec20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 26 3d    sNC.ncFlags &=
2ec30 20 7e 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a   ~NC_InAggFunc;.
2ec40 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e      }.    sAggIn
2ec50 66 6f 2e 6d 78 52 65 67 20 3d 20 70 50 61 72 73  fo.mxReg = pPars
2ec60 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 66 28  e->nMem;.    if(
2ec70 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
2ec80 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  d ) goto select_
2ec90 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f  end;..    /* Pro
2eca0 63 65 73 73 69 6e 67 20 66 6f 72 20 61 67 67 72  cessing for aggr
2ecb0 65 67 61 74 65 73 20 77 69 74 68 20 47 52 4f 55  egates with GROU
2ecc0 50 20 42 59 20 69 73 20 76 65 72 79 20 64 69 66  P BY is very dif
2ecd0 66 65 72 65 6e 74 20 61 6e 64 0a 20 20 20 20 2a  ferent and.    *
2ece0 2a 20 6d 75 63 68 20 6d 6f 72 65 20 63 6f 6d 70  * much more comp
2ecf0 6c 65 78 20 74 68 61 6e 20 61 67 67 72 65 67 61  lex than aggrega
2ed00 74 65 73 20 77 69 74 68 6f 75 74 20 61 20 47 52  tes without a GR
2ed10 4f 55 50 20 42 59 2e 0a 20 20 20 20 2a 2f 0a 20  OUP BY..    */. 
2ed20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20     if( pGroupBy 
2ed30 29 7b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f  ){.      KeyInfo
2ed40 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a 20   *pKeyInfo;  /* 
2ed50 4b 65 79 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  Keying informati
2ed60 6f 6e 20 66 6f 72 20 74 68 65 20 67 72 6f 75 70  on for the group
2ed70 20 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   by clause */.  
2ed80 20 20 20 20 69 6e 74 20 6a 31 3b 20 20 20 20 20      int j1;     
2ed90 20 20 20 20 20 20 20 20 2f 2a 20 41 2d 76 73 2d          /* A-vs-
2eda0 42 20 63 6f 6d 70 61 72 69 73 69 6f 6e 20 6a 75  B comparision ju
2edb0 6d 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  mp */.      int 
2edc0 61 64 64 72 4f 75 74 70 75 74 52 6f 77 3b 20 20  addrOutputRow;  
2edd0 2f 2a 20 53 74 61 72 74 20 6f 66 20 73 75 62 72  /* Start of subr
2ede0 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70  outine that outp
2edf0 75 74 73 20 61 20 72 65 73 75 6c 74 20 72 6f 77  uts a result row
2ee00 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65   */.      int re
2ee10 67 4f 75 74 70 75 74 52 6f 77 3b 20 20 20 2f 2a  gOutputRow;   /*
2ee20 20 52 65 74 75 72 6e 20 61 64 64 72 65 73 73 20   Return address 
2ee30 72 65 67 69 73 74 65 72 20 66 6f 72 20 6f 75 74  register for out
2ee40 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  put subroutine *
2ee50 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
2ee60 53 65 74 41 62 6f 72 74 3b 20 20 20 2f 2a 20 53  SetAbort;   /* S
2ee70 65 74 20 74 68 65 20 61 62 6f 72 74 20 66 6c 61  et the abort fla
2ee80 67 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a  g and return */.
2ee90 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f        int addrTo
2eea0 70 4f 66 4c 6f 6f 70 3b 20 20 2f 2a 20 54 6f 70  pOfLoop;  /* Top
2eeb0 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 6c 6f   of the input lo
2eec0 6f 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  op */.      int 
2eed0 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 3b 20  addrSortingIdx; 
2eee0 2f 2a 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70  /* The OP_OpenEp
2eef0 68 65 6d 65 72 61 6c 20 66 6f 72 20 74 68 65 20  hemeral for the 
2ef00 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 2a 2f  sorting index */
2ef10 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 52  .      int addrR
2ef20 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53 75  eset;      /* Su
2ef30 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 65 73  broutine for res
2ef40 65 74 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d  etting the accum
2ef50 75 6c 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20  ulator */.      
2ef60 69 6e 74 20 72 65 67 52 65 73 65 74 3b 20 20 20  int regReset;   
2ef70 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64      /* Return ad
2ef80 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
2ef90 6f 72 20 72 65 73 65 74 20 73 75 62 72 6f 75 74  or reset subrout
2efa0 69 6e 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a  ine */..      /*
2efb0 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 47   If there is a G
2efc0 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 77  ROUP BY clause w
2efd0 65 20 6d 69 67 68 74 20 6e 65 65 64 20 61 20 73  e might need a s
2efe0 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 6f 0a  orting index to.
2eff0 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65        ** impleme
2f000 6e 74 20 69 74 2e 20 20 41 6c 6c 6f 63 61 74 65  nt it.  Allocate
2f010 20 74 68 61 74 20 73 6f 72 74 69 6e 67 20 69 6e   that sorting in
2f020 64 65 78 20 6e 6f 77 2e 20 20 49 66 20 69 74 20  dex now.  If it 
2f030 74 75 72 6e 73 20 6f 75 74 0a 20 20 20 20 20 20  turns out.      
2f040 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  ** that we do no
2f050 74 20 6e 65 65 64 20 69 74 20 61 66 74 65 72 20  t need it after 
2f060 61 6c 6c 2c 20 74 68 65 20 4f 50 5f 53 6f 72 74  all, the OP_Sort
2f070 65 72 4f 70 65 6e 20 69 6e 73 74 72 75 63 74 69  erOpen instructi
2f080 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c  on.      ** will
2f090 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e   be converted in
2f0a0 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a 20 20 20  to a Noop.  .   
2f0b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 41 67 67     */.      sAgg
2f0c0 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 20  Info.sortingIdx 
2f0d0 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
2f0e0 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f  ;.      pKeyInfo
2f0f0 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78   = keyInfoFromEx
2f100 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
2f110 47 72 6f 75 70 42 79 2c 20 30 2c 20 73 41 67 67  GroupBy, 0, sAgg
2f120 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  Info.nColumn);. 
2f130 20 20 20 20 20 61 64 64 72 53 6f 72 74 69 6e 67       addrSorting
2f140 49 64 78 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Idx = sqlite3Vdb
2f150 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 6f  eAddOp4(v, OP_So
2f160 72 74 65 72 4f 70 65 6e 2c 20 0a 20 20 20 20 20  rterOpen, .     
2f170 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f       sAggInfo.so
2f180 72 74 69 6e 67 49 64 78 2c 20 73 41 67 67 49 6e  rtingIdx, sAggIn
2f190 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d  fo.nSortingColum
2f1a0 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 30 2c  n, .          0,
2f1b0 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
2f1c0 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 0a  , P4_KEYINFO);..
2f1d0 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
2f1e0 69 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74  ize memory locat
2f1f0 69 6f 6e 73 20 75 73 65 64 20 62 79 20 47 52 4f  ions used by GRO
2f200 55 50 20 42 59 20 61 67 67 72 65 67 61 74 65 20  UP BY aggregate 
2f210 70 72 6f 63 65 73 73 69 6e 67 0a 20 20 20 20 20  processing.     
2f220 20 2a 2f 0a 20 20 20 20 20 20 69 55 73 65 46 6c   */.      iUseFl
2f230 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ag = ++pParse->n
2f240 4d 65 6d 3b 0a 20 20 20 20 20 20 69 41 62 6f 72  Mem;.      iAbor
2f250 74 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65  tFlag = ++pParse
2f260 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65  ->nMem;.      re
2f270 67 4f 75 74 70 75 74 52 6f 77 20 3d 20 2b 2b 70  gOutputRow = ++p
2f280 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
2f290 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77     addrOutputRow
2f2a0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
2f2b0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
2f2c0 20 20 72 65 67 52 65 73 65 74 20 3d 20 2b 2b 70    regReset = ++p
2f2d0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
2f2e0 20 20 20 61 64 64 72 52 65 73 65 74 20 3d 20 73     addrReset = s
2f2f0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
2f300 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 41  bel(v);.      iA
2f310 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Mem = pParse->nM
2f320 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 50  em + 1;.      pP
2f330 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47  arse->nMem += pG
2f340 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  roupBy->nExpr;. 
2f350 20 20 20 20 20 69 42 4d 65 6d 20 3d 20 70 50 61       iBMem = pPa
2f360 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20  rse->nMem + 1;. 
2f370 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
2f380 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e  m += pGroupBy->n
2f390 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  Expr;.      sqli
2f3a0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2f3b0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
2f3c0 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20  iAbortFlag);.   
2f3d0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
2f3e0 76 2c 20 22 63 6c 65 61 72 20 61 62 6f 72 74 20  v, "clear abort 
2f3f0 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73  flag"));.      s
2f400 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2f410 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
2f420 30 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20  0, iUseFlag);.  
2f430 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
2f440 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20 61 63  (v, "indicate ac
2f450 63 75 6d 75 6c 61 74 6f 72 20 65 6d 70 74 79 22  cumulator empty"
2f460 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
2f470 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
2f480 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 41 4d 65 6d  P_Null, 0, iAMem
2f490 2c 20 69 41 4d 65 6d 2b 70 47 72 6f 75 70 42 79  , iAMem+pGroupBy
2f4a0 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 0a 20 20 20  ->nExpr-1);..   
2f4b0 20 20 20 2f 2a 20 42 65 67 69 6e 20 61 20 6c 6f     /* Begin a lo
2f4c0 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74  op that will ext
2f4d0 72 61 63 74 20 61 6c 6c 20 73 6f 75 72 63 65 20  ract all source 
2f4e0 72 6f 77 73 20 69 6e 20 47 52 4f 55 50 20 42 59  rows in GROUP BY
2f4f0 20 6f 72 64 65 72 2e 0a 20 20 20 20 20 20 2a 2a   order..      **
2f500 20 54 68 69 73 20 6d 69 67 68 74 20 69 6e 76 6f   This might invo
2f510 6c 76 65 20 74 77 6f 20 73 65 70 61 72 61 74 65  lve two separate
2f520 20 6c 6f 6f 70 73 20 77 69 74 68 20 61 6e 20 4f   loops with an O
2f530 50 5f 53 6f 72 74 20 69 6e 20 62 65 74 77 65 65  P_Sort in betwee
2f540 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69  n, or.      ** i
2f550 74 20 6d 69 67 68 74 20 62 65 20 61 20 73 69 6e  t might be a sin
2f560 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74 20 75 73  gle loop that us
2f570 65 73 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 65  es an index to e
2f580 78 74 72 61 63 74 20 69 6e 66 6f 72 6d 61 74 69  xtract informati
2f590 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74  on.      ** in t
2f5a0 68 65 20 72 69 67 68 74 20 6f 72 64 65 72 20 74  he right order t
2f5b0 6f 20 62 65 67 69 6e 20 77 69 74 68 2e 0a 20 20  o begin with..  
2f5c0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
2f5d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2f5e0 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52  , OP_Gosub, regR
2f5f0 65 73 65 74 2c 20 61 64 64 72 52 65 73 65 74 29  eset, addrReset)
2f600 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d  ;.      pWInfo =
2f610 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
2f620 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  in(pParse, pTabL
2f630 69 73 74 2c 20 70 57 68 65 72 65 2c 20 70 47 72  ist, pWhere, pGr
2f640 6f 75 70 42 79 2c 20 30 2c 0a 20 20 20 20 20 20  oupBy, 0,.      
2f650 20 20 20 20 57 48 45 52 45 5f 47 52 4f 55 50 42      WHERE_GROUPB
2f660 59 20 7c 20 28 6f 72 64 65 72 42 79 47 72 70 20  Y | (orderByGrp 
2f670 3f 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52  ? WHERE_SORTBYGR
2f680 4f 55 50 20 3a 20 30 29 2c 20 30 0a 20 20 20 20  OUP : 0), 0.    
2f690 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70    );.      if( p
2f6a0 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20  WInfo==0 ) goto 
2f6b0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
2f6c0 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
2f6d0 72 65 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e  reIsOrdered(pWIn
2f6e0 66 6f 29 3d 3d 70 47 72 6f 75 70 42 79 2d 3e 6e  fo)==pGroupBy->n
2f6f0 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
2f700 2f 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72  /* The optimizer
2f710 20 69 73 20 61 62 6c 65 20 74 6f 20 64 65 6c 69   is able to deli
2f720 76 65 72 20 72 6f 77 73 20 69 6e 20 67 72 6f 75  ver rows in grou
2f730 70 20 62 79 20 6f 72 64 65 72 20 73 6f 0a 20 20  p by order so.  
2f740 20 20 20 20 20 20 2a 2a 20 77 65 20 64 6f 20 6e        ** we do n
2f750 6f 74 20 68 61 76 65 20 74 6f 20 73 6f 72 74 2e  ot have to sort.
2f760 20 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68    The OP_OpenEph
2f770 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69 6c  emeral table wil
2f780 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  l be.        ** 
2f790 63 61 6e 63 65 6c 6c 65 64 20 6c 61 74 65 72 20  cancelled later 
2f7a0 62 65 63 61 75 73 65 20 77 65 20 73 74 69 6c 6c  because we still
2f7b0 20 6e 65 65 64 20 74 6f 20 75 73 65 20 74 68 65   need to use the
2f7c0 20 70 4b 65 79 49 6e 66 6f 0a 20 20 20 20 20 20   pKeyInfo.      
2f7d0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 72 6f    */.        gro
2f7e0 75 70 42 79 53 6f 72 74 20 3d 20 30 3b 0a 20 20  upBySort = 0;.  
2f7f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2f800 20 20 20 2f 2a 20 52 6f 77 73 20 61 72 65 20 63     /* Rows are c
2f810 6f 6d 69 6e 67 20 6f 75 74 20 69 6e 20 75 6e 64  oming out in und
2f820 65 74 65 72 6d 69 6e 65 64 20 6f 72 64 65 72 2e  etermined order.
2f830 20 20 57 65 20 68 61 76 65 20 74 6f 20 70 75 73    We have to pus
2f840 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 61 63  h.        ** eac
2f850 68 20 72 6f 77 20 69 6e 74 6f 20 61 20 73 6f 72  h row into a sor
2f860 74 69 6e 67 20 69 6e 64 65 78 2c 20 74 65 72 6d  ting index, term
2f870 69 6e 61 74 65 20 74 68 65 20 66 69 72 73 74 20  inate the first 
2f880 6c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 2a 2a  loop,.        **
2f890 20 74 68 65 6e 20 6c 6f 6f 70 20 6f 76 65 72 20   then loop over 
2f8a0 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  the sorting inde
2f8b0 78 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65  x in order to ge
2f8c0 74 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20 20  t the output.   
2f8d0 20 20 20 20 20 2a 2a 20 69 6e 20 73 6f 72 74 65       ** in sorte
2f8e0 64 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20 20  d order.        
2f8f0 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  */.        int r
2f900 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20  egBase;.        
2f910 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 0a 20  int regRecord;. 
2f920 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b         int nCol;
2f930 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 47 72  .        int nGr
2f940 6f 75 70 42 79 3b 0a 0a 20 20 20 20 20 20 20 20  oupBy;..        
2f950 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65  explainTempTable
2f960 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
2f970 20 20 20 20 20 20 28 73 44 69 73 74 69 6e 63 74        (sDistinct
2f980 2e 69 73 54 6e 63 74 20 26 26 20 28 70 2d 3e 73  .isTnct && (p->s
2f990 65 6c 46 6c 61 67 73 26 53 46 5f 44 69 73 74 69  elFlags&SF_Disti
2f9a0 6e 63 74 29 3d 3d 30 29 20 3f 0a 20 20 20 20 20  nct)==0) ?.     
2f9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
2f9c0 44 49 53 54 49 4e 43 54 22 20 3a 20 22 47 52 4f  DISTINCT" : "GRO
2f9d0 55 50 20 42 59 22 29 3b 0a 0a 20 20 20 20 20 20  UP BY");..      
2f9e0 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20    groupBySort = 
2f9f0 31 3b 0a 20 20 20 20 20 20 20 20 6e 47 72 6f 75  1;.        nGrou
2fa00 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e  pBy = pGroupBy->
2fa10 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 6e  nExpr;.        n
2fa20 43 6f 6c 20 3d 20 6e 47 72 6f 75 70 42 79 3b 0a  Col = nGroupBy;.
2fa30 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f          j = nGro
2fa40 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 66 6f  upBy;.        fo
2fa50 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66  r(i=0; i<sAggInf
2fa60 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  o.nColumn; i++){
2fa70 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
2fa80 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 2e  AggInfo.aCol[i].
2fa90 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a  iSorterColumn>=j
2faa0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2fab0 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nCol++;.        
2fac0 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20      j++;.       
2fad0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2fae0 20 20 20 20 20 20 20 72 65 67 42 61 73 65 20 3d         regBase =
2faf0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
2fb00 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f  ange(pParse, nCo
2fb10 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
2fb20 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
2fb30 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  r(pParse);.     
2fb40 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
2fb50 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  deExprList(pPars
2fb60 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 72 65 67  e, pGroupBy, reg
2fb70 42 61 73 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Base, 0);.      
2fb80 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 3b 0a    j = nGroupBy;.
2fb90 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
2fba0 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c   i<sAggInfo.nCol
2fbb0 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  umn; i++){.     
2fbc0 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49       struct AggI
2fbd0 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20  nfo_col *pCol = 
2fbe0 26 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69  &sAggInfo.aCol[i
2fbf0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ];.          if(
2fc00 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
2fc10 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20  lumn>=j ){.     
2fc20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20         int r1 = 
2fc30 6a 20 2b 20 72 65 67 42 61 73 65 3b 0a 20 20 20  j + regBase;.   
2fc40 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 32 3b           int r2;
2fc50 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 32  ..            r2
2fc60 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
2fc70 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72  deGetColumn(pPar
2fc80 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  se, .           
2fc90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fca0 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 2c 20      pCol->pTab, 
2fcb0 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70  pCol->iColumn, p
2fcc0 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20 72 31 2c  Col->iTable, r1,
2fcd0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
2fce0 20 69 66 28 20 72 31 21 3d 72 32 20 29 7b 0a 20   if( r1!=r2 ){. 
2fcf0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
2fd00 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2fd10 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 32 2c 20  , OP_SCopy, r2, 
2fd20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r1);.           
2fd30 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a   }.            j
2fd40 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ++;.          }.
2fd50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2fd60 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71    regRecord = sq
2fd70 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
2fd80 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
2fd90 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2fda0 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
2fdb0 6f 72 64 2c 20 72 65 67 42 61 73 65 2c 20 6e 43  ord, regBase, nC
2fdc0 6f 6c 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  ol, regRecord);.
2fdd0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2fde0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2fdf0 53 6f 72 74 65 72 49 6e 73 65 72 74 2c 20 73 41  SorterInsert, sA
2fe00 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
2fe10 78 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  x, regRecord);. 
2fe20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
2fe30 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
2fe40 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  rse, regRecord);
2fe50 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2fe60 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
2fe70 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65  (pParse, regBase
2fe80 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  , nCol);.       
2fe90 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
2fea0 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  (pWInfo);.      
2feb0 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69    sAggInfo.sorti
2fec0 6e 67 49 64 78 50 54 61 62 20 3d 20 73 6f 72 74  ngIdxPTab = sort
2fed0 50 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e  PTab = pParse->n
2fee0 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 73  Tab++;.        s
2fef0 6f 72 74 4f 75 74 20 3d 20 73 71 6c 69 74 65 33  ortOut = sqlite3
2ff00 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
2ff10 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
2ff20 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
2ff30 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20   OP_OpenPseudo, 
2ff40 73 6f 72 74 50 54 61 62 2c 20 73 6f 72 74 4f 75  sortPTab, sortOu
2ff50 74 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20  t, nCol);.      
2ff60 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2ff70 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op2(v, OP_Sorter
2ff80 53 6f 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73  Sort, sAggInfo.s
2ff90 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 45  ortingIdx, addrE
2ffa0 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  nd);.        Vdb
2ffb0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 52  eComment((v, "GR
2ffc0 4f 55 50 20 42 59 20 73 6f 72 74 22 29 29 3b 20  OUP BY sort")); 
2ffd0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
2ffe0 0a 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66  .        sAggInf
2fff0 6f 2e 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20  o.useSortingIdx 
30000 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  = 1;.        sql
30010 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
30020 61 72 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 20  ar(pParse);..   
30030 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
30040 66 20 74 68 65 20 69 6e 64 65 78 20 6f 72 20 74  f the index or t
30050 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 75  emporary table u
30060 73 65 64 20 62 79 20 74 68 65 20 47 52 4f 55 50  sed by the GROUP
30070 20 42 59 20 73 6f 72 74 0a 20 20 20 20 20 20 2a   BY sort.      *
30080 2a 20 77 69 6c 6c 20 6e 61 74 75 72 61 6c 6c 79  * will naturally
30090 20 64 65 6c 69 76 65 72 20 72 6f 77 73 20 69 6e   deliver rows in
300a0 20 74 68 65 20 6f 72 64 65 72 20 72 65 71 75 69   the order requi
300b0 72 65 64 20 62 79 20 74 68 65 20 4f 52 44 45 52  red by the ORDER
300c0 20 42 59 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61   BY.      ** cla
300d0 75 73 65 2c 20 63 61 6e 63 65 6c 20 74 68 65 20  use, cancel the 
300e0 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  ephemeral table 
300f0 6f 70 65 6e 20 63 6f 64 65 64 20 65 61 72 6c 69  open coded earli
30100 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  er..      **.   
30110 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 61 6e     ** This is an
30120 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2d 20   optimization - 
30130 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77  the correct answ
30140 65 72 20 73 68 6f 75 6c 64 20 72 65 73 75 6c 74  er should result
30150 20 72 65 67 61 72 64 6c 65 73 73 2e 0a 20 20 20   regardless..   
30160 20 20 20 2a 2a 20 55 73 65 20 74 68 65 20 53 51     ** Use the SQ
30170 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f 72 64 65  LITE_GroupByOrde
30180 72 20 66 6c 61 67 20 77 69 74 68 20 53 51 4c 49  r flag with SQLI
30190 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49  TE_TESTCTRL_OPTI
301a0 4d 49 5a 45 52 20 74 6f 20 0a 20 20 20 20 20 20  MIZER to .      
301b0 2a 2a 20 64 69 73 61 62 6c 65 20 74 68 69 73 20  ** disable this 
301c0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72  optimization for
301d0 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65   testing purpose
301e0 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  s.  */.      if(
301f0 20 6f 72 64 65 72 42 79 47 72 70 20 26 26 20 4f   orderByGrp && O
30200 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
30210 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 47 72  ed(db, SQLITE_Gr
30220 6f 75 70 42 79 4f 72 64 65 72 29 20 0a 20 20 20  oupByOrder) .   
30230 20 20 20 20 26 26 20 28 67 72 6f 75 70 42 79 53      && (groupByS
30240 6f 72 74 20 7c 7c 20 73 71 6c 69 74 65 33 57 68  ort || sqlite3Wh
30250 65 72 65 49 73 53 6f 72 74 65 64 28 70 57 49 6e  ereIsSorted(pWIn
30260 66 6f 29 29 0a 20 20 20 20 20 20 29 7b 0a 20 20  fo)).      ){.  
30270 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64        sSort.pOrd
30280 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  erBy = 0;.      
30290 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
302a0 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 73 53 6f  ngeToNoop(v, sSo
302b0 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78  rt.addrSortIndex
302c0 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
302d0 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68    /* Evaluate th
302e0 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20  e current GROUP 
302f0 42 59 20 74 65 72 6d 73 20 61 6e 64 20 73 74 6f  BY terms and sto
30300 72 65 20 69 6e 20 62 30 2c 20 62 31 2c 20 62 32  re in b0, b1, b2
30310 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 28 62 30  ....      ** (b0
30320 20 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74   is memory locat
30330 69 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20 62 31 20  ion iBMem+0, b1 
30340 69 73 20 69 42 4d 65 6d 2b 31 2c 20 61 6e 64 20  is iBMem+1, and 
30350 73 6f 20 66 6f 72 74 68 29 0a 20 20 20 20 20 20  so forth).      
30360 2a 2a 20 54 68 65 6e 20 63 6f 6d 70 61 72 65 20  ** Then compare 
30370 74 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55  the current GROU
30380 50 20 42 59 20 74 65 72 6d 73 20 61 67 61 69 6e  P BY terms again
30390 73 74 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  st the GROUP BY 
303a0 74 65 72 6d 73 0a 20 20 20 20 20 20 2a 2a 20 66  terms.      ** f
303b0 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73  rom the previous
303c0 20 72 6f 77 20 63 75 72 72 65 6e 74 6c 79 20 73   row currently s
303d0 74 6f 72 65 64 20 69 6e 20 61 30 2c 20 61 31 2c  tored in a0, a1,
303e0 20 61 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a   a2....      */.
303f0 20 20 20 20 20 20 61 64 64 72 54 6f 70 4f 66 4c        addrTopOfL
30400 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  oop = sqlite3Vdb
30410 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
30420 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
30430 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
30440 72 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  rse);.      if( 
30450 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20  groupBySort ){. 
30460 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
30470 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53  beAddOp3(v, OP_S
30480 6f 72 74 65 72 44 61 74 61 2c 20 73 41 67 67 49  orterData, sAggI
30490 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20  nfo.sortingIdx, 
304a0 73 6f 72 74 4f 75 74 2c 73 6f 72 74 50 54 61 62  sortOut,sortPTab
304b0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
304c0 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f   for(j=0; j<pGro
304d0 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b  upBy->nExpr; j++
304e0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 67  ){.        if( g
304f0 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20  roupBySort ){.  
30500 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
30510 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
30520 43 6f 6c 75 6d 6e 2c 20 73 6f 72 74 50 54 61 62  Column, sortPTab
30530 2c 20 6a 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20  , j, iBMem+j);. 
30540 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
30550 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f          sAggInfo
30560 2e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b  .directMode = 1;
30570 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
30580 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
30590 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 6a  e, pGroupBy->a[j
305a0 5d 2e 70 45 78 70 72 2c 20 69 42 4d 65 6d 2b 6a  ].pExpr, iBMem+j
305b0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
305c0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
305d0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
305e0 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 69 41 4d 65  OP_Compare, iAMe
305f0 6d 2c 20 69 42 4d 65 6d 2c 20 70 47 72 6f 75 70  m, iBMem, pGroup
30600 42 79 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20  By->nExpr,.     
30610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30620 20 20 20 20 20 28 63 68 61 72 2a 29 73 71 6c 69       (char*)sqli
30630 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b  te3KeyInfoRef(pK
30640 65 79 49 6e 66 6f 29 2c 20 50 34 5f 4b 45 59 49  eyInfo), P4_KEYI
30650 4e 46 4f 29 3b 0a 20 20 20 20 20 20 6a 31 20 3d  NFO);.      j1 =
30660 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
30670 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
30680 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
30690 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20  Op3(v, OP_Jump, 
306a0 6a 31 2b 31 2c 20 30 2c 20 6a 31 2b 31 29 3b 20  j1+1, 0, j1+1); 
306b0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
306c0 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ..      /* Gener
306d0 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 72 75  ate code that ru
306e0 6e 73 20 77 68 65 6e 65 76 65 72 20 74 68 65 20  ns whenever the 
306f0 47 52 4f 55 50 20 42 59 20 63 68 61 6e 67 65 73  GROUP BY changes
30700 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68 61 6e 67  ..      ** Chang
30710 65 73 20 69 6e 20 74 68 65 20 47 52 4f 55 50 20  es in the GROUP 
30720 42 59 20 61 72 65 20 64 65 74 65 63 74 65 64 20  BY are detected 
30730 62 79 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  by the previous 
30740 63 6f 64 65 0a 20 20 20 20 20 20 2a 2a 20 62 6c  code.      ** bl
30750 6f 63 6b 2e 20 20 49 66 20 74 68 65 72 65 20 77  ock.  If there w
30760 65 72 65 20 6e 6f 20 63 68 61 6e 67 65 73 2c 20  ere no changes, 
30770 74 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 73 6b  this block is sk
30780 69 70 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a  ipped..      **.
30790 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63 6f        ** This co
307a0 64 65 20 63 6f 70 69 65 73 20 63 75 72 72 65 6e  de copies curren
307b0 74 20 67 72 6f 75 70 20 62 79 20 74 65 72 6d 73  t group by terms
307c0 20 69 6e 20 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e   in b0,b1,b2,...
307d0 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 20 74  .      ** over t
307e0 6f 20 61 30 2c 61 31 2c 61 32 2e 20 20 49 74 20  o a0,a1,a2.  It 
307f0 74 68 65 6e 20 63 61 6c 6c 73 20 74 68 65 20 6f  then calls the o
30800 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65  utput subroutine
30810 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65  .      ** and re
30820 73 65 74 73 20 74 68 65 20 61 67 67 72 65 67 61  sets the aggrega
30830 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72  te accumulator r
30840 65 67 69 73 74 65 72 73 20 69 6e 20 70 72 65 70  egisters in prep
30850 61 72 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  aration.      **
30860 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 47 52   for the next GR
30870 4f 55 50 20 42 59 20 62 61 74 63 68 2e 0a 20 20  OUP BY batch..  
30880 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
30890 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65  ite3ExprCodeMove
308a0 28 70 50 61 72 73 65 2c 20 69 42 4d 65 6d 2c 20  (pParse, iBMem, 
308b0 69 41 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d  iAMem, pGroupBy-
308c0 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73  >nExpr);.      s
308d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
308e0 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
308f0 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72  gOutputRow, addr
30900 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
30910 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
30920 2c 20 22 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f  , "output one ro
30930 77 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  w"));.      sqli
30940 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
30950 20 4f 50 5f 49 66 50 6f 73 2c 20 69 41 62 6f 72   OP_IfPos, iAbor
30960 74 46 6c 61 67 2c 20 61 64 64 72 45 6e 64 29 3b  tFlag, addrEnd);
30970 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
30980 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
30990 65 6e 74 28 28 76 2c 20 22 63 68 65 63 6b 20 61  ent((v, "check a
309a0 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20  bort flag"));.  
309b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
309c0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
309d0 62 2c 20 72 65 67 52 65 73 65 74 2c 20 61 64 64  b, regReset, add
309e0 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 56  rReset);.      V
309f0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
30a00 72 65 73 65 74 20 61 63 63 75 6d 75 6c 61 74 6f  reset accumulato
30a10 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  r"));..      /* 
30a20 55 70 64 61 74 65 20 74 68 65 20 61 67 67 72 65  Update the aggre
30a30 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72  gate accumulator
30a40 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63  s based on the c
30a50 6f 6e 74 65 6e 74 20 6f 66 0a 20 20 20 20 20 20  ontent of.      
30a60 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  ** the current r
30a70 6f 77 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ow.      */.    
30a80 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
30a90 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20  pHere(v, j1);.  
30aa0 20 20 20 20 75 70 64 61 74 65 41 63 63 75 6d 75      updateAccumu
30ab0 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73  lator(pParse, &s
30ac0 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
30ad0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
30ae0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
30af0 20 31 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20   1, iUseFlag);. 
30b00 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
30b10 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20 64  ((v, "indicate d
30b20 61 74 61 20 69 6e 20 61 63 63 75 6d 75 6c 61 74  ata in accumulat
30b30 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  or"));..      /*
30b40 20 45 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70   End of the loop
30b50 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
30b60 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20  if( groupBySort 
30b70 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
30b80 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
30b90 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20 73  OP_SorterNext, s
30ba0 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
30bb0 64 78 2c 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f  dx, addrTopOfLoo
30bc0 70 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  p);.        Vdbe
30bd0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
30be0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
30bf0 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
30c00 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20  d(pWInfo);.     
30c10 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
30c20 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64  angeToNoop(v, ad
30c30 64 72 53 6f 72 74 69 6e 67 49 64 78 29 3b 0a 20  drSortingIdx);. 
30c40 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
30c50 20 4f 75 74 70 75 74 20 74 68 65 20 66 69 6e 61   Output the fina
30c60 6c 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 0a  l row of result.
30c70 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
30c80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
30c90 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
30ca0 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72  gOutputRow, addr
30cb0 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
30cc0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
30cd0 2c 20 22 6f 75 74 70 75 74 20 66 69 6e 61 6c 20  , "output final 
30ce0 72 6f 77 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f  row"));..      /
30cf0 2a 20 4a 75 6d 70 20 6f 76 65 72 20 74 68 65 20  * Jump over the 
30d00 73 75 62 72 6f 75 74 69 6e 65 73 0a 20 20 20 20  subroutines.    
30d10 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
30d20 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
30d30 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72  OP_Goto, 0, addr
30d40 45 6e 64 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  End);..      /* 
30d50 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
30d60 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75  utine that outpu
30d70 74 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20  ts a single row 
30d80 6f 66 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20  of the result.  
30d90 20 20 20 20 2a 2a 20 73 65 74 2e 20 20 54 68 69      ** set.  Thi
30da0 73 20 73 75 62 72 6f 75 74 69 6e 65 20 66 69 72  s subroutine fir
30db0 73 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20  st looks at the 
30dc0 69 55 73 65 46 6c 61 67 2e 20 20 49 66 20 69 55  iUseFlag.  If iU
30dd0 73 65 46 6c 61 67 0a 20 20 20 20 20 20 2a 2a 20  seFlag.      ** 
30de0 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
30df0 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74  equal to zero, t
30e00 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 69 73  he subroutine is
30e10 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 0a 20 20   a no-op.  If.  
30e20 20 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65      ** the proce
30e30 73 73 69 6e 67 20 63 61 6c 6c 73 20 66 6f 72 20  ssing calls for 
30e40 74 68 65 20 71 75 65 72 79 20 74 6f 20 61 62 6f  the query to abo
30e50 72 74 2c 20 74 68 69 73 20 73 75 62 72 6f 75 74  rt, this subrout
30e60 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 6e 63  ine.      ** inc
30e70 72 65 6d 65 6e 74 73 20 74 68 65 20 69 41 62 6f  rements the iAbo
30e80 72 74 46 6c 61 67 20 6d 65 6d 6f 72 79 20 6c 6f  rtFlag memory lo
30e90 63 61 74 69 6f 6e 20 62 65 66 6f 72 65 20 72 65  cation before re
30ea0 74 75 72 6e 69 6e 67 20 69 6e 0a 20 20 20 20 20  turning in.     
30eb0 20 2a 2a 20 6f 72 64 65 72 20 74 6f 20 73 69 67   ** order to sig
30ec0 6e 61 6c 20 74 68 65 20 63 61 6c 6c 65 72 20 74  nal the caller t
30ed0 6f 20 61 62 6f 72 74 2e 0a 20 20 20 20 20 20 2a  o abort..      *
30ee0 2f 0a 20 20 20 20 20 20 61 64 64 72 53 65 74 41  /.      addrSetA
30ef0 62 6f 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  bort = sqlite3Vd
30f00 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
30f10 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
30f20 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
30f30 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 41 62 6f  Integer, 1, iAbo
30f40 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56  rtFlag);.      V
30f50 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
30f60 73 65 74 20 61 62 6f 72 74 20 66 6c 61 67 22 29  set abort flag")
30f70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
30f80 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
30f90 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70  _Return, regOutp
30fa0 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 73 71  utRow);.      sq
30fb0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
30fc0 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4f 75 74  Label(v, addrOut
30fd0 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 61  putRow);.      a
30fe0 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73  ddrOutputRow = s
30ff0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
31000 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
31010 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
31020 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69  2(v, OP_IfPos, i
31030 55 73 65 46 6c 61 67 2c 20 61 64 64 72 4f 75 74  UseFlag, addrOut
31040 70 75 74 52 6f 77 2b 32 29 3b 20 56 64 62 65 43  putRow+2); VdbeC
31050 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
31060 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
31070 2c 20 22 47 72 6f 75 70 62 79 20 72 65 73 75 6c  , "Groupby resul
31080 74 20 67 65 6e 65 72 61 74 6f 72 20 65 6e 74 72  t generator entr
31090 79 20 70 6f 69 6e 74 22 29 29 3b 0a 20 20 20 20  y point"));.    
310a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
310b0 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
310c0 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b  , regOutputRow);
310d0 0a 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41  .      finalizeA
310e0 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72  ggFunctions(pPar
310f0 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
31100 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
31110 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
31120 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72 4f 75   pHaving, addrOu
31130 74 70 75 74 52 6f 77 2b 31 2c 20 53 51 4c 49 54  tputRow+1, SQLIT
31140 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
31150 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72       selectInner
31160 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
31170 70 2d 3e 70 45 4c 69 73 74 2c 20 2d 31 2c 20 26  p->pEList, -1, &
31180 73 53 6f 72 74 2c 0a 20 20 20 20 20 20 20 20 20  sSort,.         
31190 20 20 20 20 20 20 20 20 20 20 20 20 20 26 73 44               &sD
311a0 69 73 74 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a  istinct, pDest,.
311b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
311c0 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74        addrOutput
311d0 52 6f 77 2b 31 2c 20 61 64 64 72 53 65 74 41 62  Row+1, addrSetAb
311e0 6f 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ort);.      sqli
311f0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
31200 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f   OP_Return, regO
31210 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
31220 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
31230 20 22 65 6e 64 20 67 72 6f 75 70 62 79 20 72 65   "end groupby re
31240 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 22 29  sult generator")
31250 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e  );..      /* Gen
31260 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
31270 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65 73  ne that will res
31280 65 74 20 74 68 65 20 67 72 6f 75 70 2d 62 79 20  et the group-by 
31290 61 63 63 75 6d 75 6c 61 74 6f 72 0a 20 20 20 20  accumulator.    
312a0 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
312b0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
312c0 65 6c 28 76 2c 20 61 64 64 72 52 65 73 65 74 29  el(v, addrReset)
312d0 3b 0a 20 20 20 20 20 20 72 65 73 65 74 41 63 63  ;.      resetAcc
312e0 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c  umulator(pParse,
312f0 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
31300 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
31310 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
31320 6e 2c 20 72 65 67 52 65 73 65 74 29 3b 0a 20 20  n, regReset);.  
31330 20 20 20 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64     .    } /* end
31340 69 66 20 70 47 72 6f 75 70 42 79 2e 20 20 42 65  if pGroupBy.  Be
31350 67 69 6e 20 61 67 67 72 65 67 61 74 65 20 71 75  gin aggregate qu
31360 65 72 69 65 73 20 77 69 74 68 6f 75 74 20 47 52  eries without GR
31370 4f 55 50 20 42 59 3a 20 2a 2f 0a 20 20 20 20 65  OUP BY: */.    e
31380 6c 73 65 20 7b 0a 20 20 20 20 20 20 45 78 70 72  lse {.      Expr
31390 4c 69 73 74 20 2a 70 44 65 6c 20 3d 20 30 3b 0a  List *pDel = 0;.
313a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
313b0 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 0a 20  MIT_BTREECOUNT. 
313c0 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
313d0 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 61  ;.      if( (pTa
313e0 62 20 3d 20 69 73 53 69 6d 70 6c 65 43 6f 75 6e  b = isSimpleCoun
313f0 74 28 70 2c 20 26 73 41 67 67 49 6e 66 6f 29 29  t(p, &sAggInfo))
31400 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  !=0 ){.        /
31410 2a 20 49 66 20 69 73 53 69 6d 70 6c 65 43 6f 75  * If isSimpleCou
31420 6e 74 28 29 20 72 65 74 75 72 6e 73 20 61 20 70  nt() returns a p
31430 6f 69 6e 74 65 72 20 74 6f 20 61 20 54 61 62 6c  ointer to a Tabl
31440 65 20 73 74 72 75 63 74 75 72 65 2c 20 74 68 65  e structure, the
31450 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  n.        ** the
31460 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69   SQL statement i
31470 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20  s of the form:. 
31480 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
31490 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f    **   SELECT co
314a0 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c 74 62 6c  unt(*) FROM <tbl
314b0 3e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  >.        **.   
314c0 20 20 20 20 20 2a 2a 20 77 68 65 72 65 20 74 68       ** where th
314d0 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
314e0 65 20 72 65 74 75 72 6e 65 64 20 72 65 70 72 65  e returned repre
314f0 73 65 6e 74 73 20 74 61 62 6c 65 20 3c 74 62 6c  sents table <tbl
31500 3e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  >..        **.  
31510 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 73 74        ** This st
31520 61 74 65 6d 65 6e 74 20 69 73 20 73 6f 20 63 6f  atement is so co
31530 6d 6d 6f 6e 20 74 68 61 74 20 69 74 20 69 73 20  mmon that it is 
31540 6f 70 74 69 6d 69 7a 65 64 20 73 70 65 63 69 61  optimized specia
31550 6c 6c 79 2e 20 54 68 65 0a 20 20 20 20 20 20 20  lly. The.       
31560 20 2a 2a 20 4f 50 5f 43 6f 75 6e 74 20 69 6e 73   ** OP_Count ins
31570 74 72 75 63 74 69 6f 6e 20 69 73 20 65 78 65 63  truction is exec
31580 75 74 65 64 20 65 69 74 68 65 72 20 6f 6e 20 74  uted either on t
31590 68 65 20 69 6e 74 6b 65 79 20 74 61 62 6c 65 20  he intkey table 
315a0 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  that.        ** 
315b0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74  contains the dat
315c0 61 20 66 6f 72 20 74 61 62 6c 65 20 3c 74 62 6c  a for table <tbl
315d0 3e 20 6f 72 20 6f 6e 20 6f 6e 65 20 6f 66 20 69  > or on one of i
315e0 74 73 20 69 6e 64 65 78 65 73 2e 20 49 74 0a 20  ts indexes. It. 
315f0 20 20 20 20 20 20 20 2a 2a 20 69 73 20 62 65 74         ** is bet
31600 74 65 72 20 74 6f 20 65 78 65 63 75 74 65 20 74  ter to execute t
31610 68 65 20 6f 70 20 6f 6e 20 61 6e 20 69 6e 64 65  he op on an inde
31620 78 2c 20 61 73 20 69 6e 64 65 78 65 73 20 61 72  x, as indexes ar
31630 65 20 61 6c 6d 6f 73 74 0a 20 20 20 20 20 20 20  e almost.       
31640 20 2a 2a 20 61 6c 77 61 79 73 20 73 70 72 65 61   ** always sprea
31650 64 20 61 63 72 6f 73 73 20 6c 65 73 73 20 70 61  d across less pa
31660 67 65 73 20 74 68 61 6e 20 74 68 65 69 72 20 63  ges than their c
31670 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62  orresponding tab
31680 6c 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  les..        */.
31690 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e          const in
316a0 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53  t iDb = sqlite3S
316b0 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61  chemaToIndex(pPa
316c0 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70  rse->db, pTab->p
316d0 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20  Schema);.       
316e0 20 63 6f 6e 73 74 20 69 6e 74 20 69 43 73 72 20   const int iCsr 
316f0 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
31700 3b 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20  ;     /* Cursor 
31710 74 6f 20 73 63 61 6e 20 62 2d 74 72 65 65 20 2a  to scan b-tree *
31720 2f 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78 20  /.        Index 
31730 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20  *pIdx;          
31740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
31750 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61  * Iterator varia
31760 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 4b  ble */.        K
31770 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
31780 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
31790 20 20 20 20 2f 2a 20 4b 65 79 69 6e 66 6f 20 66      /* Keyinfo f
317a0 6f 72 20 73 63 61 6e 6e 65 64 20 69 6e 64 65 78  or scanned index
317b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e 64 65   */.        Inde
317c0 78 20 2a 70 42 65 73 74 20 3d 20 30 3b 20 20 20  x *pBest = 0;   
317d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
317e0 20 2f 2a 20 42 65 73 74 20 69 6e 64 65 78 20 66   /* Best index f
317f0 6f 75 6e 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20  ound so far */. 
31800 20 20 20 20 20 20 20 69 6e 74 20 69 52 6f 6f 74         int iRoot
31810 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 20 20   = pTab->tnum;  
31820 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
31830 6f 6f 74 20 70 61 67 65 20 6f 66 20 73 63 61 6e  oot page of scan
31840 6e 65 64 20 62 2d 74 72 65 65 20 2a 2f 0a 0a 20  ned b-tree */.. 
31850 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f         sqlite3Co
31860 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
31870 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20  Parse, iDb);.   
31880 20 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c       sqlite3Tabl
31890 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44  eLock(pParse, iD
318a0 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30  b, pTab->tnum, 0
318b0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
318c0 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72  .        /* Sear
318d0 63 68 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  ch for the index
318e0 20 74 68 61 74 20 68 61 73 20 74 68 65 20 6c 6f   that has the lo
318f0 77 65 73 74 20 73 63 61 6e 20 63 6f 73 74 2e 0a  west scan cost..
31900 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
31910 20 20 20 2a 2a 20 28 32 30 31 31 2d 30 34 2d 31     ** (2011-04-1
31920 35 29 20 44 6f 20 6e 6f 74 20 64 6f 20 61 20 66  5) Do not do a f
31930 75 6c 6c 20 73 63 61 6e 20 6f 66 20 61 6e 20 75  ull scan of an u
31940 6e 6f 72 64 65 72 65 64 20 69 6e 64 65 78 2e 0a  nordered index..
31950 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
31960 20 20 20 2a 2a 20 28 32 30 31 33 2d 31 30 2d 30     ** (2013-10-0
31970 33 29 20 44 6f 20 6e 6f 74 20 63 6f 75 6e 74 20  3) Do not count 
31980 74 68 65 20 65 6e 74 72 69 65 73 20 69 6e 20 61  the entries in a
31990 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 2e 0a   partial index..
319a0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
319b0 20 20 20 2a 2a 20 49 6e 20 70 72 61 63 74 69 63     ** In practic
319c0 65 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74  e the KeyInfo st
319d0 72 75 63 74 75 72 65 20 77 69 6c 6c 20 6e 6f 74  ructure will not
319e0 20 62 65 20 75 73 65 64 2e 20 49 74 20 69 73 20   be used. It is 
319f0 6f 6e 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a  only .        **
31a00 20 70 61 73 73 65 64 20 74 6f 20 6b 65 65 70 20   passed to keep 
31a10 4f 50 5f 4f 70 65 6e 52 65 61 64 20 68 61 70 70  OP_OpenRead happ
31a20 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  y..        */.  
31a30 20 20 20 20 20 20 69 66 28 20 21 48 61 73 52 6f        if( !HasRo
31a40 77 69 64 28 70 54 61 62 29 20 29 20 70 42 65 73  wid(pTab) ) pBes
31a50 74 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61  t = sqlite3Prima
31a60 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29  ryKeyIndex(pTab)
31a70 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70 49  ;.        for(pI
31a80 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
31a90 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
31aa0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
31ab0 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 62 55      if( pIdx->bU
31ac0 6e 6f 72 64 65 72 65 64 3d 3d 30 0a 20 20 20 20  nordered==0.    
31ad0 20 20 20 20 20 20 20 26 26 20 70 49 64 78 2d 3e         && pIdx->
31ae0 73 7a 49 64 78 52 6f 77 3c 70 54 61 62 2d 3e 73  szIdxRow<pTab->s
31af0 7a 54 61 62 52 6f 77 0a 20 20 20 20 20 20 20 20  zTabRow.        
31b00 20 20 20 26 26 20 70 49 64 78 2d 3e 70 50 61 72     && pIdx->pPar
31b10 74 49 64 78 57 68 65 72 65 3d 3d 30 0a 20 20 20  tIdxWhere==0.   
31b20 20 20 20 20 20 20 20 20 26 26 20 28 21 70 42 65          && (!pBe
31b30 73 74 20 7c 7c 20 70 49 64 78 2d 3e 73 7a 49 64  st || pIdx->szId
31b40 78 52 6f 77 3c 70 42 65 73 74 2d 3e 73 7a 49 64  xRow<pBest->szId
31b50 78 52 6f 77 29 0a 20 20 20 20 20 20 20 20 20 20  xRow).          
31b60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
31b70 42 65 73 74 20 3d 20 70 49 64 78 3b 0a 20 20 20  Best = pIdx;.   
31b80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
31b90 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
31ba0 42 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Best ){.        
31bb0 20 20 69 52 6f 6f 74 20 3d 20 70 42 65 73 74 2d    iRoot = pBest-
31bc0 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20 20  >tnum;.         
31bd0 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69   pKeyInfo = sqli
31be0 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65  te3KeyInfoOfInde
31bf0 78 28 70 50 61 72 73 65 2c 20 70 42 65 73 74 29  x(pParse, pBest)
31c00 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
31c10 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 61 20 72       /* Open a r
31c20 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2c  ead-only cursor,
31c30 20 65 78 65 63 75 74 65 20 74 68 65 20 4f 50 5f   execute the OP_
31c40 43 6f 75 6e 74 2c 20 63 6c 6f 73 65 20 74 68 65  Count, close the
31c50 20 63 75 72 73 6f 72 2e 20 2a 2f 0a 20 20 20 20   cursor. */.    
31c60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
31c70 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4f  ddOp4Int(v, OP_O
31c80 70 65 6e 52 65 61 64 2c 20 69 43 73 72 2c 20 69  penRead, iCsr, i
31c90 52 6f 6f 74 2c 20 69 44 62 2c 20 31 29 3b 0a 20  Root, iDb, 1);. 
31ca0 20 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49         if( pKeyI
31cb0 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nfo ){.         
31cc0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
31cd0 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61  geP4(v, -1, (cha
31ce0 72 20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  r *)pKeyInfo, P4
31cf0 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20  _KEYINFO);.     
31d00 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
31d10 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
31d20 2c 20 4f 50 5f 43 6f 75 6e 74 2c 20 69 43 73 72  , OP_Count, iCsr
31d30 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63  , sAggInfo.aFunc
31d40 5b 30 5d 2e 69 4d 65 6d 29 3b 0a 20 20 20 20 20  [0].iMem);.     
31d50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
31d60 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
31d70 2c 20 69 43 73 72 29 3b 0a 20 20 20 20 20 20 20  , iCsr);.       
31d80 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f   explainSimpleCo
31d90 75 6e 74 28 70 50 61 72 73 65 2c 20 70 54 61 62  unt(pParse, pTab
31da0 2c 20 70 42 65 73 74 29 3b 0a 20 20 20 20 20 20  , pBest);.      
31db0 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20  }else.#endif /* 
31dc0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45  SQLITE_OMIT_BTRE
31dd0 45 43 4f 55 4e 54 20 2a 2f 0a 20 20 20 20 20 20  ECOUNT */.      
31de0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65  {.        /* Che
31df0 63 6b 20 69 66 20 74 68 65 20 71 75 65 72 79 20  ck if the query 
31e00 69 73 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65  is of one of the
31e10 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 73   following forms
31e20 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  :.        **.   
31e30 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54       **   SELECT
31e40 20 6d 69 6e 28 78 29 20 46 52 4f 4d 20 2e 2e 2e   min(x) FROM ...
31e50 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45  .        **   SE
31e60 4c 45 43 54 20 6d 61 78 28 78 29 20 46 52 4f 4d  LECT max(x) FROM
31e70 20 2e 2e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a   ....        **.
31e80 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 69 74          ** If it
31e90 20 69 73 2c 20 74 68 65 6e 20 61 73 6b 20 74 68   is, then ask th
31ea0 65 20 63 6f 64 65 20 69 6e 20 77 68 65 72 65 2e  e code in where.
31eb0 63 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20  c to attempt to 
31ec0 73 6f 72 74 20 72 65 73 75 6c 74 73 0a 20 20 20  sort results.   
31ed0 20 20 20 20 20 2a 2a 20 61 73 20 69 66 20 74 68       ** as if th
31ee0 65 72 65 20 77 61 73 20 61 6e 20 22 4f 52 44 45  ere was an "ORDE
31ef0 52 20 4f 4e 20 78 22 20 6f 72 20 22 4f 52 44 45  R ON x" or "ORDE
31f00 52 20 4f 4e 20 78 20 44 45 53 43 22 20 63 6c 61  R ON x DESC" cla
31f10 75 73 65 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a  use. .        **
31f20 20 49 66 20 77 68 65 72 65 2e 63 20 69 73 20 61   If where.c is a
31f30 62 6c 65 20 74 6f 20 70 72 6f 64 75 63 65 20 72  ble to produce r
31f40 65 73 75 6c 74 73 20 73 6f 72 74 65 64 20 69 6e  esults sorted in
31f50 20 74 68 69 73 20 6f 72 64 65 72 2c 20 74 68 65   this order, the
31f60 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 64 64  n.        ** add
31f70 20 76 64 62 65 20 63 6f 64 65 20 74 6f 20 62 72   vdbe code to br
31f80 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 70  eak out of the p
31f90 72 6f 63 65 73 73 69 6e 67 20 6c 6f 6f 70 20 61  rocessing loop a
31fa0 66 74 65 72 20 74 68 65 20 0a 20 20 20 20 20 20  fter the .      
31fb0 20 20 2a 2a 20 66 69 72 73 74 20 69 74 65 72 61    ** first itera
31fc0 74 69 6f 6e 20 28 73 69 6e 63 65 20 74 68 65 20  tion (since the 
31fd0 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20  first iteration 
31fe0 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 0a  of the loop is .
31ff0 20 20 20 20 20 20 20 20 2a 2a 20 67 75 61 72 61          ** guara
32000 6e 74 65 65 64 20 74 6f 20 6f 70 65 72 61 74 65  nteed to operate
32010 20 6f 6e 20 74 68 65 20 72 6f 77 20 77 69 74 68   on the row with
32020 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 6f 72 20   the minimum or 
32030 6d 61 78 69 6d 75 6d 20 0a 20 20 20 20 20 20 20  maximum .       
32040 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 78 2c 20   ** value of x, 
32050 74 68 65 20 6f 6e 6c 79 20 72 6f 77 20 72 65 71  the only row req
32060 75 69 72 65 64 29 2e 0a 20 20 20 20 20 20 20 20  uired)..        
32070 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 41 20  **.        ** A 
32080 73 70 65 63 69 61 6c 20 66 6c 61 67 20 6d 75 73  special flag mus
32090 74 20 62 65 20 70 61 73 73 65 64 20 74 6f 20 73  t be passed to s
320a0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
320b0 28 29 20 74 6f 20 73 6c 69 67 68 74 6c 79 0a 20  () to slightly. 
320c0 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 69 66 79         ** modify
320d0 20 62 65 68 61 76 69 6f 72 20 61 73 20 66 6f 6c   behavior as fol
320e0 6c 6f 77 73 3a 0a 20 20 20 20 20 20 20 20 2a 2a  lows:.        **
320f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 2b 20  .        **   + 
32100 49 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20  If the query is 
32110 61 20 22 53 45 4c 45 43 54 20 6d 69 6e 28 78 29  a "SELECT min(x)
32120 22 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 6f 70  ", then the loop
32130 20 63 6f 64 65 64 20 62 79 0a 20 20 20 20 20 20   coded by.      
32140 20 20 2a 2a 20 20 20 20 20 77 68 65 72 65 2e 63    **     where.c
32150 20 73 68 6f 75 6c 64 20 6e 6f 74 20 69 74 65 72   should not iter
32160 61 74 65 20 6f 76 65 72 20 61 6e 79 20 76 61 6c  ate over any val
32170 75 65 73 20 77 69 74 68 20 61 20 4e 55 4c 4c 20  ues with a NULL 
32180 76 61 6c 75 65 0a 20 20 20 20 20 20 20 20 2a 2a  value.        **
32190 20 20 20 20 20 66 6f 72 20 78 2e 0a 20 20 20 20       for x..    
321a0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
321b0 2a 20 20 20 2b 20 54 68 65 20 6f 70 74 69 6d 69  *   + The optimi
321c0 7a 65 72 20 63 6f 64 65 20 69 6e 20 77 68 65 72  zer code in wher
321d0 65 2e 63 20 28 74 68 65 20 74 68 69 6e 67 20 74  e.c (the thing t
321e0 68 61 74 20 64 65 63 69 64 65 73 20 77 68 69 63  hat decides whic
321f0 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20  h.        **    
32200 20 69 6e 64 65 78 20 6f 72 20 69 6e 64 69 63 65   index or indice
32210 73 20 74 6f 20 75 73 65 29 20 73 68 6f 75 6c 64  s to use) should
32220 20 70 6c 61 63 65 20 61 20 64 69 66 66 65 72 65   place a differe
32230 6e 74 20 70 72 69 6f 72 69 74 79 20 6f 6e 20 0a  nt priority on .
32240 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 73          **     s
32250 61 74 69 73 66 79 69 6e 67 20 74 68 65 20 27 4f  atisfying the 'O
32260 52 44 45 52 20 42 59 27 20 63 6c 61 75 73 65 20  RDER BY' clause 
32270 74 68 61 6e 20 69 74 20 64 6f 65 73 20 69 6e 20  than it does in 
32280 6f 74 68 65 72 20 63 61 73 65 73 2e 0a 20 20 20  other cases..   
32290 20 20 20 20 20 2a 2a 20 20 20 20 20 52 65 66 65       **     Refe
322a0 72 20 74 6f 20 63 6f 64 65 20 61 6e 64 20 63 6f  r to code and co
322b0 6d 6d 65 6e 74 73 20 69 6e 20 77 68 65 72 65 2e  mments in where.
322c0 63 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 20  c for details.. 
322d0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
322e0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4d 69 6e    ExprList *pMin
322f0 4d 61 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Max = 0;.       
32300 20 75 38 20 66 6c 61 67 20 3d 20 57 48 45 52 45   u8 flag = WHERE
32310 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b  _ORDERBY_NORMAL;
32320 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20  .        .      
32330 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72    assert( p->pGr
32340 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20  oupBy==0 );.    
32350 20 20 20 20 61 73 73 65 72 74 28 20 66 6c 61 67      assert( flag
32360 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ==0 );.        i
32370 66 28 20 70 2d 3e 70 48 61 76 69 6e 67 3d 3d 30  f( p->pHaving==0
32380 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6c   ){.          fl
32390 61 67 20 3d 20 6d 69 6e 4d 61 78 51 75 65 72 79  ag = minMaxQuery
323a0 28 26 73 41 67 67 49 6e 66 6f 2c 20 26 70 4d 69  (&sAggInfo, &pMi
323b0 6e 4d 61 78 29 3b 0a 20 20 20 20 20 20 20 20 7d  nMax);.        }
323c0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
323d0 20 66 6c 61 67 3d 3d 30 20 7c 7c 20 28 70 4d 69   flag==0 || (pMi
323e0 6e 4d 61 78 21 3d 30 20 26 26 20 70 4d 69 6e 4d  nMax!=0 && pMinM
323f0 61 78 2d 3e 6e 45 78 70 72 3d 3d 31 29 20 29 3b  ax->nExpr==1) );
32400 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 6c  ..        if( fl
32410 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ag ){.          
32420 70 4d 69 6e 4d 61 78 20 3d 20 73 71 6c 69 74 65  pMinMax = sqlite
32430 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
32440 20 70 4d 69 6e 4d 61 78 2c 20 30 29 3b 0a 20 20   pMinMax, 0);.  
32450 20 20 20 20 20 20 20 20 70 44 65 6c 20 3d 20 70          pDel = p
32460 4d 69 6e 4d 61 78 3b 0a 20 20 20 20 20 20 20 20  MinMax;.        
32470 20 20 69 66 28 20 70 4d 69 6e 4d 61 78 20 26 26    if( pMinMax &&
32480 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
32490 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ed ){.          
324a0 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e    pMinMax->a[0].
324b0 73 6f 72 74 4f 72 64 65 72 20 3d 20 66 6c 61 67  sortOrder = flag
324c0 21 3d 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  !=WHERE_ORDERBY_
324d0 4d 49 4e 20 3f 31 3a 30 3b 0a 20 20 20 20 20 20  MIN ?1:0;.      
324e0 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61        pMinMax->a
324f0 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 20 3d 20  [0].pExpr->op = 
32500 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20  TK_COLUMN;.     
32510 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
32520 0a 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  .  .        /* T
32530 68 69 73 20 63 61 73 65 20 72 75 6e 73 20 69 66  his case runs if
32540 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 68   the aggregate h
32550 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63  as no GROUP BY c
32560 6c 61 75 73 65 2e 20 20 54 68 65 0a 20 20 20 20  lause.  The.    
32570 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e      ** processin
32580 67 20 69 73 20 6d 75 63 68 20 73 69 6d 70 6c 65  g is much simple
32590 72 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73  r since there is
325a0 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72   only a single r
325b0 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  ow.        ** of
325c0 20 6f 75 74 70 75 74 2e 0a 20 20 20 20 20 20 20   output..       
325d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 73 65   */.        rese
325e0 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61  tAccumulator(pPa
325f0 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
32600 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 20  .        pWInfo 
32610 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  = sqlite3WhereBe
32620 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  gin(pParse, pTab
32630 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 70 4d  List, pWhere, pM
32640 69 6e 4d 61 78 2c 30 2c 66 6c 61 67 2c 30 29 3b  inMax,0,flag,0);
32650 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 57 49  .        if( pWI
32660 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nfo==0 ){.      
32670 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
32680 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44  istDelete(db, pD
32690 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67  el);.          g
326a0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
326b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
326c0 20 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61    updateAccumula
326d0 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67  tor(pParse, &sAg
326e0 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  gInfo);.        
326f0 61 73 73 65 72 74 28 20 70 4d 69 6e 4d 61 78 3d  assert( pMinMax=
32700 3d 30 20 7c 7c 20 70 4d 69 6e 4d 61 78 2d 3e 6e  =0 || pMinMax->n
32710 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20 20 20 20  Expr==1 );.     
32720 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
32730 65 72 65 49 73 4f 72 64 65 72 65 64 28 70 57 49  ereIsOrdered(pWI
32740 6e 66 6f 29 3e 30 20 29 7b 0a 20 20 20 20 20 20  nfo)>0 ){.      
32750 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
32760 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
32770 2c 20 30 2c 20 73 71 6c 69 74 65 33 57 68 65 72  , 0, sqlite3Wher
32780 65 42 72 65 61 6b 4c 61 62 65 6c 28 70 57 49 6e  eBreakLabel(pWIn
32790 66 6f 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  fo));.          
327a0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
327b0 22 25 73 28 29 20 62 79 20 69 6e 64 65 78 22 2c  "%s() by index",
327c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
327d0 20 28 66 6c 61 67 3d 3d 57 48 45 52 45 5f 4f 52   (flag==WHERE_OR
327e0 44 45 52 42 59 5f 4d 49 4e 3f 22 6d 69 6e 22 3a  DERBY_MIN?"min":
327f0 22 6d 61 78 22 29 29 29 3b 0a 20 20 20 20 20 20  "max")));.      
32800 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
32810 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e  te3WhereEnd(pWIn
32820 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 66 69 6e  fo);.        fin
32830 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e  alizeAggFunction
32840 73 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49  s(pParse, &sAggI
32850 6e 66 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  nfo);.      }.. 
32860 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64 65       sSort.pOrde
32870 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  rBy = 0;.      s
32880 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
32890 65 28 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e  e(pParse, pHavin
328a0 67 2c 20 61 64 64 72 45 6e 64 2c 20 53 51 4c 49  g, addrEnd, SQLI
328b0 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
328c0 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65        selectInne
328d0 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
328e0 20 70 2d 3e 70 45 4c 69 73 74 2c 20 2d 31 2c 20   p->pEList, -1, 
328f0 30 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20  0, 0, .         
32900 20 20 20 20 20 20 20 20 20 20 20 20 20 70 44 65               pDe
32910 73 74 2c 20 61 64 64 72 45 6e 64 2c 20 61 64 64  st, addrEnd, add
32920 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  rEnd);.      sql
32930 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
32940 74 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20  te(db, pDel);.  
32950 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
32960 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
32970 76 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20  v, addrEnd);.   
32980 20 0a 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 61   .  } /* endif a
32990 67 67 72 65 67 61 74 65 20 71 75 65 72 79 20 2a  ggregate query *
329a0 2f 0a 0a 20 20 69 66 28 20 73 44 69 73 74 69 6e  /..  if( sDistin
329b0 63 74 2e 65 54 6e 63 74 54 79 70 65 3d 3d 57 48  ct.eTnctType==WH
329c0 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f  ERE_DISTINCT_UNO
329d0 52 44 45 52 45 44 20 29 7b 0a 20 20 20 20 65 78  RDERED ){.    ex
329e0 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 70  plainTempTable(p
329f0 50 61 72 73 65 2c 20 22 44 49 53 54 49 4e 43 54  Parse, "DISTINCT
32a00 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  ");.  }..  /* If
32a10 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44   there is an ORD
32a20 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  ER BY clause, th
32a30 65 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 73 6f  en we need to so
32a40 72 74 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20  rt the results. 
32a50 20 2a 2a 20 61 6e 64 20 73 65 6e 64 20 74 68 65   ** and send the
32a60 6d 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63  m to the callbac
32a70 6b 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20  k one by one..  
32a80 2a 2f 0a 20 20 69 66 28 20 73 53 6f 72 74 2e 70  */.  if( sSort.p
32a90 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 65  OrderBy ){.    e
32aa0 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28  xplainTempTable(
32ab0 70 50 61 72 73 65 2c 20 73 53 6f 72 74 2e 6e 4f  pParse, sSort.nO
32ac0 42 53 61 74 3e 30 20 3f 20 22 52 49 47 48 54 20  BSat>0 ? "RIGHT 
32ad0 50 41 52 54 20 4f 46 20 4f 52 44 45 52 20 42 59  PART OF ORDER BY
32ae0 22 3a 22 4f 52 44 45 52 20 42 59 22 29 3b 0a 20  ":"ORDER BY");. 
32af0 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54     generateSortT
32b00 61 69 6c 28 70 50 61 72 73 65 2c 20 70 2c 20 26  ail(pParse, p, &
32b10 73 53 6f 72 74 2c 20 70 45 4c 69 73 74 2d 3e 6e  sSort, pEList->n
32b20 45 78 70 72 2c 20 70 44 65 73 74 29 3b 0a 20 20  Expr, pDest);.  
32b30 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72  }..  /* Jump her
32b40 65 20 74 6f 20 73 6b 69 70 20 74 68 69 73 20 71  e to skip this q
32b50 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  uery.  */.  sqli
32b60 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
32b70 62 65 6c 28 76 2c 20 69 45 6e 64 29 3b 0a 0a 20  bel(v, iEnd);.. 
32b80 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 77   /* The SELECT w
32b90 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  as successfully 
32ba0 63 6f 64 65 64 2e 20 20 20 53 65 74 20 74 68 65  coded.   Set the
32bb0 20 72 65 74 75 72 6e 20 63 6f 64 65 20 74 6f 20   return code to 
32bc0 30 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61  0.  ** to indica
32bd0 74 65 20 6e 6f 20 65 72 72 6f 72 73 2e 0a 20 20  te no errors..  
32be0 2a 2f 0a 20 20 72 63 20 3d 20 30 3b 0a 0a 20 20  */.  rc = 0;..  
32bf0 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73  /* Control jumps
32c00 20 74 6f 20 68 65 72 65 20 69 66 20 61 6e 20 65   to here if an e
32c10 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
32c20 72 65 64 20 61 62 6f 76 65 2c 20 6f 72 20 75 70  red above, or up
32c30 6f 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66  on.  ** successf
32c40 75 6c 20 63 6f 64 69 6e 67 20 6f 66 20 74 68 65  ul coding of the
32c50 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a 73 65   SELECT..  */.se
32c60 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 65 78 70 6c  lect_end:.  expl
32c70 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 70 50  ainSetInteger(pP
32c80 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c  arse->iSelectId,
32c90 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63 74 49   iRestoreSelectI
32ca0 64 29 3b 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69  d);..  /* Identi
32cb0 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  fy column names 
32cc0 69 66 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  if results of th
32cd0 65 20 53 45 4c 45 43 54 20 61 72 65 20 74 6f 20  e SELECT are to 
32ce0 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a  be output..  */.
32cf0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
32d00 5f 4f 4b 20 26 26 20 70 44 65 73 74 2d 3e 65 44  _OK && pDest->eD
32d10 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
32d20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43  ){.    generateC
32d30 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
32d40 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c  e, pTabList, pEL
32d50 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c  ist);.  }..  sql
32d60 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 73  ite3DbFree(db, s
32d70 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 29 3b 0a 20  AggInfo.aCol);. 
32d80 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
32d90 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e  b, sAggInfo.aFun
32da0 63 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52  c);.#if SELECTTR
32db0 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 53 45  ACE_ENABLED.  SE
32dc0 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50 61 72  LECTTRACE(1,pPar
32dd0 73 65 2c 70 2c 28 22 65 6e 64 20 70 72 6f 63 65  se,p,("end proce
32de0 73 73 69 6e 67 5c 6e 22 29 29 3b 0a 20 20 70 50  ssing\n"));.  pP
32df0 61 72 73 65 2d 3e 6e 53 65 6c 65 63 74 49 6e 64  arse->nSelectInd
32e00 65 6e 74 2d 2d 3b 0a 23 65 6e 64 69 66 0a 20 20  ent--;.#endif.  
32e10 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
32e20 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
32e30 47 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  G./*.** Generate
32e40 20 61 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c   a human-readabl
32e50 65 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  e description of
32e60 20 61 20 74 68 65 20 53 65 6c 65 63 74 20 6f 62   a the Select ob
32e70 6a 65 63 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ject..*/.void sq
32e80 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c  lite3TreeViewSel
32e90 65 63 74 28 54 72 65 65 56 69 65 77 20 2a 70 56  ect(TreeView *pV
32ea0 69 65 77 2c 20 63 6f 6e 73 74 20 53 65 6c 65 63  iew, const Selec
32eb0 74 20 2a 70 2c 20 75 38 20 6d 6f 72 65 54 6f 46  t *p, u8 moreToF
32ec0 6f 6c 6c 6f 77 29 7b 0a 20 20 69 6e 74 20 6e 20  ollow){.  int n 
32ed0 3d 20 30 3b 0a 20 20 70 56 69 65 77 20 3d 20 73  = 0;.  pView = s
32ee0 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 50 75  qlite3TreeViewPu
32ef0 73 68 28 70 56 69 65 77 2c 20 6d 6f 72 65 54 6f  sh(pView, moreTo
32f00 46 6f 6c 6c 6f 77 29 3b 0a 20 20 73 71 6c 69 74  Follow);.  sqlit
32f10 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70  e3TreeViewLine(p
32f20 56 69 65 77 2c 20 22 53 45 4c 45 43 54 25 73 25  View, "SELECT%s%
32f30 73 20 28 30 78 25 70 29 22 2c 0a 20 20 20 20 28  s (0x%p)",.    (
32f40 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
32f50 46 5f 44 69 73 74 69 6e 63 74 29 20 3f 20 22 20  F_Distinct) ? " 
32f60 44 49 53 54 49 4e 43 54 22 20 3a 20 22 22 29 2c  DISTINCT" : ""),
32f70 0a 20 20 20 20 28 28 70 2d 3e 73 65 6c 46 6c 61  .    ((p->selFla
32f80 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74  gs & SF_Aggregat
32f90 65 29 20 3f 20 22 20 61 67 67 5f 66 6c 61 67 22  e) ? " agg_flag"
32fa0 20 3a 20 22 22 29 2c 20 70 0a 20 20 29 3b 0a 20   : ""), p.  );. 
32fb0 20 69 66 28 20 70 2d 3e 70 53 72 63 20 26 26 20   if( p->pSrc && 
32fc0 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 20 29 20  p->pSrc->nSrc ) 
32fd0 6e 2b 2b 3b 0a 20 20 69 66 28 20 70 2d 3e 70 57  n++;.  if( p->pW
32fe0 68 65 72 65 20 29 20 6e 2b 2b 3b 0a 20 20 69 66  here ) n++;.  if
32ff0 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 20  ( p->pGroupBy ) 
33000 6e 2b 2b 3b 0a 20 20 69 66 28 20 70 2d 3e 70 48  n++;.  if( p->pH
33010 61 76 69 6e 67 20 29 20 6e 2b 2b 3b 0a 20 20 69  aving ) n++;.  i
33020 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29  f( p->pOrderBy )
33030 20 6e 2b 2b 3b 0a 20 20 69 66 28 20 70 2d 3e 70   n++;.  if( p->p
33040 4c 69 6d 69 74 20 29 20 6e 2b 2b 3b 0a 20 20 69  Limit ) n++;.  i
33050 66 28 20 70 2d 3e 70 4f 66 66 73 65 74 20 29 20  f( p->pOffset ) 
33060 6e 2b 2b 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50  n++;.  if( p->pP
33070 72 69 6f 72 20 29 20 6e 2b 2b 3b 0a 20 20 73 71  rior ) n++;.  sq
33080 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78 70  lite3TreeViewExp
33090 72 4c 69 73 74 28 70 56 69 65 77 2c 20 70 2d 3e  rList(pView, p->
330a0 70 45 4c 69 73 74 2c 20 28 6e 2d 2d 29 3e 30 2c  pEList, (n--)>0,
330b0 20 22 72 65 73 75 6c 74 2d 73 65 74 22 29 3b 0a   "result-set");.
330c0 20 20 69 66 28 20 70 2d 3e 70 53 72 63 20 26 26    if( p->pSrc &&
330d0 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 20 29   p->pSrc->nSrc )
330e0 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
330f0 20 70 56 69 65 77 20 3d 20 73 71 6c 69 74 65 33   pView = sqlite3
33100 54 72 65 65 56 69 65 77 50 75 73 68 28 70 56 69  TreeViewPush(pVi
33110 65 77 2c 20 28 6e 2d 2d 29 3e 30 29 3b 0a 20 20  ew, (n--)>0);.  
33120 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
33130 77 4c 69 6e 65 28 70 56 69 65 77 2c 20 22 46 52  wLine(pView, "FR
33140 4f 4d 22 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  OM");.    for(i=
33150 30 3b 20 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53  0; i<p->pSrc->nS
33160 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rc; i++){.      
33170 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
33180 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d  tem *pItem = &p-
33190 3e 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20  >pSrc->a[i];.   
331a0 20 20 20 53 74 72 41 63 63 75 6d 20 78 3b 0a 20     StrAccum x;. 
331b0 20 20 20 20 20 63 68 61 72 20 7a 4c 69 6e 65 5b       char zLine[
331c0 31 30 30 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69  100];.      sqli
331d0 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28  te3StrAccumInit(
331e0 26 78 2c 20 7a 4c 69 6e 65 2c 20 73 69 7a 65 6f  &x, zLine, sizeo
331f0 66 28 7a 4c 69 6e 65 29 2c 20 30 29 3b 0a 20 20  f(zLine), 0);.  
33200 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e      sqlite3XPrin
33210 74 66 28 26 78 2c 20 30 2c 20 22 7b 25 64 2c 2a  tf(&x, 0, "{%d,*
33220 7d 22 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73  }", pItem->iCurs
33230 6f 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  or);.      if( p
33240 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20  Item->zDatabase 
33250 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
33260 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20 30 2c  e3XPrintf(&x, 0,
33270 20 22 20 25 73 2e 25 73 22 2c 20 70 49 74 65 6d   " %s.%s", pItem
33280 2d 3e 7a 44 61 74 61 62 61 73 65 2c 20 70 49 74  ->zDatabase, pIt
33290 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
332a0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 49 74 65    }else if( pIte
332b0 6d 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  m->zName ){.    
332c0 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e      sqlite3XPrin
332d0 74 66 28 26 78 2c 20 30 2c 20 22 20 25 73 22 2c  tf(&x, 0, " %s",
332e0 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a   pItem->zName);.
332f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
33300 28 20 70 49 74 65 6d 2d 3e 70 54 61 62 20 29 7b  ( pItem->pTab ){
33310 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
33320 58 50 72 69 6e 74 66 28 26 78 2c 20 30 2c 20 22  XPrintf(&x, 0, "
33330 20 74 61 62 6e 61 6d 65 3d 25 51 22 2c 20 70 49   tabname=%Q", pI
33340 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  tem->pTab->zName
33350 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
33360 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69   if( pItem->zAli
33370 61 73 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  as ){.        sq
33380 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c  lite3XPrintf(&x,
33390 20 30 2c 20 22 20 28 41 53 20 25 73 29 22 2c 20   0, " (AS %s)", 
333a0 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a  pItem->zAlias);.
333b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
333c0 28 20 70 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70  ( pItem->jointyp
333d0 65 20 26 20 4a 54 5f 4c 45 46 54 20 29 7b 0a 20  e & JT_LEFT ){. 
333e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50         sqlite3XP
333f0 72 69 6e 74 66 28 26 78 2c 20 30 2c 20 22 20 4c  rintf(&x, 0, " L
33400 45 46 54 2d 4a 4f 49 4e 22 29 3b 0a 20 20 20 20  EFT-JOIN");.    
33410 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
33420 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73 68 28  3StrAccumFinish(
33430 26 78 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  &x);.      sqlit
33440 65 33 54 72 65 65 56 69 65 77 49 74 65 6d 28 70  e3TreeViewItem(p
33450 56 69 65 77 2c 20 7a 4c 69 6e 65 2c 20 69 3c 70  View, zLine, i<p
33460 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 2d 31 29 3b  ->pSrc->nSrc-1);
33470 20 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65   .      if( pIte
33480 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  m->pSelect ){.  
33490 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65        sqlite3Tre
334a0 65 56 69 65 77 53 65 6c 65 63 74 28 70 56 69 65  eViewSelect(pVie
334b0 77 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  w, pItem->pSelec
334c0 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, 0);.      }. 
334d0 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65       sqlite3Tree
334e0 56 69 65 77 50 6f 70 28 70 56 69 65 77 29 3b 0a  ViewPop(pView);.
334f0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
33500 33 54 72 65 65 56 69 65 77 50 6f 70 28 70 56 69  3TreeViewPop(pVi
33510 65 77 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ew);.  }.  if( p
33520 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20  ->pWhere ){.    
33530 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 49  sqlite3TreeViewI
33540 74 65 6d 28 70 56 69 65 77 2c 20 22 57 48 45 52  tem(pView, "WHER
33550 45 22 2c 20 28 6e 2d 2d 29 3e 30 29 3b 0a 20 20  E", (n--)>0);.  
33560 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
33570 77 45 78 70 72 28 70 56 69 65 77 2c 20 70 2d 3e  wExpr(pView, p->
33580 70 57 68 65 72 65 2c 20 30 29 3b 0a 20 20 20 20  pWhere, 0);.    
33590 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 50  sqlite3TreeViewP
335a0 6f 70 28 70 56 69 65 77 29 3b 0a 20 20 7d 0a 20  op(pView);.  }. 
335b0 20 69 66 28 20 70 2d 3e 70 47 72 6f 75 70 42 79   if( p->pGroupBy
335c0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54   ){.    sqlite3T
335d0 72 65 65 56 69 65 77 45 78 70 72 4c 69 73 74 28  reeViewExprList(
335e0 70 56 69 65 77 2c 20 70 2d 3e 70 47 72 6f 75 70  pView, p->pGroup
335f0 42 79 2c 20 28 6e 2d 2d 29 3e 30 2c 20 22 47 52  By, (n--)>0, "GR
33600 4f 55 50 42 59 22 29 3b 0a 20 20 7d 0a 20 20 69  OUPBY");.  }.  i
33610 66 28 20 70 2d 3e 70 48 61 76 69 6e 67 20 29 7b  f( p->pHaving ){
33620 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65  .    sqlite3Tree
33630 56 69 65 77 49 74 65 6d 28 70 56 69 65 77 2c 20  ViewItem(pView, 
33640 22 48 41 56 49 4e 47 22 2c 20 28 6e 2d 2d 29 3e  "HAVING", (n--)>
33650 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  0);.    sqlite3T
33660 72 65 65 56 69 65 77 45 78 70 72 28 70 56 69 65  reeViewExpr(pVie
33670 77 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 30  w, p->pHaving, 0
33680 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72  );.    sqlite3Tr
33690 65 65 56 69 65 77 50 6f 70 28 70 56 69 65 77 29  eeViewPop(pView)
336a0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
336b0 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73  OrderBy ){.    s
336c0 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78  qlite3TreeViewEx
336d0 70 72 4c 69 73 74 28 70 56 69 65 77 2c 20 70 2d  prList(pView, p-
336e0 3e 70 4f 72 64 65 72 42 79 2c 20 28 6e 2d 2d 29  >pOrderBy, (n--)
336f0 3e 30 2c 20 22 4f 52 44 45 52 42 59 22 29 3b 0a  >0, "ORDERBY");.
33700 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69    }.  if( p->pLi
33710 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  mit ){.    sqlit
33720 65 33 54 72 65 65 56 69 65 77 49 74 65 6d 28 70  e3TreeViewItem(p
33730 56 69 65 77 2c 20 22 4c 49 4d 49 54 22 2c 20 28  View, "LIMIT", (
33740 6e 2d 2d 29 3e 30 29 3b 0a 20 20 20 20 73 71 6c  n--)>0);.    sql
33750 69 74 65 33 54 72 65 65 56 69 65 77 45 78 70 72  ite3TreeViewExpr
33760 28 70 56 69 65 77 2c 20 70 2d 3e 70 4c 69 6d 69  (pView, p->pLimi
33770 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  t, 0);.    sqlit
33780 65 33 54 72 65 65 56 69 65 77 50 6f 70 28 70 56  e3TreeViewPop(pV
33790 69 65 77 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  iew);.  }.  if( 
337a0 70 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20  p->pOffset ){.  
337b0 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
337c0 77 49 74 65 6d 28 70 56 69 65 77 2c 20 22 4f 46  wItem(pView, "OF
337d0 46 53 45 54 22 2c 20 28 6e 2d 2d 29 3e 30 29 3b  FSET", (n--)>0);
337e0 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65  .    sqlite3Tree
337f0 56 69 65 77 45 78 70 72 28 70 56 69 65 77 2c 20  ViewExpr(pView, 
33800 70 2d 3e 70 4f 66 66 73 65 74 2c 20 30 29 3b 0a  p->pOffset, 0);.
33810 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
33820 69 65 77 50 6f 70 28 70 56 69 65 77 29 3b 0a 20  iewPop(pView);. 
33830 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69   }.  if( p->pPri
33840 6f 72 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  or ){.    const 
33850 63 68 61 72 20 2a 7a 4f 70 20 3d 20 22 55 4e 49  char *zOp = "UNI
33860 4f 4e 22 3b 0a 20 20 20 20 73 77 69 74 63 68 28  ON";.    switch(
33870 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 20 20   p->op ){.      
33880 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20  case TK_ALL:    
33890 20 20 20 20 20 7a 4f 70 20 3d 20 22 55 4e 49 4f       zOp = "UNIO
338a0 4e 20 41 4c 4c 22 3b 20 20 62 72 65 61 6b 3b 0a  N ALL";  break;.
338b0 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e        case TK_IN
338c0 54 45 52 53 45 43 54 3a 20 20 20 7a 4f 70 20 3d  TERSECT:   zOp =
338d0 20 22 49 4e 54 45 52 53 45 43 54 22 3b 20 20 62   "INTERSECT";  b
338e0 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
338f0 20 54 4b 5f 45 58 43 45 50 54 3a 20 20 20 20 20   TK_EXCEPT:     
33900 20 7a 4f 70 20 3d 20 22 45 58 43 45 50 54 22 3b   zOp = "EXCEPT";
33910 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
33920 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65  }.    sqlite3Tre
33930 65 56 69 65 77 49 74 65 6d 28 70 56 69 65 77 2c  eViewItem(pView,
33940 20 7a 4f 70 2c 20 28 6e 2d 2d 29 3e 30 29 3b 0a   zOp, (n--)>0);.
33950 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
33960 69 65 77 53 65 6c 65 63 74 28 70 56 69 65 77 2c  iewSelect(pView,
33970 20 70 2d 3e 70 50 72 69 6f 72 2c 20 30 29 3b 0a   p->pPrior, 0);.
33980 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
33990 69 65 77 50 6f 70 28 70 56 69 65 77 29 3b 0a 20  iewPop(pView);. 
339a0 20 7d 0a 20 20 73 71 6c 69 74 65 33 54 72 65 65   }.  sqlite3Tree
339b0 56 69 65 77 50 6f 70 28 70 56 69 65 77 29 3b 0a  ViewPop(pView);.
339c0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
339d0 54 45 5f 44 45 42 55 47 20 2a 2f 0a              TE_DEBUG */.