/ Hex Artifact Content
Login

Artifact 75f825e980a1e2b4fa703757b52677a53892e0d6a89c6a765391f4c8dbe49c76:


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 69 66 28  nChng = 0;.  if(
218f0 20 70 57 68 65 72 65 3d 3d 30 20 29 20 72 65 74   pWhere==0 ) ret
21900 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 53  urn 0;.  if( (pS
21910 75 62 71 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ubq->selFlags & 
21920 28 53 46 5f 41 67 67 72 65 67 61 74 65 7c 53 46  (SF_Aggregate|SF
21930 5f 52 65 63 75 72 73 69 76 65 29 29 21 3d 30 20  _Recursive))!=0 
21940 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30  ){.     return 0
21950 3b 20 2f 2a 20 72 65 73 74 72 69 63 74 69 6f 6e  ; /* restriction
21960 73 20 28 31 29 20 61 6e 64 20 28 32 29 20 2a 2f  s (1) and (2) */
21970 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62 71  .  }.  if( pSubq
21980 2d 3e 70 4c 69 6d 69 74 21 3d 30 20 29 7b 0a 20  ->pLimit!=0 ){. 
21990 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a      return 0; /*
219a0 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 33 29   restriction (3)
219b0 20 2a 2f 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28   */.  }.  while(
219c0 20 70 57 68 65 72 65 2d 3e 6f 70 3d 3d 54 4b 5f   pWhere->op==TK_
219d0 41 4e 44 20 29 7b 0a 20 20 20 20 6e 43 68 6e 67  AND ){.    nChng
219e0 20 2b 3d 20 70 75 73 68 44 6f 77 6e 57 68 65 72   += pushDownWher
219f0 65 54 65 72 6d 73 28 64 62 2c 20 70 53 75 62 71  eTerms(db, pSubq
21a00 2c 20 70 57 68 65 72 65 2d 3e 70 52 69 67 68 74  , pWhere->pRight
21a10 2c 20 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  , iCursor);.    
21a20 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 2d  pWhere = pWhere-
21a30 3e 70 4c 65 66 74 3b 0a 20 20 7d 0a 20 20 69 66  >pLeft;.  }.  if
21a40 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
21a50 79 28 70 57 68 65 72 65 2c 45 50 5f 46 72 6f 6d  y(pWhere,EP_From
21a60 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30  Join) ) return 0
21a70 3b 20 2f 2a 20 72 65 73 74 72 69 63 74 69 6f 6e  ; /* restriction
21a80 20 35 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69   5 */.  if( sqli
21a90 74 65 33 45 78 70 72 49 73 54 61 62 6c 65 43 6f  te3ExprIsTableCo
21aa0 6e 73 74 61 6e 74 28 70 57 68 65 72 65 2c 20 69  nstant(pWhere, i
21ab0 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 6e  Cursor) ){.    n
21ac0 43 68 6e 67 2b 2b 3b 0a 20 20 20 20 77 68 69 6c  Chng++;.    whil
21ad0 65 28 20 70 53 75 62 71 20 29 7b 0a 20 20 20 20  e( pSubq ){.    
21ae0 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
21af0 45 78 70 72 44 75 70 28 64 62 2c 20 70 57 68 65  ExprDup(db, pWhe
21b00 72 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4e  re, 0);.      pN
21b10 65 77 20 3d 20 73 75 62 73 74 45 78 70 72 28 64  ew = substExpr(d
21b20 62 2c 20 70 4e 65 77 2c 20 69 43 75 72 73 6f 72  b, pNew, iCursor
21b30 2c 20 70 53 75 62 71 2d 3e 70 45 4c 69 73 74 29  , pSubq->pEList)
21b40 3b 0a 20 20 20 20 20 20 70 53 75 62 71 2d 3e 70  ;.      pSubq->p
21b50 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45  Where = sqlite3E
21b60 78 70 72 41 6e 64 28 64 62 2c 20 70 53 75 62 71  xprAnd(db, pSubq
21b70 2d 3e 70 57 68 65 72 65 2c 20 70 4e 65 77 29 3b  ->pWhere, pNew);
21b80 0a 20 20 20 20 20 20 70 53 75 62 71 20 3d 20 70  .      pSubq = p
21b90 53 75 62 71 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  Subq->pPrior;.  
21ba0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
21bb0 20 6e 43 68 6e 67 3b 0a 7d 0a 23 65 6e 64 69 66   nChng;.}.#endif
21bc0 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
21bd0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
21be0 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
21bf0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
21c00 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 42 61 73 65 64   */../*.** Based
21c10 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73   on the contents
21c20 20 6f 66 20 74 68 65 20 41 67 67 49 6e 66 6f 20   of the AggInfo 
21c30 73 74 72 75 63 74 75 72 65 20 69 6e 64 69 63 61  structure indica
21c40 74 65 64 20 62 79 20 74 68 65 20 66 69 72 73 74  ted by the first
21c50 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2c 20 74 68  .** argument, th
21c60 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 65 63  is function chec
21c70 6b 73 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ks if the follow
21c80 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a  ing are true:.**
21c90 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 71 75 65  .**    * the que
21ca0 72 79 20 63 6f 6e 74 61 69 6e 73 20 6a 75 73 74  ry contains just
21cb0 20 61 20 73 69 6e 67 6c 65 20 61 67 67 72 65 67   a single aggreg
21cc0 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c 0a 2a 2a  ate function,.**
21cd0 20 20 20 20 2a 20 74 68 65 20 61 67 67 72 65 67      * the aggreg
21ce0 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  ate function is 
21cf0 65 69 74 68 65 72 20 6d 69 6e 28 29 20 6f 72 20  either min() or 
21d00 6d 61 78 28 29 2c 20 61 6e 64 0a 2a 2a 20 20 20  max(), and.**   
21d10 20 2a 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20   * the argument 
21d20 74 6f 20 74 68 65 20 61 67 67 72 65 67 61 74 65  to the aggregate
21d30 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 63   function is a c
21d40 6f 6c 75 6d 6e 20 76 61 6c 75 65 2e 0a 2a 2a 0a  olumn value..**.
21d50 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65  ** If all of the
21d60 20 61 62 6f 76 65 20 61 72 65 20 74 72 75 65 2c   above are true,
21d70 20 74 68 65 6e 20 57 48 45 52 45 5f 4f 52 44 45   then WHERE_ORDE
21d80 52 42 59 5f 4d 49 4e 20 6f 72 20 57 48 45 52 45  RBY_MIN or WHERE
21d90 5f 4f 52 44 45 52 42 59 5f 4d 41 58 0a 2a 2a 20  _ORDERBY_MAX.** 
21da0 69 73 20 72 65 74 75 72 6e 65 64 20 61 73 20 61  is returned as a
21db0 70 70 72 6f 70 72 69 61 74 65 2e 20 41 6c 73 6f  ppropriate. Also
21dc0 2c 20 2a 70 70 4d 69 6e 4d 61 78 20 69 73 20 73  , *ppMinMax is s
21dd0 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  et to point to t
21de0 68 65 20 0a 2a 2a 20 6c 69 73 74 20 6f 66 20 61  he .** list of a
21df0 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20  rguments passed 
21e00 74 6f 20 74 68 65 20 61 67 67 72 65 67 61 74 65  to the aggregate
21e10 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
21e20 67 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20  g..**.** Or, if 
21e30 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61  the conditions a
21e40 62 6f 76 65 20 61 72 65 20 6e 6f 74 20 6d 65 74  bove are not met
21e50 2c 20 2a 70 70 4d 69 6e 4d 61 78 20 69 73 20 73  , *ppMinMax is s
21e60 65 74 20 74 6f 20 30 20 61 6e 64 0a 2a 2a 20 57  et to 0 and.** W
21e70 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52  HERE_ORDERBY_NOR
21e80 4d 41 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e  MAL is returned.
21e90 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 6d 69  .*/.static u8 mi
21ea0 6e 4d 61 78 51 75 65 72 79 28 41 67 67 49 6e 66  nMaxQuery(AggInf
21eb0 6f 20 2a 70 41 67 67 49 6e 66 6f 2c 20 45 78 70  o *pAggInfo, Exp
21ec0 72 4c 69 73 74 20 2a 2a 70 70 4d 69 6e 4d 61 78  rList **ppMinMax
21ed0 29 7b 0a 20 20 69 6e 74 20 65 52 65 74 20 3d 20  ){.  int eRet = 
21ee0 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f  WHERE_ORDERBY_NO
21ef0 52 4d 41 4c 3b 20 20 20 20 20 20 20 20 20 20 2f  RMAL;          /
21f00 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a  * Return value *
21f10 2f 0a 0a 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d  /..  *ppMinMax =
21f20 20 30 3b 0a 20 20 69 66 28 20 70 41 67 67 49 6e   0;.  if( pAggIn
21f30 66 6f 2d 3e 6e 46 75 6e 63 3d 3d 31 20 29 7b 0a  fo->nFunc==1 ){.
21f40 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
21f50 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  = pAggInfo->aFun
21f60 63 5b 30 5d 2e 70 45 78 70 72 3b 20 2f 2a 20 41  c[0].pExpr; /* A
21f70 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
21f80 6e 20 2a 2f 0a 20 20 20 20 45 78 70 72 4c 69 73  n */.    ExprLis
21f90 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 45 78 70  t *pEList = pExp
21fa0 72 2d 3e 78 2e 70 4c 69 73 74 3b 20 20 20 20 20  r->x.pList;     
21fb0 20 2f 2a 20 41 72 67 75 6d 65 6e 74 73 20 74 6f   /* Arguments to
21fc0 20 61 67 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f   agg function */
21fd0 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  ..    assert( pE
21fe0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
21ff0 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20  FUNCTION );.    
22000 69 66 28 20 70 45 4c 69 73 74 20 26 26 20 70 45  if( pEList && pE
22010 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 31 20 26  List->nExpr==1 &
22020 26 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  & pEList->a[0].p
22030 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  Expr->op==TK_AGG
22040 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20  _COLUMN ){.     
22050 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75   const char *zFu
22060 6e 63 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54  nc = pExpr->u.zT
22070 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20  oken;.      if( 
22080 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
22090 46 75 6e 63 2c 20 22 6d 69 6e 22 29 3d 3d 30 20  Func, "min")==0 
220a0 29 7b 0a 20 20 20 20 20 20 20 20 65 52 65 74 20  ){.        eRet 
220b0 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  = WHERE_ORDERBY_
220c0 4d 49 4e 3b 0a 20 20 20 20 20 20 20 20 2a 70 70  MIN;.        *pp
220d0 4d 69 6e 4d 61 78 20 3d 20 70 45 4c 69 73 74 3b  MinMax = pEList;
220e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
220f0 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
22100 7a 46 75 6e 63 2c 20 22 6d 61 78 22 29 3d 3d 30  zFunc, "max")==0
22110 20 29 7b 0a 20 20 20 20 20 20 20 20 65 52 65 74   ){.        eRet
22120 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59   = WHERE_ORDERBY
22130 5f 4d 41 58 3b 0a 20 20 20 20 20 20 20 20 2a 70  _MAX;.        *p
22140 70 4d 69 6e 4d 61 78 20 3d 20 70 45 4c 69 73 74  pMinMax = pEList
22150 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
22160 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 2a    }..  assert( *
22170 70 70 4d 69 6e 4d 61 78 3d 3d 30 20 7c 7c 20 28  ppMinMax==0 || (
22180 2a 70 70 4d 69 6e 4d 61 78 29 2d 3e 6e 45 78 70  *ppMinMax)->nExp
22190 72 3d 3d 31 20 29 3b 0a 20 20 72 65 74 75 72 6e  r==1 );.  return
221a0 20 65 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   eRet;.}../*.** 
221b0 54 68 65 20 73 65 6c 65 63 74 20 73 74 61 74 65  The select state
221c0 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73 20 74  ment passed as t
221d0 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
221e0 74 20 69 73 20 61 6e 20 61 67 67 72 65 67 61 74  t is an aggregat
221f0 65 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20  e query..** The 
22200 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
22210 69 73 20 74 68 65 20 61 73 73 6f 63 69 61 74 65  is the associate
22220 64 20 61 67 67 72 65 67 61 74 65 2d 69 6e 66 6f  d aggregate-info
22230 20 6f 62 6a 65 63 74 2e 20 54 68 69 73 20 0a 2a   object. This .*
22240 2a 20 66 75 6e 63 74 69 6f 6e 20 74 65 73 74 73  * function tests
22250 20 69 66 20 74 68 65 20 53 45 4c 45 43 54 20 69   if the SELECT i
22260 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a  s of the form:.*
22270 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f  *.**   SELECT co
22280 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c 74 62 6c  unt(*) FROM <tbl
22290 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61  >.**.** where ta
222a0 62 6c 65 20 69 73 20 61 20 64 61 74 61 62 61 73  ble is a databas
222b0 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20 73  e table, not a s
222c0 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 76 69 65  ub-select or vie
222d0 77 2e 20 49 66 20 74 68 65 20 71 75 65 72 79 0a  w. If the query.
222e0 2a 2a 20 64 6f 65 73 20 6d 61 74 63 68 20 74 68  ** does match th
222f0 69 73 20 70 61 74 74 65 72 6e 2c 20 74 68 65 6e  is pattern, then
22300 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
22310 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 72  e Table object r
22320 65 70 72 65 73 65 6e 74 69 6e 67 0a 2a 2a 20 3c  epresenting.** <
22330 74 62 6c 3e 20 69 73 20 72 65 74 75 72 6e 65 64  tbl> is returned
22340 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30 20 69  . Otherwise, 0 i
22350 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
22360 74 61 74 69 63 20 54 61 62 6c 65 20 2a 69 73 53  tatic Table *isS
22370 69 6d 70 6c 65 43 6f 75 6e 74 28 53 65 6c 65 63  impleCount(Selec
22380 74 20 2a 70 2c 20 41 67 67 49 6e 66 6f 20 2a 70  t *p, AggInfo *p
22390 41 67 67 49 6e 66 6f 29 7b 0a 20 20 54 61 62 6c  AggInfo){.  Tabl
223a0 65 20 2a 70 54 61 62 3b 0a 20 20 45 78 70 72 20  e *pTab;.  Expr 
223b0 2a 70 45 78 70 72 3b 0a 0a 20 20 61 73 73 65 72  *pExpr;..  asser
223c0 74 28 20 21 70 2d 3e 70 47 72 6f 75 70 42 79 20  t( !p->pGroupBy 
223d0 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 57 68  );..  if( p->pWh
223e0 65 72 65 20 7c 7c 20 70 2d 3e 70 45 4c 69 73 74  ere || p->pEList
223f0 2d 3e 6e 45 78 70 72 21 3d 31 20 0a 20 20 20 7c  ->nExpr!=1 .   |
22400 7c 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 21  | p->pSrc->nSrc!
22410 3d 31 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 61  =1 || p->pSrc->a
22420 5b 30 5d 2e 70 53 65 6c 65 63 74 0a 20 20 29 7b  [0].pSelect.  ){
22430 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
22440 20 7d 0a 20 20 70 54 61 62 20 3d 20 70 2d 3e 70   }.  pTab = p->p
22450 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a  Src->a[0].pTab;.
22460 20 20 70 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c    pExpr = p->pEL
22470 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
22480 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 20  .  assert( pTab 
22490 26 26 20 21 70 54 61 62 2d 3e 70 53 65 6c 65 63  && !pTab->pSelec
224a0 74 20 26 26 20 70 45 78 70 72 20 29 3b 0a 0a 20  t && pExpr );.. 
224b0 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
224c0 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b  Tab) ) return 0;
224d0 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
224e0 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  !=TK_AGG_FUNCTIO
224f0 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  N ) return 0;.  
22500 69 66 28 20 4e 45 56 45 52 28 70 41 67 67 49 6e  if( NEVER(pAggIn
22510 66 6f 2d 3e 6e 46 75 6e 63 3d 3d 30 29 20 29 20  fo->nFunc==0) ) 
22520 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
22530 28 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63  (pAggInfo->aFunc
22540 5b 30 5d 2e 70 46 75 6e 63 2d 3e 66 75 6e 63 46  [0].pFunc->funcF
22550 6c 61 67 73 26 53 51 4c 49 54 45 5f 46 55 4e 43  lags&SQLITE_FUNC
22560 5f 43 4f 55 4e 54 29 3d 3d 30 20 29 20 72 65 74  _COUNT)==0 ) ret
22570 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78  urn 0;.  if( pEx
22580 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 44 69 73  pr->flags&EP_Dis
22590 74 69 6e 63 74 20 29 20 72 65 74 75 72 6e 20 30  tinct ) return 0
225a0 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62  ;..  return pTab
225b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  ;.}../*.** If th
225c0 65 20 73 6f 75 72 63 65 2d 6c 69 73 74 20 69 74  e source-list it
225d0 65 6d 20 70 61 73 73 65 64 20 61 73 20 61 6e 20  em passed as an 
225e0 61 72 67 75 6d 65 6e 74 20 77 61 73 20 61 75 67  argument was aug
225f0 6d 65 6e 74 65 64 20 77 69 74 68 20 61 6e 0a 2a  mented with an.*
22600 2a 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  * INDEXED BY cla
22610 75 73 65 2c 20 74 68 65 6e 20 74 72 79 20 74 6f  use, then try to
22620 20 6c 6f 63 61 74 65 20 74 68 65 20 73 70 65 63   locate the spec
22630 69 66 69 65 64 20 69 6e 64 65 78 2e 20 49 66 20  ified index. If 
22640 74 68 65 72 65 0a 2a 2a 20 77 61 73 20 73 75 63  there.** was suc
22650 68 20 61 20 63 6c 61 75 73 65 20 61 6e 64 20 74  h a clause and t
22660 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 63  he named index c
22670 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2c 20  annot be found, 
22680 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54  return .** SQLIT
22690 45 5f 45 52 52 4f 52 20 61 6e 64 20 6c 65 61 76  E_ERROR and leav
226a0 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50  e an error in pP
226b0 61 72 73 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  arse. Otherwise,
226c0 20 70 6f 70 75 6c 61 74 65 20 0a 2a 2a 20 70 46   populate .** pF
226d0 72 6f 6d 2d 3e 70 49 6e 64 65 78 20 61 6e 64 20  rom->pIndex and 
226e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
226f0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
22700 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28  IndexedByLookup(
22710 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 73  Parse *pParse, s
22720 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
22730 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66  em *pFrom){.  if
22740 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 26 26  ( pFrom->pTab &&
22750 20 70 46 72 6f 6d 2d 3e 7a 49 6e 64 65 78 20 29   pFrom->zIndex )
22760 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
22770 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b  b = pFrom->pTab;
22780 0a 20 20 20 20 63 68 61 72 20 2a 7a 49 6e 64 65  .    char *zInde
22790 78 20 3d 20 70 46 72 6f 6d 2d 3e 7a 49 6e 64 65  x = pFrom->zInde
227a0 78 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  x;.    Index *pI
227b0 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78  dx;.    for(pIdx
227c0 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 0a  =pTab->pIndex; .
227d0 20 20 20 20 20 20 20 20 70 49 64 78 20 26 26 20          pIdx && 
227e0 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
227f0 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 49 6e 64  Idx->zName, zInd
22800 65 78 29 3b 20 0a 20 20 20 20 20 20 20 20 70 49  ex); .        pI
22810 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 0a 20  dx=pIdx->pNext. 
22820 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70     );.    if( !p
22830 49 64 78 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Idx ){.      sql
22840 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
22850 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e  rse, "no such in
22860 64 65 78 3a 20 25 73 22 2c 20 7a 49 6e 64 65 78  dex: %s", zIndex
22870 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72  , 0);.      pPar
22880 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20  se->checkSchema 
22890 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 1;.      retur
228a0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
228b0 20 20 20 20 7d 0a 20 20 20 20 70 46 72 6f 6d 2d      }.    pFrom-
228c0 3e 70 49 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a  >pIndex = pIdx;.
228d0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
228e0 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20  ITE_OK;.}./*.** 
228f0 44 65 74 65 63 74 20 63 6f 6d 70 6f 75 6e 64 20  Detect compound 
22900 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
22910 73 20 74 68 61 74 20 75 73 65 20 61 6e 20 4f 52  s that use an OR
22920 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 77 69  DER BY clause wi
22930 74 68 20 0a 2a 2a 20 61 6e 20 61 6c 74 65 72 6e  th .** an altern
22940 61 74 69 76 65 20 63 6f 6c 6c 61 74 69 6e 67 20  ative collating 
22950 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20  sequence..**.** 
22960 20 20 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52     SELECT ... FR
22970 4f 4d 20 74 31 20 45 58 43 45 50 54 20 53 45 4c  OM t1 EXCEPT SEL
22980 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 32 20  ECT ... FROM t2 
22990 4f 52 44 45 52 20 42 59 20 2e 2e 20 43 4f 4c 4c  ORDER BY .. COLL
229a0 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68  ATE ....**.** Th
229b0 65 73 65 20 61 72 65 20 72 65 77 72 69 74 74 65  ese are rewritte
229c0 6e 20 61 73 20 61 20 73 75 62 71 75 65 72 79 3a  n as a subquery:
229d0 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54  .**.**    SELECT
229e0 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20   * FROM (SELECT 
229f0 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 45 58 43 45  ... FROM t1 EXCE
22a00 50 54 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52  PT SELECT ... FR
22a10 4f 4d 20 74 32 29 0a 2a 2a 20 20 20 20 20 4f 52  OM t2).**     OR
22a20 44 45 52 20 42 59 20 2e 2e 2e 20 43 4f 4c 4c 41  DER BY ... COLLA
22a30 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  TE ....**.** Thi
22a40 73 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e  s transformation
22a50 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65   is necessary be
22a60 63 61 75 73 65 20 74 68 65 20 6d 75 6c 74 69 53  cause the multiS
22a70 65 6c 65 63 74 4f 72 64 65 72 42 79 28 29 20 72  electOrderBy() r
22a80 6f 75 74 69 6e 65 0a 2a 2a 20 61 62 6f 76 65 20  outine.** above 
22a90 74 68 61 74 20 67 65 6e 65 72 61 74 65 73 20 74  that generates t
22aa0 68 65 20 63 6f 64 65 20 66 6f 72 20 61 20 63 6f  he code for a co
22ab0 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 77 69  mpound SELECT wi
22ac0 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  th an ORDER BY c
22ad0 6c 61 75 73 65 0a 2a 2a 20 75 73 65 73 20 61 20  lause.** uses a 
22ae0 6d 65 72 67 65 20 61 6c 67 6f 72 69 74 68 6d 20  merge algorithm 
22af0 74 68 61 74 20 72 65 71 75 69 72 65 73 20 74 68  that requires th
22b00 65 20 73 61 6d 65 20 63 6f 6c 6c 61 74 69 6e 67  e same collating
22b10 20 73 65 71 75 65 6e 63 65 20 6f 6e 20 74 68 65   sequence on the
22b20 0a 2a 2a 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  .** result colum
22b30 6e 73 20 61 73 20 6f 6e 20 74 68 65 20 4f 52 44  ns as on the ORD
22b40 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20 53  ER BY clause.  S
22b50 65 65 20 74 69 63 6b 65 74 0a 2a 2a 20 68 74 74  ee ticket.** htt
22b60 70 3a 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f  p://www.sqlite.o
22b70 72 67 2f 73 72 63 2f 69 6e 66 6f 2f 36 37 30 39  rg/src/info/6709
22b80 35 37 34 64 32 61 0a 2a 2a 0a 2a 2a 20 54 68 69  574d2a.**.** Thi
22b90 73 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e  s transformation
22ba0 20 69 73 20 6f 6e 6c 79 20 6e 65 65 64 65 64 20   is only needed 
22bb0 66 6f 72 20 45 58 43 45 50 54 2c 20 49 4e 54 45  for EXCEPT, INTE
22bc0 52 53 45 43 54 2c 20 61 6e 64 20 55 4e 49 4f 4e  RSECT, and UNION
22bd0 2e 0a 2a 2a 20 54 68 65 20 55 4e 49 4f 4e 20 41  ..** The UNION A
22be0 4c 4c 20 6f 70 65 72 61 74 6f 72 20 77 6f 72 6b  LL operator work
22bf0 73 20 66 69 6e 65 20 77 69 74 68 20 6d 75 6c 74  s fine with mult
22c00 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 29  iSelectOrderBy()
22c10 20 65 76 65 6e 20 77 68 65 6e 0a 2a 2a 20 74 68   even when.** th
22c20 65 72 65 20 61 72 65 20 43 4f 4c 4c 41 54 45 20  ere are COLLATE 
22c30 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44  terms in the ORD
22c40 45 52 20 42 59 2e 0a 2a 2f 0a 73 74 61 74 69 63  ER BY..*/.static
22c50 20 69 6e 74 20 63 6f 6e 76 65 72 74 43 6f 6d 70   int convertComp
22c60 6f 75 6e 64 53 65 6c 65 63 74 54 6f 53 75 62 71  oundSelectToSubq
22c70 75 65 72 79 28 57 61 6c 6b 65 72 20 2a 70 57 61  uery(Walker *pWa
22c80 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29  lker, Select *p)
22c90 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 65 6c  {.  int i;.  Sel
22ca0 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c  ect *pNew;.  Sel
22cb0 65 63 74 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74  ect *pX;.  sqlit
22cc0 65 33 20 2a 64 62 3b 0a 20 20 73 74 72 75 63 74  e3 *db;.  struct
22cd0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
22ce0 61 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4e  a;.  SrcList *pN
22cf0 65 77 53 72 63 3b 0a 20 20 50 61 72 73 65 20 2a  ewSrc;.  Parse *
22d00 70 50 61 72 73 65 3b 0a 20 20 54 6f 6b 65 6e 20  pParse;.  Token 
22d10 64 75 6d 6d 79 3b 0a 0a 20 20 69 66 28 20 70 2d  dummy;..  if( p-
22d20 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20 72 65 74  >pPrior==0 ) ret
22d30 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
22d40 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65  ;.  if( p->pOrde
22d50 72 42 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  rBy==0 ) return 
22d60 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
22d70 66 6f 72 28 70 58 3d 70 3b 20 70 58 20 26 26 20  for(pX=p; pX && 
22d80 28 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20  (pX->op==TK_ALL 
22d90 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  || pX->op==TK_SE
22da0 4c 45 43 54 29 3b 20 70 58 3d 70 58 2d 3e 70 50  LECT); pX=pX->pP
22db0 72 69 6f 72 29 7b 7d 0a 20 20 69 66 28 20 70 58  rior){}.  if( pX
22dc0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
22dd0 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 61 20 3d  _Continue;.  a =
22de0 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 3b   p->pOrderBy->a;
22df0 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 70 4f 72 64  .  for(i=p->pOrd
22e00 65 72 42 79 2d 3e 6e 45 78 70 72 2d 31 3b 20 69  erBy->nExpr-1; i
22e10 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69  >=0; i--){.    i
22e20 66 28 20 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 66  f( a[i].pExpr->f
22e30 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74  lags & EP_Collat
22e40 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  e ) break;.  }. 
22e50 20 69 66 28 20 69 3c 30 20 29 20 72 65 74 75 72   if( i<0 ) retur
22e60 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
22e70 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63  .  /* If we reac
22e80 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  h this point, th
22e90 61 74 20 6d 65 61 6e 73 20 74 68 65 20 74 72 61  at means the tra
22ea0 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72  nsformation is r
22eb0 65 71 75 69 72 65 64 2e 20 2a 2f 0a 0a 20 20 70  equired. */..  p
22ec0 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d  Parse = pWalker-
22ed0 3e 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20  >pParse;.  db = 
22ee0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 4e  pParse->db;.  pN
22ef0 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
22f00 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
22f10 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20  eof(*pNew) );.  
22f20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
22f30 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
22f40 20 20 6d 65 6d 73 65 74 28 26 64 75 6d 6d 79 2c    memset(&dummy,
22f50 20 30 2c 20 73 69 7a 65 6f 66 28 64 75 6d 6d 79   0, sizeof(dummy
22f60 29 29 3b 0a 20 20 70 4e 65 77 53 72 63 20 3d 20  ));.  pNewSrc = 
22f70 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
22f80 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28 70 50 61  pendFromTerm(pPa
22f90 72 73 65 2c 30 2c 30 2c 30 2c 26 64 75 6d 6d 79  rse,0,0,0,&dummy
22fa0 2c 70 4e 65 77 2c 30 2c 30 29 3b 0a 20 20 69 66  ,pNew,0,0);.  if
22fb0 28 20 70 4e 65 77 53 72 63 3d 3d 30 20 29 20 72  ( pNewSrc==0 ) r
22fc0 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
22fd0 0a 20 20 2a 70 4e 65 77 20 3d 20 2a 70 3b 0a 20  .  *pNew = *p;. 
22fe0 20 70 2d 3e 70 53 72 63 20 3d 20 70 4e 65 77 53   p->pSrc = pNewS
22ff0 72 63 3b 0a 20 20 70 2d 3e 70 45 4c 69 73 74 20  rc;.  p->pEList 
23000 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
23010 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
23020 30 2c 20 73 71 6c 69 74 65 33 45 78 70 72 28 64  0, sqlite3Expr(d
23030 62 2c 20 54 4b 5f 41 4c 4c 2c 20 30 29 29 3b 0a  b, TK_ALL, 0));.
23040 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c    p->op = TK_SEL
23050 45 43 54 3b 0a 20 20 70 2d 3e 70 57 68 65 72 65  ECT;.  p->pWhere
23060 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 47   = 0;.  pNew->pG
23070 72 6f 75 70 42 79 20 3d 20 30 3b 0a 20 20 70 4e  roupBy = 0;.  pN
23080 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 30 3b  ew->pHaving = 0;
23090 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42  .  pNew->pOrderB
230a0 79 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 50 72 69  y = 0;.  p->pPri
230b0 6f 72 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 4e 65  or = 0;.  p->pNe
230c0 78 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 73 65 6c  xt = 0;.  p->sel
230d0 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 43 6f 6d  Flags &= ~SF_Com
230e0 70 6f 75 6e 64 3b 0a 20 20 61 73 73 65 72 74 28  pound;.  assert(
230f0 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
23100 53 46 5f 43 6f 6e 76 65 72 74 65 64 29 3d 3d 30  SF_Converted)==0
23110 20 29 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67   );.  p->selFlag
23120 73 20 7c 3d 20 53 46 5f 43 6f 6e 76 65 72 74 65  s |= SF_Converte
23130 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65  d;.  assert( pNe
23140 77 2d 3e 70 50 72 69 6f 72 21 3d 30 20 29 3b 0a  w->pPrior!=0 );.
23150 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 2d 3e    pNew->pPrior->
23160 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20  pNext = pNew;.  
23170 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 30  pNew->pLimit = 0
23180 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65  ;.  pNew->pOffse
23190 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  t = 0;.  return 
231a0 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
231b0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
231c0 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 41  OMIT_CTE./*.** A
231d0 72 67 75 6d 65 6e 74 20 70 57 69 74 68 20 28 77  rgument pWith (w
231e0 68 69 63 68 20 6d 61 79 20 62 65 20 4e 55 4c 4c  hich may be NULL
231f0 29 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 6c 69  ) points to a li
23200 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6e 65 73  nked list of nes
23210 74 65 64 20 0a 2a 2a 20 57 49 54 48 20 63 6f 6e  ted .** WITH con
23220 74 65 78 74 73 2c 20 66 72 6f 6d 20 69 6e 6e 65  texts, from inne
23230 72 20 74 6f 20 6f 75 74 65 72 6d 6f 73 74 2e 20  r to outermost. 
23240 49 66 20 74 68 65 20 74 61 62 6c 65 20 69 64 65  If the table ide
23250 6e 74 69 66 69 65 64 20 62 79 20 0a 2a 2a 20 46  ntified by .** F
23260 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65  ROM clause eleme
23270 6e 74 20 70 49 74 65 6d 20 69 73 20 72 65 61 6c  nt pItem is real
23280 6c 79 20 61 20 63 6f 6d 6d 6f 6e 2d 74 61 62 6c  ly a common-tabl
23290 65 2d 65 78 70 72 65 73 73 69 6f 6e 20 28 43 54  e-expression (CT
232a0 45 29 20 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75  E) .** then retu
232b0 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
232c0 74 68 65 20 43 54 45 20 64 65 66 69 6e 69 74 69  the CTE definiti
232d0 6f 6e 20 66 6f 72 20 74 68 61 74 20 74 61 62 6c  on for that tabl
232e0 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20  e. Otherwise.** 
232f0 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a  return NULL..**.
23300 2a 2a 20 49 66 20 61 20 6e 6f 6e 2d 4e 55 4c 4c  ** If a non-NULL
23310 20 76 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e   value is return
23320 65 64 2c 20 73 65 74 20 2a 70 70 43 6f 6e 74 65  ed, set *ppConte
23330 78 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  xt to point to t
23340 68 65 20 57 69 74 68 0a 2a 2a 20 6f 62 6a 65 63  he With.** objec
23350 74 20 74 68 61 74 20 74 68 65 20 72 65 74 75 72  t that the retur
23360 6e 65 64 20 43 54 45 20 62 65 6c 6f 6e 67 73 20  ned CTE belongs 
23370 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74  to..*/.static st
23380 72 75 63 74 20 43 74 65 20 2a 73 65 61 72 63 68  ruct Cte *search
23390 57 69 74 68 28 0a 20 20 57 69 74 68 20 2a 70 57  With(.  With *pW
233a0 69 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  ith,            
233b0 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
233c0 6e 74 20 6f 75 74 65 72 6d 6f 73 74 20 57 49 54  nt outermost WIT
233d0 48 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74  H clause */.  st
233e0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
233f0 6d 20 2a 70 49 74 65 6d 2c 20 20 20 20 20 2f 2a  m *pItem,     /*
23400 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65   FROM clause ele
23410 6d 65 6e 74 20 74 6f 20 72 65 73 6f 6c 76 65 20  ment to resolve 
23420 2a 2f 0a 20 20 57 69 74 68 20 2a 2a 70 70 43 6f  */.  With **ppCo
23430 6e 74 65 78 74 20 20 20 20 20 20 20 20 20 20 20  ntext           
23440 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 57 49 54       /* OUT: WIT
23450 48 20 63 6c 61 75 73 65 20 72 65 74 75 72 6e 20  H clause return 
23460 76 61 6c 75 65 20 62 65 6c 6f 6e 67 73 20 74 6f  value belongs to
23470 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63   */.){.  const c
23480 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66  har *zName;.  if
23490 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  ( pItem->zDataba
234a0 73 65 3d 3d 30 20 26 26 20 28 7a 4e 61 6d 65 20  se==0 && (zName 
234b0 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 21  = pItem->zName)!
234c0 3d 30 20 29 7b 0a 20 20 20 20 57 69 74 68 20 2a  =0 ){.    With *
234d0 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 57 69  p;.    for(p=pWi
234e0 74 68 3b 20 70 3b 20 70 3d 70 2d 3e 70 4f 75 74  th; p; p=p->pOut
234f0 65 72 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  er){.      int i
23500 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
23510 20 69 3c 70 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29   i<p->nCte; i++)
23520 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
23530 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 4e 61  lite3StrICmp(zNa
23540 6d 65 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  me, p->a[i].zNam
23550 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
23560 20 20 20 2a 70 70 43 6f 6e 74 65 78 74 20 3d 20     *ppContext = 
23570 70 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  p;.          ret
23580 75 72 6e 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20  urn &p->a[i];.  
23590 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
235a0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
235b0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20  rn 0;.}../* The 
235c0 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 6d  code generator m
235d0 61 69 6e 74 61 69 6e 73 20 61 20 73 74 61 63 6b  aintains a stack
235e0 20 6f 66 20 61 63 74 69 76 65 20 57 49 54 48 20   of active WITH 
235f0 63 6c 61 75 73 65 73 0a 2a 2a 20 77 69 74 68 20  clauses.** with 
23600 74 68 65 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 57  the inner-most W
23610 49 54 48 20 63 6c 61 75 73 65 20 62 65 69 6e 67  ITH clause being
23620 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74   at the top of t
23630 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  he stack..**.** 
23640 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70 75 73  This routine pus
23650 68 65 73 20 74 68 65 20 57 49 54 48 20 63 6c 61  hes the WITH cla
23660 75 73 65 20 70 61 73 73 65 64 20 61 73 20 74 68  use passed as th
23670 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
23680 74 0a 2a 2a 20 6f 6e 74 6f 20 74 68 65 20 74 6f  t.** onto the to
23690 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 20  p of the stack. 
236a0 49 66 20 61 72 67 75 6d 65 6e 74 20 62 46 72 65  If argument bFre
236b0 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  e is true, then 
236c0 74 68 69 73 0a 2a 2a 20 57 49 54 48 20 63 6c 61  this.** WITH cla
236d0 75 73 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  use will never b
236e0 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68  e popped from th
236f0 65 20 73 74 61 63 6b 2e 20 49 6e 20 74 68 69 73  e stack. In this
23700 20 63 61 73 65 20 69 74 0a 2a 2a 20 73 68 6f 75   case it.** shou
23710 6c 64 20 62 65 20 66 72 65 65 64 20 61 6c 6f 6e  ld be freed alon
23720 67 20 77 69 74 68 20 74 68 65 20 50 61 72 73 65  g with the Parse
23730 20 6f 62 6a 65 63 74 2e 20 49 6e 20 6f 74 68 65   object. In othe
23740 72 20 63 61 73 65 73 2c 20 77 68 65 6e 0a 2a 2a  r cases, when.**
23750 20 62 46 72 65 65 3d 3d 30 2c 20 74 68 65 20 57   bFree==0, the W
23760 69 74 68 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20  ith object will 
23770 62 65 20 66 72 65 65 64 20 61 6c 6f 6e 67 20 77  be freed along w
23780 69 74 68 20 74 68 65 20 53 45 4c 45 43 54 20 0a  ith the SELECT .
23790 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 69 74  ** statement wit
237a0 68 20 77 68 69 63 68 20 69 74 20 69 73 20 61 73  h which it is as
237b0 73 6f 63 69 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69  sociated..*/.voi
237c0 64 20 73 71 6c 69 74 65 33 57 69 74 68 50 75 73  d sqlite3WithPus
237d0 68 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  h(Parse *pParse,
237e0 20 57 69 74 68 20 2a 70 57 69 74 68 2c 20 75 38   With *pWith, u8
237f0 20 62 46 72 65 65 29 7b 0a 20 20 61 73 73 65 72   bFree){.  asser
23800 74 28 20 62 46 72 65 65 3d 3d 30 20 7c 7c 20 70  t( bFree==0 || p
23810 50 61 72 73 65 2d 3e 70 57 69 74 68 3d 3d 30 20  Parse->pWith==0 
23820 29 3b 0a 20 20 69 66 28 20 70 57 69 74 68 20 29  );.  if( pWith )
23830 7b 0a 20 20 20 20 70 57 69 74 68 2d 3e 70 4f 75  {.    pWith->pOu
23840 74 65 72 20 3d 20 70 50 61 72 73 65 2d 3e 70 57  ter = pParse->pW
23850 69 74 68 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  ith;.    pParse-
23860 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68 3b 0a  >pWith = pWith;.
23870 20 20 20 20 70 50 61 72 73 65 2d 3e 62 46 72 65      pParse->bFre
23880 65 57 69 74 68 20 3d 20 62 46 72 65 65 3b 0a 20  eWith = bFree;. 
23890 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
238a0 20 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73   function checks
238b0 20 69 66 20 61 72 67 75 6d 65 6e 74 20 70 46 72   if argument pFr
238c0 6f 6d 20 72 65 66 65 72 73 20 74 6f 20 61 20 43  om refers to a C
238d0 54 45 20 64 65 63 6c 61 72 65 64 20 62 79 20 0a  TE declared by .
238e0 2a 2a 20 61 20 57 49 54 48 20 63 6c 61 75 73 65  ** a WITH clause
238f0 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 20 63 75   on the stack cu
23900 72 72 65 6e 74 6c 79 20 6d 61 69 6e 74 61 69 6e  rrently maintain
23910 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
23920 2e 20 41 6e 64 2c 0a 2a 2a 20 69 66 20 63 75 72  . And,.** if cur
23930 72 65 6e 74 6c 79 20 70 72 6f 63 65 73 73 69 6e  rently processin
23940 67 20 61 20 43 54 45 20 65 78 70 72 65 73 73 69  g a CTE expressi
23950 6f 6e 2c 20 69 66 20 69 74 20 69 73 20 61 20 72  on, if it is a r
23960 65 63 75 72 73 69 76 65 0a 2a 2a 20 72 65 66 65  ecursive.** refe
23970 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63 75 72  rence to the cur
23980 72 65 6e 74 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20  rent CTE..**.** 
23990 49 66 20 70 46 72 6f 6d 20 66 61 6c 6c 73 20 69  If pFrom falls i
239a0 6e 74 6f 20 65 69 74 68 65 72 20 6f 66 20 74 68  nto either of th
239b0 65 20 74 77 6f 20 63 61 74 65 67 6f 72 69 65 73  e two categories
239c0 20 61 62 6f 76 65 2c 20 70 46 72 6f 6d 2d 3e 70   above, pFrom->p
239d0 54 61 62 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72  Tab.** and other
239e0 20 66 69 65 6c 64 73 20 61 72 65 20 70 6f 70 75   fields are popu
239f0 6c 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c  lated accordingl
23a00 79 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 73 68  y. The caller sh
23a10 6f 75 6c 64 20 63 68 65 63 6b 0a 2a 2a 20 28 70  ould check.** (p
23a20 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 29 20 74  From->pTab!=0) t
23a30 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74  o determine whet
23a40 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 73 75 63  her or not a suc
23a50 63 65 73 73 66 75 6c 20 6d 61 74 63 68 0a 2a 2a  cessful match.**
23a60 20 77 61 73 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a   was found..**.*
23a70 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  * Whether or not
23a80 20 61 20 6d 61 74 63 68 20 69 73 20 66 6f 75 6e   a match is foun
23a90 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  d, SQLITE_OK is 
23aa0 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65  returned if no e
23ab0 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 2e 20  rror.** occurs. 
23ac0 49 66 20 61 6e 20 65 72 72 6f 72 20 64 6f 65 73  If an error does
23ad0 20 6f 63 63 75 72 2c 20 61 6e 20 65 72 72 6f 72   occur, an error
23ae0 20 6d 65 73 73 61 67 65 20 69 73 20 73 74 6f 72   message is stor
23af0 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 70 61 72  ed in the.** par
23b00 73 65 72 20 61 6e 64 20 73 6f 6d 65 20 65 72 72  ser and some err
23b10 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 20 74 68  or code other th
23b20 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  an SQLITE_OK ret
23b30 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
23b40 20 69 6e 74 20 77 69 74 68 45 78 70 61 6e 64 28   int withExpand(
23b50 0a 20 20 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  .  Walker *pWalk
23b60 65 72 2c 20 0a 20 20 73 74 72 75 63 74 20 53 72  er, .  struct Sr
23b70 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f  cList_item *pFro
23b80 6d 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  m.){.  Parse *pP
23b90 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  arse = pWalker->
23ba0 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65  pParse;.  sqlite
23bb0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
23bc0 64 62 3b 0a 20 20 73 74 72 75 63 74 20 43 74 65  db;.  struct Cte
23bd0 20 2a 70 43 74 65 3b 20 20 20 20 20 20 20 20 20   *pCte;         
23be0 20 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 65 64        /* Matched
23bf0 20 43 54 45 20 28 6f 72 20 4e 55 4c 4c 20 69 66   CTE (or NULL if
23c00 20 6e 6f 20 6d 61 74 63 68 29 20 2a 2f 0a 20 20   no match) */.  
23c10 57 69 74 68 20 2a 70 57 69 74 68 3b 20 20 20 20  With *pWith;    
23c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c30 2f 2a 20 57 49 54 48 20 63 6c 61 75 73 65 20 74  /* WITH clause t
23c40 68 61 74 20 70 43 74 65 20 62 65 6c 6f 6e 67 73  hat pCte belongs
23c50 20 74 6f 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74   to */..  assert
23c60 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30  ( pFrom->pTab==0
23c70 20 29 3b 0a 0a 20 20 70 43 74 65 20 3d 20 73 65   );..  pCte = se
23c80 61 72 63 68 57 69 74 68 28 70 50 61 72 73 65 2d  archWith(pParse-
23c90 3e 70 57 69 74 68 2c 20 70 46 72 6f 6d 2c 20 26  >pWith, pFrom, &
23ca0 70 57 69 74 68 29 3b 0a 20 20 69 66 28 20 70 43  pWith);.  if( pC
23cb0 74 65 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  te ){.    Table 
23cc0 2a 70 54 61 62 3b 0a 20 20 20 20 45 78 70 72 4c  *pTab;.    ExprL
23cd0 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20  ist *pEList;.   
23ce0 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 20   Select *pSel;. 
23cf0 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 65 66 74     Select *pLeft
23d00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
23d10 20 2f 2a 20 4c 65 66 74 2d 6d 6f 73 74 20 53 45   /* Left-most SE
23d20 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
23d30 2f 0a 20 20 20 20 69 6e 74 20 62 4d 61 79 52 65  /.    int bMayRe
23d40 63 75 72 73 69 76 65 3b 20 20 20 20 20 20 20 20  cursive;        
23d50 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63      /* True if c
23d60 6f 6d 70 6f 75 6e 64 20 6a 6f 69 6e 65 64 20 62  ompound joined b
23d70 79 20 55 4e 49 4f 4e 20 5b 41 4c 4c 5d 20 2a 2f  y UNION [ALL] */
23d80 0a 20 20 20 20 57 69 74 68 20 2a 70 53 61 76 65  .    With *pSave
23d90 64 57 69 74 68 3b 20 20 20 20 20 20 20 20 20 20  dWith;          
23da0 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 76 61     /* Initial va
23db0 6c 75 65 20 6f 66 20 70 50 61 72 73 65 2d 3e 70  lue of pParse->p
23dc0 57 69 74 68 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  With */..    /* 
23dd0 49 66 20 70 43 74 65 2d 3e 7a 45 72 72 20 69 73  If pCte->zErr is
23de0 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 74 20 74 68 69   non-NULL at thi
23df0 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 74 68  s point, then th
23e00 69 73 20 69 73 20 61 6e 20 69 6c 6c 65 67 61 6c  is is an illegal
23e10 0a 20 20 20 20 2a 2a 20 72 65 63 75 72 73 69 76  .    ** recursiv
23e20 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 43  e reference to C
23e30 54 45 20 70 43 74 65 2e 20 4c 65 61 76 65 20 61  TE pCte. Leave a
23e40 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73  n error in pPars
23e50 65 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 20  e and return.   
23e60 20 2a 2a 20 65 61 72 6c 79 2e 20 49 66 20 70 43   ** early. If pC
23e70 74 65 2d 3e 7a 45 72 72 20 69 73 20 4e 55 4c 4c  te->zErr is NULL
23e80 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 6e  , then this is n
23e90 6f 74 20 61 20 72 65 63 75 72 73 69 76 65 20 72  ot a recursive r
23ea0 65 66 65 72 65 6e 63 65 2e 0a 20 20 20 20 2a 2a  eference..    **
23eb0 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 70   In this case, p
23ec0 72 6f 63 65 65 64 2e 20 20 2a 2f 0a 20 20 20 20  roceed.  */.    
23ed0 69 66 28 20 70 43 74 65 2d 3e 7a 45 72 72 20 29  if( pCte->zErr )
23ee0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
23ef0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
23f00 70 43 74 65 2d 3e 7a 45 72 72 2c 20 70 43 74 65  pCte->zErr, pCte
23f10 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
23f20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
23f30 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
23f40 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
23f50 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 70 46  Tab==0 );.    pF
23f60 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62  rom->pTab = pTab
23f70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
23f80 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
23f90 66 28 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 69  f(Table));.    i
23fa0 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74  f( pTab==0 ) ret
23fb0 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
23fc0 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20     pTab->nRef = 
23fd0 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61  1;.    pTab->zNa
23fe0 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
23ff0 72 44 75 70 28 64 62 2c 20 70 43 74 65 2d 3e 7a  rDup(db, pCte->z
24000 4e 61 6d 65 29 3b 0a 20 20 20 20 70 54 61 62 2d  Name);.    pTab-
24010 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20  >iPKey = -1;.   
24020 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73   pTab->nRowLogEs
24030 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28  t = 200; assert(
24040 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67   200==sqlite3Log
24050 45 73 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a  Est(1048576) );.
24060 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61      pTab->tabFla
24070 67 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65 72  gs |= TF_Ephemer
24080 61 6c 3b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70  al;.    pFrom->p
24090 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
240a0 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 43  SelectDup(db, pC
240b0 74 65 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b  te->pSelect, 0);
240c0 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
240d0 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
240e0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
240f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72  .    assert( pFr
24100 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a 0a  om->pSelect );..
24110 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20      /* Check if 
24120 74 68 69 73 20 69 73 20 61 20 72 65 63 75 72 73  this is a recurs
24130 69 76 65 20 43 54 45 2e 20 2a 2f 0a 20 20 20 20  ive CTE. */.    
24140 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53  pSel = pFrom->pS
24150 65 6c 65 63 74 3b 0a 20 20 20 20 62 4d 61 79 52  elect;.    bMayR
24160 65 63 75 72 73 69 76 65 20 3d 20 28 20 70 53 65  ecursive = ( pSe
24170 6c 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c  l->op==TK_ALL ||
24180 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e   pSel->op==TK_UN
24190 49 4f 4e 20 29 3b 0a 20 20 20 20 69 66 28 20 62  ION );.    if( b
241a0 4d 61 79 52 65 63 75 72 73 69 76 65 20 29 7b 0a  MayRecursive ){.
241b0 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
241c0 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63     SrcList *pSrc
241d0 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63   = pFrom->pSelec
241e0 74 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 66  t->pSrc;.      f
241f0 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e  or(i=0; i<pSrc->
24200 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
24210 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
24220 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
24230 20 26 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20   &pSrc->a[i];.  
24240 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
24250 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30 20 0a 20  >zDatabase==0 . 
24260 20 20 20 20 20 20 20 20 26 26 20 70 49 74 65 6d          && pItem
24270 2d 3e 7a 4e 61 6d 65 21 3d 30 20 0a 20 20 20 20  ->zName!=0 .    
24280 20 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69 74       && 0==sqlit
24290 65 33 53 74 72 49 43 6d 70 28 70 49 74 65 6d 2d  e3StrICmp(pItem-
242a0 3e 7a 4e 61 6d 65 2c 20 70 43 74 65 2d 3e 7a 4e  >zName, pCte->zN
242b0 61 6d 65 29 0a 20 20 20 20 20 20 20 20 20 20 29  ame).          )
242c0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65  {.          pIte
242d0 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 3b 0a  m->pTab = pTab;.
242e0 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
242f0 3e 69 73 52 65 63 75 72 73 69 76 65 20 3d 20 31  >isRecursive = 1
24300 3b 0a 20 20 20 20 20 20 20 20 20 20 70 54 61 62  ;.          pTab
24310 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20  ->nRef++;.      
24320 20 20 20 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61      pSel->selFla
24330 67 73 20 7c 3d 20 53 46 5f 52 65 63 75 72 73 69  gs |= SF_Recursi
24340 76 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ve;.        }.  
24350 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
24360 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 72 65 63   /* Only one rec
24370 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63 65  ursive reference
24380 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 2a   is permitted. *
24390 2f 20 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d  / .    if( pTab-
243a0 3e 6e 52 65 66 3e 32 20 29 7b 0a 20 20 20 20 20  >nRef>2 ){.     
243b0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
243c0 28 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72  (.          pPar
243d0 73 65 2c 20 22 6d 75 6c 74 69 70 6c 65 20 72 65  se, "multiple re
243e0 66 65 72 65 6e 63 65 73 20 74 6f 20 72 65 63 75  ferences to recu
243f0 72 73 69 76 65 20 74 61 62 6c 65 3a 20 25 73 22  rsive table: %s"
24400 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 0a 20 20  , pCte->zName.  
24410 20 20 20 20 29 3b 0a 20 20 20 20 20 20 72 65 74      );.      ret
24420 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
24430 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
24440 72 74 28 20 70 54 61 62 2d 3e 6e 52 65 66 3d 3d  rt( pTab->nRef==
24450 31 20 7c 7c 20 28 28 70 53 65 6c 2d 3e 73 65 6c  1 || ((pSel->sel
24460 46 6c 61 67 73 26 53 46 5f 52 65 63 75 72 73 69  Flags&SF_Recursi
24470 76 65 29 20 26 26 20 70 54 61 62 2d 3e 6e 52 65  ve) && pTab->nRe
24480 66 3d 3d 32 20 29 29 3b 0a 0a 20 20 20 20 70 43  f==2 ));..    pC
24490 74 65 2d 3e 7a 45 72 72 20 3d 20 22 63 69 72 63  te->zErr = "circ
244a0 75 6c 61 72 20 72 65 66 65 72 65 6e 63 65 3a 20  ular reference: 
244b0 25 73 22 3b 0a 20 20 20 20 70 53 61 76 65 64 57  %s";.    pSavedW
244c0 69 74 68 20 3d 20 70 50 61 72 73 65 2d 3e 70 57  ith = pParse->pW
244d0 69 74 68 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  ith;.    pParse-
244e0 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68 3b 0a  >pWith = pWith;.
244f0 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53      sqlite3WalkS
24500 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 62  elect(pWalker, b
24510 4d 61 79 52 65 63 75 72 73 69 76 65 20 3f 20 70  MayRecursive ? p
24520 53 65 6c 2d 3e 70 50 72 69 6f 72 20 3a 20 70 53  Sel->pPrior : pS
24530 65 6c 29 3b 0a 0a 20 20 20 20 66 6f 72 28 70 4c  el);..    for(pL
24540 65 66 74 3d 70 53 65 6c 3b 20 70 4c 65 66 74 2d  eft=pSel; pLeft-
24550 3e 70 50 72 69 6f 72 3b 20 70 4c 65 66 74 3d 70  >pPrior; pLeft=p
24560 4c 65 66 74 2d 3e 70 50 72 69 6f 72 29 3b 0a 20  Left->pPrior);. 
24570 20 20 20 70 45 4c 69 73 74 20 3d 20 70 4c 65 66     pEList = pLef
24580 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 69  t->pEList;.    i
24590 66 28 20 70 43 74 65 2d 3e 70 43 6f 6c 73 20 29  f( pCte->pCols )
245a0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 4c 69  {.      if( pELi
245b0 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45  st && pEList->nE
245c0 78 70 72 21 3d 70 43 74 65 2d 3e 70 43 6f 6c 73  xpr!=pCte->pCols
245d0 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->nExpr ){.     
245e0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
245f0 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c  sg(pParse, "tabl
24600 65 20 25 73 20 68 61 73 20 25 64 20 76 61 6c 75  e %s has %d valu
24610 65 73 20 66 6f 72 20 25 64 20 63 6f 6c 75 6d 6e  es for %d column
24620 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
24630 70 43 74 65 2d 3e 7a 4e 61 6d 65 2c 20 70 45 4c  pCte->zName, pEL
24640 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 43 74 65  ist->nExpr, pCte
24650 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78 70 72 0a 20  ->pCols->nExpr. 
24660 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
24670 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20    pParse->pWith 
24680 3d 20 70 53 61 76 65 64 57 69 74 68 3b 0a 20 20  = pSavedWith;.  
24690 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
246a0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
246b0 20 7d 0a 20 20 20 20 20 20 70 45 4c 69 73 74 20   }.      pEList 
246c0 3d 20 70 43 74 65 2d 3e 70 43 6f 6c 73 3b 0a 20  = pCte->pCols;. 
246d0 20 20 20 7d 0a 0a 20 20 20 20 73 65 6c 65 63 74     }..    select
246e0 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c  ColumnsFromExprL
246f0 69 73 74 28 70 50 61 72 73 65 2c 20 70 45 4c 69  ist(pParse, pELi
24700 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c  st, &pTab->nCol,
24710 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20   &pTab->aCol);. 
24720 20 20 20 69 66 28 20 62 4d 61 79 52 65 63 75 72     if( bMayRecur
24730 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 69 66  sive ){.      if
24740 28 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73  ( pSel->selFlags
24750 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 20   & SF_Recursive 
24760 29 7b 0a 20 20 20 20 20 20 20 20 70 43 74 65 2d  ){.        pCte-
24770 3e 7a 45 72 72 20 3d 20 22 6d 75 6c 74 69 70 6c  >zErr = "multipl
24780 65 20 72 65 63 75 72 73 69 76 65 20 72 65 66 65  e recursive refe
24790 72 65 6e 63 65 73 3a 20 25 73 22 3b 0a 20 20 20  rences: %s";.   
247a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
247b0 20 20 70 43 74 65 2d 3e 7a 45 72 72 20 3d 20 22    pCte->zErr = "
247c0 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65  recursive refere
247d0 6e 63 65 20 69 6e 20 61 20 73 75 62 71 75 65 72  nce in a subquer
247e0 79 3a 20 25 73 22 3b 0a 20 20 20 20 20 20 7d 0a  y: %s";.      }.
247f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c        sqlite3Wal
24800 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c  kSelect(pWalker,
24810 20 70 53 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20   pSel);.    }.  
24820 20 20 70 43 74 65 2d 3e 7a 45 72 72 20 3d 20 30    pCte->zErr = 0
24830 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57  ;.    pParse->pW
24840 69 74 68 20 3d 20 70 53 61 76 65 64 57 69 74 68  ith = pSavedWith
24850 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
24860 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
24870 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
24880 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a  ITE_OMIT_CTE./*.
24890 2a 2a 20 49 66 20 74 68 65 20 53 45 4c 45 43 54  ** If the SELECT
248a0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
248b0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 68  econd argument h
248c0 61 73 20 61 6e 20 61 73 73 6f 63 69 61 74 65 64  as an associated
248d0 20 57 49 54 48 20 0a 2a 2a 20 63 6c 61 75 73 65   WITH .** clause
248e0 2c 20 70 6f 70 20 69 74 20 66 72 6f 6d 20 74 68  , pop it from th
248f0 65 20 73 74 61 63 6b 20 73 74 6f 72 65 64 20 61  e stack stored a
24900 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 50 61  s part of the Pa
24910 72 73 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a  rse object..**.*
24920 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
24930 69 73 20 75 73 65 64 20 61 73 20 74 68 65 20 78  is used as the x
24940 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 28  SelectCallback2(
24950 29 20 63 61 6c 6c 62 61 63 6b 20 62 79 0a 2a 2a  ) callback by.**
24960 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
24970 70 61 6e 64 28 29 20 77 68 65 6e 20 77 61 6c 6b  pand() when walk
24980 69 6e 67 20 61 20 53 45 4c 45 43 54 20 74 72 65  ing a SELECT tre
24990 65 20 74 6f 20 72 65 73 6f 6c 76 65 20 74 61 62  e to resolve tab
249a0 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20 61 6e 64 20  le.** names and 
249b0 6f 74 68 65 72 20 46 52 4f 4d 20 63 6c 61 75 73  other FROM claus
249c0 65 20 65 6c 65 6d 65 6e 74 73 2e 20 0a 2a 2f 0a  e elements. .*/.
249d0 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65  static void sele
249e0 63 74 50 6f 70 57 69 74 68 28 57 61 6c 6b 65 72  ctPopWith(Walker
249f0 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63   *pWalker, Selec
24a00 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a  t *p){.  Parse *
24a10 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72  pParse = pWalker
24a20 2d 3e 70 50 61 72 73 65 3b 0a 20 20 57 69 74 68  ->pParse;.  With
24a30 20 2a 70 57 69 74 68 20 3d 20 66 69 6e 64 52 69   *pWith = findRi
24a40 67 68 74 6d 6f 73 74 28 70 29 2d 3e 70 57 69 74  ghtmost(p)->pWit
24a50 68 3b 0a 20 20 69 66 28 20 70 57 69 74 68 21 3d  h;.  if( pWith!=
24a60 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
24a70 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3d 3d   pParse->pWith==
24a80 70 57 69 74 68 20 29 3b 0a 20 20 20 20 70 50 61  pWith );.    pPa
24a90 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69  rse->pWith = pWi
24aa0 74 68 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 7d 0a  th->pOuter;.  }.
24ab0 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  }.#else.#define 
24ac0 73 65 6c 65 63 74 50 6f 70 57 69 74 68 20 30 0a  selectPopWith 0.
24ad0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
24ae0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
24af0 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20  Walker callback 
24b00 66 6f 72 20 22 65 78 70 61 6e 64 69 6e 67 22 20  for "expanding" 
24b10 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
24b20 6e 74 2e 0a 2a 2a 20 22 45 78 70 61 6e 64 69 6e  nt..** "Expandin
24b30 67 22 20 6d 65 61 6e 73 20 74 6f 20 64 6f 20 74  g" means to do t
24b40 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
24b50 0a 2a 2a 20 20 20 20 28 31 29 20 20 4d 61 6b 65  .**    (1)  Make
24b60 20 73 75 72 65 20 56 44 42 45 20 63 75 72 73 6f   sure VDBE curso
24b70 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62  r numbers have b
24b80 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20  een assigned to 
24b90 65 76 65 72 79 0a 2a 2a 20 20 20 20 20 20 20 20  every.**        
24ba0 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
24bb0 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  FROM clause..**.
24bc0 2a 2a 20 20 20 20 28 32 29 20 20 46 69 6c 6c 20  **    (2)  Fill 
24bd0 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74 2d  in the pTabList-
24be0 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64 73  >a[].pTab fields
24bf0 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20   in the SrcList 
24c00 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 20 20  that .**        
24c10 20 64 65 66 69 6e 65 73 20 46 52 4f 4d 20 63 6c   defines FROM cl
24c20 61 75 73 65 2e 20 20 57 68 65 6e 20 76 69 65 77  ause.  When view
24c30 73 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20  s appear in the 
24c40 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a 2a 20  FROM clause,.** 
24c50 20 20 20 20 20 20 20 20 66 69 6c 6c 20 70 54 61          fill pTa
24c60 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65  bList->a[].pSele
24c70 63 74 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f  ct with a copy o
24c80 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  f the SELECT sta
24c90 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20  tement.**       
24ca0 20 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74    that implement
24cb0 73 20 74 68 65 20 76 69 65 77 2e 20 20 41 20 63  s the view.  A c
24cc0 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20 74  opy is made of t
24cd0 68 65 20 76 69 65 77 27 73 20 53 45 4c 45 43 54  he view's SELECT
24ce0 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 74 61 74  .**         stat
24cf0 65 6d 65 6e 74 20 73 6f 20 74 68 61 74 20 77 65  ement so that we
24d00 20 63 61 6e 20 66 72 65 65 6c 79 20 6d 6f 64 69   can freely modi
24d10 66 79 20 6f 72 20 64 65 6c 65 74 65 20 74 68 61  fy or delete tha
24d20 74 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20  t statement.**  
24d30 20 20 20 20 20 20 20 77 69 74 68 6f 75 74 20 77         without w
24d40 6f 72 72 79 69 6e 67 20 61 62 6f 75 74 20 6d 65  orrying about me
24d50 73 73 69 6e 67 20 75 70 20 74 68 65 20 70 65 72  ssing up the per
24d60 73 69 73 74 65 6e 74 20 72 65 70 72 65 73 65 6e  sistent represen
24d70 74 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20  tation.**       
24d80 20 20 6f 66 20 74 68 65 20 76 69 65 77 2e 0a 2a    of the view..*
24d90 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20 41 64 64  *.**    (3)  Add
24da0 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 57 48   terms to the WH
24db0 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 61 63  ERE clause to ac
24dc0 63 6f 6d 6d 6f 64 61 74 65 20 74 68 65 20 4e 41  commodate the NA
24dd0 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a  TURAL keyword.**
24de0 20 20 20 20 20 20 20 20 20 6f 6e 20 6a 6f 69 6e           on join
24df0 73 20 61 6e 64 20 74 68 65 20 4f 4e 20 61 6e 64  s and the ON and
24e00 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66   USING clause of
24e10 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20   joins..**.**   
24e20 20 28 34 29 20 20 53 63 61 6e 20 74 68 65 20 6c   (4)  Scan the l
24e30 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ist of columns i
24e40 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
24e50 20 28 70 45 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e   (pEList) lookin
24e60 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 6f 72  g.**         for
24e70 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68   instances of th
24e80 65 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 20 6f  e "*" operator o
24e90 72 20 74 68 65 20 54 41 42 4c 45 2e 2a 20 6f 70  r the TABLE.* op
24ea0 65 72 61 74 6f 72 2e 0a 2a 2a 20 20 20 20 20 20  erator..**      
24eb0 20 20 20 49 66 20 66 6f 75 6e 64 2c 20 65 78 70     If found, exp
24ec0 61 6e 64 20 65 61 63 68 20 22 2a 22 20 74 6f 20  and each "*" to 
24ed0 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20  be every column 
24ee0 69 6e 20 65 76 65 72 79 20 74 61 62 6c 65 0a 2a  in every table.*
24ef0 2a 20 20 20 20 20 20 20 20 20 61 6e 64 20 54 41  *         and TA
24f00 42 4c 45 2e 2a 20 74 6f 20 62 65 20 65 76 65 72  BLE.* to be ever
24f10 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 54 41 42 4c  y column in TABL
24f20 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20  E..**.*/.static 
24f30 69 6e 74 20 73 65 6c 65 63 74 45 78 70 61 6e 64  int selectExpand
24f40 65 72 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  er(Walker *pWalk
24f50 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  er, Select *p){.
24f60 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
24f70 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73  = pWalker->pPars
24f80 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b  e;.  int i, j, k
24f90 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  ;.  SrcList *pTa
24fa0 62 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73  bList;.  ExprLis
24fb0 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73 74 72  t *pEList;.  str
24fc0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
24fd0 20 2a 70 46 72 6f 6d 3b 0a 20 20 73 71 6c 69 74   *pFrom;.  sqlit
24fe0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
24ff0 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 2c  >db;.  Expr *pE,
25000 20 2a 70 52 69 67 68 74 2c 20 2a 70 45 78 70 72   *pRight, *pExpr
25010 3b 0a 20 20 75 31 36 20 73 65 6c 46 6c 61 67 73  ;.  u16 selFlags
25020 20 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 3b 0a   = p->selFlags;.
25030 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c  .  p->selFlags |
25040 3d 20 53 46 5f 45 78 70 61 6e 64 65 64 3b 0a 20  = SF_Expanded;. 
25050 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
25060 61 69 6c 65 64 20 20 29 7b 0a 20 20 20 20 72 65  ailed  ){.    re
25070 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
25080 20 20 7d 0a 20 20 69 66 28 20 4e 45 56 45 52 28    }.  if( NEVER(
25090 70 2d 3e 70 53 72 63 3d 3d 30 29 20 7c 7c 20 28  p->pSrc==0) || (
250a0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 45 78  selFlags & SF_Ex
250b0 70 61 6e 64 65 64 29 21 3d 30 20 29 7b 0a 20 20  panded)!=0 ){.  
250c0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75    return WRC_Pru
250d0 6e 65 3b 0a 20 20 7d 0a 20 20 70 54 61 62 4c 69  ne;.  }.  pTabLi
250e0 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  st = p->pSrc;.  
250f0 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
25100 73 74 3b 0a 20 20 69 66 28 20 70 57 61 6c 6b 65  st;.  if( pWalke
25110 72 2d 3e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61  r->xSelectCallba
25120 63 6b 32 3d 3d 73 65 6c 65 63 74 50 6f 70 57 69  ck2==selectPopWi
25130 74 68 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  th ){.    sqlite
25140 33 57 69 74 68 50 75 73 68 28 70 50 61 72 73 65  3WithPush(pParse
25150 2c 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28  , findRightmost(
25160 70 29 2d 3e 70 57 69 74 68 2c 20 30 29 3b 0a 20  p)->pWith, 0);. 
25170 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
25180 72 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  re cursor number
25190 73 20 68 61 76 65 20 62 65 65 6e 20 61 73 73 69  s have been assi
251a0 67 6e 65 64 20 74 6f 20 61 6c 6c 20 65 6e 74 72  gned to all entr
251b0 69 65 73 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20  ies in.  ** the 
251c0 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
251d0 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
251e0 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ent..  */.  sqli
251f0 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e  te3SrcListAssign
25200 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20  Cursors(pParse, 
25210 70 54 61 62 4c 69 73 74 29 3b 0a 0a 20 20 2f 2a  pTabList);..  /*
25220 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72 79 20 74   Look up every t
25230 61 62 6c 65 20 6e 61 6d 65 64 20 69 6e 20 74 68  able named in th
25240 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
25250 20 74 68 65 20 73 65 6c 65 63 74 2e 20 20 49 66   the select.  If
25260 0a 20 20 2a 2a 20 61 6e 20 65 6e 74 72 79 20 6f  .  ** an entry o
25270 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
25280 65 20 69 73 20 61 20 73 75 62 71 75 65 72 79 20  e is a subquery 
25290 69 6e 73 74 65 61 64 20 6f 66 20 61 20 74 61 62  instead of a tab
252a0 6c 65 20 6f 72 20 76 69 65 77 2c 0a 20 20 2a 2a  le or view,.  **
252b0 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 74   then create a t
252c0 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 73  ransient table s
252d0 74 72 75 63 74 75 72 65 20 74 6f 20 64 65 73 63  tructure to desc
252e0 72 69 62 65 20 74 68 65 20 73 75 62 71 75 65 72  ribe the subquer
252f0 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  y..  */.  for(i=
25300 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73  0, pFrom=pTabLis
25310 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74  t->a; i<pTabList
25320 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72  ->nSrc; i++, pFr
25330 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65  om++){.    Table
25340 20 2a 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65   *pTab;.    asse
25350 72 74 28 20 70 46 72 6f 6d 2d 3e 69 73 52 65 63  rt( pFrom->isRec
25360 75 72 73 69 76 65 3d 3d 30 20 7c 7c 20 70 46 72  ursive==0 || pFr
25370 6f 6d 2d 3e 70 54 61 62 20 29 3b 0a 20 20 20 20  om->pTab );.    
25380 69 66 28 20 70 46 72 6f 6d 2d 3e 69 73 52 65 63  if( pFrom->isRec
25390 75 72 73 69 76 65 20 29 20 63 6f 6e 74 69 6e 75  ursive ) continu
253a0 65 3b 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d  e;.    if( pFrom
253b0 2d 3e 70 54 61 62 21 3d 30 20 29 7b 0a 20 20 20  ->pTab!=0 ){.   
253c0 20 20 20 2f 2a 20 54 68 69 73 20 73 74 61 74 65     /* This state
253d0 6d 65 6e 74 20 68 61 73 20 61 6c 72 65 61 64 79  ment has already
253e0 20 62 65 65 6e 20 70 72 65 70 61 72 65 64 2e 20   been prepared. 
253f0 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   There is no nee
25400 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 67 6f  d.      ** to go
25410 20 66 75 72 74 68 65 72 2e 20 2a 2f 0a 20 20 20   further. */.   
25420 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d 30 20     assert( i==0 
25430 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
25440 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20 20  E_OMIT_CTE.     
25450 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68 28 70   selectPopWith(p
25460 57 61 6c 6b 65 72 2c 20 70 29 3b 0a 23 65 6e 64  Walker, p);.#end
25470 69 66 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  if.      return 
25480 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d  WRC_Prune;.    }
25490 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
254a0 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20 69 66 28  OMIT_CTE.    if(
254b0 20 77 69 74 68 45 78 70 61 6e 64 28 70 57 61 6c   withExpand(pWal
254c0 6b 65 72 2c 20 70 46 72 6f 6d 29 20 29 20 72 65  ker, pFrom) ) re
254d0 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
254e0 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70      if( pFrom->p
254f0 54 61 62 20 29 20 7b 7d 20 65 6c 73 65 0a 23 65  Tab ) {} else.#e
25500 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 46 72  ndif.    if( pFr
25510 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a  om->zName==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 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
25540 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 20     Select *pSel 
25550 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  = pFrom->pSelect
25560 3b 0a 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62  ;.      /* A sub
25570 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20 46 52  -query in the FR
25580 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53  OM clause of a S
25590 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 61  ELECT */.      a
255a0 73 73 65 72 74 28 20 70 53 65 6c 21 3d 30 20 29  ssert( pSel!=0 )
255b0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
255c0 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29  pFrom->pTab==0 )
255d0 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
255e0 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57  te3WalkSelect(pW
255f0 61 6c 6b 65 72 2c 20 70 53 65 6c 29 20 29 20 72  alker, pSel) ) r
25600 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
25610 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54  .      pFrom->pT
25620 61 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69  ab = pTab = sqli
25630 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
25640 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65  db, sizeof(Table
25650 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  ));.      if( pT
25660 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57  ab==0 ) return W
25670 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  RC_Abort;.      
25680 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a  pTab->nRef = 1;.
25690 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d        pTab->zNam
256a0 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
256b0 74 66 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 73  tf(db, "sqlite_s
256c0 71 5f 25 70 22 2c 20 28 76 6f 69 64 2a 29 70 54  q_%p", (void*)pT
256d0 61 62 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  ab);.      while
256e0 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29  ( pSel->pPrior )
256f0 7b 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70  { pSel = pSel->p
25700 50 72 69 6f 72 3b 20 7d 0a 20 20 20 20 20 20 73  Prior; }.      s
25710 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d  electColumnsFrom
25720 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
25730 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 2c 20 26   pSel->pEList, &
25740 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61  pTab->nCol, &pTa
25750 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 20 20  b->aCol);.      
25760 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31  pTab->iPKey = -1
25770 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52  ;.      pTab->nR
25780 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20  owLogEst = 200; 
25790 61 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c  assert( 200==sql
257a0 69 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35  ite3LogEst(10485
257b0 37 36 29 20 29 3b 0a 20 20 20 20 20 20 70 54 61  76) );.      pTa
257c0 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54  b->tabFlags |= T
257d0 46 5f 45 70 68 65 6d 65 72 61 6c 3b 0a 23 65 6e  F_Ephemeral;.#en
257e0 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  dif.    }else{. 
257f0 20 20 20 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e       /* An ordin
25800 61 72 79 20 74 61 62 6c 65 20 6f 72 20 76 69 65  ary table or vie
25810 77 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 46 52  w name in the FR
25820 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  OM clause */.   
25830 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
25840 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20  ->pTab==0 );.   
25850 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d     pFrom->pTab =
25860 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c   pTab = sqlite3L
25870 6f 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28 70  ocateTableItem(p
25880 50 61 72 73 65 2c 20 30 2c 20 70 46 72 6f 6d 29  Parse, 0, pFrom)
25890 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ;.      if( pTab
258a0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
258b0 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 69 66  _Abort;.      if
258c0 28 20 70 54 61 62 2d 3e 6e 52 65 66 3d 3d 30 78  ( pTab->nRef==0x
258d0 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20  ffff ){.        
258e0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
258f0 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e  pParse, "too man
25900 79 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  y references to 
25910 5c 22 25 73 5c 22 3a 20 6d 61 78 20 36 35 35 33  \"%s\": max 6553
25920 35 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  5",.           p
25930 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
25940 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62       pFrom->pTab
25950 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65   = 0;.        re
25960 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
25970 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54        }.      pT
25980 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 23 69 66 20  ab->nRef++;.#if 
25990 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
259a0 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64  OMIT_VIEW) || !d
259b0 65 66 69 6e 65 64 20 28 53 51 4c 49 54 45 5f 4f  efined (SQLITE_O
259c0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
259d0 29 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ).      if( pTab
259e0 2d 3e 70 53 65 6c 65 63 74 20 7c 7c 20 49 73 56  ->pSelect || IsV
259f0 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
25a00 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 72 65          /* We re
25a10 61 63 68 20 68 65 72 65 20 69 66 20 74 68 65 20  ach here if the 
25a20 6e 61 6d 65 64 20 74 61 62 6c 65 20 69 73 20 61  named table is a
25a30 20 72 65 61 6c 6c 79 20 61 20 76 69 65 77 20 2a   really a view *
25a40 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  /.        if( sq
25a50 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75  lite3ViewGetColu
25a60 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
25a70 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 57  pTab) ) return W
25a80 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  RC_Abort;.      
25a90 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
25aa0 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a 20  >pSelect==0 );. 
25ab0 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53         pFrom->pS
25ac0 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
25ad0 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 54 61  electDup(db, pTa
25ae0 62 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a  b->pSelect, 0);.
25af0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
25b00 65 6c 65 63 74 53 65 74 4e 61 6d 65 28 70 46 72  electSetName(pFr
25b10 6f 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 70 54 61  om->pSelect, pTa
25b20 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b->zName);.     
25b30 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65     sqlite3WalkSe
25b40 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 46  lect(pWalker, pF
25b50 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  rom->pSelect);. 
25b60 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
25b70 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 61    }..    /* Loca
25b80 74 65 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d  te the index nam
25b90 65 64 20 62 79 20 74 68 65 20 49 4e 44 45 58 45  ed by the INDEXE
25ba0 44 20 42 59 20 63 6c 61 75 73 65 2c 20 69 66 20  D BY clause, if 
25bb0 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  any. */.    if( 
25bc0 73 71 6c 69 74 65 33 49 6e 64 65 78 65 64 42 79  sqlite3IndexedBy
25bd0 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70  Lookup(pParse, p
25be0 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20 20 20 72  From) ){.      r
25bf0 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
25c00 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
25c10 20 50 72 6f 63 65 73 73 20 4e 41 54 55 52 41 4c   Process NATURAL
25c20 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e 64 20 4f   keywords, and O
25c30 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
25c40 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20  ses of joins..  
25c50 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  */.  if( db->mal
25c60 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 73 71 6c  locFailed || sql
25c70 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70  iteProcessJoin(p
25c80 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20  Parse, p) ){.   
25c90 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
25ca0 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72  t;.  }..  /* For
25cb0 20 65 76 65 72 79 20 22 2a 22 20 74 68 61 74 20   every "*" that 
25cc0 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20 63 6f  occurs in the co
25cd0 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72  lumn list, inser
25ce0 74 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20  t the names of. 
25cf0 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20   ** all columns 
25d00 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20  in all tables.  
25d10 41 6e 64 20 66 6f 72 20 65 76 65 72 79 20 54 41  And for every TA
25d20 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74 68 65  BLE.* insert the
25d30 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61   names.  ** of a
25d40 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41  ll columns in TA
25d50 42 4c 45 2e 20 20 54 68 65 20 70 61 72 73 65 72  BLE.  The parser
25d60 20 69 6e 73 65 72 74 65 64 20 61 20 73 70 65 63   inserted a spec
25d70 69 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a 20  ial expression. 
25d80 20 2a 2a 20 77 69 74 68 20 74 68 65 20 54 4b 5f   ** with the TK_
25d90 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 66 6f 72  ALL operator for
25da0 20 65 61 63 68 20 22 2a 22 20 74 68 61 74 20 69   each "*" that i
25db0 74 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 63  t found in the c
25dc0 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a 20 20 2a 2a  olumn list..  **
25dd0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
25de0 6f 64 65 20 6a 75 73 74 20 68 61 73 20 74 6f 20  ode just has to 
25df0 6c 6f 63 61 74 65 20 74 68 65 20 54 4b 5f 41 4c  locate the TK_AL
25e00 4c 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 6e  L expressions an
25e10 64 20 65 78 70 61 6e 64 0a 20 20 2a 2a 20 65 61  d expand.  ** ea
25e20 63 68 20 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69  ch one to the li
25e30 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e  st of all column
25e40 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e  s in all tables.
25e50 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66  .  **.  ** The f
25e60 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63  irst loop just c
25e70 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20  hecks to see if 
25e80 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 22 2a  there are any "*
25e90 22 20 6f 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a  " operators.  **
25ea0 20 74 68 61 74 20 6e 65 65 64 20 65 78 70 61 6e   that need expan
25eb0 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ding..  */.  for
25ec0 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e  (k=0; k<pEList->
25ed0 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20  nExpr; k++){.   
25ee0 20 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b   pE = pEList->a[
25ef0 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  k].pExpr;.    if
25f00 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c  ( pE->op==TK_ALL
25f10 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 61 73   ) break;.    as
25f20 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b  sert( pE->op!=TK
25f30 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52 69 67  _DOT || pE->pRig
25f40 68 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ht!=0 );.    ass
25f50 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f  ert( pE->op!=TK_
25f60 44 4f 54 20 7c 7c 20 28 70 45 2d 3e 70 4c 65 66  DOT || (pE->pLef
25f70 74 21 3d 30 20 26 26 20 70 45 2d 3e 70 4c 65 66  t!=0 && pE->pLef
25f80 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 29 20 29 3b  t->op==TK_ID) );
25f90 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d  .    if( pE->op=
25fa0 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70  =TK_DOT && pE->p
25fb0 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c  Right->op==TK_AL
25fc0 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  L ) break;.  }. 
25fd0 20 69 66 28 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e   if( k<pEList->n
25fe0 45 78 70 72 20 29 7b 0a 20 20 20 20 2f 2a 0a 20  Expr ){.    /*. 
25ff0 20 20 20 2a 2a 20 49 66 20 77 65 20 67 65 74 20     ** If we get 
26000 68 65 72 65 20 69 74 20 6d 65 61 6e 73 20 74 68  here it means th
26010 65 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6e  e result set con
26020 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72  tains one or mor
26030 65 20 22 2a 22 0a 20 20 20 20 2a 2a 20 6f 70 65  e "*".    ** ope
26040 72 61 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64  rators that need
26050 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e   to be expanded.
26060 20 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65    Loop through e
26070 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 0a 20  ach expression. 
26080 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73     ** in the res
26090 75 6c 74 20 73 65 74 20 61 6e 64 20 65 78 70 61  ult set and expa
260a0 6e 64 20 74 68 65 6d 20 6f 6e 65 20 62 79 20 6f  nd them one by o
260b0 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ne..    */.    s
260c0 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
260d0 74 65 6d 20 2a 61 20 3d 20 70 45 4c 69 73 74 2d  tem *a = pEList-
260e0 3e 61 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74  >a;.    ExprList
260f0 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20   *pNew = 0;.    
26100 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 50 61 72  int flags = pPar
26110 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 3b 0a 20  se->db->flags;. 
26120 20 20 20 69 6e 74 20 6c 6f 6e 67 4e 61 6d 65 73     int longNames
26130 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
26140 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29  TE_FullColNames)
26150 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  !=0.            
26160 20 20 20 20 20 20 20 20 20 20 26 26 20 28 66 6c            && (fl
26170 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f  ags & SQLITE_Sho
26180 72 74 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30 3b 0a  rtColNames)==0;.
26190 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 70 72 6f  .    /* When pro
261a0 63 65 73 73 69 6e 67 20 46 52 4f 4d 2d 63 6c 61  cessing FROM-cla
261b0 75 73 65 20 73 75 62 71 75 65 72 69 65 73 2c 20  use subqueries, 
261c0 69 74 20 69 73 20 61 6c 77 61 79 73 20 74 68 65  it is always the
261d0 20 63 61 73 65 0a 20 20 20 20 2a 2a 20 74 68 61   case.    ** tha
261e0 74 20 66 75 6c 6c 5f 63 6f 6c 75 6d 6e 5f 6e 61  t full_column_na
261f0 6d 65 73 3d 4f 46 46 20 61 6e 64 20 73 68 6f 72  mes=OFF and shor
26200 74 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 3d 4f  t_column_names=O
26210 4e 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 73  N.  The.    ** s
26220 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
26230 66 53 65 6c 65 63 74 28 29 20 72 6f 75 74 69 6e  fSelect() routin
26240 65 20 6d 61 6b 65 73 20 69 74 20 73 6f 2e 20 2a  e makes it so. *
26250 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  /.    assert( (p
26260 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
26270 4e 65 73 74 65 64 46 72 6f 6d 29 3d 3d 30 0a 20  NestedFrom)==0. 
26280 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28 66 6c           || ((fl
26290 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c  ags & SQLITE_Ful
262a0 6c 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30 20 26 26  lColNames)==0 &&
262b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  .              (
262c0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53  flags & SQLITE_S
262d0 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 21 3d 30  hortColNames)!=0
262e0 29 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28 6b 3d  ) );..    for(k=
262f0 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; k<pEList->nEx
26300 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; k++){.      
26310 70 45 20 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b  pE = a[k].pExpr;
26320 0a 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20  .      pRight = 
26330 70 45 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pE->pRight;.    
26340 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70    assert( pE->op
26350 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67  !=TK_DOT || pRig
26360 68 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ht!=0 );.      i
26370 66 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 4c  f( pE->op!=TK_AL
26380 4c 20 26 26 20 28 70 45 2d 3e 6f 70 21 3d 54 4b  L && (pE->op!=TK
26390 5f 44 4f 54 20 7c 7c 20 70 52 69 67 68 74 2d 3e  _DOT || pRight->
263a0 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20  op!=TK_ALL) ){. 
263b0 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 70         /* This p
263c0 61 72 74 69 63 75 6c 61 72 20 65 78 70 72 65 73  articular expres
263d0 73 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65  sion does not ne
263e0 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65  ed to be expande
263f0 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  d..        */.  
26400 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
26410 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
26420 6e 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c  nd(pParse, pNew,
26430 20 61 5b 6b 5d 2e 70 45 78 70 72 29 3b 0a 20 20   a[k].pExpr);.  
26440 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 29        if( pNew )
26450 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  {.          pNew
26460 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d  ->a[pNew->nExpr-
26470 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e  1].zName = a[k].
26480 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  zName;.         
26490 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e   pNew->a[pNew->n
264a0 45 78 70 72 2d 31 5d 2e 7a 53 70 61 6e 20 3d 20  Expr-1].zSpan = 
264b0 61 5b 6b 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20  a[k].zSpan;.    
264c0 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65        a[k].zName
264d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
264e0 61 5b 6b 5d 2e 7a 53 70 61 6e 20 3d 20 30 3b 0a  a[k].zSpan = 0;.
264f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26500 20 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30    a[k].pExpr = 0
26510 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
26520 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 65         /* This e
26530 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 22  xpression is a "
26540 2a 22 20 6f 72 20 61 20 22 54 41 42 4c 45 2e 2a  *" or a "TABLE.*
26550 22 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62  " and needs to b
26560 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70  e.        ** exp
26570 61 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  anded. */.      
26580 20 20 69 6e 74 20 74 61 62 6c 65 53 65 65 6e 20    int tableSeen 
26590 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 53 65 74  = 0;      /* Set
265a0 20 74 6f 20 31 20 77 68 65 6e 20 54 41 42 4c 45   to 1 when TABLE
265b0 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20 20 20   matches */.    
265c0 20 20 20 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65      char *zTName
265d0 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 74   = 0;       /* t
265e0 65 78 74 20 6f 66 20 6e 61 6d 65 20 6f 66 20 54  ext of name of T
265f0 41 42 4c 45 20 2a 2f 0a 20 20 20 20 20 20 20 20  ABLE */.        
26600 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44  if( pE->op==TK_D
26610 4f 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OT ){.          
26620 61 73 73 65 72 74 28 20 70 45 2d 3e 70 4c 65 66  assert( pE->pLef
26630 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t!=0 );.        
26640 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
26650 61 73 50 72 6f 70 65 72 74 79 28 70 45 2d 3e 70  asProperty(pE->p
26660 4c 65 66 74 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Left, EP_IntValu
26670 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e) );.          
26680 7a 54 4e 61 6d 65 20 3d 20 70 45 2d 3e 70 4c 65  zTName = pE->pLe
26690 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  ft->u.zToken;.  
266a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
266b0 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70  for(i=0, pFrom=p
266c0 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54  TabList->a; i<pT
266d0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
266e0 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20  +, pFrom++){.   
266f0 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54         Table *pT
26700 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ab = pFrom->pTab
26710 3b 0a 20 20 20 20 20 20 20 20 20 20 53 65 6c 65  ;.          Sele
26720 63 74 20 2a 70 53 75 62 20 3d 20 70 46 72 6f 6d  ct *pSub = pFrom
26730 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  ->pSelect;.     
26740 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 4e       char *zTabN
26750 61 6d 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c  ame = pFrom->zAl
26760 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20 20 63  ias;.          c
26770 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 63 68 65  onst char *zSche
26780 6d 61 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  maName = 0;.    
26790 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20        int iDb;. 
267a0 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 61           if( zTa
267b0 62 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  bName==0 ){.    
267c0 20 20 20 20 20 20 20 20 7a 54 61 62 4e 61 6d 65          zTabName
267d0 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a   = pTab->zName;.
267e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
267f0 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61        if( db->ma
26800 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 62 72 65  llocFailed ) bre
26810 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ak;.          if
26820 28 20 70 53 75 62 3d 3d 30 20 7c 7c 20 28 70 53  ( pSub==0 || (pS
26830 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ub->selFlags & S
26840 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29 3d 3d 30  F_NestedFrom)==0
26850 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
26860 70 53 75 62 20 3d 20 30 3b 0a 20 20 20 20 20 20  pSub = 0;.      
26870 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65        if( zTName
26880 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
26890 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a 54 61 62 4e  mp(zTName, zTabN
268a0 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ame)!=0 ){.     
268b0 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
268c0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
268d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 44 62  .            iDb
268e0 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
268f0 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62  ToIndex(db, pTab
26900 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
26910 20 20 20 20 20 20 20 20 7a 53 63 68 65 6d 61 4e          zSchemaN
26920 61 6d 65 20 3d 20 69 44 62 3e 3d 30 20 3f 20 64  ame = iDb>=0 ? d
26930 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
26940 65 20 3a 20 22 2a 22 3b 0a 20 20 20 20 20 20 20  e : "*";.       
26950 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66     }.          f
26960 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e  or(j=0; j<pTab->
26970 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nCol; j++){.    
26980 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
26990 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  ame = pTab->aCol
269a0 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [j].zName;.     
269b0 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f         char *zCo
269c0 6c 6e 61 6d 65 3b 20 20 2f 2a 20 54 68 65 20 63  lname;  /* The c
269d0 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e  omputed column n
269e0 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ame */.         
269f0 20 20 20 63 68 61 72 20 2a 7a 54 6f 46 72 65 65     char *zToFree
26a00 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65 64 20  ;   /* Malloced 
26a10 73 74 72 69 6e 67 20 74 68 61 74 20 6e 65 65 64  string that need
26a20 73 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f  s to be freed */
26a30 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 6f 6b  .            Tok
26a40 65 6e 20 73 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a  en sColname;  /*
26a50 20 43 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e   Computed column
26a60 20 6e 61 6d 65 20 61 73 20 61 20 74 6f 6b 65 6e   name as a token
26a70 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 20 20 20   */..           
26a80 20 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 20 29   assert( zName )
26a90 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
26aa0 28 20 7a 54 4e 61 6d 65 20 26 26 20 70 53 75 62  ( zTName && pSub
26ab0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
26ac0 20 73 71 6c 69 74 65 33 4d 61 74 63 68 53 70 61   sqlite3MatchSpa
26ad0 6e 4e 61 6d 65 28 70 53 75 62 2d 3e 70 45 4c 69  nName(pSub->pELi
26ae0 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 2c 20  st->a[j].zSpan, 
26af0 30 2c 20 7a 54 4e 61 6d 65 2c 20 30 29 3d 3d 30  0, zTName, 0)==0
26b00 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a  .            ){.
26b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
26b20 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
26b30 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20      }..         
26b40 20 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c 75 6d     /* If a colum
26b50 6e 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 27  n is marked as '
26b60 68 69 64 64 65 6e 27 20 28 63 75 72 72 65 6e 74  hidden' (current
26b70 6c 79 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65  ly only possible
26b80 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
26b90 66 6f 72 20 76 69 72 74 75 61 6c 20 74 61 62 6c  for virtual tabl
26ba0 65 73 29 2c 20 64 6f 20 6e 6f 74 20 69 6e 63 6c  es), do not incl
26bb0 75 64 65 20 69 74 20 69 6e 20 74 68 65 20 65 78  ude it in the ex
26bc0 70 61 6e 64 65 64 0a 20 20 20 20 20 20 20 20 20  panded.         
26bd0 20 20 20 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74     ** result-set
26be0 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 20 20 20   list..         
26bf0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
26c00 20 20 69 66 28 20 49 73 48 69 64 64 65 6e 43 6f    if( IsHiddenCo
26c10 6c 75 6d 6e 28 26 70 54 61 62 2d 3e 61 43 6f 6c  lumn(&pTab->aCol
26c20 5b 6a 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [j]) ){.        
26c30 20 20 20 20 20 20 61 73 73 65 72 74 28 49 73 56        assert(IsV
26c40 69 72 74 75 61 6c 28 70 54 61 62 29 29 3b 0a 20  irtual(pTab));. 
26c50 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
26c60 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
26c70 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
26c80 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 31 3b 0a   tableSeen = 1;.
26c90 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
26ca0 20 69 3e 30 20 26 26 20 7a 54 4e 61 6d 65 3d 3d   i>0 && zTName==
26cb0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
26cc0 20 20 20 69 66 28 20 28 70 46 72 6f 6d 2d 3e 6a     if( (pFrom->j
26cd0 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54  ointype & JT_NAT
26ce0 55 52 41 4c 29 21 3d 30 0a 20 20 20 20 20 20 20  URAL)!=0.       
26cf0 20 20 20 20 20 20 20 20 20 26 26 20 74 61 62 6c           && tabl
26d00 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28  eAndColumnIndex(
26d10 70 54 61 62 4c 69 73 74 2c 20 69 2c 20 7a 4e 61  pTabList, i, zNa
26d20 6d 65 2c 20 30 2c 20 30 29 0a 20 20 20 20 20 20  me, 0, 0).      
26d30 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
26d40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
26d50 20 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c   a NATURAL join,
26d60 20 6f 6d 69 74 20 74 68 65 20 6a 6f 69 6e 20 63   omit the join c
26d70 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20  olumns from the 
26d80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26d90 20 2a 2a 20 74 61 62 6c 65 20 74 6f 20 74 68 65   ** table to the
26da0 20 72 69 67 68 74 20 6f 66 20 74 68 65 20 6a 6f   right of the jo
26db0 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  in */.          
26dc0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
26dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
26de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
26df0 28 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49  ( sqlite3IdListI
26e00 6e 64 65 78 28 70 46 72 6f 6d 2d 3e 70 55 73 69  ndex(pFrom->pUsi
26e10 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b  ng, zName)>=0 ){
26e20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26e30 20 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69   /* In a join wi
26e40 74 68 20 61 20 55 53 49 4e 47 20 63 6c 61 75 73  th a USING claus
26e50 65 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20  e, omit columns 
26e60 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  in the.         
26e70 20 20 20 20 20 20 20 2a 2a 20 75 73 69 6e 67 20         ** using 
26e80 63 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20  clause from the 
26e90 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67  table on the rig
26ea0 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ht. */.         
26eb0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
26ec0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
26ed0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
26ee0 20 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68             pRigh
26ef0 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  t = sqlite3Expr(
26f00 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 4e 61 6d 65  db, TK_ID, zName
26f10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  );.            z
26f20 43 6f 6c 6e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b  Colname = zName;
26f30 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 6f  .            zTo
26f40 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Free = 0;.      
26f50 20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61        if( longNa
26f60 6d 65 73 20 7c 7c 20 70 54 61 62 4c 69 73 74 2d  mes || pTabList-
26f70 3e 6e 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20  >nSrc>1 ){.     
26f80 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
26f90 4c 65 66 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Left;.          
26fa0 20 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c 69      pLeft = sqli
26fb0 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49  te3Expr(db, TK_I
26fc0 44 2c 20 7a 54 61 62 4e 61 6d 65 29 3b 0a 20 20  D, zTabName);.  
26fd0 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
26fe0 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  r = sqlite3PExpr
26ff0 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c  (pParse, TK_DOT,
27000 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20   pLeft, pRight, 
27010 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
27020 20 20 69 66 28 20 7a 53 63 68 65 6d 61 4e 61 6d    if( zSchemaNam
27030 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
27040 20 20 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c       pLeft = sql
27050 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f  ite3Expr(db, TK_
27060 49 44 2c 20 7a 53 63 68 65 6d 61 4e 61 6d 65 29  ID, zSchemaName)
27070 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
27080 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65    pExpr = sqlite
27090 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
270a0 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 45  K_DOT, pLeft, pE
270b0 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  xpr, 0);.       
270c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
270d0 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e         if( longN
270e0 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20  ames ){.        
270f0 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65          zColname
27100 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
27110 66 28 64 62 2c 20 22 25 73 2e 25 73 22 2c 20 7a  f(db, "%s.%s", z
27120 54 61 62 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b  TabName, zName);
27130 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27140 20 7a 54 6f 46 72 65 65 20 3d 20 7a 43 6f 6c 6e   zToFree = zColn
27150 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ame;.           
27160 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
27170 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
27180 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 52        pExpr = pR
27190 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20  ight;.          
271a0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
271b0 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
271c0 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
271d0 72 73 65 2c 20 70 4e 65 77 2c 20 70 45 78 70 72  rse, pNew, pExpr
271e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
271f0 43 6f 6c 6e 61 6d 65 2e 7a 20 3d 20 7a 43 6f 6c  Colname.z = zCol
27200 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  name;.          
27210 20 20 73 43 6f 6c 6e 61 6d 65 2e 6e 20 3d 20 73    sColname.n = s
27220 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
27230 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  Colname);.      
27240 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
27250 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50 61  rListSetName(pPa
27260 72 73 65 2c 20 70 4e 65 77 2c 20 26 73 43 6f 6c  rse, pNew, &sCol
27270 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  name, 0);.      
27280 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 26        if( pNew &
27290 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  & (p->selFlags &
272a0 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29 21   SF_NestedFrom)!
272b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
272c0 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
272d0 69 73 74 5f 69 74 65 6d 20 2a 70 58 20 3d 20 26  ist_item *pX = &
272e0 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45  pNew->a[pNew->nE
272f0 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20  xpr-1];.        
27300 20 20 20 20 20 20 69 66 28 20 70 53 75 62 20 29        if( pSub )
27310 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
27320 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71    pX->zSpan = sq
27330 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
27340 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e  , pSub->pEList->
27350 61 5b 6a 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20  a[j].zSpan);.   
27360 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
27370 74 63 61 73 65 28 20 70 58 2d 3e 7a 53 70 61 6e  tcase( pX->zSpan
27380 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
27390 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
273a0 20 20 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e              pX->
273b0 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 4d  zSpan = sqlite3M
273c0 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25  Printf(db, "%s.%
273d0 73 2e 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20  s.%s",.         
273e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
273f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27400 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65 2c 20 7a    zSchemaName, z
27410 54 61 62 4e 61 6d 65 2c 20 7a 43 6f 6c 6e 61 6d  TabName, zColnam
27420 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
27430 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58      testcase( pX
27440 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a 20 20  ->zSpan==0 );.  
27450 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
27460 20 20 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e              pX->
27470 62 53 70 61 6e 49 73 54 61 62 20 3d 20 31 3b 0a  bSpanIsTab = 1;.
27480 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
27490 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
274a0 33 44 62 46 72 65 65 28 64 62 2c 20 7a 54 6f 46  3DbFree(db, zToF
274b0 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ree);.          
274c0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
274d0 20 20 20 20 69 66 28 20 21 74 61 62 6c 65 53 65      if( !tableSe
274e0 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  en ){.          
274f0 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b 0a 20 20  if( zTName ){.  
27500 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
27510 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
27520 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  , "no such table
27530 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a  : %s", zTName);.
27540 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
27550 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
27560 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
27570 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c 65 73 20  rse, "no tables 
27580 73 70 65 63 69 66 69 65 64 22 29 3b 0a 20 20 20  specified");.   
27590 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
275a0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
275b0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
275c0 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
275d0 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70  EList);.    p->p
275e0 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20  EList = pNew;.  
275f0 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  }.#if SQLITE_MAX
27600 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70 2d  _COLUMN.  if( p-
27610 3e 70 45 4c 69 73 74 20 26 26 20 70 2d 3e 70 45  >pEList && p->pE
27620 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e  List->nExpr>db->
27630 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
27640 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20  MIT_COLUMN] ){. 
27650 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
27660 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
27670 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  many columns in 
27680 72 65 73 75 6c 74 20 73 65 74 22 29 3b 0a 20 20  result set");.  
27690 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
276a0 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
276b0 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 72  }../*.** No-op r
276c0 6f 75 74 69 6e 65 20 66 6f 72 20 74 68 65 20 70  outine for the p
276d0 61 72 73 65 2d 74 72 65 65 20 77 61 6c 6b 65 72  arse-tree walker
276e0 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
276f0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65  s routine is the
27700 20 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c   Walker.xExprCal
27710 6c 62 61 63 6b 20 74 68 65 6e 20 65 78 70 72 65  lback then expre
27720 73 73 69 6f 6e 20 74 72 65 65 73 0a 2a 2a 20 61  ssion trees.** a
27730 72 65 20 77 61 6c 6b 65 64 20 77 69 74 68 6f 75  re walked withou
27740 74 20 61 6e 79 20 61 63 74 69 6f 6e 73 20 62 65  t any actions be
27750 69 6e 67 20 74 61 6b 65 6e 20 61 74 20 65 61 63  ing taken at eac
27760 68 20 6e 6f 64 65 2e 20 20 50 72 65 73 75 6d 61  h node.  Presuma
27770 62 6c 79 2c 0a 2a 2a 20 77 68 65 6e 20 74 68 69  bly,.** when thi
27780 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
27790 64 20 66 6f 72 20 57 61 6c 6b 65 72 2e 78 45 78  d for Walker.xEx
277a0 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20  prCallback then 
277b0 0a 2a 2a 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65  .** Walker.xSele
277c0 63 74 43 61 6c 6c 62 61 63 6b 20 69 73 20 73 65  ctCallback is se
277d0 74 20 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69 6e  t to do somethin
277e0 67 20 75 73 65 66 75 6c 20 66 6f 72 20 65 76 65  g useful for eve
277f0 72 79 20 0a 2a 2a 20 73 75 62 71 75 65 72 79 20  ry .** subquery 
27800 69 6e 20 74 68 65 20 70 61 72 73 65 72 20 74 72  in the parser tr
27810 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ee..*/.static in
27820 74 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 28 57  t exprWalkNoop(W
27830 61 6c 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20  alker *NotUsed, 
27840 45 78 70 72 20 2a 4e 6f 74 55 73 65 64 32 29 7b  Expr *NotUsed2){
27850 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
27860 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f  TER2(NotUsed, No
27870 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72  tUsed2);.  retur
27880 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
27890 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
278a0 75 74 69 6e 65 20 22 65 78 70 61 6e 64 73 22 20  utine "expands" 
278b0 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
278c0 6e 74 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74  nt and all of it
278d0 73 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a  s subqueries..**
278e0 20 46 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   For additional 
278f0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 77  information on w
27900 68 61 74 20 69 74 20 6d 65 61 6e 73 20 74 6f 20  hat it means to 
27910 22 65 78 70 61 6e 64 22 20 61 20 53 45 4c 45 43  "expand" a SELEC
27920 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2c 20  T.** statement, 
27930 73 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  see the comment 
27940 6f 6e 20 74 68 65 20 73 65 6c 65 63 74 45 78 70  on the selectExp
27950 61 6e 64 20 77 6f 72 6b 65 72 20 63 61 6c 6c 62  and worker callb
27960 61 63 6b 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a  ack above..**.**
27970 20 45 78 70 61 6e 64 69 6e 67 20 61 20 53 45 4c   Expanding a SEL
27980 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 73  ECT statement is
27990 20 74 68 65 20 66 69 72 73 74 20 73 74 65 70 20   the first step 
279a0 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 0a  in processing a.
279b0 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
279c0 65 6e 74 2e 20 20 54 68 65 20 53 45 4c 45 43 54  ent.  The SELECT
279d0 20 73 74 61 74 65 6d 65 6e 74 20 6d 75 73 74 20   statement must 
279e0 62 65 20 65 78 70 61 6e 64 65 64 20 62 65 66 6f  be expanded befo
279f0 72 65 0a 2a 2a 20 6e 61 6d 65 20 72 65 73 6f 6c  re.** name resol
27a00 75 74 69 6f 6e 20 69 73 20 70 65 72 66 6f 72 6d  ution is perform
27a10 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79  ed..**.** If any
27a20 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
27a30 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  , an error messa
27a40 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  ge is written in
27a50 74 6f 20 70 50 61 72 73 65 2e 0a 2a 2a 20 54 68  to pParse..** Th
27a60 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
27a70 6f 6e 20 63 61 6e 20 64 65 74 65 63 74 20 74 68  on can detect th
27a80 65 20 70 72 6f 62 6c 65 6d 20 62 79 20 6c 6f 6f  e problem by loo
27a90 6b 69 6e 67 20 61 74 20 70 50 61 72 73 65 2d 3e  king at pParse->
27aa0 6e 45 72 72 0a 2a 2a 20 61 6e 64 2f 6f 72 20 70  nErr.** and/or p
27ab0 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
27ac0 63 46 61 69 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74  cFailed..*/.stat
27ad0 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53  ic void sqlite3S
27ae0 65 6c 65 63 74 45 78 70 61 6e 64 28 50 61 72 73  electExpand(Pars
27af0 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
27b00 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 57  t *pSelect){.  W
27b10 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65  alker w;.  memse
27b20 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&w, 0, sizeof(
27b30 77 29 29 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  w));.  w.xExprCa
27b40 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 57 61 6c  llback = exprWal
27b50 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73  kNoop;.  w.pPars
27b60 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 69 66  e = pParse;.  if
27b70 28 20 70 50 61 72 73 65 2d 3e 68 61 73 43 6f 6d  ( pParse->hasCom
27b80 70 6f 75 6e 64 20 29 7b 0a 20 20 20 20 77 2e 78  pound ){.    w.x
27b90 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d  SelectCallback =
27ba0 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64   convertCompound
27bb0 53 65 6c 65 63 74 54 6f 53 75 62 71 75 65 72 79  SelectToSubquery
27bc0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c  ;.    sqlite3Wal
27bd0 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c  kSelect(&w, pSel
27be0 65 63 74 29 3b 0a 20 20 7d 0a 20 20 77 2e 78 53  ect);.  }.  w.xS
27bf0 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
27c00 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72 3b 0a  selectExpander;.
27c10 20 20 69 66 28 20 28 70 53 65 6c 65 63 74 2d 3e    if( (pSelect->
27c20 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 6c  selFlags & SF_Al
27c30 6c 56 61 6c 75 65 73 29 3d 3d 30 20 29 7b 0a 20  lValues)==0 ){. 
27c40 20 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c     w.xSelectCall
27c50 62 61 63 6b 32 20 3d 20 73 65 6c 65 63 74 50 6f  back2 = selectPo
27c60 70 57 69 74 68 3b 0a 20 20 7d 0a 20 20 73 71 6c  pWith;.  }.  sql
27c70 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26  ite3WalkSelect(&
27c80 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 7d 0a 0a  w, pSelect);.}..
27c90 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
27ca0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a  OMIT_SUBQUERY./*
27cb0 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 57 61  .** This is a Wa
27cc0 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c  lker.xSelectCall
27cd0 62 61 63 6b 20 63 61 6c 6c 62 61 63 6b 20 66 6f  back callback fo
27ce0 72 20 74 68 65 20 73 71 6c 69 74 65 33 53 65 6c  r the sqlite3Sel
27cf0 65 63 74 54 79 70 65 49 6e 66 6f 28 29 0a 2a 2a  ectTypeInfo().**
27d00 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a   interface..**.*
27d10 2a 20 46 6f 72 20 65 61 63 68 20 46 52 4f 4d 2d  * For each FROM-
27d20 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 79 2c  clause subquery,
27d30 20 61 64 64 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70   add Column.zTyp
27d40 65 20 61 6e 64 20 43 6f 6c 75 6d 6e 2e 7a 43 6f  e and Column.zCo
27d50 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f  ll.** informatio
27d60 6e 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20 73  n to the Table s
27d70 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65  tructure that re
27d80 70 72 65 73 65 6e 74 73 20 74 68 65 20 72 65 73  presents the res
27d90 75 6c 74 20 73 65 74 0a 2a 2a 20 6f 66 20 74 68  ult set.** of th
27da0 61 74 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a  at subquery..**.
27db0 2a 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74 72  ** The Table str
27dc0 75 63 74 75 72 65 20 74 68 61 74 20 72 65 70 72  ucture that repr
27dd0 65 73 65 6e 74 73 20 74 68 65 20 72 65 73 75 6c  esents the resul
27de0 74 20 73 65 74 20 77 61 73 20 63 6f 6e 73 74 72  t set was constr
27df0 75 63 74 65 64 0a 2a 2a 20 62 79 20 73 65 6c 65  ucted.** by sele
27e00 63 74 45 78 70 61 6e 64 65 72 28 29 20 62 75 74  ctExpander() but
27e10 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 63 6f   the type and co
27e20 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74  llation informat
27e30 69 6f 6e 20 77 61 73 20 6f 6d 69 74 74 65 64 0a  ion was omitted.
27e40 2a 2a 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74  ** at that point
27e50 20 62 65 63 61 75 73 65 20 69 64 65 6e 74 69 66   because identif
27e60 69 65 72 73 20 68 61 64 20 6e 6f 74 20 79 65 74  iers had not yet
27e70 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20   been resolved. 
27e80 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   This.** routine
27e90 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72   is called after
27ea0 20 69 64 65 6e 74 69 66 69 65 72 20 72 65 73 6f   identifier reso
27eb0 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  lution..*/.stati
27ec0 63 20 76 6f 69 64 20 73 65 6c 65 63 74 41 64 64  c void selectAdd
27ed0 53 75 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f  SubqueryTypeInfo
27ee0 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
27ef0 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
27f00 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 20  Parse *pParse;. 
27f10 20 69 6e 74 20 69 3b 0a 20 20 53 72 63 4c 69 73   int i;.  SrcLis
27f20 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 73  t *pTabList;.  s
27f30 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
27f40 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20 61 73  em *pFrom;..  as
27f50 73 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67  sert( p->selFlag
27f60 73 20 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 20  s & SF_Resolved 
27f70 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c  );.  if( (p->sel
27f80 46 6c 61 67 73 20 26 20 53 46 5f 48 61 73 54 79  Flags & SF_HasTy
27f90 70 65 49 6e 66 6f 29 3d 3d 30 20 29 7b 0a 20 20  peInfo)==0 ){.  
27fa0 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d    p->selFlags |=
27fb0 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 3b   SF_HasTypeInfo;
27fc0 0a 20 20 20 20 70 50 61 72 73 65 20 3d 20 70 57  .    pParse = pW
27fd0 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20  alker->pParse;. 
27fe0 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d     pTabList = p-
27ff0 3e 70 53 72 63 3b 0a 20 20 20 20 66 6f 72 28 69  >pSrc;.    for(i
28000 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69  =0, pFrom=pTabLi
28010 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73  st->a; i<pTabLis
28020 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46  t->nSrc; i++, pF
28030 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 54 61  rom++){.      Ta
28040 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f  ble *pTab = pFro
28050 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 69  m->pTab;.      i
28060 66 28 20 41 4c 57 41 59 53 28 70 54 61 62 21 3d  f( ALWAYS(pTab!=
28070 30 29 20 26 26 20 28 70 54 61 62 2d 3e 74 61 62  0) && (pTab->tab
28080 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d  Flags & TF_Ephem
28090 65 72 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20  eral)!=0 ){.    
280a0 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65      /* A sub-que
280b0 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ry in the FROM c
280c0 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43  lause of a SELEC
280d0 54 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 65 6c  T */.        Sel
280e0 65 63 74 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f  ect *pSel = pFro
280f0 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  m->pSelect;.    
28100 20 20 20 20 69 66 28 20 70 53 65 6c 20 29 7b 0a      if( pSel ){.
28110 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
28120 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29 20   pSel->pPrior ) 
28130 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72  pSel = pSel->pPr
28140 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ior;.          s
28150 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79  electAddColumnTy
28160 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70  peAndCollation(p
28170 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 53 65  Parse, pTab, pSe
28180 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  l);.        }.  
28190 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
281a0 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
281b0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 64   This routine ad
281c0 64 73 20 64 61 74 61 74 79 70 65 20 61 6e 64 20  ds datatype and 
281d0 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
281e0 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  ce information t
281f0 6f 0a 2a 2a 20 74 68 65 20 54 61 62 6c 65 20 73  o.** the Table s
28200 74 72 75 63 74 75 72 65 73 20 6f 66 20 61 6c 6c  tructures of all
28210 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62   FROM-clause sub
28220 71 75 65 72 69 65 73 20 69 6e 20 61 0a 2a 2a 20  queries in a.** 
28230 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
28240 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 69 73  ..**.** Use this
28250 20 72 6f 75 74 69 6e 65 20 61 66 74 65 72 20 6e   routine after n
28260 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a  ame resolution..
28270 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
28280 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64 54  qlite3SelectAddT
28290 79 70 65 49 6e 66 6f 28 50 61 72 73 65 20 2a 70  ypeInfo(Parse *p
282a0 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
282b0 53 65 6c 65 63 74 29 7b 0a 23 69 66 6e 64 65 66  Select){.#ifndef
282c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
282d0 51 55 45 52 59 0a 20 20 57 61 6c 6b 65 72 20 77  QUERY.  Walker w
282e0 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30  ;.  memset(&w, 0
282f0 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20  , sizeof(w));.  
28300 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
28310 6b 32 20 3d 20 73 65 6c 65 63 74 41 64 64 53 75  k2 = selectAddSu
28320 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f 3b 0a  bqueryTypeInfo;.
28330 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
28340 6b 20 3d 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70  k = exprWalkNoop
28350 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70  ;.  w.pParse = p
28360 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33  Parse;.  sqlite3
28370 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70  WalkSelect(&w, p
28380 53 65 6c 65 63 74 29 3b 0a 23 65 6e 64 69 66 0a  Select);.#endif.
28390 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  }.../*.** This r
283a0 6f 75 74 69 6e 65 20 73 65 74 73 20 75 70 20 61  outine sets up a
283b0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
283c0 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67  t for processing
283d0 2e 20 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77  .  The.** follow
283e0 69 6e 67 20 69 73 20 61 63 63 6f 6d 70 6c 69 73  ing is accomplis
283f0 68 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  hed:.**.**     *
28400 20 20 56 44 42 45 20 43 75 72 73 6f 72 20 6e 75    VDBE Cursor nu
28410 6d 62 65 72 73 20 61 72 65 20 61 73 73 69 67 6e  mbers are assign
28420 65 64 20 74 6f 20 61 6c 6c 20 46 52 4f 4d 2d 63  ed to all FROM-c
28430 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 20  lause terms..** 
28440 20 20 20 20 2a 20 20 45 70 68 65 6d 65 72 61 6c      *  Ephemeral
28450 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 73 20 61   Table objects a
28460 72 65 20 63 72 65 61 74 65 64 20 66 6f 72 20 61  re created for a
28470 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73  ll FROM-clause s
28480 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20 20 20  ubqueries..**   
28490 20 20 2a 20 20 4f 4e 20 61 6e 64 20 55 53 49 4e    *  ON and USIN
284a0 47 20 63 6c 61 75 73 65 73 20 61 72 65 20 73 68  G clauses are sh
284b0 69 66 74 65 64 20 69 6e 74 6f 20 57 48 45 52 45  ifted into WHERE
284c0 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 20   statements.**  
284d0 20 20 20 2a 20 20 57 69 6c 64 63 61 72 64 73 20     *  Wildcards 
284e0 22 2a 22 20 61 6e 64 20 22 54 41 42 4c 45 2e 2a  "*" and "TABLE.*
284f0 22 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 73  " in result sets
28500 20 61 72 65 20 65 78 70 61 6e 64 65 64 2e 0a 2a   are expanded..*
28510 2a 20 20 20 20 20 2a 20 20 49 64 65 6e 74 69 66  *     *  Identif
28520 69 65 72 73 20 69 6e 20 65 78 70 72 65 73 73 69  iers in expressi
28530 6f 6e 20 61 72 65 20 6d 61 74 63 68 65 64 20 74  on are matched t
28540 6f 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  o tables..**.** 
28550 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 74  This routine act
28560 73 20 72 65 63 75 72 73 69 76 65 6c 79 20 6f 6e  s recursively on
28570 20 61 6c 6c 20 73 75 62 71 75 65 72 69 65 73 20   all subqueries 
28580 77 69 74 68 69 6e 20 74 68 65 20 53 45 4c 45 43  within the SELEC
28590 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  T..*/.void sqlit
285a0 65 33 53 65 6c 65 63 74 50 72 65 70 28 0a 20 20  e3SelectPrep(.  
285b0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
285c0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
285d0 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
285e0 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
285f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
28600 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
28610 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f   being coded. */
28620 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
28630 70 4f 75 74 65 72 4e 43 20 20 2f 2a 20 4e 61 6d  pOuterNC  /* Nam
28640 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 63 6f  e context for co
28650 6e 74 61 69 6e 65 72 20 2a 2f 0a 29 7b 0a 20 20  ntainer */.){.  
28660 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
28670 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29  f( NEVER(p==0) )
28680 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20   return;.  db = 
28690 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
286a0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
286b0 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  ed ) return;.  i
286c0 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
286d0 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 20   SF_HasTypeInfo 
286e0 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69  ) return;.  sqli
286f0 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28  te3SelectExpand(
28700 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 69 66  pParse, p);.  if
28710 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
28720 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
28730 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  ed ) return;.  s
28740 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c  qlite3ResolveSel
28750 65 63 74 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  ectNames(pParse,
28760 20 70 2c 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20   p, pOuterNC);. 
28770 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
28780 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
28790 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
287a0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41    sqlite3SelectA
287b0 64 64 54 79 70 65 49 6e 66 6f 28 70 50 61 72 73  ddTypeInfo(pPars
287c0 65 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e, p);.}../*.** 
287d0 52 65 73 65 74 20 74 68 65 20 61 67 67 72 65 67  Reset the aggreg
287e0 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e  ate accumulator.
287f0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 67 67 72 65  .**.** The aggre
28800 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72  gate accumulator
28810 20 69 73 20 61 20 73 65 74 20 6f 66 20 6d 65 6d   is a set of mem
28820 6f 72 79 20 63 65 6c 6c 73 20 74 68 61 74 20 68  ory cells that h
28830 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d 65 64 69  old.** intermedi
28840 61 74 65 20 72 65 73 75 6c 74 73 20 77 68 69 6c  ate results whil
28850 65 20 63 61 6c 63 75 6c 61 74 69 6e 67 20 61 6e  e calculating an
28860 20 61 67 67 72 65 67 61 74 65 2e 20 20 54 68 69   aggregate.  Thi
28870 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e  s.** routine gen
28880 65 72 61 74 65 73 20 63 6f 64 65 20 74 68 61 74  erates code that
28890 20 73 74 6f 72 65 73 20 4e 55 4c 4c 73 20 69 6e   stores NULLs in
288a0 20 61 6c 6c 20 6f 66 20 74 68 6f 73 65 20 6d 65   all of those me
288b0 6d 6f 72 79 0a 2a 2a 20 63 65 6c 6c 73 2e 0a 2a  mory.** cells..*
288c0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
288d0 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 50  setAccumulator(P
288e0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67  arse *pParse, Ag
288f0 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29  gInfo *pAggInfo)
28900 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
28910 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
28920 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41  nt i;.  struct A
28930 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 75  ggInfo_func *pFu
28940 6e 63 3b 0a 20 20 69 6e 74 20 6e 52 65 67 20 3d  nc;.  int nReg =
28950 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63   pAggInfo->nFunc
28960 20 2b 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f   + pAggInfo->nCo
28970 6c 75 6d 6e 3b 0a 20 20 69 66 28 20 6e 52 65 67  lumn;.  if( nReg
28980 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 23 69  ==0 ) return;.#i
28990 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
289a0 47 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68  G.  /* Verify th
289b0 61 74 20 61 6c 6c 20 41 67 67 49 6e 66 6f 20 72  at all AggInfo r
289c0 65 67 69 73 74 65 72 73 20 61 72 65 20 77 69 74  egisters are wit
289d0 68 69 6e 20 74 68 65 20 72 61 6e 67 65 20 73 70  hin the range sp
289e0 65 63 69 66 69 65 64 20 62 79 0a 20 20 2a 2a 20  ecified by.  ** 
289f0 41 67 67 49 6e 66 6f 2e 6d 6e 52 65 67 2e 2e 41  AggInfo.mnReg..A
28a00 67 67 49 6e 66 6f 2e 6d 78 52 65 67 20 2a 2f 0a  ggInfo.mxReg */.
28a10 20 20 61 73 73 65 72 74 28 20 6e 52 65 67 3d 3d    assert( nReg==
28a20 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 2d  pAggInfo->mxReg-
28a30 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2b  pAggInfo->mnReg+
28a40 31 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  1 );.  for(i=0; 
28a50 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c  i<pAggInfo->nCol
28a60 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61  umn; i++){.    a
28a70 73 73 65 72 74 28 20 70 41 67 67 49 6e 66 6f 2d  ssert( pAggInfo-
28a80 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3e 3d 70  >aCol[i].iMem>=p
28a90 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20  AggInfo->mnReg. 
28aa0 20 20 20 20 20 20 20 20 26 26 20 70 41 67 67 49          && pAggI
28ab0 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65  nfo->aCol[i].iMe
28ac0 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52  m<=pAggInfo->mxR
28ad0 65 67 20 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  eg );.  }.  for(
28ae0 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  i=0; i<pAggInfo-
28af0 3e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20  >nFunc; i++){.  
28b00 20 20 61 73 73 65 72 74 28 20 70 41 67 67 49 6e    assert( pAggIn
28b10 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d 65  fo->aFunc[i].iMe
28b20 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52  m>=pAggInfo->mnR
28b30 65 67 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  eg.         && p
28b40 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69  AggInfo->aFunc[i
28b50 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67 49 6e 66 6f  ].iMem<=pAggInfo
28b60 2d 3e 6d 78 52 65 67 20 29 3b 0a 20 20 7d 0a 23  ->mxReg );.  }.#
28b70 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 56  endif.  sqlite3V
28b80 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
28b90 4e 75 6c 6c 2c 20 30 2c 20 70 41 67 67 49 6e 66  Null, 0, pAggInf
28ba0 6f 2d 3e 6d 6e 52 65 67 2c 20 70 41 67 67 49 6e  o->mnReg, pAggIn
28bb0 66 6f 2d 3e 6d 78 52 65 67 29 3b 0a 20 20 66 6f  fo->mxReg);.  fo
28bc0 72 28 70 46 75 6e 63 3d 70 41 67 67 49 6e 66 6f  r(pFunc=pAggInfo
28bd0 2d 3e 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69 3c  ->aFunc, i=0; i<
28be0 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
28bf0 20 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a   i++, pFunc++){.
28c00 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 69      if( pFunc->i
28c10 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20  Distinct>=0 ){. 
28c20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20       Expr *pE = 
28c30 70 46 75 6e 63 2d 3e 70 45 78 70 72 3b 0a 20 20  pFunc->pExpr;.  
28c40 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
28c50 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c  rHasProperty(pE,
28c60 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
28c70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e  ;.      if( pE->
28c80 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45  x.pList==0 || pE
28c90 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
28ca0 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=1 ){.        s
28cb0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
28cc0 50 61 72 73 65 2c 20 22 44 49 53 54 49 4e 43 54  Parse, "DISTINCT
28cd0 20 61 67 67 72 65 67 61 74 65 73 20 6d 75 73 74   aggregates must
28ce0 20 68 61 76 65 20 65 78 61 63 74 6c 79 20 6f 6e   have exactly on
28cf0 65 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22  e ".           "
28d00 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 20 20  argument");.    
28d10 20 20 20 20 70 46 75 6e 63 2d 3e 69 44 69 73 74      pFunc->iDist
28d20 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20  inct = -1;.     
28d30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
28d40 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
28d50 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  o = keyInfoFromE
28d60 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
28d70 70 45 2d 3e 78 2e 70 4c 69 73 74 2c 20 30 2c 20  pE->x.pList, 0, 
28d80 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
28d90 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
28da0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
28db0 6c 2c 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69  l, pFunc->iDisti
28dc0 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  nct, 0, 0,.     
28dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28de0 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
28df0 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
28e00 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
28e10 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  .  }.}../*.** In
28e20 76 6f 6b 65 20 74 68 65 20 4f 50 5f 41 67 67 46  voke the OP_AggF
28e30 69 6e 61 6c 69 7a 65 20 6f 70 63 6f 64 65 20 66  inalize opcode f
28e40 6f 72 20 65 76 65 72 79 20 61 67 67 72 65 67 61  or every aggrega
28e50 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  te function.** i
28e60 6e 20 74 68 65 20 41 67 67 49 6e 66 6f 20 73 74  n the AggInfo st
28e70 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ructure..*/.stat
28e80 69 63 20 76 6f 69 64 20 66 69 6e 61 6c 69 7a 65  ic void finalize
28e90 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 50 61 72  AggFunctions(Par
28ea0 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49  se *pParse, AggI
28eb0 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a  nfo *pAggInfo){.
28ec0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
28ed0 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
28ee0 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67   i;.  struct Agg
28ef0 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20  Info_func *pF;. 
28f00 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67   for(i=0, pF=pAg
28f10 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c  gInfo->aFunc; i<
28f20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
28f30 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20   i++, pF++){.   
28f40 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
28f50 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e   = pF->pExpr->x.
28f60 70 4c 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72  pList;.    asser
28f70 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
28f80 72 74 79 28 70 46 2d 3e 70 45 78 70 72 2c 20 45  rty(pF->pExpr, E
28f90 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
28fa0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
28fb0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67 46  ddOp4(v, OP_AggF
28fc0 69 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20  inal, pF->iMem, 
28fd0 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e  pList ? pList->n
28fe0 45 78 70 72 20 3a 20 30 2c 20 30 2c 0a 20 20 20  Expr : 0, 0,.   
28ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29000 20 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46     (void*)pF->pF
29010 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29  unc, P4_FUNCDEF)
29020 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  ;.  }.}../*.** U
29030 70 64 61 74 65 20 74 68 65 20 61 63 63 75 6d 75  pdate the accumu
29040 6c 61 74 6f 72 20 6d 65 6d 6f 72 79 20 63 65 6c  lator memory cel
29050 6c 73 20 66 6f 72 20 61 6e 20 61 67 67 72 65 67  ls for an aggreg
29060 61 74 65 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20  ate based on.** 
29070 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73  the current curs
29080 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a  or position..*/.
29090 73 74 61 74 69 63 20 76 6f 69 64 20 75 70 64 61  static void upda
290a0 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61  teAccumulator(Pa
290b0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67  rse *pParse, Agg
290c0 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b  Info *pAggInfo){
290d0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
290e0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
290f0 74 20 69 3b 0a 20 20 69 6e 74 20 72 65 67 48 69  t i;.  int regHi
29100 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 61 64 64  t = 0;.  int add
29110 72 48 69 74 54 65 73 74 20 3d 20 30 3b 0a 20 20  rHitTest = 0;.  
29120 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66  struct AggInfo_f
29130 75 6e 63 20 2a 70 46 3b 0a 20 20 73 74 72 75 63  unc *pF;.  struc
29140 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70  t AggInfo_col *p
29150 43 3b 0a 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e  C;..  pAggInfo->
29160 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a  directMode = 1;.
29170 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41    for(i=0, pF=pA
29180 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69  ggInfo->aFunc; i
29190 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  <pAggInfo->nFunc
291a0 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20  ; i++, pF++){.  
291b0 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20    int nArg;.    
291c0 69 6e 74 20 61 64 64 72 4e 65 78 74 20 3d 20 30  int addrNext = 0
291d0 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 41 67 67  ;.    int regAgg
291e0 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  ;.    ExprList *
291f0 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70  pList = pF->pExp
29200 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20  r->x.pList;.    
29210 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
29220 50 72 6f 70 65 72 74 79 28 70 46 2d 3e 70 45 78  Property(pF->pEx
29230 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
29240 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  ) );.    if( pLi
29250 73 74 20 29 7b 0a 20 20 20 20 20 20 6e 41 72 67  st ){.      nArg
29260 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
29270 0a 20 20 20 20 20 20 72 65 67 41 67 67 20 3d 20  .      regAgg = 
29280 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
29290 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 41 72 67  nge(pParse, nArg
292a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
292b0 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
292c0 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20  (pParse, pList, 
292d0 72 65 67 41 67 67 2c 20 53 51 4c 49 54 45 5f 45  regAgg, SQLITE_E
292e0 43 45 4c 5f 44 55 50 29 3b 0a 20 20 20 20 7d 65  CEL_DUP);.    }e
292f0 6c 73 65 7b 0a 20 20 20 20 20 20 6e 41 72 67 20  lse{.      nArg 
29300 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 67 41 67  = 0;.      regAg
29310 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  g = 0;.    }.   
29320 20 69 66 28 20 70 46 2d 3e 69 44 69 73 74 69 6e   if( pF->iDistin
29330 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  ct>=0 ){.      a
29340 64 64 72 4e 65 78 74 20 3d 20 73 71 6c 69 74 65  ddrNext = sqlite
29350 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
29360 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
29370 20 6e 41 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20   nArg==1 );.    
29380 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28 70    codeDistinct(p
29390 50 61 72 73 65 2c 20 70 46 2d 3e 69 44 69 73 74  Parse, pF->iDist
293a0 69 6e 63 74 2c 20 61 64 64 72 4e 65 78 74 2c 20  inct, addrNext, 
293b0 31 2c 20 72 65 67 41 67 67 29 3b 0a 20 20 20 20  1, regAgg);.    
293c0 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 70 46  }.    if( pF->pF
293d0 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  unc->funcFlags &
293e0 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45   SQLITE_FUNC_NEE
293f0 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20 43  DCOLL ){.      C
29400 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
29410 30 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  0;.      struct 
29420 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
29430 49 74 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20  Item;.      int 
29440 6a 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  j;.      assert(
29450 20 70 4c 69 73 74 21 3d 30 20 29 3b 20 20 2f 2a   pList!=0 );  /*
29460 20 70 4c 69 73 74 21 3d 30 20 69 66 20 70 46 2d   pList!=0 if pF-
29470 3e 70 46 75 6e 63 20 68 61 73 20 4e 45 45 44 43  >pFunc has NEEDC
29480 4f 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72  OLL */.      for
29490 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73  (j=0, pItem=pLis
294a0 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20 26 26 20  t->a; !pColl && 
294b0 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c 20 70 49 74  j<nArg; j++, pIt
294c0 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70  em++){.        p
294d0 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
294e0 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
294f0 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b  , pItem->pExpr);
29500 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
29510 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  f( !pColl ){.   
29520 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 50 61       pColl = pPa
29530 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f  rse->db->pDfltCo
29540 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ll;.      }.    
29550 20 20 69 66 28 20 72 65 67 48 69 74 3d 3d 30 20    if( regHit==0 
29560 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63  && pAggInfo->nAc
29570 63 75 6d 75 6c 61 74 6f 72 20 29 20 72 65 67 48  cumulator ) regH
29580 69 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  it = ++pParse->n
29590 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Mem;.      sqlit
295a0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
295b0 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 72 65 67 48  OP_CollSeq, regH
295c0 69 74 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20  it, 0, 0, (char 
295d0 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c  *)pColl, P4_COLL
295e0 53 45 51 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  SEQ);.    }.    
295f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
29600 34 28 76 2c 20 4f 50 5f 41 67 67 53 74 65 70 2c  4(v, OP_AggStep,
29610 20 30 2c 20 72 65 67 41 67 67 2c 20 70 46 2d 3e   0, regAgg, pF->
29620 69 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20 20 20  iMem,.          
29630 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
29640 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34  d*)pF->pFunc, P4
29650 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 73  _FUNCDEF);.    s
29660 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
29670 50 35 28 76 2c 20 28 75 38 29 6e 41 72 67 29 3b  P5(v, (u8)nArg);
29680 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
29690 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
296a0 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 41  nge(pParse, regA
296b0 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 73  gg, nArg);.    s
296c0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
296d0 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  pRange(pParse, r
296e0 65 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20  egAgg, nArg);.  
296f0 20 20 69 66 28 20 61 64 64 72 4e 65 78 74 20 29    if( addrNext )
29700 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
29710 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
29720 76 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a 20 20  v, addrNext);.  
29730 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
29740 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
29750 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
29760 2f 2a 20 42 65 66 6f 72 65 20 70 6f 70 75 6c 61  /* Before popula
29770 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d 75 6c  ting the accumul
29780 61 74 6f 72 20 72 65 67 69 73 74 65 72 73 2c 20  ator registers, 
29790 63 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e  clear the column
297a0 20 63 61 63 68 65 2e 0a 20 20 2a 2a 20 4f 74 68   cache..  ** Oth
297b0 65 72 77 69 73 65 2c 20 69 66 20 61 6e 79 20 6f  erwise, if any o
297c0 66 20 74 68 65 20 72 65 71 75 69 72 65 64 20 63  f the required c
297d0 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20 61 72 65  olumn values are
297e0 20 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74   already present
297f0 20 0a 20 20 2a 2a 20 69 6e 20 72 65 67 69 73 74   .  ** in regist
29800 65 72 73 2c 20 73 71 6c 69 74 65 33 45 78 70 72  ers, sqlite3Expr
29810 43 6f 64 65 28 29 20 6d 61 79 20 75 73 65 20 4f  Code() may use O
29820 50 5f 53 43 6f 70 79 20 74 6f 20 63 6f 70 79 20  P_SCopy to copy 
29830 74 68 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20 74  the value.  ** t
29840 6f 20 70 43 2d 3e 69 4d 65 6d 2e 20 42 75 74 20  o pC->iMem. But 
29850 62 79 20 74 68 65 20 74 69 6d 65 20 74 68 65 20  by the time the 
29860 76 61 6c 75 65 20 69 73 20 75 73 65 64 2c 20 74  value is used, t
29870 68 65 20 6f 72 69 67 69 6e 61 6c 20 72 65 67 69  he original regi
29880 73 74 65 72 0a 20 20 2a 2a 20 6d 61 79 20 68 61  ster.  ** may ha
29890 76 65 20 62 65 65 6e 20 75 73 65 64 2c 20 69 6e  ve been used, in
298a0 76 61 6c 69 64 61 74 69 6e 67 20 74 68 65 20 75  validating the u
298b0 6e 64 65 72 6c 79 69 6e 67 20 62 75 66 66 65 72  nderlying buffer
298c0 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20 2a   holding the.  *
298d0 2a 20 74 65 78 74 20 6f 72 20 62 6c 6f 62 20 76  * text or blob v
298e0 61 6c 75 65 2e 20 53 65 65 20 74 69 63 6b 65 74  alue. See ticket
298f0 20 5b 38 38 33 30 33 34 64 63 62 35 5d 2e 0a 20   [883034dcb5].. 
29900 20 2a 2a 0a 20 20 2a 2a 20 41 6e 6f 74 68 65 72   **.  ** Another
29910 20 73 6f 6c 75 74 69 6f 6e 20 77 6f 75 6c 64 20   solution would 
29920 62 65 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65  be to change the
29930 20 4f 50 5f 53 43 6f 70 79 20 75 73 65 64 20 74   OP_SCopy used t
29940 6f 20 63 6f 70 79 20 63 61 63 68 65 64 0a 20 20  o copy cached.  
29950 2a 2a 20 76 61 6c 75 65 73 20 74 6f 20 61 6e 20  ** values to an 
29960 4f 50 5f 43 6f 70 79 2e 0a 20 20 2a 2f 0a 20 20  OP_Copy..  */.  
29970 69 66 28 20 72 65 67 48 69 74 20 29 7b 0a 20 20  if( regHit ){.  
29980 20 20 61 64 64 72 48 69 74 54 65 73 74 20 3d 20    addrHitTest = 
29990 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
299a0 31 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 48  1(v, OP_If, regH
299b0 69 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  it); VdbeCoverag
299c0 65 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  e(v);.  }.  sqli
299d0 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
299e0 72 28 70 50 61 72 73 65 29 3b 0a 20 20 66 6f 72  r(pParse);.  for
299f0 28 69 3d 30 2c 20 70 43 3d 70 41 67 67 49 6e 66  (i=0, pC=pAggInf
29a00 6f 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41 67 67 49  o->aCol; i<pAggI
29a10 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f  nfo->nAccumulato
29a20 72 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20  r; i++, pC++){. 
29a30 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
29a40 64 65 28 70 50 61 72 73 65 2c 20 70 43 2d 3e 70  de(pParse, pC->p
29a50 45 78 70 72 2c 20 70 43 2d 3e 69 4d 65 6d 29 3b  Expr, pC->iMem);
29a60 0a 20 20 7d 0a 20 20 70 41 67 67 49 6e 66 6f 2d  .  }.  pAggInfo-
29a70 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 30 3b  >directMode = 0;
29a80 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
29a90 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
29aa0 3b 0a 20 20 69 66 28 20 61 64 64 72 48 69 74 54  ;.  if( addrHitT
29ab0 65 73 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  est ){.    sqlit
29ac0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
29ad0 2c 20 61 64 64 72 48 69 74 54 65 73 74 29 3b 0a  , addrHitTest);.
29ae0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64    }.}../*.** Add
29af0 20 61 20 73 69 6e 67 6c 65 20 4f 50 5f 45 78 70   a single OP_Exp
29b00 6c 61 69 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e  lain instruction
29b10 20 74 6f 20 74 68 65 20 56 44 42 45 20 74 6f 20   to the VDBE to 
29b20 65 78 70 6c 61 69 6e 20 61 20 73 69 6d 70 6c 65  explain a simple
29b30 0a 2a 2a 20 63 6f 75 6e 74 28 2a 29 20 71 75 65  .** count(*) que
29b40 72 79 20 28 22 53 45 4c 45 43 54 20 63 6f 75 6e  ry ("SELECT coun
29b50 74 28 2a 29 20 46 52 4f 4d 20 70 54 61 62 22 29  t(*) FROM pTab")
29b60 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
29b70 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
29b80 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
29b90 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28  lainSimpleCount(
29ba0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
29bb0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
29bc0 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74     /* Parse cont
29bd0 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ext */.  Table *
29be0 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 20  pTab,           
29bf0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
29c00 65 20 62 65 69 6e 67 20 71 75 65 72 69 65 64 20  e being queried 
29c10 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
29c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c30 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 75 73       /* Index us
29c40 65 64 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 73  ed to optimize s
29c50 63 61 6e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  can, or NULL */.
29c60 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ){.  if( pParse-
29c70 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20  >explain==2 ){. 
29c80 20 20 20 69 6e 74 20 62 43 6f 76 65 72 20 3d 20     int bCover = 
29c90 28 70 49 64 78 21 3d 30 20 26 26 20 28 48 61 73  (pIdx!=0 && (Has
29ca0 52 6f 77 69 64 28 70 54 61 62 29 20 7c 7c 20 21  Rowid(pTab) || !
29cb0 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  IsPrimaryKeyInde
29cc0 78 28 70 49 64 78 29 29 29 3b 0a 20 20 20 20 63  x(pIdx)));.    c
29cd0 68 61 72 20 2a 7a 45 71 70 20 3d 20 73 71 6c 69  har *zEqp = sqli
29ce0 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73  te3MPrintf(pPars
29cf0 65 2d 3e 64 62 2c 20 22 53 43 41 4e 20 54 41 42  e->db, "SCAN TAB
29d00 4c 45 20 25 73 25 73 25 73 22 2c 0a 20 20 20 20  LE %s%s%s",.    
29d10 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c      pTab->zName,
29d20 0a 20 20 20 20 20 20 20 20 62 43 6f 76 65 72 20  .        bCover 
29d30 3f 20 22 20 55 53 49 4e 47 20 43 4f 56 45 52 49  ? " USING COVERI
29d40 4e 47 20 49 4e 44 45 58 20 22 20 3a 20 22 22 2c  NG INDEX " : "",
29d50 0a 20 20 20 20 20 20 20 20 62 43 6f 76 65 72 20  .        bCover 
29d60 3f 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20  ? pIdx->zName : 
29d70 22 22 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71  "".    );.    sq
29d80 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
29d90 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
29da0 3e 70 56 64 62 65 2c 20 4f 50 5f 45 78 70 6c 61  >pVdbe, OP_Expla
29db0 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  in, pParse->iSel
29dc0 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 45 71  ectId, 0, 0, zEq
29dd0 70 2c 20 50 34 5f 44 59 4e 41 4d 49 43 0a 20 20  p, P4_DYNAMIC.  
29de0 20 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65    );.  }.}.#else
29df0 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69  .# define explai
29e00 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 61 2c 62  nSimpleCount(a,b
29e10 2c 63 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  ,c).#endif..#ifd
29e20 65 66 20 53 51 4c 49 54 45 5f 43 4f 55 4e 54 4f  ef SQLITE_COUNTO
29e30 46 56 49 45 57 5f 4f 50 54 49 4d 49 5a 41 54 49  FVIEW_OPTIMIZATI
29e40 4f 4e 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  ON./*.** Attempt
29e50 20 74 6f 20 74 72 61 6e 73 66 6f 72 6d 20 61 20   to transform a 
29e60 71 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f 72  query of the for
29e70 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43  m.**.**    SELEC
29e80 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
29e90 28 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74  (SELECT x FROM t
29ea0 31 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45  1 UNION ALL SELE
29eb0 43 54 20 79 20 46 52 4f 4d 20 74 32 29 0a 2a 2a  CT y FROM t2).**
29ec0 0a 2a 2a 20 49 6e 74 6f 20 74 68 69 73 3a 0a 2a  .** Into this:.*
29ed0 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 28  *.**    SELECT (
29ee0 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
29ef0 46 52 4f 4d 20 74 31 29 2b 28 53 45 4c 45 43 54  FROM t1)+(SELECT
29f00 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74   count(*) FROM t
29f10 32 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 72 61  2).**.** The tra
29f20 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 6c 79  nsformation only
29f30 20 77 6f 72 6b 73 20 69 66 20 61 6c 6c 20 6f 66   works if all of
29f40 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
29f50 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20  re true:.**.**  
29f60 20 2a 20 20 54 68 65 20 73 75 62 71 75 65 72 79   *  The subquery
29f70 20 69 73 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20   is a UNION ALL 
29f80 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 74  of two or more t
29f90 65 72 6d 73 0a 2a 2a 20 20 20 2a 20 20 54 68 65  erms.**   *  The
29fa0 72 65 20 69 73 20 6e 6f 20 57 48 45 52 45 20 6f  re is no WHERE o
29fb0 72 20 47 52 4f 55 50 20 42 59 20 6f 72 20 48 41  r GROUP BY or HA
29fc0 56 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 6e 20  VING clauses on 
29fd0 74 68 65 20 73 75 62 71 75 65 72 69 65 73 0a 2a  the subqueries.*
29fe0 2a 20 20 20 2a 20 20 54 68 65 20 6f 75 74 65 72  *   *  The outer
29ff0 20 71 75 65 72 79 20 69 73 20 61 20 73 69 6d 70   query is a simp
2a000 6c 65 20 63 6f 75 6e 74 28 2a 29 0a 2a 2a 0a 2a  le count(*).**.*
2a010 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
2a020 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   the optimizatio
2a030 6e 20 69 73 20 75 6e 64 65 72 74 61 6b 65 6e 2e  n is undertaken.
2a040 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
2a050 6f 75 6e 74 4f 66 56 69 65 77 4f 70 74 69 6d 69  ountOfViewOptimi
2a060 7a 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  zation(Parse *pP
2a070 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29  arse, Select *p)
2a080 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62  {.  Select *pSub
2a090 2c 20 2a 70 50 72 69 6f 72 3b 0a 20 20 45 78 70  , *pPrior;.  Exp
2a0a0 72 20 2a 70 45 78 70 72 3b 0a 20 20 45 78 70 72  r *pExpr;.  Expr
2a0b0 20 2a 70 43 6f 75 6e 74 3b 0a 20 20 73 71 6c 69   *pCount;.  sqli
2a0c0 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 28  te3 *db;.  if( (
2a0d0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
2a0e0 5f 41 67 67 72 65 67 61 74 65 29 3d 3d 30 20 29  _Aggregate)==0 )
2a0f0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20   return 0;   /* 
2a100 54 68 69 73 20 69 73 20 61 6e 20 61 67 67 72 65  This is an aggre
2a110 67 61 74 65 20 71 75 65 72 79 20 2a 2f 0a 20 20  gate query */.  
2a120 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  if( p->pEList->n
2a130 45 78 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e  Expr!=1 ) return
2a140 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2a150 20 20 2f 2a 20 53 69 6e 67 6c 65 20 72 65 73 75    /* Single resu
2a160 6c 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 70  lt column */.  p
2a170 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74  Expr = p->pEList
2a180 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
2a190 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
2a1a0 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29  K_AGG_FUNCTION )
2a1b0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
2a1c0 20 20 2f 2a 20 52 65 73 75 6c 74 20 69 73 20 61    /* Result is a
2a1d0 6e 20 61 67 67 72 65 67 61 74 65 20 2a 2f 0a 20  n aggregate */. 
2a1e0 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
2a1f0 69 63 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54  icmp(pExpr->u.zT
2a200 6f 6b 65 6e 2c 22 63 6f 75 6e 74 22 29 20 29 20  oken,"count") ) 
2a210 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 4d 75  return 0;  /* Mu
2a220 73 74 20 62 65 20 63 6f 75 6e 74 28 29 20 2a 2f  st be count() */
2a230 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 78 2e  .  if( pExpr->x.
2a240 70 4c 69 73 74 21 3d 30 20 29 20 72 65 74 75 72  pList!=0 ) retur
2a250 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
2a260 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20       /* Must be 
2a270 63 6f 75 6e 74 28 2a 29 20 2a 2f 0a 20 20 69 66  count(*) */.  if
2a280 28 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 21  ( p->pSrc->nSrc!
2a290 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =1 ) return 0;  
2a2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a2b0 2f 2a 20 4f 6e 65 20 74 61 62 6c 65 20 69 6e 20  /* One table in 
2a2c0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
2a2d0 2a 2f 0a 20 20 70 53 75 62 20 3d 20 70 2d 3e 70  */.  pSub = p->p
2a2e0 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63  Src->a[0].pSelec
2a2f0 74 3b 0a 20 20 69 66 28 20 70 53 75 62 3d 3d 30  t;.  if( pSub==0
2a300 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
2a310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a320 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52         /* The FR
2a330 4f 4d 20 69 73 20 61 20 73 75 62 71 75 65 72 79  OM is a subquery
2a340 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
2a350 70 50 72 69 6f 72 3d 3d 30 20 29 20 72 65 74 75  pPrior==0 ) retu
2a360 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
2a370 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20          /* Must 
2a380 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 75  be a compound su
2a390 62 71 75 65 72 79 20 2a 2f 0a 20 20 64 6f 7b 0a  bquery */.  do{.
2a3a0 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 6f 70      if( pSub->op
2a3b0 21 3d 54 4b 5f 41 4c 4c 20 26 26 20 70 53 75 62  !=TK_ALL && pSub
2a3c0 2d 3e 70 50 72 69 6f 72 20 29 20 72 65 74 75 72  ->pPrior ) retur
2a3d0 6e 20 30 3b 20 20 2f 2a 20 4d 75 73 74 20 62 65  n 0;  /* Must be
2a3e0 20 55 4e 49 4f 4e 20 41 4c 4c 20 2a 2f 0a 20 20   UNION ALL */.  
2a3f0 20 20 69 66 28 20 70 53 75 62 2d 3e 70 57 68 65    if( pSub->pWhe
2a400 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  re ) return 0;  
2a410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a420 20 20 20 20 2f 2a 20 4e 6f 20 57 48 45 52 45 20      /* No WHERE 
2a430 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 69 66  clause */.    if
2a440 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73  ( pSub->selFlags
2a450 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 20   & SF_Aggregate 
2a460 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
2a470 2f 2a 20 4e 6f 74 20 61 6e 20 61 67 67 72 65 67  /* Not an aggreg
2a480 61 74 65 20 2a 2f 0a 20 20 20 20 70 53 75 62 20  ate */.    pSub 
2a490 3d 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 3b 20  = pSub->pPrior; 
2a4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a4c0 52 65 70 65 61 74 20 6f 76 65 72 20 63 6f 6d 70  Repeat over comp
2a4d0 6f 75 6e 64 20 74 65 72 6d 73 20 2a 2f 0a 20 20  ound terms */.  
2a4e0 7d 77 68 69 6c 65 28 20 70 53 75 62 20 29 3b 0a  }while( pSub );.
2a4f0 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63  .  /* If we reac
2a500 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  h this point, th
2a510 61 74 20 6d 65 61 6e 73 20 69 74 20 69 73 20 4f  at means it is O
2a520 4b 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 65  K to perform the
2a530 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20   transformation 
2a540 2a 2f 0a 0a 20 20 64 62 20 3d 20 70 50 61 72 73  */..  db = pPars
2a550 65 2d 3e 64 62 3b 0a 20 20 70 43 6f 75 6e 74 20  e->db;.  pCount 
2a560 3d 20 70 45 78 70 72 3b 0a 20 20 70 45 78 70 72  = pExpr;.  pExpr
2a570 20 3d 20 30 3b 0a 20 20 70 53 75 62 20 3d 20 70   = 0;.  pSub = p
2a580 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65  ->pSrc->a[0].pSe
2a590 6c 65 63 74 3b 0a 20 20 70 2d 3e 70 53 72 63 2d  lect;.  p->pSrc-
2a5a0 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 20 3d 20  >a[0].pSelect = 
2a5b0 30 3b 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c  0;.  sqlite3SrcL
2a5c0 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
2a5d0 3e 70 53 72 63 29 3b 0a 20 20 70 2d 3e 70 53 72  >pSrc);.  p->pSr
2a5e0 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  c = sqlite3DbMal
2a5f0 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e  locZero(pParse->
2a600 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 2d 3e 70  db, sizeof(*p->p
2a610 53 72 63 29 29 3b 0a 20 20 77 68 69 6c 65 28 20  Src));.  while( 
2a620 70 53 75 62 20 29 7b 0a 20 20 20 20 45 78 70 72  pSub ){.    Expr
2a630 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20 70 50 72   *pTerm;.    pPr
2a640 69 6f 72 20 3d 20 70 53 75 62 2d 3e 70 50 72 69  ior = pSub->pPri
2a650 6f 72 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70 50  or;.    pSub->pP
2a660 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 53  rior = 0;.    pS
2a670 75 62 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20  ub->pNext = 0;. 
2a680 20 20 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67     pSub->selFlag
2a690 73 20 7c 3d 20 53 46 5f 41 67 67 72 65 67 61 74  s |= SF_Aggregat
2a6a0 65 3b 0a 20 20 20 20 70 53 75 62 2d 3e 73 65 6c  e;.    pSub->sel
2a6b0 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 43 6f 6d  Flags &= ~SF_Com
2a6c0 70 6f 75 6e 64 3b 0a 20 20 20 20 70 53 75 62 2d  pound;.    pSub-
2a6d0 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 30 3b  >nSelectRow = 0;
2a6e0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
2a6f0 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
2a700 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sub->pEList);.  
2a710 20 20 70 54 65 72 6d 20 3d 20 70 50 72 69 6f 72    pTerm = pPrior
2a720 20 3f 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   ? sqlite3ExprDu
2a730 70 28 64 62 2c 20 70 43 6f 75 6e 74 2c 20 30 29  p(db, pCount, 0)
2a740 20 3a 20 70 43 6f 75 6e 74 3b 0a 20 20 20 20 70   : pCount;.    p
2a750 53 75 62 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71  Sub->pEList = sq
2a760 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
2a770 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 70  end(pParse, 0, p
2a780 54 65 72 6d 29 3b 0a 20 20 20 20 70 54 65 72 6d  Term);.    pTerm
2a790 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
2a7a0 70 50 61 72 73 65 2c 20 54 4b 5f 53 45 4c 45 43  pParse, TK_SELEC
2a7b0 54 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  T, 0, 0, 0);.   
2a7c0 20 69 66 28 20 70 54 65 72 6d 20 29 7b 0a 20 20   if( pTerm ){.  
2a7d0 20 20 20 20 70 54 65 72 6d 2d 3e 78 2e 70 53 65      pTerm->x.pSe
2a7e0 6c 65 63 74 20 3d 20 70 53 75 62 3b 0a 20 20 20  lect = pSub;.   
2a7f0 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72     ExprSetProper
2a800 74 79 28 70 54 65 72 6d 2c 20 45 50 5f 78 49 73  ty(pTerm, EP_xIs
2a810 53 65 6c 65 63 74 7c 45 50 5f 53 75 62 71 75 65  Select|EP_Subque
2a820 72 79 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ry);.      sqlit
2a830 65 33 45 78 70 72 53 65 74 48 65 69 67 68 74 41  e3ExprSetHeightA
2a840 6e 64 46 6c 61 67 73 28 70 50 61 72 73 65 2c 20  ndFlags(pParse, 
2a850 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 69 66  pTerm);.      if
2a860 28 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20  ( pExpr==0 ){.  
2a870 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 54        pExpr = pT
2a880 65 72 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  erm;.      }else
2a890 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 20  {.        pExpr 
2a8a0 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
2a8b0 50 61 72 73 65 2c 20 54 4b 5f 50 4c 55 53 2c 20  Parse, TK_PLUS, 
2a8c0 70 54 65 72 6d 2c 20 70 45 78 70 72 2c 20 30 29  pTerm, pExpr, 0)
2a8d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
2a8e0 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
2a8f0 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
2a900 62 2c 20 70 53 75 62 29 3b 0a 20 20 20 20 7d 0a  b, pSub);.    }.
2a910 20 20 20 20 70 53 75 62 20 3d 20 70 50 72 69 6f      pSub = pPrio
2a920 72 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 45 4c 69  r;.  }.  p->pELi
2a930 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 20 3d  st->a[0].pExpr =
2a940 20 70 45 78 70 72 3b 0a 20 20 70 2d 3e 73 65 6c   pExpr;.  p->sel
2a950 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 41 67 67  Flags &= ~SF_Agg
2a960 72 65 67 61 74 65 3b 0a 0a 23 69 66 20 53 45 4c  regate;..#if SEL
2a970 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ECTTRACE_ENABLED
2a980 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65  .  if( sqlite3Se
2a990 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 34 30  lectTrace & 0x40
2a9a0 30 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54  0 ){.    SELECTT
2a9b0 52 41 43 45 28 30 78 34 30 30 2c 70 50 61 72 73  RACE(0x400,pPars
2a9c0 65 2c 70 2c 28 22 41 66 74 65 72 20 63 6f 75 6e  e,p,("After coun
2a9d0 74 2d 6f 66 2d 76 69 65 77 20 6f 70 74 69 6d 69  t-of-view optimi
2a9e0 7a 61 74 69 6f 6e 3a 5c 6e 22 29 29 3b 0a 20 20  zation:\n"));.  
2a9f0 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
2aa00 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29  wSelect(0, p, 0)
2aa10 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  ;.  }.#endif.  r
2aa20 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
2aa30 66 20 2f 2a 20 53 51 4c 49 54 45 5f 43 4f 55 4e  f /* SQLITE_COUN
2aa40 54 4f 46 56 49 45 57 5f 4f 50 54 49 4d 49 5a 41  TOFVIEW_OPTIMIZA
2aa50 54 49 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47  TION */../*.** G
2aa60 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
2aa70 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
2aa80 65 6d 65 6e 74 20 67 69 76 65 6e 20 69 6e 20 74  ement given in t
2aa90 68 65 20 70 20 61 72 67 75 6d 65 6e 74 2e 20 20  he p argument.  
2aaa0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c  .**.** The resul
2aab0 74 73 20 61 72 65 20 72 65 74 75 72 6e 65 64 20  ts are returned 
2aac0 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
2aad0 20 53 65 6c 65 63 74 44 65 73 74 20 73 74 72 75   SelectDest stru
2aae0 63 74 75 72 65 2e 0a 2a 2a 20 53 65 65 20 63 6f  cture..** See co
2aaf0 6d 6d 65 6e 74 73 20 69 6e 20 73 71 6c 69 74 65  mments in sqlite
2ab00 49 6e 74 2e 68 20 66 6f 72 20 66 75 72 74 68 65  Int.h for furthe
2ab10 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  r information..*
2ab20 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2ab30 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75  e returns the nu
2ab40 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20  mber of errors. 
2ab50 20 49 66 20 61 6e 79 20 65 72 72 6f 72 73 20 61   If any errors a
2ab60 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65  re.** encountere
2ab70 64 2c 20 74 68 65 6e 20 61 6e 20 61 70 70 72 6f  d, then an appro
2ab80 70 72 69 61 74 65 20 65 72 72 6f 72 20 6d 65 73  priate error mes
2ab90 73 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e 0a  sage is left in.
2aba0 2a 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  ** pParse->zErrM
2abb0 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  sg..**.** This r
2abc0 6f 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20  outine does NOT 
2abd0 66 72 65 65 20 74 68 65 20 53 65 6c 65 63 74 20  free the Select 
2abe0 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64  structure passed
2abf0 20 69 6e 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c   in.  The.** cal
2ac00 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65  ling function ne
2ac10 65 64 73 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a  eds to do that..
2ac20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65  */.int sqlite3Se
2ac30 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70  lect(.  Parse *p
2ac40 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
2ac50 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
2ac60 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
2ac70 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
2ac80 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
2ac90 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63  tatement being c
2aca0 6f 64 65 64 2e 20 2a 2f 0a 20 20 53 65 6c 65 63  oded. */.  Selec
2acb0 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20  tDest *pDest    
2acc0 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
2acd0 77 69 74 68 20 74 68 65 20 71 75 65 72 79 20 72  with the query r
2ace0 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  esults */.){.  i
2acf0 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
2ad00 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
2ad10 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72  unters */.  Wher
2ad20 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20  eInfo *pWInfo;  
2ad30 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 66 72 6f     /* Return fro
2ad40 6d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  m sqlite3WhereBe
2ad50 67 69 6e 28 29 20 2a 2f 0a 20 20 56 64 62 65 20  gin() */.  Vdbe 
2ad60 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
2ad70 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c    /* The virtual
2ad80 20 6d 61 63 68 69 6e 65 20 75 6e 64 65 72 20 63   machine under c
2ad90 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
2ada0 20 69 6e 74 20 69 73 41 67 67 3b 20 20 20 20 20   int isAgg;     
2adb0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2adc0 66 6f 72 20 73 65 6c 65 63 74 20 6c 69 73 74 73  for select lists
2add0 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22   like "count(*)"
2ade0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
2adf0 70 45 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a 20  pEList;      /* 
2ae00 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  List of columns 
2ae10 74 6f 20 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20  to extract. */. 
2ae20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
2ae30 73 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  st;     /* List 
2ae40 6f 66 20 74 61 62 6c 65 73 20 74 6f 20 73 65 6c  of tables to sel
2ae50 65 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78  ect from */.  Ex
2ae60 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20  pr *pWhere;     
2ae70 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
2ae80 45 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  E clause.  May b
2ae90 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  e NULL */.  Expr
2aea0 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20  List *pGroupBy; 
2aeb0 20 20 20 2f 2a 20 54 68 65 20 47 52 4f 55 50 20     /* The GROUP 
2aec0 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20  BY clause.  May 
2aed0 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70  be NULL */.  Exp
2aee0 72 20 2a 70 48 61 76 69 6e 67 3b 20 20 20 20 20  r *pHaving;     
2aef0 20 20 20 20 2f 2a 20 54 68 65 20 48 41 56 49 4e      /* The HAVIN
2af00 47 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  G clause.  May b
2af10 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20  e NULL */.  int 
2af20 72 63 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  rc = 1;         
2af30 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72     /* Value to r
2af40 65 74 75 72 6e 20 66 72 6f 6d 20 74 68 69 73 20  eturn from this 
2af50 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 44 69  function */.  Di
2af60 73 74 69 6e 63 74 43 74 78 20 73 44 69 73 74 69  stinctCtx sDisti
2af70 6e 63 74 3b 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20  nct; /* Info on 
2af80 68 6f 77 20 74 6f 20 63 6f 64 65 20 74 68 65 20  how to code the 
2af90 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
2afa0 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 73 53   */.  SortCtx sS
2afb0 6f 72 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ort;         /* 
2afc0 49 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 63  Info on how to c
2afd0 6f 64 65 20 74 68 65 20 4f 52 44 45 52 20 42 59  ode the ORDER BY
2afe0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 41 67 67   clause */.  Agg
2aff0 49 6e 66 6f 20 73 41 67 67 49 6e 66 6f 3b 20 20  Info sAggInfo;  
2b000 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69      /* Informati
2b010 6f 6e 20 75 73 65 64 20 62 79 20 61 67 67 72 65  on used by aggre
2b020 67 61 74 65 20 71 75 65 72 69 65 73 20 2a 2f 0a  gate queries */.
2b030 20 20 69 6e 74 20 69 45 6e 64 3b 20 20 20 20 20    int iEnd;     
2b040 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
2b050 65 73 73 20 6f 66 20 74 68 65 20 65 6e 64 20 6f  ess of the end o
2b060 66 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20  f the query */. 
2b070 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
2b080 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
2b090 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
2b0a0 6f 6e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  on */..#ifndef S
2b0b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
2b0c0 49 4e 0a 20 20 69 6e 74 20 69 52 65 73 74 6f 72  IN.  int iRestor
2b0d0 65 53 65 6c 65 63 74 49 64 20 3d 20 70 50 61 72  eSelectId = pPar
2b0e0 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 3b 0a 20  se->iSelectId;. 
2b0f0 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74   pParse->iSelect
2b100 49 64 20 3d 20 70 50 61 72 73 65 2d 3e 69 4e 65  Id = pParse->iNe
2b110 78 74 53 65 6c 65 63 74 49 64 2b 2b 3b 0a 23 65  xtSelectId++;.#e
2b120 6e 64 69 66 0a 0a 20 20 64 62 20 3d 20 70 50 61  ndif..  db = pPa
2b130 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70  rse->db;.  if( p
2b140 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  ==0 || db->mallo
2b150 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73  cFailed || pPars
2b160 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 72  e->nErr ){.    r
2b170 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69  eturn 1;.  }.  i
2b180 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
2b190 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
2b1a0 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c  TE_SELECT, 0, 0,
2b1b0 20 30 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a   0) ) return 1;.
2b1c0 20 20 6d 65 6d 73 65 74 28 26 73 41 67 67 49 6e    memset(&sAggIn
2b1d0 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41  fo, 0, sizeof(sA
2b1e0 67 67 49 6e 66 6f 29 29 3b 0a 23 69 66 20 53 45  ggInfo));.#if SE
2b1f0 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45  LECTTRACE_ENABLE
2b200 44 0a 20 20 70 50 61 72 73 65 2d 3e 6e 53 65 6c  D.  pParse->nSel
2b210 65 63 74 49 6e 64 65 6e 74 2b 2b 3b 0a 20 20 53  ectIndent++;.  S
2b220 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50 61  ELECTTRACE(1,pPa
2b230 72 73 65 2c 70 2c 20 28 22 62 65 67 69 6e 20 70  rse,p, ("begin p
2b240 72 6f 63 65 73 73 69 6e 67 3a 5c 6e 22 29 29 3b  rocessing:\n"));
2b250 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65  .  if( sqlite3Se
2b260 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 31 30  lectTrace & 0x10
2b270 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
2b280 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30  TreeViewSelect(0
2b290 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  , p, 0);.  }.#en
2b2a0 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
2b2b0 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c  ->pOrderBy==0 ||
2b2c0 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53   pDest->eDest!=S
2b2d0 52 54 5f 44 69 73 74 46 69 66 6f 20 29 3b 0a 20  RT_DistFifo );. 
2b2e0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64   assert( p->pOrd
2b2f0 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74  erBy==0 || pDest
2b300 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 46 69 66  ->eDest!=SRT_Fif
2b310 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  o );.  assert( p
2b320 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c  ->pOrderBy==0 ||
2b330 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53   pDest->eDest!=S
2b340 52 54 5f 44 69 73 74 51 75 65 75 65 20 29 3b 0a  RT_DistQueue );.
2b350 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
2b360 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73  derBy==0 || pDes
2b370 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 51 75  t->eDest!=SRT_Qu
2b380 65 75 65 20 29 3b 0a 20 20 69 66 28 20 49 67 6e  eue );.  if( Ign
2b390 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44  orableOrderby(pD
2b3a0 65 73 74 29 20 29 7b 0a 20 20 20 20 61 73 73 65  est) ){.    asse
2b3b0 72 74 28 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  rt(pDest->eDest=
2b3c0 3d 53 52 54 5f 45 78 69 73 74 73 20 7c 7c 20 70  =SRT_Exists || p
2b3d0 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
2b3e0 5f 55 6e 69 6f 6e 20 7c 7c 20 0a 20 20 20 20 20  _Union || .     
2b3f0 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65        pDest->eDe
2b400 73 74 3d 3d 53 52 54 5f 45 78 63 65 70 74 20 7c  st==SRT_Except |
2b410 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  | pDest->eDest==
2b420 53 52 54 5f 44 69 73 63 61 72 64 20 7c 7c 0a 20  SRT_Discard ||. 
2b430 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2d            pDest-
2b440 3e 65 44 65 73 74 3d 3d 53 52 54 5f 51 75 65 75  >eDest==SRT_Queu
2b450 65 20 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65  e  || pDest->eDe
2b460 73 74 3d 3d 53 52 54 5f 44 69 73 74 46 69 66 6f  st==SRT_DistFifo
2b470 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 70   ||.           p
2b480 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
2b490 5f 44 69 73 74 51 75 65 75 65 20 7c 7c 20 70 44  _DistQueue || pD
2b4a0 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
2b4b0 46 69 66 6f 29 3b 0a 20 20 20 20 2f 2a 20 49 66  Fifo);.    /* If
2b4c0 20 4f 52 44 45 52 20 42 59 20 6d 61 6b 65 73 20   ORDER BY makes 
2b4d0 6e 6f 20 64 69 66 66 65 72 65 6e 63 65 20 69 6e  no difference in
2b4e0 20 74 68 65 20 6f 75 74 70 75 74 20 74 68 65 6e   the output then
2b4f0 20 6e 65 69 74 68 65 72 20 64 6f 65 73 0a 20 20   neither does.  
2b500 20 20 2a 2a 20 44 49 53 54 49 4e 43 54 20 73 6f    ** DISTINCT so
2b510 20 69 74 20 63 61 6e 20 62 65 20 72 65 6d 6f 76   it can be remov
2b520 65 64 20 74 6f 6f 2e 20 2a 2f 0a 20 20 20 20 73  ed too. */.    s
2b530 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
2b540 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64  lete(db, p->pOrd
2b550 65 72 42 79 29 3b 0a 20 20 20 20 70 2d 3e 70 4f  erBy);.    p->pO
2b560 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
2b570 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e  p->selFlags &= ~
2b580 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d  SF_Distinct;.  }
2b590 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
2b5a0 50 72 65 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Prep(pParse, p, 
2b5b0 30 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 53  0);.  memset(&sS
2b5c0 6f 72 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  ort, 0, sizeof(s
2b5d0 53 6f 72 74 29 29 3b 0a 20 20 73 53 6f 72 74 2e  Sort));.  sSort.
2b5e0 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
2b5f0 72 64 65 72 42 79 3b 0a 20 20 70 54 61 62 4c 69  rderBy;.  pTabLi
2b600 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  st = p->pSrc;.  
2b610 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
2b620 73 74 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  st;.  if( pParse
2b630 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61  ->nErr || db->ma
2b640 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
2b650 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
2b660 64 3b 0a 20 20 7d 0a 20 20 69 73 41 67 67 20 3d  d;.  }.  isAgg =
2b670 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
2b680 53 46 5f 41 67 67 72 65 67 61 74 65 29 21 3d 30  SF_Aggregate)!=0
2b690 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 4c 69  ;.  assert( pELi
2b6a0 73 74 21 3d 30 20 29 3b 0a 23 69 66 20 53 45 4c  st!=0 );.#if SEL
2b6b0 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ECTTRACE_ENABLED
2b6c0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65  .  if( sqlite3Se
2b6d0 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 31 30  lectTrace & 0x10
2b6e0 30 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54  0 ){.    SELECTT
2b6f0 52 41 43 45 28 30 78 31 30 30 2c 70 50 61 72 73  RACE(0x100,pPars
2b700 65 2c 70 2c 20 28 22 61 66 74 65 72 20 6e 61 6d  e,p, ("after nam
2b710 65 20 72 65 73 6f 6c 75 74 69 6f 6e 3a 5c 6e 22  e resolution:\n"
2b720 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  ));.    sqlite3T
2b730 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c  reeViewSelect(0,
2b740 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   p, 0);.  }.#end
2b750 69 66 0a 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20  if...  /* Begin 
2b760 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 2e  generating code.
2b770 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  .  */.  v = sqli
2b780 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
2b790 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  e);.  if( v==0 )
2b7a0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
2b7b0 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 72 69 74 69  ;..  /* If writi
2b7c0 6e 67 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 72 20  ng to memory or 
2b7d0 67 65 6e 65 72 61 74 69 6e 67 20 61 20 73 65 74  generating a set
2b7e0 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e  .  ** only a sin
2b7f0 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61 79 20 62  gle column may b
2b800 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 23  e output..  */.#
2b810 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2b820 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 69 66  IT_SUBQUERY.  if
2b830 28 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43  ( checkForMultiC
2b840 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72  olumnSelectError
2b850 28 70 50 61 72 73 65 2c 20 70 44 65 73 74 2c 20  (pParse, pDest, 
2b860 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29  pEList->nExpr) )
2b870 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63  {.    goto selec
2b880 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64 69  t_end;.  }.#endi
2b890 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  f..  /* Generate
2b8a0 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75   code for all su
2b8b0 62 2d 71 75 65 72 69 65 73 20 69 6e 20 74 68 65  b-queries in the
2b8c0 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a   FROM clause.  *
2b8d0 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
2b8e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
2b8f0 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
2b900 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
2b910 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20 21 70  W).  for(i=0; !p
2b920 2d 3e 70 50 72 69 6f 72 20 26 26 20 69 3c 70 54  ->pPrior && i<pT
2b930 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
2b940 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53  +){.    struct S
2b950 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
2b960 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
2b970 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74  a[i];.    Select
2b980 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20 53  Dest dest;.    S
2b990 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70 49  elect *pSub = pI
2b9a0 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  tem->pSelect;.  
2b9b0 20 20 69 6e 74 20 69 73 41 67 67 53 75 62 3b 0a    int isAggSub;.
2b9c0 0a 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30  .    if( pSub==0
2b9d0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20   ) continue;..  
2b9e0 20 20 2f 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74    /* Sometimes t
2b9f0 68 65 20 63 6f 64 65 20 66 6f 72 20 61 20 73 75  he code for a su
2ba00 62 71 75 65 72 79 20 77 69 6c 6c 20 62 65 20 67  bquery will be g
2ba10 65 6e 65 72 61 74 65 64 20 6d 6f 72 65 20 74 68  enerated more th
2ba20 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e 63 65 2c 20  an.    ** once, 
2ba30 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  if the subquery 
2ba40 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 57  is part of the W
2ba50 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 20 61  HERE clause in a
2ba60 20 4c 45 46 54 20 4a 4f 49 4e 2c 0a 20 20 20 20   LEFT JOIN,.    
2ba70 2a 2a 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20  ** for example. 
2ba80 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 64   In that case, d
2ba90 6f 20 6e 6f 74 20 72 65 67 65 6e 65 72 61 74 65  o not regenerate
2baa0 20 74 68 65 20 63 6f 64 65 20 74 6f 20 6d 61 6e   the code to man
2bab0 69 66 65 73 74 0a 20 20 20 20 2a 2a 20 61 20 76  ifest.    ** a v
2bac0 69 65 77 20 6f 72 20 74 68 65 20 63 6f 2d 72 6f  iew or the co-ro
2bad0 75 74 69 6e 65 20 74 6f 20 69 6d 70 6c 65 6d 65  utine to impleme
2bae0 6e 74 20 61 20 76 69 65 77 2e 20 20 54 68 65 20  nt a view.  The 
2baf0 66 69 72 73 74 20 69 6e 73 74 61 6e 63 65 0a 20  first instance. 
2bb00 20 20 20 2a 2a 20 69 73 20 73 75 66 66 69 63 69     ** is suffici
2bb10 65 6e 74 2c 20 74 68 6f 75 67 68 20 74 68 65 20  ent, though the 
2bb20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 6d 61  subroutine to ma
2bb30 6e 69 66 65 73 74 20 74 68 65 20 76 69 65 77 20  nifest the view 
2bb40 64 6f 65 73 20 6e 65 65 64 0a 20 20 20 20 2a 2a  does need.    **
2bb50 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 61   to be invoked a
2bb60 67 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28  gain. */.    if(
2bb70 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c   pItem->addrFill
2bb80 53 75 62 20 29 7b 0a 20 20 20 20 20 20 69 66 28  Sub ){.      if(
2bb90 20 70 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75   pItem->viaCorou
2bba0 74 69 6e 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  tine==0 ){.     
2bbb0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2bbc0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
2bbd0 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  , pItem->regRetu
2bbe0 72 6e 2c 20 70 49 74 65 6d 2d 3e 61 64 64 72 46  rn, pItem->addrF
2bbf0 69 6c 6c 53 75 62 29 3b 0a 20 20 20 20 20 20 7d  illSub);.      }
2bc00 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
2bc10 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
2bc20 6e 63 72 65 6d 65 6e 74 20 50 61 72 73 65 2e 6e  ncrement Parse.n
2bc30 48 65 69 67 68 74 20 62 79 20 74 68 65 20 68 65  Height by the he
2bc40 69 67 68 74 20 6f 66 20 74 68 65 20 6c 61 72 67  ight of the larg
2bc50 65 73 74 20 65 78 70 72 65 73 73 69 6f 6e 0a 20  est expression. 
2bc60 20 20 20 2a 2a 20 74 72 65 65 20 72 65 66 65 72     ** tree refer
2bc70 72 65 64 20 74 6f 20 62 79 20 74 68 69 73 2c 20  red to by this, 
2bc80 74 68 65 20 70 61 72 65 6e 74 20 73 65 6c 65 63  the parent selec
2bc90 74 2e 20 54 68 65 20 63 68 69 6c 64 20 73 65 6c  t. The child sel
2bca0 65 63 74 0a 20 20 20 20 2a 2a 20 6d 61 79 20 63  ect.    ** may c
2bcb0 6f 6e 74 61 69 6e 20 65 78 70 72 65 73 73 69 6f  ontain expressio
2bcc0 6e 20 74 72 65 65 73 20 6f 66 20 61 74 20 6d 6f  n trees of at mo
2bcd0 73 74 0a 20 20 20 20 2a 2a 20 28 53 51 4c 49 54  st.    ** (SQLIT
2bce0 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48  E_MAX_EXPR_DEPTH
2bcf0 2d 50 61 72 73 65 2e 6e 48 65 69 67 68 74 29 20  -Parse.nHeight) 
2bd00 68 65 69 67 68 74 2e 20 54 68 69 73 20 69 73 20  height. This is 
2bd10 61 20 62 69 74 0a 20 20 20 20 2a 2a 20 6d 6f 72  a bit.    ** mor
2bd20 65 20 63 6f 6e 73 65 72 76 61 74 69 76 65 20 74  e conservative t
2bd30 68 61 6e 20 6e 65 63 65 73 73 61 72 79 2c 20 62  han necessary, b
2bd40 75 74 20 6d 75 63 68 20 65 61 73 69 65 72 20 74  ut much easier t
2bd50 68 61 6e 20 65 6e 66 6f 72 63 69 6e 67 0a 20 20  han enforcing.  
2bd60 20 20 2a 2a 20 61 6e 20 65 78 61 63 74 20 6c 69    ** an exact li
2bd70 6d 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  mit..    */.    
2bd80 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20  pParse->nHeight 
2bd90 2b 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  += sqlite3Select
2bda0 45 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a 0a  ExprHeight(p);..
2bdb0 20 20 20 20 69 73 41 67 67 53 75 62 20 3d 20 28      isAggSub = (
2bdc0 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSub->selFlags &
2bdd0 20 53 46 5f 41 67 67 72 65 67 61 74 65 29 21 3d   SF_Aggregate)!=
2bde0 30 3b 0a 20 20 20 20 69 66 28 20 66 6c 61 74 74  0;.    if( flatt
2bdf0 65 6e 53 75 62 71 75 65 72 79 28 70 50 61 72 73  enSubquery(pPars
2be00 65 2c 20 70 2c 20 69 2c 20 69 73 41 67 67 2c 20  e, p, i, isAgg, 
2be10 69 73 41 67 67 53 75 62 29 20 29 7b 0a 20 20 20  isAggSub) ){.   
2be20 20 20 20 2f 2a 20 54 68 69 73 20 73 75 62 71 75     /* This subqu
2be30 65 72 79 20 63 61 6e 20 62 65 20 61 62 73 6f 72  ery can be absor
2be40 62 65 64 20 69 6e 74 6f 20 69 74 73 20 70 61 72  bed into its par
2be50 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  ent. */.      if
2be60 28 20 69 73 41 67 67 53 75 62 20 29 7b 0a 20 20  ( isAggSub ){.  
2be70 20 20 20 20 20 20 69 73 41 67 67 20 3d 20 31 3b        isAgg = 1;
2be80 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 65 6c 46  .        p->selF
2be90 6c 61 67 73 20 7c 3d 20 53 46 5f 41 67 67 72 65  lags |= SF_Aggre
2bea0 67 61 74 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  gate;.      }.  
2beb0 20 20 20 20 69 20 3d 20 2d 31 3b 0a 20 20 20 20      i = -1;.    
2bec0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28  }else{.      if(
2bed0 20 28 70 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70   (pItem->jointyp
2bee0 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 3d 3d 30  e & JT_OUTER)==0
2bef0 0a 20 20 20 20 20 20 20 26 26 20 70 75 73 68 44  .       && pushD
2bf00 6f 77 6e 57 68 65 72 65 54 65 72 6d 73 28 64 62  ownWhereTerms(db
2bf10 2c 20 70 53 75 62 2c 20 70 2d 3e 70 57 68 65 72  , pSub, p->pWher
2bf20 65 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  e, pItem->iCurso
2bf30 72 29 0a 20 20 20 20 20 20 29 7b 0a 23 69 66 20  r).      ){.#if 
2bf40 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42  SELECTTRACE_ENAB
2bf50 4c 45 44 0a 20 20 20 20 20 20 20 20 69 66 28 20  LED.        if( 
2bf60 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61  sqlite3SelectTra
2bf70 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20 20  ce & 0x100 ){.  
2bf80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
2bf90 65 62 75 67 50 72 69 6e 74 66 28 22 41 66 74 65  ebugPrintf("Afte
2bfa0 72 20 57 48 45 52 45 2d 63 6c 61 75 73 65 20 70  r WHERE-clause p
2bfb0 75 73 68 2d 64 6f 77 6e 3a 5c 6e 22 29 3b 0a 20  ush-down:\n");. 
2bfc0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2bfd0 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30  TreeViewSelect(0
2bfe0 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , p, 0);.       
2bff0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
2c000 7d 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  }.      if( pTab
2c010 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 31 0a 20 20  List->nSrc==1.  
2c020 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61       && Optimiza
2c030 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20  tionEnabled(db, 
2c040 53 51 4c 49 54 45 5f 53 75 62 71 43 6f 72 6f 75  SQLITE_SubqCorou
2c050 74 69 6e 65 29 0a 20 20 20 20 20 20 29 7b 0a 20  tine).      ){. 
2c060 20 20 20 20 20 20 20 2f 2a 20 49 6d 70 6c 65 6d         /* Implem
2c070 65 6e 74 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65  ent a co-routine
2c080 20 74 68 61 74 20 77 69 6c 6c 20 72 65 74 75 72   that will retur
2c090 6e 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f  n a single row o
2c0a0 66 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20  f the result.   
2c0b0 20 20 20 20 20 2a 2a 20 73 65 74 20 6f 6e 20 65       ** set on e
2c0c0 61 63 68 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a  ach invocation..
2c0d0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2c0e0 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70 20 3d     int addrTop =
2c0f0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
2c100 65 6e 74 41 64 64 72 28 76 29 2b 31 3b 0a 20 20  entAddr(v)+1;.  
2c110 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 67        pItem->reg
2c120 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73  Return = ++pPars
2c130 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20  e->nMem;.       
2c140 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2c150 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72  p3(v, OP_InitCor
2c160 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72  outine, pItem->r
2c170 65 67 52 65 74 75 72 6e 2c 20 30 2c 20 61 64 64  egReturn, 0, add
2c180 72 54 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 56  rTop);.        V
2c190 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
2c1a0 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62  %s", pItem->pTab
2c1b0 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  ->zName));.     
2c1c0 20 20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69     pItem->addrFi
2c1d0 6c 6c 53 75 62 20 3d 20 61 64 64 72 54 6f 70 3b  llSub = addrTop;
2c1e0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2c1f0 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
2c200 64 65 73 74 2c 20 53 52 54 5f 43 6f 72 6f 75 74  dest, SRT_Corout
2c210 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52  ine, pItem->regR
2c220 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 20 20  eturn);.        
2c230 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
2c240 72 28 70 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74  r(pItem->iSelect
2c250 49 64 2c 20 28 75 38 29 70 50 61 72 73 65 2d 3e  Id, (u8)pParse->
2c260 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
2c270 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
2c280 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
2c290 75 62 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20  ub, &dest);.    
2c2a0 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d      pItem->pTab-
2c2b0 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 73 71  >nRowLogEst = sq
2c2c0 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 53 75 62  lite3LogEst(pSub
2c2d0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20  ->nSelectRow);. 
2c2e0 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 76 69         pItem->vi
2c2f0 61 43 6f 72 6f 75 74 69 6e 65 20 3d 20 31 3b 0a  aCoroutine = 1;.
2c300 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72          pItem->r
2c310 65 67 52 65 73 75 6c 74 20 3d 20 64 65 73 74 2e  egResult = dest.
2c320 69 53 64 73 74 3b 0a 20 20 20 20 20 20 20 20 73  iSdst;.        s
2c330 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
2c340 28 76 2c 20 4f 50 5f 45 6e 64 43 6f 72 6f 75 74  (v, OP_EndCorout
2c350 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52  ine, pItem->regR
2c360 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 20 20  eturn);.        
2c370 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
2c380 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70 2d 31  ere(v, addrTop-1
2c390 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2c3a0 65 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61  e3ClearTempRegCa
2c3b0 63 68 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  che(pParse);.   
2c3c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2c3d0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
2c3e0 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
2c3f0 77 69 6c 6c 20 66 69 6c 6c 20 61 6e 20 65 70 68  will fill an eph
2c400 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69 74  emeral table wit
2c410 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  h.        ** the
2c420 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69 73   content of this
2c430 20 73 75 62 71 75 65 72 79 2e 20 20 70 49 74 65   subquery.  pIte
2c440 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 77  m->addrFillSub w
2c450 69 6c 6c 20 70 6f 69 6e 74 0a 20 20 20 20 20 20  ill point.      
2c460 20 20 2a 2a 20 74 6f 20 74 68 65 20 61 64 64 72    ** to the addr
2c470 65 73 73 20 6f 66 20 74 68 65 20 67 65 6e 65 72  ess of the gener
2c480 61 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65 2e  ated subroutine.
2c490 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75    pItem->regRetu
2c4a0 72 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73  rn.        ** is
2c4b0 20 61 20 72 65 67 69 73 74 65 72 20 61 6c 6c 6f   a register allo
2c4c0 63 61 74 65 64 20 74 6f 20 68 6f 6c 64 20 74 68  cated to hold th
2c4d0 65 20 73 75 62 72 6f 75 74 69 6e 65 20 72 65 74  e subroutine ret
2c4e0 75 72 6e 20 61 64 64 72 65 73 73 0a 20 20 20 20  urn address.    
2c4f0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
2c500 6e 74 20 74 6f 70 41 64 64 72 3b 0a 20 20 20 20  nt topAddr;.    
2c510 20 20 20 20 69 6e 74 20 6f 6e 63 65 41 64 64 72      int onceAddr
2c520 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e   = 0;.        in
2c530 74 20 72 65 74 41 64 64 72 3b 0a 20 20 20 20 20  t retAddr;.     
2c540 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d     assert( pItem
2c550 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 3d 3d 30  ->addrFillSub==0
2c560 20 29 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65   );.        pIte
2c570 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b  m->regReturn = +
2c580 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
2c590 20 20 20 20 20 20 20 74 6f 70 41 64 64 72 20 3d         topAddr =
2c5a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2c5b0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
2c5c0 2c 20 30 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52  , 0, pItem->regR
2c5d0 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 20 20  eturn);.        
2c5e0 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
2c5f0 75 62 20 3d 20 74 6f 70 41 64 64 72 2b 31 3b 0a  ub = topAddr+1;.
2c600 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65          if( pIte
2c610 6d 2d 3e 69 73 43 6f 72 72 65 6c 61 74 65 64 3d  m->isCorrelated=
2c620 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2c630 2f 2a 20 49 66 20 74 68 65 20 73 75 62 71 75 65  /* If the subque
2c640 72 79 20 69 73 20 6e 6f 74 20 63 6f 72 72 65 6c  ry is not correl
2c650 61 74 65 64 20 61 6e 64 20 69 66 20 77 65 20 61  ated and if we a
2c660 72 65 20 6e 6f 74 20 69 6e 73 69 64 65 20 6f 66  re not inside of
2c670 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 20  .          ** a 
2c680 74 72 69 67 67 65 72 2c 20 74 68 65 6e 20 77 65  trigger, then we
2c690 20 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20 63 6f   only need to co
2c6a0 6d 70 75 74 65 20 74 68 65 20 76 61 6c 75 65 20  mpute the value 
2c6b0 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 0a  of the subquery.
2c6c0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 63            ** onc
2c6d0 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  e. */.          
2c6e0 6f 6e 63 65 41 64 64 72 20 3d 20 73 71 6c 69 74  onceAddr = sqlit
2c6f0 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73  e3CodeOnce(pPars
2c700 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
2c710 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56  (v);.          V
2c720 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
2c730 6d 61 74 65 72 69 61 6c 69 7a 65 20 5c 22 25 73  materialize \"%s
2c740 5c 22 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62  \"", pItem->pTab
2c750 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  ->zName));.     
2c760 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2c770 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d      VdbeNoopComm
2c780 65 6e 74 28 28 76 2c 20 22 6d 61 74 65 72 69 61  ent((v, "materia
2c790 6c 69 7a 65 20 5c 22 25 73 5c 22 22 2c 20 70 49  lize \"%s\"", pI
2c7a0 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  tem->pTab->zName
2c7b0 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ));.        }.  
2c7c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
2c7d0 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
2c7e0 74 2c 20 53 52 54 5f 45 70 68 65 6d 54 61 62 2c  t, SRT_EphemTab,
2c7f0 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29   pItem->iCursor)
2c800 3b 0a 20 20 20 20 20 20 20 20 65 78 70 6c 61 69  ;.        explai
2c810 6e 53 65 74 49 6e 74 65 67 65 72 28 70 49 74 65  nSetInteger(pIte
2c820 6d 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 28 75  m->iSelectId, (u
2c830 38 29 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  8)pParse->iNextS
2c840 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20  electId);.      
2c850 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
2c860 70 50 61 72 73 65 2c 20 70 53 75 62 2c 20 26 64  pParse, pSub, &d
2c870 65 73 74 29 3b 0a 20 20 20 20 20 20 20 20 70 49  est);.        pI
2c880 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 4c  tem->pTab->nRowL
2c890 6f 67 45 73 74 20 3d 20 73 71 6c 69 74 65 33 4c  ogEst = sqlite3L
2c8a0 6f 67 45 73 74 28 70 53 75 62 2d 3e 6e 53 65 6c  ogEst(pSub->nSel
2c8b0 65 63 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 20  ectRow);.       
2c8c0 20 69 66 28 20 6f 6e 63 65 41 64 64 72 20 29 20   if( onceAddr ) 
2c8d0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
2c8e0 65 72 65 28 76 2c 20 6f 6e 63 65 41 64 64 72 29  ere(v, onceAddr)
2c8f0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 41 64 64  ;.        retAdd
2c900 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
2c910 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
2c920 72 6e 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65  rn, pItem->regRe
2c930 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 20 20 56  turn);.        V
2c940 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
2c950 65 6e 64 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e  end %s", pItem->
2c960 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  pTab->zName));. 
2c970 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2c980 62 65 43 68 61 6e 67 65 50 31 28 76 2c 20 74 6f  beChangeP1(v, to
2c990 70 41 64 64 72 2c 20 72 65 74 41 64 64 72 29 3b  pAddr, retAddr);
2c9a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2c9b0 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63 68  ClearTempRegCach
2c9c0 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  e(pParse);.     
2c9d0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
2c9e0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
2c9f0 64 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  d ){.      goto 
2ca00 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
2ca10 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48  }.    pParse->nH
2ca20 65 69 67 68 74 20 2d 3d 20 73 71 6c 69 74 65 33  eight -= sqlite3
2ca30 53 65 6c 65 63 74 45 78 70 72 48 65 69 67 68 74  SelectExprHeight
2ca40 28 70 29 3b 0a 20 20 20 20 70 54 61 62 4c 69 73  (p);.    pTabLis
2ca50 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20  t = p->pSrc;.   
2ca60 20 69 66 28 20 21 49 67 6e 6f 72 61 62 6c 65 4f   if( !IgnorableO
2ca70 72 64 65 72 62 79 28 70 44 65 73 74 29 20 29 7b  rderby(pDest) ){
2ca80 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72  .      sSort.pOr
2ca90 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
2caa0 72 42 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  rBy;.    }.  }. 
2cab0 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c   pEList = p->pEL
2cac0 69 73 74 3b 0a 23 65 6e 64 69 66 0a 20 20 70 57  ist;.#endif.  pW
2cad0 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65  here = p->pWhere
2cae0 3b 0a 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70  ;.  pGroupBy = p
2caf0 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 48  ->pGroupBy;.  pH
2cb00 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69  aving = p->pHavi
2cb10 6e 67 3b 0a 20 20 73 44 69 73 74 69 6e 63 74 2e  ng;.  sDistinct.
2cb20 69 73 54 6e 63 74 20 3d 20 28 70 2d 3e 73 65 6c  isTnct = (p->sel
2cb30 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
2cb40 6e 63 74 29 21 3d 30 3b 0a 0a 23 69 66 6e 64 65  nct)!=0;..#ifnde
2cb50 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
2cb60 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20  MPOUND_SELECT.  
2cb70 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
2cb80 72 65 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66  re a sequence of
2cb90 20 71 75 65 72 69 65 73 2c 20 64 6f 20 74 68 65   queries, do the
2cba0 20 65 61 72 6c 69 65 72 20 6f 6e 65 73 20 66 69   earlier ones fi
2cbb0 72 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  rst..  */.  if( 
2cbc0 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  p->pPrior ){.   
2cbd0 20 72 63 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63   rc = multiSelec
2cbe0 74 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65  t(pParse, p, pDe
2cbf0 73 74 29 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e  st);.    explain
2cc00 53 65 74 49 6e 74 65 67 65 72 28 70 50 61 72 73  SetInteger(pPars
2cc10 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 69 52  e->iSelectId, iR
2cc20 65 73 74 6f 72 65 53 65 6c 65 63 74 49 64 29 3b  estoreSelectId);
2cc30 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45  .#if SELECTTRACE
2cc40 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 53 45 4c  _ENABLED.    SEL
2cc50 45 43 54 54 52 41 43 45 28 31 2c 70 50 61 72 73  ECTTRACE(1,pPars
2cc60 65 2c 70 2c 28 22 65 6e 64 20 63 6f 6d 70 6f 75  e,p,("end compou
2cc70 6e 64 2d 73 65 6c 65 63 74 20 70 72 6f 63 65 73  nd-select proces
2cc80 73 69 6e 67 5c 6e 22 29 29 3b 0a 20 20 20 20 70  sing\n"));.    p
2cc90 50 61 72 73 65 2d 3e 6e 53 65 6c 65 63 74 49 6e  Parse->nSelectIn
2cca0 64 65 6e 74 2d 2d 3b 0a 23 65 6e 64 69 66 0a 20  dent--;.#endif. 
2ccb0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2ccc0 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
2ccd0 20 53 51 4c 49 54 45 5f 43 4f 55 4e 54 4f 46 56   SQLITE_COUNTOFV
2cce0 49 45 57 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  IEW_OPTIMIZATION
2ccf0 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74  .  if( Optimizat
2cd00 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53  ionEnabled(db, S
2cd10 51 4c 49 54 45 5f 51 75 65 72 79 46 6c 61 74 74  QLITE_QueryFlatt
2cd20 65 6e 65 72 7c 53 51 4c 49 54 45 5f 43 6f 75 6e  ener|SQLITE_Coun
2cd30 74 4f 66 56 69 65 77 29 0a 20 20 20 26 26 20 63  tOfView).   && c
2cd40 6f 75 6e 74 4f 66 56 69 65 77 4f 70 74 69 6d 69  ountOfViewOptimi
2cd50 7a 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70  zation(pParse, p
2cd60 29 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 64  ).  ){.    if( d
2cd70 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2cd80 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
2cd90 64 3b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20  d;.    pEList = 
2cda0 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 70  p->pEList;.    p
2cdb0 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  TabList = p->pSr
2cdc0 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  c;.  }.#endif.. 
2cdd0 20 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72 79   /* If the query
2cde0 20 69 73 20 44 49 53 54 49 4e 43 54 20 77 69 74   is DISTINCT wit
2cdf0 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20 62 75  h an ORDER BY bu
2ce00 74 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72  t is not an aggr
2ce10 65 67 61 74 65 2c 20 61 6e 64 20 0a 20 20 2a 2a  egate, and .  **
2ce20 20 69 66 20 74 68 65 20 73 65 6c 65 63 74 2d 6c   if the select-l
2ce30 69 73 74 20 69 73 20 74 68 65 20 73 61 6d 65 20  ist is the same 
2ce40 61 73 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  as the ORDER BY 
2ce50 6c 69 73 74 2c 20 74 68 65 6e 20 74 68 69 73 20  list, then this 
2ce60 71 75 65 72 79 0a 20 20 2a 2a 20 63 61 6e 20 62  query.  ** can b
2ce70 65 20 72 65 77 72 69 74 74 65 6e 20 61 73 20 61  e rewritten as a
2ce80 20 47 52 4f 55 50 20 42 59 2e 20 49 6e 20 6f 74   GROUP BY. In ot
2ce90 68 65 72 20 77 6f 72 64 73 2c 20 74 68 69 73 3a  her words, this:
2cea0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
2ceb0 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 78  ELECT DISTINCT x
2cec0 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20 4f 52 44 45  yz FROM ... ORDE
2ced0 52 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20 20  R BY xyz.  **.  
2cee0 2a 2a 20 69 73 20 74 72 61 6e 73 66 6f 72 6d 65  ** is transforme
2cef0 64 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  d to:.  **.  ** 
2cf00 20 20 20 20 53 45 4c 45 43 54 20 78 79 7a 20 46      SELECT xyz F
2cf10 52 4f 4d 20 2e 2e 2e 20 47 52 4f 55 50 20 42 59  ROM ... GROUP BY
2cf20 20 78 79 7a 20 4f 52 44 45 52 20 42 59 20 78 79   xyz ORDER BY xy
2cf30 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  z.  **.  ** The 
2cf40 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69 73 20 70  second form is p
2cf50 72 65 66 65 72 72 65 64 20 61 73 20 61 20 73 69  referred as a si
2cf60 6e 67 6c 65 20 69 6e 64 65 78 20 28 6f 72 20 74  ngle index (or t
2cf70 65 6d 70 2d 74 61 62 6c 65 29 20 6d 61 79 20 62  emp-table) may b
2cf80 65 20 0a 20 20 2a 2a 20 75 73 65 64 20 66 6f 72  e .  ** used for
2cf90 20 62 6f 74 68 20 74 68 65 20 4f 52 44 45 52 20   both the ORDER 
2cfa0 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54 20  BY and DISTINCT 
2cfb0 70 72 6f 63 65 73 73 69 6e 67 2e 20 41 73 20 6f  processing. As o
2cfc0 72 69 67 69 6e 61 6c 6c 79 20 0a 20 20 2a 2a 20  riginally .  ** 
2cfd0 77 72 69 74 74 65 6e 20 74 68 65 20 71 75 65 72  written the quer
2cfe0 79 20 6d 75 73 74 20 75 73 65 20 61 20 74 65 6d  y must use a tem
2cff0 70 2d 74 61 62 6c 65 20 66 6f 72 20 61 74 20 6c  p-table for at l
2d000 65 61 73 74 20 6f 6e 65 20 6f 66 20 74 68 65 20  east one of the 
2d010 4f 52 44 45 52 20 0a 20 20 2a 2a 20 42 59 20 61  ORDER .  ** BY a
2d020 6e 64 20 44 49 53 54 49 4e 43 54 2c 20 61 6e 64  nd DISTINCT, and
2d030 20 61 6e 20 69 6e 64 65 78 20 6f 72 20 73 65 70   an index or sep
2d040 61 72 61 74 65 20 74 65 6d 70 2d 74 61 62 6c 65  arate temp-table
2d050 20 66 6f 72 20 74 68 65 20 6f 74 68 65 72 2e 0a   for the other..
2d060 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73    */.  if( (p->s
2d070 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69  elFlags & (SF_Di
2d080 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67  stinct|SF_Aggreg
2d090 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e  ate))==SF_Distin
2d0a0 63 74 20 0a 20 20 20 26 26 20 73 71 6c 69 74 65  ct .   && sqlite
2d0b0 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65  3ExprListCompare
2d0c0 28 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c  (sSort.pOrderBy,
2d0d0 20 70 2d 3e 70 45 4c 69 73 74 2c 20 2d 31 29 3d   p->pEList, -1)=
2d0e0 3d 30 0a 20 20 29 7b 0a 20 20 20 20 70 2d 3e 73  =0.  ){.    p->s
2d0f0 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44  elFlags &= ~SF_D
2d100 69 73 74 69 6e 63 74 3b 0a 20 20 20 20 70 2d 3e  istinct;.    p->
2d110 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74  pGroupBy = sqlit
2d120 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
2d130 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30 29 3b  , p->pEList, 0);
2d140 0a 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20  .    pGroupBy = 
2d150 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20  p->pGroupBy;.   
2d160 20 2f 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20   /* Notice that 
2d170 65 76 65 6e 20 74 68 6f 75 67 68 74 20 53 46 5f  even thought SF_
2d180 44 69 73 74 69 6e 63 74 20 68 61 73 20 62 65 65  Distinct has bee
2d190 6e 20 63 6c 65 61 72 65 64 20 66 72 6f 6d 20 70  n cleared from p
2d1a0 2d 3e 73 65 6c 46 6c 61 67 73 2c 0a 20 20 20 20  ->selFlags,.    
2d1b0 2a 2a 20 74 68 65 20 73 44 69 73 74 69 6e 63 74  ** the sDistinct
2d1c0 2e 69 73 54 6e 63 74 20 69 73 20 73 74 69 6c 6c  .isTnct is still
2d1d0 20 73 65 74 2e 20 20 48 65 6e 63 65 2c 20 69 73   set.  Hence, is
2d1e0 54 6e 63 74 20 72 65 70 72 65 73 65 6e 74 73 20  Tnct represents 
2d1f0 74 68 65 0a 20 20 20 20 2a 2a 20 6f 72 69 67 69  the.    ** origi
2d200 6e 61 6c 20 73 65 74 74 69 6e 67 20 6f 66 20 74  nal setting of t
2d210 68 65 20 53 46 5f 44 69 73 74 69 6e 63 74 20 66  he SF_Distinct f
2d220 6c 61 67 2c 20 6e 6f 74 20 74 68 65 20 63 75 72  lag, not the cur
2d230 72 65 6e 74 20 73 65 74 74 69 6e 67 20 2a 2f 0a  rent setting */.
2d240 20 20 20 20 61 73 73 65 72 74 28 20 73 44 69 73      assert( sDis
2d250 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 29 3b 0a  tinct.isTnct );.
2d260 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
2d270 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  re is an ORDER B
2d280 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74  Y clause, then t
2d290 68 69 73 20 73 6f 72 74 69 6e 67 0a 20 20 2a 2a  his sorting.  **
2d2a0 20 69 6e 64 65 78 20 6d 69 67 68 74 20 65 6e 64   index might end
2d2b0 20 75 70 20 62 65 69 6e 67 20 75 6e 75 73 65 64   up being unused
2d2c0 20 69 66 20 74 68 65 20 64 61 74 61 20 63 61 6e   if the data can
2d2d0 20 62 65 20 0a 20 20 2a 2a 20 65 78 74 72 61 63   be .  ** extrac
2d2e0 74 65 64 20 69 6e 20 70 72 65 2d 73 6f 72 74 65  ted in pre-sorte
2d2f0 64 20 6f 72 64 65 72 2e 20 20 49 66 20 74 68 61  d order.  If tha
2d300 74 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  t is the case, t
2d310 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 4f 50 5f  hen the.  ** OP_
2d320 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e  OpenEphemeral in
2d330 73 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20 62  struction will b
2d340 65 20 63 68 61 6e 67 65 64 20 74 6f 20 61 6e 20  e changed to an 
2d350 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65 0a 20 20 2a  OP_Noop once.  *
2d360 2a 20 77 65 20 66 69 67 75 72 65 20 6f 75 74 20  * we figure out 
2d370 74 68 61 74 20 74 68 65 20 73 6f 72 74 69 6e 67  that the sorting
2d380 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 6e 65   index is not ne
2d390 65 64 65 64 2e 20 20 54 68 65 20 61 64 64 72 53  eded.  The addrS
2d3a0 6f 72 74 49 6e 64 65 78 0a 20 20 2a 2a 20 76 61  ortIndex.  ** va
2d3b0 72 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74  riable is used t
2d3c0 6f 20 66 61 63 69 6c 69 74 61 74 65 20 74 68 61  o facilitate tha
2d3d0 74 20 63 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a 20  t change..  */. 
2d3e0 20 69 66 28 20 73 53 6f 72 74 2e 70 4f 72 64 65   if( sSort.pOrde
2d3f0 72 42 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e  rBy ){.    KeyIn
2d400 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  fo *pKeyInfo;.  
2d410 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79    pKeyInfo = key
2d420 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
2d430 28 70 50 61 72 73 65 2c 20 73 53 6f 72 74 2e 70  (pParse, sSort.p
2d440 4f 72 64 65 72 42 79 2c 20 30 2c 20 70 45 4c 69  OrderBy, 0, pELi
2d450 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20  st->nExpr);.    
2d460 73 53 6f 72 74 2e 69 45 43 75 72 73 6f 72 20 3d  sSort.iECursor =
2d470 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
2d480 0a 20 20 20 20 73 53 6f 72 74 2e 61 64 64 72 53  .    sSort.addrS
2d490 6f 72 74 49 6e 64 65 78 20 3d 0a 20 20 20 20 20  ortIndex =.     
2d4a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2d4b0 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p4(v, OP_OpenEph
2d4c0 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20 20 20  emeral,.        
2d4d0 20 20 73 53 6f 72 74 2e 69 45 43 75 72 73 6f 72    sSort.iECursor
2d4e0 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79  , sSort.pOrderBy
2d4f0 2d 3e 6e 45 78 70 72 2b 31 2b 70 45 4c 69 73 74  ->nExpr+1+pEList
2d500 2d 3e 6e 45 78 70 72 2c 20 30 2c 0a 20 20 20 20  ->nExpr, 0,.    
2d510 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
2d520 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
2d530 4f 0a 20 20 20 20 20 20 29 3b 0a 20 20 7d 65 6c  O.      );.  }el
2d540 73 65 7b 0a 20 20 20 20 73 53 6f 72 74 2e 61 64  se{.    sSort.ad
2d550 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 20 2d 31  drSortIndex = -1
2d560 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
2d570 68 65 20 6f 75 74 70 75 74 20 69 73 20 64 65 73  he output is des
2d580 74 69 6e 65 64 20 66 6f 72 20 61 20 74 65 6d 70  tined for a temp
2d590 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 6f 70 65  orary table, ope
2d5a0 6e 20 74 68 61 74 20 74 61 62 6c 65 2e 0a 20 20  n that table..  
2d5b0 2a 2f 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e  */.  if( pDest->
2d5c0 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d  eDest==SRT_Ephem
2d5d0 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Tab ){.    sqlit
2d5e0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2d5f0 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
2d600 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
2d610 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
2d620 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  ;.  }..  /* Set 
2d630 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a 20 20 2a  the limiter..  *
2d640 2f 0a 20 20 69 45 6e 64 20 3d 20 73 71 6c 69 74  /.  iEnd = sqlit
2d650 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
2d660 76 29 3b 0a 20 20 70 2d 3e 6e 53 65 6c 65 63 74  v);.  p->nSelect
2d670 52 6f 77 20 3d 20 4c 41 52 47 45 53 54 5f 49 4e  Row = LARGEST_IN
2d680 54 36 34 3b 0a 20 20 63 6f 6d 70 75 74 65 4c 69  T64;.  computeLi
2d690 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
2d6a0 72 73 65 2c 20 70 2c 20 69 45 6e 64 29 3b 0a 20  rse, p, iEnd);. 
2d6b0 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3d 3d   if( p->iLimit==
2d6c0 30 20 26 26 20 73 53 6f 72 74 2e 61 64 64 72 53  0 && sSort.addrS
2d6d0 6f 72 74 49 6e 64 65 78 3e 3d 30 20 29 7b 0a 20  ortIndex>=0 ){. 
2d6e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 65     sqlite3VdbeGe
2d6f0 74 4f 70 28 76 2c 20 73 53 6f 72 74 2e 61 64 64  tOp(v, sSort.add
2d700 72 53 6f 72 74 49 6e 64 65 78 29 2d 3e 6f 70 63  rSortIndex)->opc
2d710 6f 64 65 20 3d 20 4f 50 5f 53 6f 72 74 65 72 4f  ode = OP_SorterO
2d720 70 65 6e 3b 0a 20 20 20 20 73 53 6f 72 74 2e 73  pen;.    sSort.s
2d730 6f 72 74 46 6c 61 67 73 20 7c 3d 20 53 4f 52 54  ortFlags |= SORT
2d740 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 3b 0a  FLAG_UseSorter;.
2d750 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61    }..  /* Open a
2d760 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74   virtual index t
2d770 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20 64 69  o use for the di
2d780 73 74 69 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f  stinct set..  */
2d790 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
2d7a0 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74  gs & SF_Distinct
2d7b0 20 29 7b 0a 20 20 20 20 73 44 69 73 74 69 6e 63   ){.    sDistinc
2d7c0 74 2e 74 61 62 54 6e 63 74 20 3d 20 70 50 61 72  t.tabTnct = pPar
2d7d0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
2d7e0 73 44 69 73 74 69 6e 63 74 2e 61 64 64 72 54 6e  sDistinct.addrTn
2d7f0 63 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ct = sqlite3Vdbe
2d800 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
2d810 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20  nEphemeral,.    
2d820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d830 20 20 20 20 20 20 20 20 20 20 20 20 73 44 69 73              sDis
2d840 74 69 6e 63 74 2e 74 61 62 54 6e 63 74 2c 20 30  tinct.tabTnct, 0
2d850 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
2d860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d870 20 20 20 20 20 28 63 68 61 72 2a 29 6b 65 79 49       (char*)keyI
2d880 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
2d890 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73  pParse, p->pELis
2d8a0 74 2c 30 2c 30 29 2c 0a 20 20 20 20 20 20 20 20  t,0,0),.        
2d8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d8c0 20 20 20 20 20 20 20 20 50 34 5f 4b 45 59 49 4e          P4_KEYIN
2d8d0 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  FO);.    sqlite3
2d8e0 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
2d8f0 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29  BTREE_UNORDERED)
2d900 3b 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e  ;.    sDistinct.
2d910 65 54 6e 63 74 54 79 70 65 20 3d 20 57 48 45 52  eTnctType = WHER
2d920 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44  E_DISTINCT_UNORD
2d930 45 52 45 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ERED;.  }else{. 
2d940 20 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e     sDistinct.eTn
2d950 63 74 54 79 70 65 20 3d 20 57 48 45 52 45 5f 44  ctType = WHERE_D
2d960 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20  ISTINCT_NOOP;.  
2d970 7d 0a 0a 20 20 69 66 28 20 21 69 73 41 67 67 20  }..  if( !isAgg 
2d980 26 26 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29  && pGroupBy==0 )
2d990 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 61 67 67 72  {.    /* No aggr
2d9a0 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
2d9b0 61 6e 64 20 6e 6f 20 47 52 4f 55 50 20 42 59 20  and no GROUP BY 
2d9c0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 75 31  clause */.    u1
2d9d0 36 20 77 63 74 72 6c 46 6c 61 67 73 20 3d 20 28  6 wctrlFlags = (
2d9e0 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74  sDistinct.isTnct
2d9f0 20 3f 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49   ? WHERE_WANT_DI
2da00 53 54 49 4e 43 54 20 3a 20 30 29 3b 0a 0a 20 20  STINCT : 0);..  
2da10 20 20 2f 2a 20 42 65 67 69 6e 20 74 68 65 20 64    /* Begin the d
2da20 61 74 61 62 61 73 65 20 73 63 61 6e 2e 20 2a 2f  atabase scan. */
2da30 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71  .    pWInfo = sq
2da40 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
2da50 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
2da60 2c 20 70 57 68 65 72 65 2c 20 73 53 6f 72 74 2e  , pWhere, sSort.
2da70 70 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20  pOrderBy,.      
2da80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2da90 20 20 20 20 20 20 20 20 20 70 2d 3e 70 45 4c 69           p->pELi
2daa0 73 74 2c 20 77 63 74 72 6c 46 6c 61 67 73 2c 20  st, wctrlFlags, 
2dab0 30 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e  0);.    if( pWIn
2dac0 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c  fo==0 ) goto sel
2dad0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28  ect_end;.    if(
2dae0 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f 75 74   sqlite3WhereOut
2daf0 70 75 74 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e  putRowCount(pWIn
2db00 66 6f 29 20 3c 20 70 2d 3e 6e 53 65 6c 65 63 74  fo) < p->nSelect
2db10 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  Row ){.      p->
2db20 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c  nSelectRow = sql
2db30 69 74 65 33 57 68 65 72 65 4f 75 74 70 75 74 52  ite3WhereOutputR
2db40 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66 6f 29 3b  owCount(pWInfo);
2db50 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
2db60 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20  Distinct.isTnct 
2db70 26 26 20 73 71 6c 69 74 65 33 57 68 65 72 65 49  && sqlite3WhereI
2db80 73 44 69 73 74 69 6e 63 74 28 70 57 49 6e 66 6f  sDistinct(pWInfo
2db90 29 20 29 7b 0a 20 20 20 20 20 20 73 44 69 73 74  ) ){.      sDist
2dba0 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d  inct.eTnctType =
2dbb0 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 44   sqlite3WhereIsD
2dbc0 69 73 74 69 6e 63 74 28 70 57 49 6e 66 6f 29 3b  istinct(pWInfo);
2dbd0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
2dbe0 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 29 7b  Sort.pOrderBy ){
2dbf0 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 6e 4f 42  .      sSort.nOB
2dc00 53 61 74 20 3d 20 73 71 6c 69 74 65 33 57 68 65  Sat = sqlite3Whe
2dc10 72 65 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e  reIsOrdered(pWIn
2dc20 66 6f 29 3b 0a 20 20 20 20 20 20 73 53 6f 72 74  fo);.      sSort
2dc30 2e 62 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f  .bOrderedInnerLo
2dc40 6f 70 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  op = sqlite3Wher
2dc50 65 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f 6f  eOrderedInnerLoo
2dc60 70 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20  p(pWInfo);.     
2dc70 20 69 66 28 20 73 53 6f 72 74 2e 6e 4f 42 53 61   if( sSort.nOBSa
2dc80 74 3d 3d 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  t==sSort.pOrderB
2dc90 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  y->nExpr ){.    
2dca0 20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72      sSort.pOrder
2dcb0 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  By = 0;.      }.
2dcc0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
2dcd0 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74   sorting index t
2dce0 68 61 74 20 77 61 73 20 63 72 65 61 74 65 64 20  hat was created 
2dcf0 62 79 20 61 20 70 72 69 6f 72 20 4f 50 5f 4f 70  by a prior OP_Op
2dd00 65 6e 45 70 68 65 6d 65 72 61 6c 20 0a 20 20 20  enEphemeral .   
2dd10 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   ** instruction 
2dd20 65 6e 64 65 64 20 75 70 20 6e 6f 74 20 62 65 69  ended up not bei
2dd30 6e 67 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20  ng needed, then 
2dd40 63 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70  change the OP_Op
2dd50 65 6e 45 70 68 65 6d 65 72 61 6c 0a 20 20 20 20  enEphemeral.    
2dd60 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f  ** into an OP_No
2dd70 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  op..    */.    i
2dd80 66 28 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72  f( sSort.addrSor
2dd90 74 49 6e 64 65 78 3e 3d 30 20 26 26 20 73 53 6f  tIndex>=0 && sSo
2dda0 72 74 2e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  rt.pOrderBy==0 )
2ddb0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
2ddc0 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28  dbeChangeToNoop(
2ddd0 76 2c 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72  v, sSort.addrSor
2dde0 74 49 6e 64 65 78 29 3b 0a 20 20 20 20 7d 0a 0a  tIndex);.    }..
2ddf0 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 73      /* Use the s
2de00 74 61 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f  tandard inner lo
2de10 6f 70 2e 20 2a 2f 0a 20 20 20 20 73 65 6c 65 63  op. */.    selec
2de20 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
2de30 65 2c 20 70 2c 20 70 45 4c 69 73 74 2c 20 2d 31  e, p, pEList, -1
2de40 2c 20 26 73 53 6f 72 74 2c 20 26 73 44 69 73 74  , &sSort, &sDist
2de50 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20 20 20  inct, pDest,.   
2de60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2de70 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6f 6e   sqlite3WhereCon
2de80 74 69 6e 75 65 4c 61 62 65 6c 28 70 57 49 6e 66  tinueLabel(pWInf
2de90 6f 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  o),.            
2dea0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
2deb0 68 65 72 65 42 72 65 61 6b 4c 61 62 65 6c 28 70  hereBreakLabel(p
2dec0 57 49 6e 66 6f 29 29 3b 0a 0a 20 20 20 20 2f 2a  WInfo));..    /*
2ded0 20 45 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   End the databas
2dee0 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20  e scan loop..   
2def0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 57   */.    sqlite3W
2df00 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b  hereEnd(pWInfo);
2df10 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
2df20 20 54 68 69 73 20 63 61 73 65 20 77 68 65 6e 20   This case when 
2df30 74 68 65 72 65 20 65 78 69 73 74 20 61 67 67 72  there exist aggr
2df40 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
2df50 6f 72 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c  or a GROUP BY cl
2df60 61 75 73 65 0a 20 20 20 20 2a 2a 20 6f 72 20 62  ause.    ** or b
2df70 6f 74 68 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43  oth */.    NameC
2df80 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20 2f  ontext sNC;    /
2df90 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66  * Name context f
2dfa0 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20 61 67  or processing ag
2dfb0 67 72 65 67 61 74 65 20 69 6e 66 6f 72 6d 61 74  gregate informat
2dfc0 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ion */.    int i
2dfd0 41 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f  AMem;          /
2dfe0 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72  * First Mem addr
2dff0 65 73 73 20 66 6f 72 20 73 74 6f 72 69 6e 67 20  ess for storing 
2e000 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59  current GROUP BY
2e010 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 42 4d 65   */.    int iBMe
2e020 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  m;          /* F
2e030 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73  irst Mem address
2e040 20 66 6f 72 20 70 72 65 76 69 6f 75 73 20 47 52   for previous GR
2e050 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e  OUP BY */.    in
2e060 74 20 69 55 73 65 46 6c 61 67 3b 20 20 20 20 20  t iUseFlag;     
2e070 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73    /* Mem address
2e080 20 68 6f 6c 64 69 6e 67 20 66 6c 61 67 20 69 6e   holding flag in
2e090 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 61 74  dicating that at
2e0a0 20 6c 65 61 73 74 0a 20 20 20 20 20 20 20 20 20   least.         
2e0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
2e0c0 2a 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65  * one row of the
2e0d0 20 69 6e 70 75 74 20 74 6f 20 74 68 65 20 61 67   input to the ag
2e0e0 67 72 65 67 61 74 6f 72 20 68 61 73 20 62 65 65  gregator has bee
2e0f0 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n.              
2e100 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f            ** pro
2e110 63 65 73 73 65 64 20 2a 2f 0a 20 20 20 20 69 6e  cessed */.    in
2e120 74 20 69 41 62 6f 72 74 46 6c 61 67 3b 20 20 20  t iAbortFlag;   
2e130 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73    /* Mem address
2e140 20 77 68 69 63 68 20 63 61 75 73 65 73 20 71 75   which causes qu
2e150 65 72 79 20 61 62 6f 72 74 20 69 66 20 70 6f 73  ery abort if pos
2e160 69 74 69 76 65 20 2a 2f 0a 20 20 20 20 69 6e 74  itive */.    int
2e170 20 67 72 6f 75 70 42 79 53 6f 72 74 3b 20 20 20   groupBySort;   
2e180 20 2f 2a 20 52 6f 77 73 20 63 6f 6d 65 20 66 72   /* Rows come fr
2e190 6f 6d 20 73 6f 75 72 63 65 20 69 6e 20 47 52 4f  om source in GRO
2e1a0 55 50 20 42 59 20 6f 72 64 65 72 20 2a 2f 0a 20  UP BY order */. 
2e1b0 20 20 20 69 6e 74 20 61 64 64 72 45 6e 64 3b 20     int addrEnd; 
2e1c0 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66         /* End of
2e1d0 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20   processing for 
2e1e0 74 68 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20  this SELECT */. 
2e1f0 20 20 20 69 6e 74 20 73 6f 72 74 50 54 61 62 20     int sortPTab 
2e200 3d 20 30 3b 20 20 20 2f 2a 20 50 73 65 75 64 6f  = 0;   /* Pseudo
2e210 74 61 62 6c 65 20 75 73 65 64 20 74 6f 20 64 65  table used to de
2e220 63 6f 64 65 20 73 6f 72 74 69 6e 67 20 72 65 73  code sorting res
2e230 75 6c 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ults */.    int 
2e240 73 6f 72 74 4f 75 74 20 3d 20 30 3b 20 20 20 20  sortOut = 0;    
2e250 2f 2a 20 4f 75 74 70 75 74 20 72 65 67 69 73 74  /* Output regist
2e260 65 72 20 66 72 6f 6d 20 74 68 65 20 73 6f 72 74  er from the sort
2e270 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 72  er */.    int or
2e280 64 65 72 42 79 47 72 70 20 3d 20 30 3b 20 2f 2a  derByGrp = 0; /*
2e290 20 54 72 75 65 20 69 66 20 74 68 65 20 47 52 4f   True if the GRO
2e2a0 55 50 20 42 59 20 61 6e 64 20 4f 52 44 45 52 20  UP BY and ORDER 
2e2b0 42 59 20 61 72 65 20 74 68 65 20 73 61 6d 65 20  BY are the same 
2e2c0 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76  */..    /* Remov
2e2d0 65 20 61 6e 79 20 61 6e 64 20 61 6c 6c 20 61 6c  e any and all al
2e2e0 69 61 73 65 73 20 62 65 74 77 65 65 6e 20 74 68  iases between th
2e2f0 65 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64  e result set and
2e300 20 74 68 65 0a 20 20 20 20 2a 2a 20 47 52 4f 55   the.    ** GROU
2e310 50 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20  P BY clause..   
2e320 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f   */.    if( pGro
2e330 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e  upBy ){.      in
2e340 74 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  t k;            
2e350 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
2e360 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
2e370 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
2e380 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
2e390 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e  ;  /* For loopin
2e3a0 67 20 6f 76 65 72 20 65 78 70 72 65 73 73 69 6f  g over expressio
2e3b0 6e 20 69 6e 20 61 20 6c 69 73 74 20 2a 2f 0a 0a  n in a list */..
2e3c0 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 2d 3e 70        for(k=p->p
2e3d0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49  EList->nExpr, pI
2e3e0 74 65 6d 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  tem=p->pEList->a
2e3f0 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65  ; k>0; k--, pIte
2e400 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 49  m++){.        pI
2e410 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c 69 61 73 20  tem->u.x.iAlias 
2e420 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
2e430 20 20 20 66 6f 72 28 6b 3d 70 47 72 6f 75 70 42     for(k=pGroupB
2e440 79 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d  y->nExpr, pItem=
2e450 70 47 72 6f 75 70 42 79 2d 3e 61 3b 20 6b 3e 30  pGroupBy->a; k>0
2e460 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; k--, pItem++){
2e470 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  .        pItem->
2e480 75 2e 78 2e 69 41 6c 69 61 73 20 3d 20 30 3b 0a  u.x.iAlias = 0;.
2e490 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2e4a0 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e  ( p->nSelectRow>
2e4b0 31 30 30 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74  100 ) p->nSelect
2e4c0 52 6f 77 20 3d 20 31 30 30 3b 0a 20 20 20 20 7d  Row = 100;.    }
2e4d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e  else{.      p->n
2e4e0 53 65 6c 65 63 74 52 6f 77 20 3d 20 31 3b 0a 20  SelectRow = 1;. 
2e4f0 20 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a 20 49 66     }...    /* If
2e500 20 74 68 65 72 65 20 69 73 20 62 6f 74 68 20 61   there is both a
2e510 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20 61 6e   GROUP BY and an
2e520 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
2e530 20 61 6e 64 20 74 68 65 79 20 61 72 65 0a 20 20   and they are.  
2e540 20 20 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20    ** identical, 
2e550 74 68 65 6e 20 69 74 20 6d 61 79 20 62 65 20 70  then it may be p
2e560 6f 73 73 69 62 6c 65 20 74 6f 20 64 69 73 61 62  ossible to disab
2e570 6c 65 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  le the ORDER BY 
2e580 63 6c 61 75 73 65 20 0a 20 20 20 20 2a 2a 20 6f  clause .    ** o
2e590 6e 20 74 68 65 20 67 72 6f 75 6e 64 73 20 74 68  n the grounds th
2e5a0 61 74 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  at the GROUP BY 
2e5b0 77 69 6c 6c 20 63 61 75 73 65 20 65 6c 65 6d 65  will cause eleme
2e5c0 6e 74 73 20 74 6f 20 63 6f 6d 65 20 6f 75 74 20  nts to come out 
2e5d0 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 63  .    ** in the c
2e5e0 6f 72 72 65 63 74 20 6f 72 64 65 72 2e 20 49 74  orrect order. It
2e5f0 20 61 6c 73 6f 20 6d 61 79 20 6e 6f 74 20 2d 20   also may not - 
2e600 74 68 65 20 47 52 4f 55 50 20 42 59 20 6d 61 79  the GROUP BY may
2e610 20 75 73 65 20 61 0a 20 20 20 20 2a 2a 20 64 61   use a.    ** da
2e620 74 61 62 61 73 65 20 69 6e 64 65 78 20 74 68 61  tabase index tha
2e630 74 20 63 61 75 73 65 73 20 72 6f 77 73 20 74 6f  t causes rows to
2e640 20 62 65 20 67 72 6f 75 70 65 64 20 74 6f 67 65   be grouped toge
2e650 74 68 65 72 20 61 73 20 72 65 71 75 69 72 65 64  ther as required
2e660 0a 20 20 20 20 2a 2a 20 62 75 74 20 6e 6f 74 20  .    ** but not 
2e670 61 63 74 75 61 6c 6c 79 20 73 6f 72 74 65 64 2e  actually sorted.
2e680 20 45 69 74 68 65 72 20 77 61 79 2c 20 72 65 63   Either way, rec
2e690 6f 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61  ord the fact tha
2e6a0 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 4f 52 44  t the.    ** ORD
2e6b0 45 52 20 42 59 20 61 6e 64 20 47 52 4f 55 50 20  ER BY and GROUP 
2e6c0 42 59 20 63 6c 61 75 73 65 73 20 61 72 65 20 74  BY clauses are t
2e6d0 68 65 20 73 61 6d 65 20 62 79 20 73 65 74 74 69  he same by setti
2e6e0 6e 67 20 74 68 65 20 6f 72 64 65 72 42 79 47 72  ng the orderByGr
2e6f0 70 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c  p.    ** variabl
2e700 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  e.  */.    if( s
2e710 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f  qlite3ExprListCo
2e720 6d 70 61 72 65 28 70 47 72 6f 75 70 42 79 2c 20  mpare(pGroupBy, 
2e730 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 20  sSort.pOrderBy, 
2e740 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  -1)==0 ){.      
2e750 6f 72 64 65 72 42 79 47 72 70 20 3d 20 31 3b 0a  orderByGrp = 1;.
2e760 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 43      }. .    /* C
2e770 72 65 61 74 65 20 61 20 6c 61 62 65 6c 20 74 6f  reate a label to
2e780 20 6a 75 6d 70 20 74 6f 20 77 68 65 6e 20 77 65   jump to when we
2e790 20 77 61 6e 74 20 74 6f 20 61 62 6f 72 74 20 74   want to abort t
2e7a0 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20  he query */.    
2e7b0 61 64 64 72 45 6e 64 20 3d 20 73 71 6c 69 74 65  addrEnd = sqlite
2e7c0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
2e7d0 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65  );..    /* Conve
2e7e0 72 74 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64  rt TK_COLUMN nod
2e7f0 65 73 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43  es into TK_AGG_C
2e800 4f 4c 55 4d 4e 20 61 6e 64 20 6d 61 6b 65 20 65  OLUMN and make e
2e810 6e 74 72 69 65 73 20 69 6e 0a 20 20 20 20 2a 2a  ntries in.    **
2e820 20 73 41 67 67 49 6e 66 6f 20 66 6f 72 20 61 6c   sAggInfo for al
2e830 6c 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  l TK_AGG_FUNCTIO
2e840 4e 20 6e 6f 64 65 73 20 69 6e 20 65 78 70 72 65  N nodes in expre
2e850 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20  ssions of the.  
2e860 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74    ** SELECT stat
2e870 65 6d 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  ement..    */.  
2e880 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30    memset(&sNC, 0
2e890 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a  , sizeof(sNC));.
2e8a0 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d      sNC.pParse =
2e8b0 20 70 50 61 72 73 65 3b 0a 20 20 20 20 73 4e 43   pParse;.    sNC
2e8c0 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62  .pSrcList = pTab
2e8d0 4c 69 73 74 3b 0a 20 20 20 20 73 4e 43 2e 70 41  List;.    sNC.pA
2e8e0 67 67 49 6e 66 6f 20 3d 20 26 73 41 67 67 49 6e  ggInfo = &sAggIn
2e8f0 66 6f 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f  fo;.    sAggInfo
2e900 2e 6d 6e 52 65 67 20 3d 20 70 50 61 72 73 65 2d  .mnReg = pParse-
2e910 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 73 41 67  >nMem+1;.    sAg
2e920 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f  gInfo.nSortingCo
2e930 6c 75 6d 6e 20 3d 20 70 47 72 6f 75 70 42 79 20  lumn = pGroupBy 
2e940 3f 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  ? pGroupBy->nExp
2e950 72 20 3a 20 30 3b 0a 20 20 20 20 73 41 67 67 49  r : 0;.    sAggI
2e960 6e 66 6f 2e 70 47 72 6f 75 70 42 79 20 3d 20 70  nfo.pGroupBy = p
2e970 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 73 71 6c  GroupBy;.    sql
2e980 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
2e990 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 70 45 4c  ggList(&sNC, pEL
2e9a0 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ist);.    sqlite
2e9b0 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c  3ExprAnalyzeAggL
2e9c0 69 73 74 28 26 73 4e 43 2c 20 73 53 6f 72 74 2e  ist(&sNC, sSort.
2e9d0 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 69  pOrderBy);.    i
2e9e0 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20  f( pHaving ){.  
2e9f0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
2ea00 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
2ea10 28 26 73 4e 43 2c 20 70 48 61 76 69 6e 67 29 3b  (&sNC, pHaving);
2ea20 0a 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49  .    }.    sAggI
2ea30 6e 66 6f 2e 6e 41 63 63 75 6d 75 6c 61 74 6f 72  nfo.nAccumulator
2ea40 20 3d 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c   = sAggInfo.nCol
2ea50 75 6d 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  umn;.    for(i=0
2ea60 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75  ; i<sAggInfo.nFu
2ea70 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  nc; i++){.      
2ea80 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
2ea90 50 72 6f 70 65 72 74 79 28 73 41 67 67 49 6e 66  Property(sAggInf
2eaa0 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72  o.aFunc[i].pExpr
2eab0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
2eac0 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e 6e 63 46  );.      sNC.ncF
2ead0 6c 61 67 73 20 7c 3d 20 4e 43 5f 49 6e 41 67 67  lags |= NC_InAgg
2eae0 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69  Func;.      sqli
2eaf0 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
2eb00 67 4c 69 73 74 28 26 73 4e 43 2c 20 73 41 67 67  gList(&sNC, sAgg
2eb10 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45  Info.aFunc[i].pE
2eb20 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20  xpr->x.pList);. 
2eb30 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73       sNC.ncFlags
2eb40 20 26 3d 20 7e 4e 43 5f 49 6e 41 67 67 46 75 6e   &= ~NC_InAggFun
2eb50 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 41 67  c;.    }.    sAg
2eb60 67 49 6e 66 6f 2e 6d 78 52 65 67 20 3d 20 70 50  gInfo.mxReg = pP
2eb70 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
2eb80 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
2eb90 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65  iled ) goto sele
2eba0 63 74 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20  ct_end;..    /* 
2ebb0 50 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 61  Processing for a
2ebc0 67 67 72 65 67 61 74 65 73 20 77 69 74 68 20 47  ggregates with G
2ebd0 52 4f 55 50 20 42 59 20 69 73 20 76 65 72 79 20  ROUP BY is very 
2ebe0 64 69 66 66 65 72 65 6e 74 20 61 6e 64 0a 20 20  different and.  
2ebf0 20 20 2a 2a 20 6d 75 63 68 20 6d 6f 72 65 20 63    ** much more c
2ec00 6f 6d 70 6c 65 78 20 74 68 61 6e 20 61 67 67 72  omplex than aggr
2ec10 65 67 61 74 65 73 20 77 69 74 68 6f 75 74 20 61  egates without a
2ec20 20 47 52 4f 55 50 20 42 59 2e 0a 20 20 20 20 2a   GROUP BY..    *
2ec30 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70  /.    if( pGroup
2ec40 42 79 20 29 7b 0a 20 20 20 20 20 20 4b 65 79 49  By ){.      KeyI
2ec50 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20  nfo *pKeyInfo;  
2ec60 2f 2a 20 4b 65 79 69 6e 67 20 69 6e 66 6f 72 6d  /* Keying inform
2ec70 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 67 72  ation for the gr
2ec80 6f 75 70 20 62 79 20 63 6c 61 75 73 65 20 2a 2f  oup by clause */
2ec90 0a 20 20 20 20 20 20 69 6e 74 20 6a 31 3b 20 20  .      int j1;  
2eca0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 2d             /* A-
2ecb0 76 73 2d 42 20 63 6f 6d 70 61 72 69 73 69 6f 6e  vs-B comparision
2ecc0 20 6a 75 6d 70 20 2a 2f 0a 20 20 20 20 20 20 69   jump */.      i
2ecd0 6e 74 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  nt addrOutputRow
2ece0 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 73  ;  /* Start of s
2ecf0 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f  ubroutine that o
2ed00 75 74 70 75 74 73 20 61 20 72 65 73 75 6c 74 20  utputs a result 
2ed10 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  row */.      int
2ed20 20 72 65 67 4f 75 74 70 75 74 52 6f 77 3b 20 20   regOutputRow;  
2ed30 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65   /* Return addre
2ed40 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ss register for 
2ed50 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e  output subroutin
2ed60 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  e */.      int a
2ed70 64 64 72 53 65 74 41 62 6f 72 74 3b 20 20 20 2f  ddrSetAbort;   /
2ed80 2a 20 53 65 74 20 74 68 65 20 61 62 6f 72 74 20  * Set the abort 
2ed90 66 6c 61 67 20 61 6e 64 20 72 65 74 75 72 6e 20  flag and return 
2eda0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
2edb0 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20 2f 2a 20  rTopOfLoop;  /* 
2edc0 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 70 75 74  Top of the input
2edd0 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 69   loop */.      i
2ede0 6e 74 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64  nt addrSortingId
2edf0 78 3b 20 2f 2a 20 54 68 65 20 4f 50 5f 4f 70 65  x; /* The OP_Ope
2ee00 6e 45 70 68 65 6d 65 72 61 6c 20 66 6f 72 20 74  nEphemeral for t
2ee10 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  he sorting index
2ee20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
2ee30 64 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a  drReset;      /*
2ee40 20 53 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20   Subroutine for 
2ee50 72 65 73 65 74 74 69 6e 67 20 74 68 65 20 61 63  resetting the ac
2ee60 63 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a 20 20 20  cumulator */.   
2ee70 20 20 20 69 6e 74 20 72 65 67 52 65 73 65 74 3b     int regReset;
2ee80 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
2ee90 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65   address registe
2eea0 72 20 66 6f 72 20 72 65 73 65 74 20 73 75 62 72  r for reset subr
2eeb0 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20 20 20 20 20  outine */..     
2eec0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
2eed0 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  a GROUP BY claus
2eee0 65 20 77 65 20 6d 69 67 68 74 20 6e 65 65 64 20  e we might need 
2eef0 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  a sorting index 
2ef00 74 6f 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c  to.      ** impl
2ef10 65 6d 65 6e 74 20 69 74 2e 20 20 41 6c 6c 6f 63  ement it.  Alloc
2ef20 61 74 65 20 74 68 61 74 20 73 6f 72 74 69 6e 67  ate that sorting
2ef30 20 69 6e 64 65 78 20 6e 6f 77 2e 20 20 49 66 20   index now.  If 
2ef40 69 74 20 74 75 72 6e 73 20 6f 75 74 0a 20 20 20  it turns out.   
2ef50 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f     ** that we do
2ef60 20 6e 6f 74 20 6e 65 65 64 20 69 74 20 61 66 74   not need it aft
2ef70 65 72 20 61 6c 6c 2c 20 74 68 65 20 4f 50 5f 53  er all, the OP_S
2ef80 6f 72 74 65 72 4f 70 65 6e 20 69 6e 73 74 72 75  orterOpen instru
2ef90 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77  ction.      ** w
2efa0 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64  ill be converted
2efb0 20 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a   into a Noop.  .
2efc0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
2efd0 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
2efe0 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  dx = pParse->nTa
2eff0 62 2b 2b 3b 0a 20 20 20 20 20 20 70 4b 65 79 49  b++;.      pKeyI
2f000 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f  nfo = keyInfoFro
2f010 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
2f020 2c 20 70 47 72 6f 75 70 42 79 2c 20 30 2c 20 73  , pGroupBy, 0, s
2f030 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 29  AggInfo.nColumn)
2f040 3b 0a 20 20 20 20 20 20 61 64 64 72 53 6f 72 74  ;.      addrSort
2f050 69 6e 67 49 64 78 20 3d 20 73 71 6c 69 74 65 33  ingIdx = sqlite3
2f060 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
2f070 5f 53 6f 72 74 65 72 4f 70 65 6e 2c 20 0a 20 20  _SorterOpen, .  
2f080 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f          sAggInfo
2f090 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 73 41 67  .sortingIdx, sAg
2f0a0 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f  gInfo.nSortingCo
2f0b0 6c 75 6d 6e 2c 20 0a 20 20 20 20 20 20 20 20 20  lumn, .         
2f0c0 20 30 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49   0, (char*)pKeyI
2f0d0 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  nfo, P4_KEYINFO)
2f0e0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69 74  ;..      /* Init
2f0f0 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f  ialize memory lo
2f100 63 61 74 69 6f 6e 73 20 75 73 65 64 20 62 79 20  cations used by 
2f110 47 52 4f 55 50 20 42 59 20 61 67 67 72 65 67 61  GROUP BY aggrega
2f120 74 65 20 70 72 6f 63 65 73 73 69 6e 67 0a 20 20  te processing.  
2f130 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 55 73      */.      iUs
2f140 65 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65  eFlag = ++pParse
2f150 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69 41  ->nMem;.      iA
2f160 62 6f 72 74 46 6c 61 67 20 3d 20 2b 2b 70 50 61  bortFlag = ++pPa
2f170 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
2f180 20 72 65 67 4f 75 74 70 75 74 52 6f 77 20 3d 20   regOutputRow = 
2f190 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
2f1a0 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74        addrOutput
2f1b0 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Row = sqlite3Vdb
2f1c0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
2f1d0 20 20 20 20 20 72 65 67 52 65 73 65 74 20 3d 20       regReset = 
2f1e0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
2f1f0 20 20 20 20 20 20 61 64 64 72 52 65 73 65 74 20        addrReset 
2f200 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
2f210 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
2f220 20 69 41 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d   iAMem = pParse-
2f230 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20  >nMem + 1;.     
2f240 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
2f250 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
2f260 3b 0a 20 20 20 20 20 20 69 42 4d 65 6d 20 3d 20  ;.      iBMem = 
2f270 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31  pParse->nMem + 1
2f280 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
2f290 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79  nMem += pGroupBy
2f2a0 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 73  ->nExpr;.      s
2f2b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2f2c0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
2f2d0 30 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a  0, iAbortFlag);.
2f2e0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
2f2f0 74 28 28 76 2c 20 22 63 6c 65 61 72 20 61 62 6f  t((v, "clear abo
2f300 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20  rt flag"));.    
2f310 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2f320 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
2f330 72 2c 20 30 2c 20 69 55 73 65 46 6c 61 67 29 3b  r, 0, iUseFlag);
2f340 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
2f350 6e 74 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65  nt((v, "indicate
2f360 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 65 6d 70   accumulator emp
2f370 74 79 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ty"));.      sql
2f380 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
2f390 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 41  , OP_Null, 0, iA
2f3a0 4d 65 6d 2c 20 69 41 4d 65 6d 2b 70 47 72 6f 75  Mem, iAMem+pGrou
2f3b0 70 42 79 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 0a  pBy->nExpr-1);..
2f3c0 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 61        /* Begin a
2f3d0 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20   loop that will 
2f3e0 65 78 74 72 61 63 74 20 61 6c 6c 20 73 6f 75 72  extract all sour
2f3f0 63 65 20 72 6f 77 73 20 69 6e 20 47 52 4f 55 50  ce rows in GROUP
2f400 20 42 59 20 6f 72 64 65 72 2e 0a 20 20 20 20 20   BY order..     
2f410 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 69   ** This might i
2f420 6e 76 6f 6c 76 65 20 74 77 6f 20 73 65 70 61 72  nvolve two separ
2f430 61 74 65 20 6c 6f 6f 70 73 20 77 69 74 68 20 61  ate loops with a
2f440 6e 20 4f 50 5f 53 6f 72 74 20 69 6e 20 62 65 74  n OP_Sort in bet
2f450 77 65 65 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a  ween, or.      *
2f460 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 20  * it might be a 
2f470 73 69 6e 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74  single loop that
2f480 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78 20 74   uses an index t
2f490 6f 20 65 78 74 72 61 63 74 20 69 6e 66 6f 72 6d  o extract inform
2f4a0 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69  ation.      ** i
2f4b0 6e 20 74 68 65 20 72 69 67 68 74 20 6f 72 64 65  n the right orde
2f4c0 72 20 74 6f 20 62 65 67 69 6e 20 77 69 74 68 2e  r to begin with.
2f4d0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2f4e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2f4f0 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
2f500 65 67 52 65 73 65 74 2c 20 61 64 64 72 52 65 73  egReset, addrRes
2f510 65 74 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66  et);.      pWInf
2f520 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  o = sqlite3Where
2f530 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54  Begin(pParse, pT
2f540 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20  abList, pWhere, 
2f550 70 47 72 6f 75 70 42 79 2c 20 30 2c 0a 20 20 20  pGroupBy, 0,.   
2f560 20 20 20 20 20 20 20 57 48 45 52 45 5f 47 52 4f         WHERE_GRO
2f570 55 50 42 59 20 7c 20 28 6f 72 64 65 72 42 79 47  UPBY | (orderByG
2f580 72 70 20 3f 20 57 48 45 52 45 5f 53 4f 52 54 42  rp ? WHERE_SORTB
2f590 59 47 52 4f 55 50 20 3a 20 30 29 2c 20 30 0a 20  YGROUP : 0), 0. 
2f5a0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66       );.      if
2f5b0 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f  ( pWInfo==0 ) go
2f5c0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
2f5d0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
2f5e0 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28 70  WhereIsOrdered(p
2f5f0 57 49 6e 66 6f 29 3d 3d 70 47 72 6f 75 70 42 79  WInfo)==pGroupBy
2f600 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->nExpr ){.     
2f610 20 20 20 2f 2a 20 54 68 65 20 6f 70 74 69 6d 69     /* The optimi
2f620 7a 65 72 20 69 73 20 61 62 6c 65 20 74 6f 20 64  zer is able to d
2f630 65 6c 69 76 65 72 20 72 6f 77 73 20 69 6e 20 67  eliver rows in g
2f640 72 6f 75 70 20 62 79 20 6f 72 64 65 72 20 73 6f  roup by order so
2f650 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 65 20 64  .        ** we d
2f660 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 73 6f  o not have to so
2f670 72 74 2e 20 20 54 68 65 20 4f 50 5f 4f 70 65 6e  rt.  The OP_Open
2f680 45 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  Ephemeral table 
2f690 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20  will be.        
2f6a0 2a 2a 20 63 61 6e 63 65 6c 6c 65 64 20 6c 61 74  ** cancelled lat
2f6b0 65 72 20 62 65 63 61 75 73 65 20 77 65 20 73 74  er because we st
2f6c0 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 73 65 20  ill need to use 
2f6d0 74 68 65 20 70 4b 65 79 49 6e 66 6f 0a 20 20 20  the pKeyInfo.   
2f6e0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2f6f0 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 30 3b  groupBySort = 0;
2f700 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2f710 20 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 61 72        /* Rows ar
2f720 65 20 63 6f 6d 69 6e 67 20 6f 75 74 20 69 6e 20  e coming out in 
2f730 75 6e 64 65 74 65 72 6d 69 6e 65 64 20 6f 72 64  undetermined ord
2f740 65 72 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20  er.  We have to 
2f750 70 75 73 68 0a 20 20 20 20 20 20 20 20 2a 2a 20  push.        ** 
2f760 65 61 63 68 20 72 6f 77 20 69 6e 74 6f 20 61 20  each row into a 
2f770 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 2c 20 74  sorting index, t
2f780 65 72 6d 69 6e 61 74 65 20 74 68 65 20 66 69 72  erminate the fir
2f790 73 74 20 6c 6f 6f 70 2c 0a 20 20 20 20 20 20 20  st loop,.       
2f7a0 20 2a 2a 20 74 68 65 6e 20 6c 6f 6f 70 20 6f 76   ** then loop ov
2f7b0 65 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69  er the sorting i
2f7c0 6e 64 65 78 20 69 6e 20 6f 72 64 65 72 20 74 6f  ndex in order to
2f7d0 20 67 65 74 20 74 68 65 20 6f 75 74 70 75 74 0a   get the output.
2f7e0 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 73 6f          ** in so
2f7f0 72 74 65 64 20 6f 72 64 65 72 0a 20 20 20 20 20  rted order.     
2f800 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e     */.        in
2f810 74 20 72 65 67 42 61 73 65 3b 0a 20 20 20 20 20  t regBase;.     
2f820 20 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64     int regRecord
2f830 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43  ;.        int nC
2f840 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ol;.        int 
2f850 6e 47 72 6f 75 70 42 79 3b 0a 0a 20 20 20 20 20  nGroupBy;..     
2f860 20 20 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61     explainTempTa
2f870 62 6c 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20  ble(pParse, .   
2f880 20 20 20 20 20 20 20 20 20 28 73 44 69 73 74 69           (sDisti
2f890 6e 63 74 2e 69 73 54 6e 63 74 20 26 26 20 28 70  nct.isTnct && (p
2f8a0 2d 3e 73 65 6c 46 6c 61 67 73 26 53 46 5f 44 69  ->selFlags&SF_Di
2f8b0 73 74 69 6e 63 74 29 3d 3d 30 29 20 3f 0a 20 20  stinct)==0) ?.  
2f8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f8d0 20 20 22 44 49 53 54 49 4e 43 54 22 20 3a 20 22    "DISTINCT" : "
2f8e0 47 52 4f 55 50 20 42 59 22 29 3b 0a 0a 20 20 20  GROUP BY");..   
2f8f0 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74       groupBySort
2f900 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 6e 47   = 1;.        nG
2f910 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42  roupBy = pGroupB
2f920 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  y->nExpr;.      
2f930 20 20 6e 43 6f 6c 20 3d 20 6e 47 72 6f 75 70 42    nCol = nGroupB
2f940 79 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e  y;.        j = n
2f950 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20  GroupBy;.       
2f960 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67   for(i=0; i<sAgg
2f970 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  Info.nColumn; i+
2f980 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
2f990 28 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b  ( sAggInfo.aCol[
2f9a0 69 5d 2e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  i].iSorterColumn
2f9b0 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=j ){.         
2f9c0 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20     nCol++;.     
2f9d0 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20         j++;.    
2f9e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2f9f0 7d 0a 20 20 20 20 20 20 20 20 72 65 67 42 61 73  }.        regBas
2fa00 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  e = sqlite3GetTe
2fa10 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
2fa20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  nCol);.        s
2fa30 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
2fa40 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
2fa50 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2fa60 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
2fa70 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2c 20  arse, pGroupBy, 
2fa80 72 65 67 42 61 73 65 2c 20 30 29 3b 0a 20 20 20  regBase, 0);.   
2fa90 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42       j = nGroupB
2faa0 79 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  y;.        for(i
2fab0 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e  =0; i<sAggInfo.n
2fac0 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
2fad0 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41          struct A
2fae0 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c  ggInfo_col *pCol
2faf0 20 3d 20 26 73 41 67 67 49 6e 66 6f 2e 61 43 6f   = &sAggInfo.aCo
2fb00 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  l[i];.          
2fb10 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65  if( pCol->iSorte
2fb20 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20  rColumn>=j ){.  
2fb30 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 31            int r1
2fb40 20 3d 20 6a 20 2b 20 72 65 67 42 61 73 65 3b 0a   = j + regBase;.
2fb50 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
2fb60 72 32 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20  r2;..           
2fb70 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
2fb80 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70  rCodeGetColumn(p
2fb90 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
2fba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fbb0 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61         pCol->pTa
2fbc0 62 2c 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e  b, pCol->iColumn
2fbd0 2c 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20  , pCol->iTable, 
2fbe0 72 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  r1, 0);.        
2fbf0 20 20 20 20 69 66 28 20 72 31 21 3d 72 32 20 29      if( r1!=r2 )
2fc00 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2fc10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2fc20 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72  2(v, OP_SCopy, r
2fc30 32 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20  2, r1);.        
2fc40 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2fc50 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20    j++;.         
2fc60 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2fc70 20 20 20 20 20 72 65 67 52 65 63 6f 72 64 20 3d       regRecord =
2fc80 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
2fc90 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
2fca0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2fcb0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
2fcc0 52 65 63 6f 72 64 2c 20 72 65 67 42 61 73 65 2c  Record, regBase,
2fcd0 20 6e 43 6f 6c 2c 20 72 65 67 52 65 63 6f 72 64   nCol, regRecord
2fce0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2fcf0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2fd00 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 2c  OP_SorterInsert,
2fd10 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
2fd20 67 49 64 78 2c 20 72 65 67 52 65 63 6f 72 64 29  gIdx, regRecord)
2fd30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2fd40 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
2fd50 70 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72  pParse, regRecor
2fd60 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  d);.        sqli
2fd70 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
2fd80 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 42  nge(pParse, regB
2fd90 61 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20  ase, nCol);.    
2fda0 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
2fdb0 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  End(pWInfo);.   
2fdc0 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f       sAggInfo.so
2fdd0 72 74 69 6e 67 49 64 78 50 54 61 62 20 3d 20 73  rtingIdxPTab = s
2fde0 6f 72 74 50 54 61 62 20 3d 20 70 50 61 72 73 65  ortPTab = pParse
2fdf0 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
2fe00 20 20 73 6f 72 74 4f 75 74 20 3d 20 73 71 6c 69    sortOut = sqli
2fe10 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
2fe20 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
2fe30 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
2fe40 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64  (v, OP_OpenPseud
2fe50 6f 2c 20 73 6f 72 74 50 54 61 62 2c 20 73 6f 72  o, sortPTab, sor
2fe60 74 4f 75 74 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20  tOut, nCol);.   
2fe70 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2fe80 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
2fe90 74 65 72 53 6f 72 74 2c 20 73 41 67 67 49 6e 66  terSort, sAggInf
2fea0 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64  o.sortingIdx, ad
2feb0 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 20 20  drEnd);.        
2fec0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
2fed0 22 47 52 4f 55 50 20 42 59 20 73 6f 72 74 22 29  "GROUP BY sort")
2fee0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
2fef0 76 29 3b 0a 20 20 20 20 20 20 20 20 73 41 67 67  v);.        sAgg
2ff00 49 6e 66 6f 2e 75 73 65 53 6f 72 74 69 6e 67 49  Info.useSortingI
2ff10 64 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  dx = 1;.        
2ff20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
2ff30 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 0a  Clear(pParse);..
2ff40 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
2ff50 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78 20 6f  * If the index o
2ff60 72 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  r temporary tabl
2ff70 65 20 75 73 65 64 20 62 79 20 74 68 65 20 47 52  e used by the GR
2ff80 4f 55 50 20 42 59 20 73 6f 72 74 0a 20 20 20 20  OUP BY sort.    
2ff90 20 20 2a 2a 20 77 69 6c 6c 20 6e 61 74 75 72 61    ** will natura
2ffa0 6c 6c 79 20 64 65 6c 69 76 65 72 20 72 6f 77 73  lly deliver rows
2ffb0 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 72 65   in the order re
2ffc0 71 75 69 72 65 64 20 62 79 20 74 68 65 20 4f 52  quired by the OR
2ffd0 44 45 52 20 42 59 0a 20 20 20 20 20 20 2a 2a 20  DER BY.      ** 
2ffe0 63 6c 61 75 73 65 2c 20 63 61 6e 63 65 6c 20 74  clause, cancel t
2fff0 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  he ephemeral tab
30000 6c 65 20 6f 70 65 6e 20 63 6f 64 65 64 20 65 61  le open coded ea
30010 72 6c 69 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a  rlier..      **.
30020 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73        ** This is
30030 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
30040 20 2d 20 74 68 65 20 63 6f 72 72 65 63 74 20 61   - the correct a
30050 6e 73 77 65 72 20 73 68 6f 75 6c 64 20 72 65 73  nswer should res
30060 75 6c 74 20 72 65 67 61 72 64 6c 65 73 73 2e 0a  ult regardless..
30070 20 20 20 20 20 20 2a 2a 20 55 73 65 20 74 68 65        ** Use the
30080 20 53 51 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f   SQLITE_GroupByO
30090 72 64 65 72 20 66 6c 61 67 20 77 69 74 68 20 53  rder flag with S
300a0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f  QLITE_TESTCTRL_O
300b0 50 54 49 4d 49 5a 45 52 20 74 6f 20 0a 20 20 20  PTIMIZER to .   
300c0 20 20 20 2a 2a 20 64 69 73 61 62 6c 65 20 74 68     ** disable th
300d0 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  is optimization 
300e0 66 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72 70  for testing purp
300f0 6f 73 65 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20  oses.  */.      
30100 69 66 28 20 6f 72 64 65 72 42 79 47 72 70 20 26  if( orderByGrp &
30110 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e  & OptimizationEn
30120 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45  abled(db, SQLITE
30130 5f 47 72 6f 75 70 42 79 4f 72 64 65 72 29 20 0a  _GroupByOrder) .
30140 20 20 20 20 20 20 20 26 26 20 28 67 72 6f 75 70         && (group
30150 42 79 53 6f 72 74 20 7c 7c 20 73 71 6c 69 74 65  BySort || sqlite
30160 33 57 68 65 72 65 49 73 53 6f 72 74 65 64 28 70  3WhereIsSorted(p
30170 57 49 6e 66 6f 29 29 0a 20 20 20 20 20 20 29 7b  WInfo)).      ){
30180 0a 20 20 20 20 20 20 20 20 73 53 6f 72 74 2e 70  .        sSort.p
30190 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
301a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
301b0 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20  ChangeToNoop(v, 
301c0 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e  sSort.addrSortIn
301d0 64 65 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  dex);.      }.. 
301e0 20 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65       /* Evaluate
301f0 20 74 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f   the current GRO
30200 55 50 20 42 59 20 74 65 72 6d 73 20 61 6e 64 20  UP BY terms and 
30210 73 74 6f 72 65 20 69 6e 20 62 30 2c 20 62 31 2c  store in b0, b1,
30220 20 62 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20   b2....      ** 
30230 28 62 30 20 69 73 20 6d 65 6d 6f 72 79 20 6c 6f  (b0 is memory lo
30240 63 61 74 69 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20  cation iBMem+0, 
30250 62 31 20 69 73 20 69 42 4d 65 6d 2b 31 2c 20 61  b1 is iBMem+1, a
30260 6e 64 20 73 6f 20 66 6f 72 74 68 29 0a 20 20 20  nd so forth).   
30270 20 20 20 2a 2a 20 54 68 65 6e 20 63 6f 6d 70 61     ** Then compa
30280 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 47  re the current G
30290 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61 67  ROUP BY terms ag
302a0 61 69 6e 73 74 20 74 68 65 20 47 52 4f 55 50 20  ainst the GROUP 
302b0 42 59 20 74 65 72 6d 73 0a 20 20 20 20 20 20 2a  BY terms.      *
302c0 2a 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69  * from the previ
302d0 6f 75 73 20 72 6f 77 20 63 75 72 72 65 6e 74 6c  ous row currentl
302e0 79 20 73 74 6f 72 65 64 20 69 6e 20 61 30 2c 20  y stored in a0, 
302f0 61 31 2c 20 61 32 2e 2e 2e 0a 20 20 20 20 20 20  a1, a2....      
30300 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 54 6f 70  */.      addrTop
30310 4f 66 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33  OfLoop = sqlite3
30320 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
30330 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
30340 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
30350 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69  pParse);.      i
30360 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29  f( groupBySort )
30370 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
30380 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
30390 50 5f 53 6f 72 74 65 72 44 61 74 61 2c 20 73 41  P_SorterData, sA
303a0 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
303b0 78 2c 20 73 6f 72 74 4f 75 74 2c 73 6f 72 74 50  x, sortOut,sortP
303c0 54 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Tab);.      }.  
303d0 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
303e0 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20  GroupBy->nExpr; 
303f0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
30400 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b  ( groupBySort ){
30410 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
30420 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
30430 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 6f 72 74 50  OP_Column, sortP
30440 54 61 62 2c 20 6a 2c 20 69 42 4d 65 6d 2b 6a 29  Tab, j, iBMem+j)
30450 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
30460 0a 20 20 20 20 20 20 20 20 20 20 73 41 67 67 49  .          sAggI
30470 6e 66 6f 2e 64 69 72 65 63 74 4d 6f 64 65 20 3d  nfo.directMode =
30480 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71   1;.          sq
30490 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
304a0 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e  arse, pGroupBy->
304b0 61 5b 6a 5d 2e 70 45 78 70 72 2c 20 69 42 4d 65  a[j].pExpr, iBMe
304c0 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  m+j);.        }.
304d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
304e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
304f0 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 69  v, OP_Compare, i
30500 41 4d 65 6d 2c 20 69 42 4d 65 6d 2c 20 70 47 72  AMem, iBMem, pGr
30510 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c 0a 20 20  oupBy->nExpr,.  
30520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30530 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 73          (char*)s
30540 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66  qlite3KeyInfoRef
30550 28 70 4b 65 79 49 6e 66 6f 29 2c 20 50 34 5f 4b  (pKeyInfo), P4_K
30560 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 6a  EYINFO);.      j
30570 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  1 = sqlite3VdbeC
30580 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
30590 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
305a0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d  AddOp3(v, OP_Jum
305b0 70 2c 20 6a 31 2b 31 2c 20 30 2c 20 6a 31 2b 31  p, j1+1, 0, j1+1
305c0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
305d0 76 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65  v);..      /* Ge
305e0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
305f0 20 72 75 6e 73 20 77 68 65 6e 65 76 65 72 20 74   runs whenever t
30600 68 65 20 47 52 4f 55 50 20 42 59 20 63 68 61 6e  he GROUP BY chan
30610 67 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68  ges..      ** Ch
30620 61 6e 67 65 73 20 69 6e 20 74 68 65 20 47 52 4f  anges in the GRO
30630 55 50 20 42 59 20 61 72 65 20 64 65 74 65 63 74  UP BY are detect
30640 65 64 20 62 79 20 74 68 65 20 70 72 65 76 69 6f  ed by the previo
30650 75 73 20 63 6f 64 65 0a 20 20 20 20 20 20 2a 2a  us code.      **
30660 20 62 6c 6f 63 6b 2e 20 20 49 66 20 74 68 65 72   block.  If ther
30670 65 20 77 65 72 65 20 6e 6f 20 63 68 61 6e 67 65  e were no change
30680 73 2c 20 74 68 69 73 20 62 6c 6f 63 6b 20 69 73  s, this block is
30690 20 73 6b 69 70 70 65 64 2e 0a 20 20 20 20 20 20   skipped..      
306a0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73  **.      ** This
306b0 20 63 6f 64 65 20 63 6f 70 69 65 73 20 63 75 72   code copies cur
306c0 72 65 6e 74 20 67 72 6f 75 70 20 62 79 20 74 65  rent group by te
306d0 72 6d 73 20 69 6e 20 62 30 2c 62 31 2c 62 32 2c  rms in b0,b1,b2,
306e0 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65  ....      ** ove
306f0 72 20 74 6f 20 61 30 2c 61 31 2c 61 32 2e 20 20  r to a0,a1,a2.  
30700 49 74 20 74 68 65 6e 20 63 61 6c 6c 73 20 74 68  It then calls th
30710 65 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74  e output subrout
30720 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64  ine.      ** and
30730 20 72 65 73 65 74 73 20 74 68 65 20 61 67 67 72   resets the aggr
30740 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  egate accumulato
30750 72 20 72 65 67 69 73 74 65 72 73 20 69 6e 20 70  r registers in p
30760 72 65 70 61 72 61 74 69 6f 6e 0a 20 20 20 20 20  reparation.     
30770 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65 78 74   ** for the next
30780 20 47 52 4f 55 50 20 42 59 20 62 61 74 63 68 2e   GROUP BY batch.
30790 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
307a0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
307b0 6f 76 65 28 70 50 61 72 73 65 2c 20 69 42 4d 65  ove(pParse, iBMe
307c0 6d 2c 20 69 41 4d 65 6d 2c 20 70 47 72 6f 75 70  m, iAMem, pGroup
307d0 42 79 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20  By->nExpr);.    
307e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
307f0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
30800 20 72 65 67 4f 75 74 70 75 74 52 6f 77 2c 20 61   regOutputRow, a
30810 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  ddrOutputRow);. 
30820 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
30830 28 28 76 2c 20 22 6f 75 74 70 75 74 20 6f 6e 65  ((v, "output one
30840 20 72 6f 77 22 29 29 3b 0a 20 20 20 20 20 20 73   row"));.      s
30850 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
30860 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 41  (v, OP_IfPos, iA
30870 62 6f 72 74 46 6c 61 67 2c 20 61 64 64 72 45 6e  bortFlag, addrEn
30880 64 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  d); VdbeCoverage
30890 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  (v);.      VdbeC
308a0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 68 65 63  omment((v, "chec
308b0 6b 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b  k abort flag"));
308c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
308d0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
308e0 6f 73 75 62 2c 20 72 65 67 52 65 73 65 74 2c 20  osub, regReset, 
308f0 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20  addrReset);.    
30900 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
30910 2c 20 22 72 65 73 65 74 20 61 63 63 75 6d 75 6c  , "reset accumul
30920 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20  ator"));..      
30930 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 67  /* Update the ag
30940 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61  gregate accumula
30950 74 6f 72 73 20 62 61 73 65 64 20 6f 6e 20 74 68  tors based on th
30960 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 20 20 20  e content of.   
30970 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e     ** the curren
30980 74 20 72 6f 77 0a 20 20 20 20 20 20 2a 2f 0a 20  t row.      */. 
30990 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
309a0 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b  JumpHere(v, j1);
309b0 0a 20 20 20 20 20 20 75 70 64 61 74 65 41 63 63  .      updateAcc
309c0 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c  umulator(pParse,
309d0 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
309e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
309f0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
30a00 65 72 2c 20 31 2c 20 69 55 73 65 46 6c 61 67 29  er, 1, iUseFlag)
30a10 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
30a20 65 6e 74 28 28 76 2c 20 22 69 6e 64 69 63 61 74  ent((v, "indicat
30a30 65 20 64 61 74 61 20 69 6e 20 61 63 63 75 6d 75  e data in accumu
30a40 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20  lator"));..     
30a50 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6c   /* End of the l
30a60 6f 6f 70 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  oop.      */.   
30a70 20 20 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f     if( groupBySo
30a80 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  rt ){.        sq
30a90 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
30aa0 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74  v, OP_SorterNext
30ab0 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69  , sAggInfo.sorti
30ac0 6e 67 49 64 78 2c 20 61 64 64 72 54 6f 70 4f 66  ngIdx, addrTopOf
30ad0 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 56  Loop);.        V
30ae0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
30af0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
30b00 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
30b10 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20  eEnd(pWInfo);.  
30b20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
30b30 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c  eChangeToNoop(v,
30b40 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 29   addrSortingIdx)
30b50 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
30b60 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 66   /* Output the f
30b70 69 6e 61 6c 20 72 6f 77 20 6f 66 20 72 65 73 75  inal row of resu
30b80 6c 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  lt.      */.    
30b90 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
30ba0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
30bb0 20 72 65 67 4f 75 74 70 75 74 52 6f 77 2c 20 61   regOutputRow, a
30bc0 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  ddrOutputRow);. 
30bd0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
30be0 28 28 76 2c 20 22 6f 75 74 70 75 74 20 66 69 6e  ((v, "output fin
30bf0 61 6c 20 72 6f 77 22 29 29 3b 0a 0a 20 20 20 20  al row"));..    
30c00 20 20 2f 2a 20 4a 75 6d 70 20 6f 76 65 72 20 74    /* Jump over t
30c10 68 65 20 73 75 62 72 6f 75 74 69 6e 65 73 0a 20  he subroutines. 
30c20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
30c30 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
30c40 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61  v, OP_Goto, 0, a
30c50 64 64 72 45 6e 64 29 3b 0a 0a 20 20 20 20 20 20  ddrEnd);..      
30c60 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
30c70 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75  broutine that ou
30c80 74 70 75 74 73 20 61 20 73 69 6e 67 6c 65 20 72  tputs a single r
30c90 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  ow of the result
30ca0 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 2e 20 20  .      ** set.  
30cb0 54 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20  This subroutine 
30cc0 66 69 72 73 74 20 6c 6f 6f 6b 73 20 61 74 20 74  first looks at t
30cd0 68 65 20 69 55 73 65 46 6c 61 67 2e 20 20 49 66  he iUseFlag.  If
30ce0 20 69 55 73 65 46 6c 61 67 0a 20 20 20 20 20 20   iUseFlag.      
30cf0 2a 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ** is less than 
30d00 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f  or equal to zero
30d10 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  , the subroutine
30d20 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66   is a no-op.  If
30d30 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72  .      ** the pr
30d40 6f 63 65 73 73 69 6e 67 20 63 61 6c 6c 73 20 66  ocessing calls f
30d50 6f 72 20 74 68 65 20 71 75 65 72 79 20 74 6f 20  or the query to 
30d60 61 62 6f 72 74 2c 20 74 68 69 73 20 73 75 62 72  abort, this subr
30d70 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20  outine.      ** 
30d80 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20 69  increments the i
30d90 41 62 6f 72 74 46 6c 61 67 20 6d 65 6d 6f 72 79  AbortFlag memory
30da0 20 6c 6f 63 61 74 69 6f 6e 20 62 65 66 6f 72 65   location before
30db0 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 0a 20 20   returning in.  
30dc0 20 20 20 20 2a 2a 20 6f 72 64 65 72 20 74 6f 20      ** order to 
30dd0 73 69 67 6e 61 6c 20 74 68 65 20 63 61 6c 6c 65  signal the calle
30de0 72 20 74 6f 20 61 62 6f 72 74 2e 0a 20 20 20 20  r to abort..    
30df0 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 53    */.      addrS
30e00 65 74 41 62 6f 72 74 20 3d 20 73 71 6c 69 74 65  etAbort = sqlite
30e10 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
30e20 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
30e30 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
30e40 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69  OP_Integer, 1, i
30e50 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20  AbortFlag);.    
30e60 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
30e70 2c 20 22 73 65 74 20 61 62 6f 72 74 20 66 6c 61  , "set abort fla
30e80 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  g"));.      sqli
30e90 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
30ea0 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f   OP_Return, regO
30eb0 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
30ec0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
30ed0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
30ee0 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
30ef0 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20    addrOutputRow 
30f00 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
30f10 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
30f20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
30f30 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73  dOp2(v, OP_IfPos
30f40 2c 20 69 55 73 65 46 6c 61 67 2c 20 61 64 64 72  , iUseFlag, addr
30f50 4f 75 74 70 75 74 52 6f 77 2b 32 29 3b 20 56 64  OutputRow+2); Vd
30f60 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
30f70 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
30f80 28 28 76 2c 20 22 47 72 6f 75 70 62 79 20 72 65  ((v, "Groupby re
30f90 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 20 65  sult generator e
30fa0 6e 74 72 79 20 70 6f 69 6e 74 22 29 29 3b 0a 20  ntry point"));. 
30fb0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
30fc0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74  AddOp1(v, OP_Ret
30fd0 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f  urn, regOutputRo
30fe0 77 29 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c 69  w);.      finali
30ff0 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70  zeAggFunctions(p
31000 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
31010 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
31020 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
31030 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64  se, pHaving, add
31040 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 53 51  rOutputRow+1, SQ
31050 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
31060 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e  ;.      selectIn
31070 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
31080 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 2d 31  p, p->pEList, -1
31090 2c 20 26 73 53 6f 72 74 2c 0a 20 20 20 20 20 20  , &sSort,.      
310a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
310b0 26 73 44 69 73 74 69 6e 63 74 2c 20 70 44 65 73  &sDistinct, pDes
310c0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
310d0 20 20 20 20 20 20 20 20 20 61 64 64 72 4f 75 74           addrOut
310e0 70 75 74 52 6f 77 2b 31 2c 20 61 64 64 72 53 65  putRow+1, addrSe
310f0 74 41 62 6f 72 74 29 3b 0a 20 20 20 20 20 20 73  tAbort);.      s
31100 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
31110 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72  (v, OP_Return, r
31120 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  egOutputRow);.  
31130 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
31140 28 76 2c 20 22 65 6e 64 20 67 72 6f 75 70 62 79  (v, "end groupby
31150 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f   result generato
31160 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  r"));..      /* 
31170 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
31180 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20  utine that will 
31190 72 65 73 65 74 20 74 68 65 20 67 72 6f 75 70 2d  reset the group-
311a0 62 79 20 61 63 63 75 6d 75 6c 61 74 6f 72 0a 20  by accumulator. 
311b0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
311c0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
311d0 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 52 65 73  Label(v, addrRes
311e0 65 74 29 3b 0a 20 20 20 20 20 20 72 65 73 65 74  et);.      reset
311f0 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72  Accumulator(pPar
31200 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
31210 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
31220 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
31230 74 75 72 6e 2c 20 72 65 67 52 65 73 65 74 29 3b  turn, regReset);
31240 0a 20 20 20 20 20 0a 20 20 20 20 7d 20 2f 2a 20  .     .    } /* 
31250 65 6e 64 69 66 20 70 47 72 6f 75 70 42 79 2e 20  endif pGroupBy. 
31260 20 42 65 67 69 6e 20 61 67 67 72 65 67 61 74 65   Begin aggregate
31270 20 71 75 65 72 69 65 73 20 77 69 74 68 6f 75 74   queries without
31280 20 47 52 4f 55 50 20 42 59 3a 20 2a 2f 0a 20 20   GROUP BY: */.  
31290 20 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 45    else {.      E
312a0 78 70 72 4c 69 73 74 20 2a 70 44 65 6c 20 3d 20  xprList *pDel = 
312b0 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
312c0 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e  E_OMIT_BTREECOUN
312d0 54 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  T.      Table *p
312e0 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 28  Tab;.      if( (
312f0 70 54 61 62 20 3d 20 69 73 53 69 6d 70 6c 65 43  pTab = isSimpleC
31300 6f 75 6e 74 28 70 2c 20 26 73 41 67 67 49 6e 66  ount(p, &sAggInf
31310 6f 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  o))!=0 ){.      
31320 20 20 2f 2a 20 49 66 20 69 73 53 69 6d 70 6c 65    /* If isSimple
31330 43 6f 75 6e 74 28 29 20 72 65 74 75 72 6e 73 20  Count() returns 
31340 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 54  a pointer to a T
31350 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 2c 20  able structure, 
31360 74 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  then.        ** 
31370 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
31380 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  t is of the form
31390 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  :.        **.   
313a0 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54       **   SELECT
313b0 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c   count(*) FROM <
313c0 74 62 6c 3e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  tbl>.        **.
313d0 20 20 20 20 20 20 20 20 2a 2a 20 77 68 65 72 65          ** where
313e0 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63   the Table struc
313f0 74 75 72 65 20 72 65 74 75 72 6e 65 64 20 72 65  ture returned re
31400 70 72 65 73 65 6e 74 73 20 74 61 62 6c 65 20 3c  presents table <
31410 74 62 6c 3e 2e 0a 20 20 20 20 20 20 20 20 2a 2a  tbl>..        **
31420 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73  .        ** This
31430 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73 6f   statement is so
31440 20 63 6f 6d 6d 6f 6e 20 74 68 61 74 20 69 74 20   common that it 
31450 69 73 20 6f 70 74 69 6d 69 7a 65 64 20 73 70 65  is optimized spe
31460 63 69 61 6c 6c 79 2e 20 54 68 65 0a 20 20 20 20  cially. The.    
31470 20 20 20 20 2a 2a 20 4f 50 5f 43 6f 75 6e 74 20      ** OP_Count 
31480 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 65  instruction is e
31490 78 65 63 75 74 65 64 20 65 69 74 68 65 72 20 6f  xecuted either o
314a0 6e 20 74 68 65 20 69 6e 74 6b 65 79 20 74 61 62  n the intkey tab
314b0 6c 65 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  le that.        
314c0 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ** contains the 
314d0 64 61 74 61 20 66 6f 72 20 74 61 62 6c 65 20 3c  data for table <
314e0 74 62 6c 3e 20 6f 72 20 6f 6e 20 6f 6e 65 20 6f  tbl> or on one o
314f0 66 20 69 74 73 20 69 6e 64 65 78 65 73 2e 20 49  f its indexes. I
31500 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20  t.        ** is 
31510 62 65 74 74 65 72 20 74 6f 20 65 78 65 63 75 74  better to execut
31520 65 20 74 68 65 20 6f 70 20 6f 6e 20 61 6e 20 69  e the op on an i
31530 6e 64 65 78 2c 20 61 73 20 69 6e 64 65 78 65 73  ndex, as indexes
31540 20 61 72 65 20 61 6c 6d 6f 73 74 0a 20 20 20 20   are almost.    
31550 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 70      ** always sp
31560 72 65 61 64 20 61 63 72 6f 73 73 20 6c 65 73 73  read across less
31570 20 70 61 67 65 73 20 74 68 61 6e 20 74 68 65 69   pages than thei
31580 72 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  r corresponding 
31590 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 20 20  tables..        
315a0 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  */.        const
315b0 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
315c0 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
315d0 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
315e0 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
315f0 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 43      const int iC
31600 73 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  sr = pParse->nTa
31610 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 43 75 72 73  b++;     /* Curs
31620 6f 72 20 74 6f 20 73 63 61 6e 20 62 2d 74 72 65  or to scan b-tre
31630 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e 64  e */.        Ind
31640 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20  ex *pIdx;       
31650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31660 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61    /* Iterator va
31670 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20  riable */.      
31680 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
31690 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 20  nfo = 0;        
316a0 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 69 6e 66         /* Keyinf
316b0 6f 20 66 6f 72 20 73 63 61 6e 6e 65 64 20 69 6e  o for scanned in
316c0 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 49  dex */.        I
316d0 6e 64 65 78 20 2a 70 42 65 73 74 20 3d 20 30 3b  ndex *pBest = 0;
316e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
316f0 20 20 20 20 2f 2a 20 42 65 73 74 20 69 6e 64 65      /* Best inde
31700 78 20 66 6f 75 6e 64 20 73 6f 20 66 61 72 20 2a  x found so far *
31710 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 52  /.        int iR
31720 6f 6f 74 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d  oot = pTab->tnum
31730 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
31740 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 73  * Root page of s
31750 63 61 6e 6e 65 64 20 62 2d 74 72 65 65 20 2a 2f  canned b-tree */
31760 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ..        sqlite
31770 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
31780 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
31790 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54          sqlite3T
317a0 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c  ableLock(pParse,
317b0 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d   iDb, pTab->tnum
317c0 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  , 0, pTab->zName
317d0 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 53  );..        /* S
317e0 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 69 6e  earch for the in
317f0 64 65 78 20 74 68 61 74 20 68 61 73 20 74 68 65  dex that has the
31800 20 6c 6f 77 65 73 74 20 73 63 61 6e 20 63 6f 73   lowest scan cos
31810 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  t..        **.  
31820 20 20 20 20 20 20 2a 2a 20 28 32 30 31 31 2d 30        ** (2011-0
31830 34 2d 31 35 29 20 44 6f 20 6e 6f 74 20 64 6f 20  4-15) Do not do 
31840 61 20 66 75 6c 6c 20 73 63 61 6e 20 6f 66 20 61  a full scan of a
31850 6e 20 75 6e 6f 72 64 65 72 65 64 20 69 6e 64 65  n unordered inde
31860 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  x..        **.  
31870 20 20 20 20 20 20 2a 2a 20 28 32 30 31 33 2d 31        ** (2013-1
31880 30 2d 30 33 29 20 44 6f 20 6e 6f 74 20 63 6f 75  0-03) Do not cou
31890 6e 74 20 74 68 65 20 65 6e 74 72 69 65 73 20 69  nt the entries i
318a0 6e 20 61 20 70 61 72 74 69 61 6c 20 69 6e 64 65  n a partial inde
318b0 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  x..        **.  
318c0 20 20 20 20 20 20 2a 2a 20 49 6e 20 70 72 61 63        ** In prac
318d0 74 69 63 65 20 74 68 65 20 4b 65 79 49 6e 66 6f  tice the KeyInfo
318e0 20 73 74 72 75 63 74 75 72 65 20 77 69 6c 6c 20   structure will 
318f0 6e 6f 74 20 62 65 20 75 73 65 64 2e 20 49 74 20  not be used. It 
31900 69 73 20 6f 6e 6c 79 20 0a 20 20 20 20 20 20 20  is only .       
31910 20 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 6b 65   ** passed to ke
31920 65 70 20 4f 50 5f 4f 70 65 6e 52 65 61 64 20 68  ep OP_OpenRead h
31930 61 70 70 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f  appy..        */
31940 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 48 61  .        if( !Ha
31950 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 20 70  sRowid(pTab) ) p
31960 42 65 73 74 20 3d 20 73 71 6c 69 74 65 33 50 72  Best = sqlite3Pr
31970 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54  imaryKeyIndex(pT
31980 61 62 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  ab);.        for
31990 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
319a0 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
319b0 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
319c0 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
319d0 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d 30 0a 20  >bUnordered==0. 
319e0 20 20 20 20 20 20 20 20 20 20 26 26 20 70 49 64            && pId
319f0 78 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 54 61 62  x->szIdxRow<pTab
31a00 2d 3e 73 7a 54 61 62 52 6f 77 0a 20 20 20 20 20  ->szTabRow.     
31a10 20 20 20 20 20 20 26 26 20 70 49 64 78 2d 3e 70        && pIdx->p
31a20 50 61 72 74 49 64 78 57 68 65 72 65 3d 3d 30 0a  PartIdxWhere==0.
31a30 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 21             && (!
31a40 70 42 65 73 74 20 7c 7c 20 70 49 64 78 2d 3e 73  pBest || pIdx->s
31a50 7a 49 64 78 52 6f 77 3c 70 42 65 73 74 2d 3e 73  zIdxRow<pBest->s
31a60 7a 49 64 78 52 6f 77 29 0a 20 20 20 20 20 20 20  zIdxRow).       
31a70 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
31a80 20 20 70 42 65 73 74 20 3d 20 70 49 64 78 3b 0a    pBest = pIdx;.
31a90 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
31aa0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
31ab0 28 20 70 42 65 73 74 20 29 7b 0a 20 20 20 20 20  ( pBest ){.     
31ac0 20 20 20 20 20 69 52 6f 6f 74 20 3d 20 70 42 65       iRoot = pBe
31ad0 73 74 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20  st->tnum;.      
31ae0 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73      pKeyInfo = s
31af0 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49  qlite3KeyInfoOfI
31b00 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 42 65  ndex(pParse, pBe
31b10 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  st);.        }..
31b20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
31b30 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73  a read-only curs
31b40 6f 72 2c 20 65 78 65 63 75 74 65 20 74 68 65 20  or, execute the 
31b50 4f 50 5f 43 6f 75 6e 74 2c 20 63 6c 6f 73 65 20  OP_Count, close 
31b60 74 68 65 20 63 75 72 73 6f 72 2e 20 2a 2f 0a 20  the cursor. */. 
31b70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
31b80 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
31b90 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 43 73 72  P_OpenRead, iCsr
31ba0 2c 20 69 52 6f 6f 74 2c 20 69 44 62 2c 20 31 29  , iRoot, iDb, 1)
31bb0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4b  ;.        if( pK
31bc0 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20  eyInfo ){.      
31bd0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
31be0 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28  hangeP4(v, -1, (
31bf0 63 68 61 72 20 2a 29 70 4b 65 79 49 6e 66 6f 2c  char *)pKeyInfo,
31c00 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
31c10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
31c20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
31c30 32 28 76 2c 20 4f 50 5f 43 6f 75 6e 74 2c 20 69  2(v, OP_Count, i
31c40 43 73 72 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46  Csr, sAggInfo.aF
31c50 75 6e 63 5b 30 5d 2e 69 4d 65 6d 29 3b 0a 20 20  unc[0].iMem);.  
31c60 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
31c70 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c  eAddOp1(v, OP_Cl
31c80 6f 73 65 2c 20 69 43 73 72 29 3b 0a 20 20 20 20  ose, iCsr);.    
31c90 20 20 20 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c      explainSimpl
31ca0 65 43 6f 75 6e 74 28 70 50 61 72 73 65 2c 20 70  eCount(pParse, p
31cb0 54 61 62 2c 20 70 42 65 73 74 29 3b 0a 20 20 20  Tab, pBest);.   
31cc0 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20     }else.#endif 
31cd0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42  /* SQLITE_OMIT_B
31ce0 54 52 45 45 43 4f 55 4e 54 20 2a 2f 0a 20 20 20  TREECOUNT */.   
31cf0 20 20 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20     {.        /* 
31d00 43 68 65 63 6b 20 69 66 20 74 68 65 20 71 75 65  Check if the que
31d10 72 79 20 69 73 20 6f 66 20 6f 6e 65 20 6f 66 20  ry is of one of 
31d20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f  the following fo
31d30 72 6d 73 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a  rms:.        **.
31d40 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c          **   SEL
31d50 45 43 54 20 6d 69 6e 28 78 29 20 46 52 4f 4d 20  ECT min(x) FROM 
31d60 2e 2e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  ....        **  
31d70 20 53 45 4c 45 43 54 20 6d 61 78 28 78 29 20 46   SELECT max(x) F
31d80 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 20 20  ROM ....        
31d90 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 66  **.        ** If
31da0 20 69 74 20 69 73 2c 20 74 68 65 6e 20 61 73 6b   it is, then ask
31db0 20 74 68 65 20 63 6f 64 65 20 69 6e 20 77 68 65   the code in whe
31dc0 72 65 2e 63 20 74 6f 20 61 74 74 65 6d 70 74 20  re.c to attempt 
31dd0 74 6f 20 73 6f 72 74 20 72 65 73 75 6c 74 73 0a  to sort results.
31de0 20 20 20 20 20 20 20 20 2a 2a 20 61 73 20 69 66          ** as if
31df0 20 74 68 65 72 65 20 77 61 73 20 61 6e 20 22 4f   there was an "O
31e00 52 44 45 52 20 4f 4e 20 78 22 20 6f 72 20 22 4f  RDER ON x" or "O
31e10 52 44 45 52 20 4f 4e 20 78 20 44 45 53 43 22 20  RDER ON x DESC" 
31e20 63 6c 61 75 73 65 2e 20 0a 20 20 20 20 20 20 20  clause. .       
31e30 20 2a 2a 20 49 66 20 77 68 65 72 65 2e 63 20 69   ** If where.c i
31e40 73 20 61 62 6c 65 20 74 6f 20 70 72 6f 64 75 63  s able to produc
31e50 65 20 72 65 73 75 6c 74 73 20 73 6f 72 74 65 64  e results sorted
31e60 20 69 6e 20 74 68 69 73 20 6f 72 64 65 72 2c 20   in this order, 
31e70 74 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  then.        ** 
31e80 61 64 64 20 76 64 62 65 20 63 6f 64 65 20 74 6f  add vdbe code to
31e90 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68   break out of th
31ea0 65 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 6f  e processing loo
31eb0 70 20 61 66 74 65 72 20 74 68 65 20 0a 20 20 20  p after the .   
31ec0 20 20 20 20 20 2a 2a 20 66 69 72 73 74 20 69 74       ** first it
31ed0 65 72 61 74 69 6f 6e 20 28 73 69 6e 63 65 20 74  eration (since t
31ee0 68 65 20 66 69 72 73 74 20 69 74 65 72 61 74 69  he first iterati
31ef0 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69  on of the loop i
31f00 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 67 75  s .        ** gu
31f10 61 72 61 6e 74 65 65 64 20 74 6f 20 6f 70 65 72  aranteed to oper
31f20 61 74 65 20 6f 6e 20 74 68 65 20 72 6f 77 20 77  ate on the row w
31f30 69 74 68 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20  ith the minimum 
31f40 6f 72 20 6d 61 78 69 6d 75 6d 20 0a 20 20 20 20  or maximum .    
31f50 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20      ** value of 
31f60 78 2c 20 74 68 65 20 6f 6e 6c 79 20 72 6f 77 20  x, the only row 
31f70 72 65 71 75 69 72 65 64 29 2e 0a 20 20 20 20 20  required)..     
31f80 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
31f90 20 41 20 73 70 65 63 69 61 6c 20 66 6c 61 67 20   A special flag 
31fa0 6d 75 73 74 20 62 65 20 70 61 73 73 65 64 20 74  must be passed t
31fb0 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  o sqlite3WhereBe
31fc0 67 69 6e 28 29 20 74 6f 20 73 6c 69 67 68 74 6c  gin() to slightl
31fd0 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64  y.        ** mod
31fe0 69 66 79 20 62 65 68 61 76 69 6f 72 20 61 73 20  ify behavior as 
31ff0 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20 20  follows:.       
32000 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   **.        **  
32010 20 2b 20 49 66 20 74 68 65 20 71 75 65 72 79 20   + If the query 
32020 69 73 20 61 20 22 53 45 4c 45 43 54 20 6d 69 6e  is a "SELECT min
32030 28 78 29 22 2c 20 74 68 65 6e 20 74 68 65 20 6c  (x)", then the l
32040 6f 6f 70 20 63 6f 64 65 64 20 62 79 0a 20 20 20  oop coded by.   
32050 20 20 20 20 20 2a 2a 20 20 20 20 20 77 68 65 72       **     wher
32060 65 2e 63 20 73 68 6f 75 6c 64 20 6e 6f 74 20 69  e.c should not i
32070 74 65 72 61 74 65 20 6f 76 65 72 20 61 6e 79 20  terate over any 
32080 76 61 6c 75 65 73 20 77 69 74 68 20 61 20 4e 55  values with a NU
32090 4c 4c 20 76 61 6c 75 65 0a 20 20 20 20 20 20 20  LL value.       
320a0 20 2a 2a 20 20 20 20 20 66 6f 72 20 78 2e 0a 20   **     for x.. 
320b0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
320c0 20 20 2a 2a 20 20 20 2b 20 54 68 65 20 6f 70 74    **   + The opt
320d0 69 6d 69 7a 65 72 20 63 6f 64 65 20 69 6e 20 77  imizer code in w
320e0 68 65 72 65 2e 63 20 28 74 68 65 20 74 68 69 6e  here.c (the thin
320f0 67 20 74 68 61 74 20 64 65 63 69 64 65 73 20 77  g that decides w
32100 68 69 63 68 0a 20 20 20 20 20 20 20 20 2a 2a 20  hich.        ** 
32110 20 20 20 20 69 6e 64 65 78 20 6f 72 20 69 6e 64      index or ind
32120 69 63 65 73 20 74 6f 20 75 73 65 29 20 73 68 6f  ices to use) sho
32130 75 6c 64 20 70 6c 61 63 65 20 61 20 64 69 66 66  uld place a diff
32140 65 72 65 6e 74 20 70 72 69 6f 72 69 74 79 20 6f  erent priority o
32150 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  n .        **   
32160 20 20 73 61 74 69 73 66 79 69 6e 67 20 74 68 65    satisfying the
32170 20 27 4f 52 44 45 52 20 42 59 27 20 63 6c 61 75   'ORDER BY' clau
32180 73 65 20 74 68 61 6e 20 69 74 20 64 6f 65 73 20  se than it does 
32190 69 6e 20 6f 74 68 65 72 20 63 61 73 65 73 2e 0a  in other cases..
321a0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 52          **     R
321b0 65 66 65 72 20 74 6f 20 63 6f 64 65 20 61 6e 64  efer to code and
321c0 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 77 68 65   comments in whe
321d0 72 65 2e 63 20 66 6f 72 20 64 65 74 61 69 6c 73  re.c for details
321e0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
321f0 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
32200 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a 20 20 20 20  MinMax = 0;.    
32210 20 20 20 20 75 38 20 66 6c 61 67 20 3d 20 57 48      u8 flag = WH
32220 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d  ERE_ORDERBY_NORM
32230 41 4c 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20  AL;.        .   
32240 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
32250 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20  pGroupBy==0 );. 
32260 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 66         assert( f
32270 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  lag==0 );.      
32280 20 20 69 66 28 20 70 2d 3e 70 48 61 76 69 6e 67    if( p->pHaving
32290 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
322a0 20 66 6c 61 67 20 3d 20 6d 69 6e 4d 61 78 51 75   flag = minMaxQu
322b0 65 72 79 28 26 73 41 67 67 49 6e 66 6f 2c 20 26  ery(&sAggInfo, &
322c0 70 4d 69 6e 4d 61 78 29 3b 0a 20 20 20 20 20 20  pMinMax);.      
322d0 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
322e0 72 74 28 20 66 6c 61 67 3d 3d 30 20 7c 7c 20 28  rt( flag==0 || (
322f0 70 4d 69 6e 4d 61 78 21 3d 30 20 26 26 20 70 4d  pMinMax!=0 && pM
32300 69 6e 4d 61 78 2d 3e 6e 45 78 70 72 3d 3d 31 29  inMax->nExpr==1)
32310 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28   );..        if(
32320 20 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20   flag ){.       
32330 20 20 20 70 4d 69 6e 4d 61 78 20 3d 20 73 71 6c     pMinMax = sql
32340 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
32350 64 62 2c 20 70 4d 69 6e 4d 61 78 2c 20 30 29 3b  db, pMinMax, 0);
32360 0a 20 20 20 20 20 20 20 20 20 20 70 44 65 6c 20  .          pDel 
32370 3d 20 70 4d 69 6e 4d 61 78 3b 0a 20 20 20 20 20  = pMinMax;.     
32380 20 20 20 20 20 69 66 28 20 70 4d 69 6e 4d 61 78       if( pMinMax
32390 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46   && !db->mallocF
323a0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20  ailed ){.       
323b0 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b       pMinMax->a[
323c0 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 66  0].sortOrder = f
323d0 6c 61 67 21 3d 57 48 45 52 45 5f 4f 52 44 45 52  lag!=WHERE_ORDER
323e0 42 59 5f 4d 49 4e 20 3f 31 3a 30 3b 0a 20 20 20  BY_MIN ?1:0;.   
323f0 20 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78           pMinMax
32400 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70  ->a[0].pExpr->op
32410 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20   = TK_COLUMN;.  
32420 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
32430 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 2f    }.  .        /
32440 2a 20 54 68 69 73 20 63 61 73 65 20 72 75 6e 73  * This case runs
32450 20 69 66 20 74 68 65 20 61 67 67 72 65 67 61 74   if the aggregat
32460 65 20 68 61 73 20 6e 6f 20 47 52 4f 55 50 20 42  e has no GROUP B
32470 59 20 63 6c 61 75 73 65 2e 20 20 54 68 65 0a 20  Y clause.  The. 
32480 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73         ** proces
32490 73 69 6e 67 20 69 73 20 6d 75 63 68 20 73 69 6d  sing is much sim
324a0 70 6c 65 72 20 73 69 6e 63 65 20 74 68 65 72 65  pler since there
324b0 20 69 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c   is only a singl
324c0 65 20 72 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a  e row.        **
324d0 20 6f 66 20 6f 75 74 70 75 74 2e 0a 20 20 20 20   of output..    
324e0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72      */.        r
324f0 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28  esetAccumulator(
32500 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
32510 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 57 49 6e  o);.        pWIn
32520 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  fo = sqlite3Wher
32530 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70  eBegin(pParse, p
32540 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c  TabList, pWhere,
32550 20 70 4d 69 6e 4d 61 78 2c 30 2c 66 6c 61 67 2c   pMinMax,0,flag,
32560 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
32570 70 57 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20  pWInfo==0 ){.   
32580 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
32590 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
325a0 20 70 44 65 6c 29 3b 0a 20 20 20 20 20 20 20 20   pDel);.        
325b0 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
325c0 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
325d0 20 20 20 20 20 75 70 64 61 74 65 41 63 63 75 6d       updateAccum
325e0 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26  ulator(pParse, &
325f0 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
32600 20 20 20 61 73 73 65 72 74 28 20 70 4d 69 6e 4d     assert( pMinM
32610 61 78 3d 3d 30 20 7c 7c 20 70 4d 69 6e 4d 61 78  ax==0 || pMinMax
32620 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20  ->nExpr==1 );.  
32630 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
32640 33 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28  3WhereIsOrdered(
32650 70 57 49 6e 66 6f 29 3e 30 20 29 7b 0a 20 20 20  pWInfo)>0 ){.   
32660 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
32670 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
32680 6f 74 6f 2c 20 30 2c 20 73 71 6c 69 74 65 33 57  oto, 0, sqlite3W
32690 68 65 72 65 42 72 65 61 6b 4c 61 62 65 6c 28 70  hereBreakLabel(p
326a0 57 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20 20  WInfo));.       
326b0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
326c0 76 2c 20 22 25 73 28 29 20 62 79 20 69 6e 64 65  v, "%s() by inde
326d0 78 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  x",.            
326e0 20 20 20 20 28 66 6c 61 67 3d 3d 57 48 45 52 45      (flag==WHERE
326f0 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3f 22 6d 69  _ORDERBY_MIN?"mi
32700 6e 22 3a 22 6d 61 78 22 29 29 29 3b 0a 20 20 20  n":"max")));.   
32710 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
32720 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
32730 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  WInfo);.        
32740 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74  finalizeAggFunct
32750 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41  ions(pParse, &sA
32760 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 7d  ggInfo);.      }
32770 0a 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f  ..      sSort.pO
32780 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
32790 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
327a0 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48 61  alse(pParse, pHa
327b0 76 69 6e 67 2c 20 61 64 64 72 45 6e 64 2c 20 53  ving, addrEnd, S
327c0 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
327d0 29 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49  );.      selectI
327e0 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
327f0 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 2d   p, p->pEList, -
32800 31 2c 20 30 2c 20 30 2c 20 0a 20 20 20 20 20 20  1, 0, 0, .      
32810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32820 70 44 65 73 74 2c 20 61 64 64 72 45 6e 64 2c 20  pDest, addrEnd, 
32830 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20  addrEnd);.      
32840 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
32850 65 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 29 3b  elete(db, pDel);
32860 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
32870 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
32880 65 6c 28 76 2c 20 61 64 64 72 45 6e 64 29 3b 0a  el(v, addrEnd);.
32890 20 20 20 20 0a 20 20 7d 20 2f 2a 20 65 6e 64 69      .  } /* endi
328a0 66 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  f aggregate quer
328b0 79 20 2a 2f 0a 0a 20 20 69 66 28 20 73 44 69 73  y */..  if( sDis
328c0 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 3d  tinct.eTnctType=
328d0 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f  =WHERE_DISTINCT_
328e0 55 4e 4f 52 44 45 52 45 44 20 29 7b 0a 20 20 20  UNORDERED ){.   
328f0 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c   explainTempTabl
32900 65 28 70 50 61 72 73 65 2c 20 22 44 49 53 54 49  e(pParse, "DISTI
32910 4e 43 54 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  NCT");.  }..  /*
32920 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   If there is an 
32930 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
32940 20 74 68 65 6e 20 77 65 20 6e 65 65 64 20 74 6f   then we need to
32950 20 73 6f 72 74 20 74 68 65 20 72 65 73 75 6c 74   sort the result
32960 73 0a 20 20 2a 2a 20 61 6e 64 20 73 65 6e 64 20  s.  ** and send 
32970 74 68 65 6d 20 74 6f 20 74 68 65 20 63 61 6c 6c  them to the call
32980 62 61 63 6b 20 6f 6e 65 20 62 79 20 6f 6e 65 2e  back one by one.
32990 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 53 6f 72  .  */.  if( sSor
329a0 74 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  t.pOrderBy ){.  
329b0 20 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62    explainTempTab
329c0 6c 65 28 70 50 61 72 73 65 2c 20 73 53 6f 72 74  le(pParse, sSort
329d0 2e 6e 4f 42 53 61 74 3e 30 20 3f 20 22 52 49 47  .nOBSat>0 ? "RIG
329e0 48 54 20 50 41 52 54 20 4f 46 20 4f 52 44 45 52  HT PART OF ORDER
329f0 20 42 59 22 3a 22 4f 52 44 45 52 20 42 59 22 29   BY":"ORDER BY")
32a00 3b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f  ;.    generateSo
32a10 72 74 54 61 69 6c 28 70 50 61 72 73 65 2c 20 70  rtTail(pParse, p
32a20 2c 20 26 73 53 6f 72 74 2c 20 70 45 4c 69 73 74  , &sSort, pEList
32a30 2d 3e 6e 45 78 70 72 2c 20 70 44 65 73 74 29 3b  ->nExpr, pDest);
32a40 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  .  }..  /* Jump 
32a50 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68 69  here to skip thi
32a60 73 20 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73  s query.  */.  s
32a70 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
32a80 65 4c 61 62 65 6c 28 76 2c 20 69 45 6e 64 29 3b  eLabel(v, iEnd);
32a90 0a 0a 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43  ..  /* The SELEC
32aa0 54 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  T was successful
32ab0 6c 79 20 63 6f 64 65 64 2e 20 20 20 53 65 74 20  ly coded.   Set 
32ac0 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  the return code 
32ad0 74 6f 20 30 0a 20 20 2a 2a 20 74 6f 20 69 6e 64  to 0.  ** to ind
32ae0 69 63 61 74 65 20 6e 6f 20 65 72 72 6f 72 73 2e  icate no errors.
32af0 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 30 3b 0a  .  */.  rc = 0;.
32b00 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75  .  /* Control ju
32b10 6d 70 73 20 74 6f 20 68 65 72 65 20 69 66 20 61  mps to here if a
32b20 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  n error is encou
32b30 6e 74 65 72 65 64 20 61 62 6f 76 65 2c 20 6f 72  ntered above, or
32b40 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63 65   upon.  ** succe
32b50 73 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66 20  ssful coding of 
32b60 74 68 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2f  the SELECT..  */
32b70 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 65  .select_end:.  e
32b80 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
32b90 28 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74  (pParse->iSelect
32ba0 49 64 2c 20 69 52 65 73 74 6f 72 65 53 65 6c 65  Id, iRestoreSele
32bb0 63 74 49 64 29 3b 0a 0a 20 20 2f 2a 20 49 64 65  ctId);..  /* Ide
32bc0 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d  ntify column nam
32bd0 65 73 20 69 66 20 72 65 73 75 6c 74 73 20 6f 66  es if results of
32be0 20 74 68 65 20 53 45 4c 45 43 54 20 61 72 65 20   the SELECT are 
32bf0 74 6f 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20  to be output..  
32c00 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
32c10 49 54 45 5f 4f 4b 20 26 26 20 70 44 65 73 74 2d  ITE_OK && pDest-
32c20 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70  >eDest==SRT_Outp
32c30 75 74 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61  ut ){.    genera
32c40 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  teColumnNames(pP
32c50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
32c60 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20  pEList);.  }..  
32c70 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
32c80 2c 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 29  , sAggInfo.aCol)
32c90 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
32ca0 65 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61  e(db, sAggInfo.a
32cb0 46 75 6e 63 29 3b 0a 23 69 66 20 53 45 4c 45 43  Func);.#if SELEC
32cc0 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  TTRACE_ENABLED. 
32cd0 20 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70   SELECTTRACE(1,p
32ce0 50 61 72 73 65 2c 70 2c 28 22 65 6e 64 20 70 72  Parse,p,("end pr
32cf0 6f 63 65 73 73 69 6e 67 5c 6e 22 29 29 3b 0a 20  ocessing\n"));. 
32d00 20 70 50 61 72 73 65 2d 3e 6e 53 65 6c 65 63 74   pParse->nSelect
32d10 49 6e 64 65 6e 74 2d 2d 3b 0a 23 65 6e 64 69 66  Indent--;.#endif
32d20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
32d30 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
32d40 45 42 55 47 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  EBUG./*.** Gener
32d50 61 74 65 20 61 20 68 75 6d 61 6e 2d 72 65 61 64  ate a human-read
32d60 61 62 6c 65 20 64 65 73 63 72 69 70 74 69 6f 6e  able description
32d70 20 6f 66 20 61 20 74 68 65 20 53 65 6c 65 63 74   of a the Select
32d80 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 76 6f 69 64   object..*/.void
32d90 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
32da0 53 65 6c 65 63 74 28 54 72 65 65 56 69 65 77 20  Select(TreeView 
32db0 2a 70 56 69 65 77 2c 20 63 6f 6e 73 74 20 53 65  *pView, const Se
32dc0 6c 65 63 74 20 2a 70 2c 20 75 38 20 6d 6f 72 65  lect *p, u8 more
32dd0 54 6f 46 6f 6c 6c 6f 77 29 7b 0a 20 20 69 6e 74  ToFollow){.  int
32de0 20 6e 20 3d 20 30 3b 0a 20 20 70 56 69 65 77 20   n = 0;.  pView 
32df0 3d 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65  = sqlite3TreeVie
32e00 77 50 75 73 68 28 70 56 69 65 77 2c 20 6d 6f 72  wPush(pView, mor
32e10 65 54 6f 46 6f 6c 6c 6f 77 29 3b 0a 20 20 73 71  eToFollow);.  sq
32e20 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e  lite3TreeViewLin
32e30 65 28 70 56 69 65 77 2c 20 22 53 45 4c 45 43 54  e(pView, "SELECT
32e40 25 73 25 73 20 28 30 78 25 70 29 22 2c 0a 20 20  %s%s (0x%p)",.  
32e50 20 20 28 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20    ((p->selFlags 
32e60 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29 20 3f  & SF_Distinct) ?
32e70 20 22 20 44 49 53 54 49 4e 43 54 22 20 3a 20 22   " DISTINCT" : "
32e80 22 29 2c 0a 20 20 20 20 28 28 70 2d 3e 73 65 6c  "),.    ((p->sel
32e90 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65  Flags & SF_Aggre
32ea0 67 61 74 65 29 20 3f 20 22 20 61 67 67 5f 66 6c  gate) ? " agg_fl
32eb0 61 67 22 20 3a 20 22 22 29 2c 20 70 0a 20 20 29  ag" : ""), p.  )
32ec0 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53 72 63 20  ;.  if( p->pSrc 
32ed0 26 26 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63  && p->pSrc->nSrc
32ee0 20 29 20 6e 2b 2b 3b 0a 20 20 69 66 28 20 70 2d   ) n++;.  if( p-
32ef0 3e 70 57 68 65 72 65 20 29 20 6e 2b 2b 3b 0a 20  >pWhere ) n++;. 
32f00 20 69 66 28 20 70 2d 3e 70 47 72 6f 75 70 42 79   if( p->pGroupBy
32f10 20 29 20 6e 2b 2b 3b 0a 20 20 69 66 28 20 70 2d   ) n++;.  if( p-
32f20 3e 70 48 61 76 69 6e 67 20 29 20 6e 2b 2b 3b 0a  >pHaving ) n++;.
32f30 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
32f40 79 20 29 20 6e 2b 2b 3b 0a 20 20 69 66 28 20 70  y ) n++;.  if( p
32f50 2d 3e 70 4c 69 6d 69 74 20 29 20 6e 2b 2b 3b 0a  ->pLimit ) n++;.
32f60 20 20 69 66 28 20 70 2d 3e 70 4f 66 66 73 65 74    if( p->pOffset
32f70 20 29 20 6e 2b 2b 3b 0a 20 20 69 66 28 20 70 2d   ) n++;.  if( p-
32f80 3e 70 50 72 69 6f 72 20 29 20 6e 2b 2b 3b 0a 20  >pPrior ) n++;. 
32f90 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
32fa0 45 78 70 72 4c 69 73 74 28 70 56 69 65 77 2c 20  ExprList(pView, 
32fb0 70 2d 3e 70 45 4c 69 73 74 2c 20 28 6e 2d 2d 29  p->pEList, (n--)
32fc0 3e 30 2c 20 22 72 65 73 75 6c 74 2d 73 65 74 22  >0, "result-set"
32fd0 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53 72 63  );.  if( p->pSrc
32fe0 20 26 26 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72   && p->pSrc->nSr
32ff0 63 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  c ){.    int i;.
33000 20 20 20 20 70 56 69 65 77 20 3d 20 73 71 6c 69      pView = sqli
33010 74 65 33 54 72 65 65 56 69 65 77 50 75 73 68 28  te3TreeViewPush(
33020 70 56 69 65 77 2c 20 28 6e 2d 2d 29 3e 30 29 3b  pView, (n--)>0);
33030 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65  .    sqlite3Tree
33040 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 20  ViewLine(pView, 
33050 22 46 52 4f 4d 22 29 3b 0a 20 20 20 20 66 6f 72  "FROM");.    for
33060 28 69 3d 30 3b 20 69 3c 70 2d 3e 70 53 72 63 2d  (i=0; i<p->pSrc-
33070 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
33080 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
33090 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
330a0 26 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a  &p->pSrc->a[i];.
330b0 20 20 20 20 20 20 53 74 72 41 63 63 75 6d 20 78        StrAccum x
330c0 3b 0a 20 20 20 20 20 20 63 68 61 72 20 7a 4c 69  ;.      char zLi
330d0 6e 65 5b 31 30 30 5d 3b 0a 20 20 20 20 20 20 73  ne[100];.      s
330e0 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e  qlite3StrAccumIn
330f0 69 74 28 26 78 2c 20 7a 4c 69 6e 65 2c 20 73 69  it(&x, zLine, si
33100 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c 20 30 29 3b  zeof(zLine), 0);
33110 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50  .      sqlite3XP
33120 72 69 6e 74 66 28 26 78 2c 20 30 2c 20 22 7b 25  rintf(&x, 0, "{%
33130 64 2c 2a 7d 22 2c 20 70 49 74 65 6d 2d 3e 69 43  d,*}", pItem->iC
33140 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 69 66  ursor);.      if
33150 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  ( pItem->zDataba
33160 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  se ){.        sq
33170 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c  lite3XPrintf(&x,
33180 20 30 2c 20 22 20 25 73 2e 25 73 22 2c 20 70 49   0, " %s.%s", pI
33190 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 2c 20  tem->zDatabase, 
331a0 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pItem->zName);. 
331b0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
331c0 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20  Item->zName ){. 
331d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50         sqlite3XP
331e0 72 69 6e 74 66 28 26 78 2c 20 30 2c 20 22 20 25  rintf(&x, 0, " %
331f0 73 22 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  s", pItem->zName
33200 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
33210 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 54 61 62   if( pItem->pTab
33220 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
33230 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20 30  te3XPrintf(&x, 0
33240 2c 20 22 20 74 61 62 6e 61 6d 65 3d 25 51 22 2c  , " tabname=%Q",
33250 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e   pItem->pTab->zN
33260 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
33270 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a      if( pItem->z
33280 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20 20  Alias ){.       
33290 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28   sqlite3XPrintf(
332a0 26 78 2c 20 30 2c 20 22 20 28 41 53 20 25 73 29  &x, 0, " (AS %s)
332b0 22 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  ", pItem->zAlias
332c0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
332d0 20 69 66 28 20 70 49 74 65 6d 2d 3e 6a 6f 69 6e   if( pItem->join
332e0 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 20 29  type & JT_LEFT )
332f0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
33300 33 58 50 72 69 6e 74 66 28 26 78 2c 20 30 2c 20  3XPrintf(&x, 0, 
33310 22 20 4c 45 46 54 2d 4a 4f 49 4e 22 29 3b 0a 20  " LEFT-JOIN");. 
33320 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
33330 69 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69  ite3StrAccumFini
33340 73 68 28 26 78 29 3b 0a 20 20 20 20 20 20 73 71  sh(&x);.      sq
33350 6c 69 74 65 33 54 72 65 65 56 69 65 77 49 74 65  lite3TreeViewIte
33360 6d 28 70 56 69 65 77 2c 20 7a 4c 69 6e 65 2c 20  m(pView, zLine, 
33370 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 2d  i<p->pSrc->nSrc-
33380 31 29 3b 20 0a 20 20 20 20 20 20 69 66 28 20 70  1); .      if( p
33390 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b  Item->pSelect ){
333a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
333b0 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 70  TreeViewSelect(p
333c0 56 69 65 77 2c 20 70 49 74 65 6d 2d 3e 70 53 65  View, pItem->pSe
333d0 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  lect, 0);.      
333e0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  }.      sqlite3T
333f0 72 65 65 56 69 65 77 50 6f 70 28 70 56 69 65 77  reeViewPop(pView
33400 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
33410 69 74 65 33 54 72 65 65 56 69 65 77 50 6f 70 28  ite3TreeViewPop(
33420 70 56 69 65 77 29 3b 0a 20 20 7d 0a 20 20 69 66  pView);.  }.  if
33430 28 20 70 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20  ( p->pWhere ){. 
33440 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
33450 65 77 49 74 65 6d 28 70 56 69 65 77 2c 20 22 57  ewItem(pView, "W
33460 48 45 52 45 22 2c 20 28 6e 2d 2d 29 3e 30 29 3b  HERE", (n--)>0);
33470 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65  .    sqlite3Tree
33480 56 69 65 77 45 78 70 72 28 70 56 69 65 77 2c 20  ViewExpr(pView, 
33490 70 2d 3e 70 57 68 65 72 65 2c 20 30 29 3b 0a 20  p->pWhere, 0);. 
334a0 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
334b0 65 77 50 6f 70 28 70 56 69 65 77 29 3b 0a 20 20  ewPop(pView);.  
334c0 7d 0a 20 20 69 66 28 20 70 2d 3e 70 47 72 6f 75  }.  if( p->pGrou
334d0 70 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pBy ){.    sqlit
334e0 65 33 54 72 65 65 56 69 65 77 45 78 70 72 4c 69  e3TreeViewExprLi
334f0 73 74 28 70 56 69 65 77 2c 20 70 2d 3e 70 47 72  st(pView, p->pGr
33500 6f 75 70 42 79 2c 20 28 6e 2d 2d 29 3e 30 2c 20  oupBy, (n--)>0, 
33510 22 47 52 4f 55 50 42 59 22 29 3b 0a 20 20 7d 0a  "GROUPBY");.  }.
33520 20 20 69 66 28 20 70 2d 3e 70 48 61 76 69 6e 67    if( p->pHaving
33530 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54   ){.    sqlite3T
33540 72 65 65 56 69 65 77 49 74 65 6d 28 70 56 69 65  reeViewItem(pVie
33550 77 2c 20 22 48 41 56 49 4e 47 22 2c 20 28 6e 2d  w, "HAVING", (n-
33560 2d 29 3e 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  -)>0);.    sqlit
33570 65 33 54 72 65 65 56 69 65 77 45 78 70 72 28 70  e3TreeViewExpr(p
33580 56 69 65 77 2c 20 70 2d 3e 70 48 61 76 69 6e 67  View, p->pHaving
33590 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
335a0 33 54 72 65 65 56 69 65 77 50 6f 70 28 70 56 69  3TreeViewPop(pVi
335b0 65 77 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ew);.  }.  if( p
335c0 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
335d0 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
335e0 77 45 78 70 72 4c 69 73 74 28 70 56 69 65 77 2c  wExprList(pView,
335f0 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 28 6e   p->pOrderBy, (n
33600 2d 2d 29 3e 30 2c 20 22 4f 52 44 45 52 42 59 22  --)>0, "ORDERBY"
33610 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
33620 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71  pLimit ){.    sq
33630 6c 69 74 65 33 54 72 65 65 56 69 65 77 49 74 65  lite3TreeViewIte
33640 6d 28 70 56 69 65 77 2c 20 22 4c 49 4d 49 54 22  m(pView, "LIMIT"
33650 2c 20 28 6e 2d 2d 29 3e 30 29 3b 0a 20 20 20 20  , (n--)>0);.    
33660 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45  sqlite3TreeViewE
33670 78 70 72 28 70 56 69 65 77 2c 20 70 2d 3e 70 4c  xpr(pView, p->pL
33680 69 6d 69 74 2c 20 30 29 3b 0a 20 20 20 20 73 71  imit, 0);.    sq
33690 6c 69 74 65 33 54 72 65 65 56 69 65 77 50 6f 70  lite3TreeViewPop
336a0 28 70 56 69 65 77 29 3b 0a 20 20 7d 0a 20 20 69  (pView);.  }.  i
336b0 66 28 20 70 2d 3e 70 4f 66 66 73 65 74 20 29 7b  f( p->pOffset ){
336c0 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65  .    sqlite3Tree
336d0 56 69 65 77 49 74 65 6d 28 70 56 69 65 77 2c 20  ViewItem(pView, 
336e0 22 4f 46 46 53 45 54 22 2c 20 28 6e 2d 2d 29 3e  "OFFSET", (n--)>
336f0 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  0);.    sqlite3T
33700 72 65 65 56 69 65 77 45 78 70 72 28 70 56 69 65  reeViewExpr(pVie
33710 77 2c 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20 30  w, p->pOffset, 0
33720 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72  );.    sqlite3Tr
33730 65 65 56 69 65 77 50 6f 70 28 70 56 69 65 77 29  eeViewPop(pView)
33740 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
33750 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 63 6f 6e  Prior ){.    con
33760 73 74 20 63 68 61 72 20 2a 7a 4f 70 20 3d 20 22  st char *zOp = "
33770 55 4e 49 4f 4e 22 3b 0a 20 20 20 20 73 77 69 74  UNION";.    swit
33780 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20  ch( p->op ){.   
33790 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20     case TK_ALL: 
337a0 20 20 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 55          zOp = "U
337b0 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20 62 72 65 61  NION ALL";  brea
337c0 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b  k;.      case TK
337d0 5f 49 4e 54 45 52 53 45 43 54 3a 20 20 20 7a 4f  _INTERSECT:   zO
337e0 70 20 3d 20 22 49 4e 54 45 52 53 45 43 54 22 3b  p = "INTERSECT";
337f0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
33800 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 20 20  ase TK_EXCEPT:  
33810 20 20 20 20 7a 4f 70 20 3d 20 22 45 58 43 45 50      zOp = "EXCEP
33820 54 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  T";     break;. 
33830 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
33840 54 72 65 65 56 69 65 77 49 74 65 6d 28 70 56 69  TreeViewItem(pVi
33850 65 77 2c 20 7a 4f 70 2c 20 28 6e 2d 2d 29 3e 30  ew, zOp, (n--)>0
33860 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72  );.    sqlite3Tr
33870 65 65 56 69 65 77 53 65 6c 65 63 74 28 70 56 69  eeViewSelect(pVi
33880 65 77 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 30  ew, p->pPrior, 0
33890 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72  );.    sqlite3Tr
338a0 65 65 56 69 65 77 50 6f 70 28 70 56 69 65 77 29  eeViewPop(pView)
338b0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 54  ;.  }.  sqlite3T
338c0 72 65 65 56 69 65 77 50 6f 70 28 70 56 69 65 77  reeViewPop(pView
338d0 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  );.}.#endif /* S
338e0 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a     QLITE_DEBUG */.