/ Hex Artifact Content
Login

Artifact 4cf17c0960e222bf65a95bc186c4c7c2366a7adc:


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 41 6e 20 69 6e 73 74 61 6e 63  /*.** An instanc
0210: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
0220: 6e 67 20 6f 62 6a 65 63 74 20 69 73 20 75 73 65  ng object is use
0230: 64 20 74 6f 20 72 65 63 6f 72 64 20 69 6e 66 6f  d to record info
0240: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 0a 2a 2a  rmation about.**
0250: 20 68 6f 77 20 74 6f 20 70 72 6f 63 65 73 73 20   how to process 
0260: 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79  the DISTINCT key
0270: 77 6f 72 64 2c 20 74 6f 20 73 69 6d 70 6c 69 66  word, to simplif
0280: 79 20 70 61 73 73 69 6e 67 20 74 68 61 74 20 69  y passing that i
0290: 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 69 6e  nformation.** in
02a0: 74 6f 20 74 68 65 20 73 65 6c 65 63 74 49 6e 6e  to the selectInn
02b0: 65 72 4c 6f 6f 70 28 29 20 72 6f 75 74 69 6e 65  erLoop() routine
02c0: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
02d0: 75 63 74 20 44 69 73 74 69 6e 63 74 43 74 78 20  uct DistinctCtx 
02e0: 44 69 73 74 69 6e 63 74 43 74 78 3b 0a 73 74 72  DistinctCtx;.str
02f0: 75 63 74 20 44 69 73 74 69 6e 63 74 43 74 78 20  uct DistinctCtx 
0300: 7b 0a 20 20 75 38 20 69 73 54 6e 63 74 3b 20 20  {.  u8 isTnct;  
0310: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
0320: 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77  he DISTINCT keyw
0330: 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ord is present *
0340: 2f 0a 20 20 75 38 20 65 54 6e 63 74 54 79 70 65  /.  u8 eTnctType
0350: 3b 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68  ;   /* One of th
0360: 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  e WHERE_DISTINCT
0370: 5f 2a 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a  _* operators */.
0380: 20 20 69 6e 74 20 74 61 62 54 6e 63 74 3b 20 20    int tabTnct;  
0390: 20 20 2f 2a 20 45 70 68 65 6d 65 72 61 6c 20 74    /* Ephemeral t
03a0: 61 62 6c 65 20 75 73 65 64 20 66 6f 72 20 44 49  able used for DI
03b0: 53 54 49 4e 43 54 20 70 72 6f 63 65 73 73 69 6e  STINCT processin
03c0: 67 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54  g */.  int addrT
03d0: 6e 63 74 3b 20 20 20 2f 2a 20 41 64 64 72 65 73  nct;   /* Addres
03e0: 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 45 70 68 65  s of OP_OpenEphe
03f0: 6d 65 72 61 6c 20 6f 70 63 6f 64 65 20 66 6f 72  meral opcode for
0400: 20 74 61 62 54 6e 63 74 20 2a 2f 0a 7d 3b 0a 0a   tabTnct */.};..
0410: 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  /*.** An instanc
0420: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
0430: 6e 67 20 6f 62 6a 65 63 74 20 69 73 20 75 73 65  ng object is use
0440: 64 20 74 6f 20 72 65 63 6f 72 64 20 69 6e 66 6f  d to record info
0450: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 0a 2a 2a  rmation about.**
0460: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 28 6f   the ORDER BY (o
0470: 72 20 47 52 4f 55 50 20 42 59 29 20 63 6c 61 75  r GROUP BY) clau
0480: 73 65 20 6f 66 20 71 75 65 72 79 20 69 73 20 62  se of query is b
0490: 65 69 6e 67 20 63 6f 64 65 64 2e 0a 2a 2f 0a 74  eing coded..*/.t
04a0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53 6f  ypedef struct So
04b0: 72 74 43 74 78 20 53 6f 72 74 43 74 78 3b 0a 73  rtCtx SortCtx;.s
04c0: 74 72 75 63 74 20 53 6f 72 74 43 74 78 20 7b 0a  truct SortCtx {.
04d0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
04e0: 65 72 42 79 3b 20 20 20 2f 2a 20 54 68 65 20 4f  erBy;   /* The O
04f0: 52 44 45 52 20 42 59 20 28 6f 72 20 47 52 4f 55  RDER BY (or GROU
0500: 50 20 42 59 20 63 6c 61 75 73 65 29 20 2a 2f 0a  P BY clause) */.
0510: 20 20 69 6e 74 20 6e 4f 42 53 61 74 3b 20 20 20    int nOBSat;   
0520: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
0530: 72 20 6f 66 20 4f 52 44 45 52 20 42 59 20 74 65  r of ORDER BY te
0540: 72 6d 73 20 73 61 74 69 73 66 69 65 64 20 62 79  rms satisfied by
0550: 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e   indices */.  in
0560: 74 20 69 45 43 75 72 73 6f 72 3b 20 20 20 20 20  t iECursor;     
0570: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
0580: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 73 6f 72  mber for the sor
0590: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ter */.  int reg
05a0: 52 65 74 75 72 6e 3b 20 20 20 20 20 20 20 20 2f  Return;        /
05b0: 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69  * Register holdi
05c0: 6e 67 20 62 6c 6f 63 6b 2d 6f 75 74 70 75 74 20  ng block-output 
05d0: 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 20 2a  return address *
05e0: 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 42 6b 4f  /.  int labelBkO
05f0: 75 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 74 61  ut;       /* Sta
0600: 72 74 20 6c 61 62 65 6c 20 66 6f 72 20 74 68 65  rt label for the
0610: 20 62 6c 6f 63 6b 2d 6f 75 74 70 75 74 20 73 75   block-output su
0620: 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
0630: 74 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3b  t addrSortIndex;
0640: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
0650: 66 20 74 68 65 20 4f 50 5f 53 6f 72 74 65 72 4f  f the OP_SorterO
0660: 70 65 6e 20 6f 72 20 4f 50 5f 4f 70 65 6e 45 70  pen or OP_OpenEp
0670: 68 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 75 38 20  hemeral */.  u8 
0680: 73 6f 72 74 46 6c 61 67 73 3b 20 20 20 20 20 20  sortFlags;      
0690: 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d 6f     /* Zero or mo
06a0: 72 65 20 53 4f 52 54 46 4c 41 47 5f 2a 20 62 69  re SORTFLAG_* bi
06b0: 74 73 20 2a 2f 0a 7d 3b 0a 23 64 65 66 69 6e 65  ts */.};.#define
06c0: 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72   SORTFLAG_UseSor
06d0: 74 65 72 20 20 30 78 30 31 20 20 20 2f 2a 20 55  ter  0x01   /* U
06e0: 73 65 20 53 6f 72 74 65 72 4f 70 65 6e 20 69 6e  se SorterOpen in
06f0: 73 74 65 61 64 20 6f 66 20 4f 70 65 6e 45 70 68  stead of OpenEph
0700: 65 6d 65 72 61 6c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  emeral */../*.**
0710: 20 44 65 6c 65 74 65 20 61 6c 6c 20 74 68 65 20   Delete all the 
0720: 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 53 65 6c  content of a Sel
0730: 65 63 74 20 73 74 72 75 63 74 75 72 65 20 62 75  ect structure bu
0740: 74 20 64 6f 20 6e 6f 74 20 64 65 61 6c 6c 6f 63  t do not dealloc
0750: 61 74 65 0a 2a 2a 20 74 68 65 20 73 65 6c 65 63  ate.** the selec
0760: 74 20 73 74 72 75 63 74 75 72 65 20 69 74 73 65  t structure itse
0770: 6c 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  lf..*/.static vo
0780: 69 64 20 63 6c 65 61 72 53 65 6c 65 63 74 28 73  id clearSelect(s
0790: 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65  qlite3 *db, Sele
07a0: 63 74 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  ct *p){.  sqlite
07b0: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
07c0: 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a  db, p->pEList);.
07d0: 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
07e0: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 53  Delete(db, p->pS
07f0: 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  rc);.  sqlite3Ex
0800: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
0810: 70 57 68 65 72 65 29 3b 0a 20 20 73 71 6c 69 74  pWhere);.  sqlit
0820: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
0830: 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79  (db, p->pGroupBy
0840: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
0850: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 48  Delete(db, p->pH
0860: 61 76 69 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65  aving);.  sqlite
0870: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
0880: 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29  db, p->pOrderBy)
0890: 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
08a0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
08b0: 50 72 69 6f 72 29 3b 0a 20 20 73 71 6c 69 74 65  Prior);.  sqlite
08c0: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
08d0: 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 73 71  p->pLimit);.  sq
08e0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
08f0: 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b  db, p->pOffset);
0900: 0a 20 20 73 71 6c 69 74 65 33 57 69 74 68 44 65  .  sqlite3WithDe
0910: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 57 69 74  lete(db, p->pWit
0920: 68 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  h);.}../*.** Ini
0930: 74 69 61 6c 69 7a 65 20 61 20 53 65 6c 65 63 74  tialize a Select
0940: 44 65 73 74 20 73 74 72 75 63 74 75 72 65 2e 0a  Dest structure..
0950: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
0960: 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 53 65  electDestInit(Se
0970: 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c  lectDest *pDest,
0980: 20 69 6e 74 20 65 44 65 73 74 2c 20 69 6e 74 20   int eDest, int 
0990: 69 50 61 72 6d 29 7b 0a 20 20 70 44 65 73 74 2d  iParm){.  pDest-
09a0: 3e 65 44 65 73 74 20 3d 20 28 75 38 29 65 44 65  >eDest = (u8)eDe
09b0: 73 74 3b 0a 20 20 70 44 65 73 74 2d 3e 69 53 44  st;.  pDest->iSD
09c0: 50 61 72 6d 20 3d 20 69 50 61 72 6d 3b 0a 20 20  Parm = iParm;.  
09d0: 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 20 3d  pDest->affSdst =
09e0: 20 30 3b 0a 20 20 70 44 65 73 74 2d 3e 69 53 64   0;.  pDest->iSd
09f0: 73 74 20 3d 20 30 3b 0a 20 20 70 44 65 73 74 2d  st = 0;.  pDest-
0a00: 3e 6e 53 64 73 74 20 3d 20 30 3b 0a 7d 0a 0a 0a  >nSdst = 0;.}...
0a10: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
0a20: 20 6e 65 77 20 53 65 6c 65 63 74 20 73 74 72 75   new Select stru
0a30: 63 74 75 72 65 20 61 6e 64 20 72 65 74 75 72 6e  cture and return
0a40: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
0a50: 61 74 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e  at.** structure.
0a60: 0a 2a 2f 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69  .*/.Select *sqli
0a70: 74 65 33 53 65 6c 65 63 74 4e 65 77 28 0a 20 20  te3SelectNew(.  
0a80: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
0a90: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
0aa0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
0ab0: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
0ac0: 20 20 20 20 2f 2a 20 77 68 69 63 68 20 63 6f 6c      /* which col
0ad0: 75 6d 6e 73 20 74 6f 20 69 6e 63 6c 75 64 65 20  umns to include 
0ae0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f  in the result */
0af0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
0b00: 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20  ,        /* the 
0b10: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2d 2d 20 77  FROM clause -- w
0b20: 68 69 63 68 20 74 61 62 6c 65 73 20 74 6f 20 73  hich tables to s
0b30: 63 61 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  can */.  Expr *p
0b40: 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20 2f  Where,         /
0b50: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
0b60: 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
0b70: 20 2a 70 47 72 6f 75 70 42 79 2c 20 20 20 2f 2a   *pGroupBy,   /*
0b80: 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c   the GROUP BY cl
0b90: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  ause */.  Expr *
0ba0: 70 48 61 76 69 6e 67 2c 20 20 20 20 20 20 20 20  pHaving,        
0bb0: 2f 2a 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c  /* the HAVING cl
0bc0: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ause */.  ExprLi
0bd0: 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
0be0: 2f 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  /* the ORDER BY 
0bf0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 75 31 36 20  clause */.  u16 
0c00: 73 65 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 20  selFlags,       
0c10: 20 20 2f 2a 20 46 6c 61 67 20 70 61 72 61 6d 65    /* Flag parame
0c20: 74 65 72 73 2c 20 73 75 63 68 20 61 73 20 53 46  ters, such as SF
0c30: 5f 44 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 45  _Distinct */.  E
0c40: 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 20 20 20  xpr *pLimit,    
0c50: 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54 20 76 61       /* LIMIT va
0c60: 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e 73  lue.  NULL means
0c70: 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 45   not used */.  E
0c80: 78 70 72 20 2a 70 4f 66 66 73 65 74 20 20 20 20  xpr *pOffset    
0c90: 20 20 20 20 20 2f 2a 20 4f 46 46 53 45 54 20 76       /* OFFSET v
0ca0: 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e  alue.  NULL mean
0cb0: 73 20 6e 6f 20 6f 66 66 73 65 74 20 2a 2f 0a 29  s no offset */.)
0cc0: 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77  {.  Select *pNew
0cd0: 3b 0a 20 20 53 65 6c 65 63 74 20 73 74 61 6e 64  ;.  Select stand
0ce0: 69 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  in;.  sqlite3 *d
0cf0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
0d00: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
0d10: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
0d20: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29   sizeof(*pNew) )
0d30: 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  ;.  assert( db->
0d40: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
0d50: 21 70 4f 66 66 73 65 74 20 7c 7c 20 70 4c 69 6d  !pOffset || pLim
0d60: 69 74 20 29 3b 20 2f 2a 20 4f 46 46 53 45 54 20  it ); /* OFFSET 
0d70: 69 6d 70 6c 69 65 73 20 4c 49 4d 49 54 20 2a 2f  implies LIMIT */
0d80: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
0d90: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  {.    assert( db
0da0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
0db0: 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 26 73 74  ;.    pNew = &st
0dc0: 61 6e 64 69 6e 3b 0a 20 20 20 20 6d 65 6d 73 65  andin;.    memse
0dd0: 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f  t(pNew, 0, sizeo
0de0: 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20 7d 0a 20  f(*pNew));.  }. 
0df0: 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 29   if( pEList==0 )
0e00: 7b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20 73  {.    pEList = s
0e10: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
0e20: 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20  pend(pParse, 0, 
0e30: 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 54  sqlite3Expr(db,T
0e40: 4b 5f 41 4c 4c 2c 30 29 29 3b 0a 20 20 7d 0a 20  K_ALL,0));.  }. 
0e50: 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20   pNew->pEList = 
0e60: 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 53  pEList;.  if( pS
0e70: 72 63 3d 3d 30 20 29 20 70 53 72 63 20 3d 20 73  rc==0 ) pSrc = s
0e80: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
0e90: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  ro(db, sizeof(*p
0ea0: 53 72 63 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  Src));.  pNew->p
0eb0: 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 70 4e  Src = pSrc;.  pN
0ec0: 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68  ew->pWhere = pWh
0ed0: 65 72 65 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72  ere;.  pNew->pGr
0ee0: 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79  oupBy = pGroupBy
0ef0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e  ;.  pNew->pHavin
0f00: 67 20 3d 20 70 48 61 76 69 6e 67 3b 0a 20 20 70  g = pHaving;.  p
0f10: 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  New->pOrderBy = 
0f20: 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 4e 65 77  pOrderBy;.  pNew
0f30: 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20 73 65 6c  ->selFlags = sel
0f40: 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e 6f  Flags;.  pNew->o
0f50: 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20  p = TK_SELECT;. 
0f60: 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20   pNew->pLimit = 
0f70: 70 4c 69 6d 69 74 3b 0a 20 20 70 4e 65 77 2d 3e  pLimit;.  pNew->
0f80: 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65  pOffset = pOffse
0f90: 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 66  t;.  assert( pOf
0fa0: 66 73 65 74 3d 3d 30 20 7c 7c 20 70 4c 69 6d 69  fset==0 || pLimi
0fb0: 74 21 3d 30 20 29 3b 0a 20 20 70 4e 65 77 2d 3e  t!=0 );.  pNew->
0fc0: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20  addrOpenEphm[0] 
0fd0: 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64  = -1;.  pNew->ad
0fe0: 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20  drOpenEphm[1] = 
0ff0: 2d 31 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  -1;.  if( db->ma
1000: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 7b 0a 20  llocFailed ) {. 
1010: 20 20 20 63 6c 65 61 72 53 65 6c 65 63 74 28 64     clearSelect(d
1020: 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 69 66  b, pNew);.    if
1030: 28 20 70 4e 65 77 21 3d 26 73 74 61 6e 64 69 6e  ( pNew!=&standin
1040: 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65   ) sqlite3DbFree
1050: 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  (db, pNew);.    
1060: 70 4e 65 77 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  pNew = 0;.  }els
1070: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
1080: 4e 65 77 2d 3e 70 53 72 63 21 3d 30 20 7c 7c 20  New->pSrc!=0 || 
1090: 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29  pParse->nErr>0 )
10a0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
10b0: 70 4e 65 77 21 3d 26 73 74 61 6e 64 69 6e 20 29  pNew!=&standin )
10c0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  ;.  return pNew;
10d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
10e0: 20 74 68 65 20 67 69 76 65 6e 20 53 65 6c 65 63   the given Selec
10f0: 74 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  t structure and 
1100: 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 73 74  all of its subst
1110: 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69  ructures..*/.voi
1120: 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  d sqlite3SelectD
1130: 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64  elete(sqlite3 *d
1140: 62 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  b, Select *p){. 
1150: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 63 6c   if( p ){.    cl
1160: 65 61 72 53 65 6c 65 63 74 28 64 62 2c 20 70 29  earSelect(db, p)
1170: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
1180: 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a  ree(db, p);.  }.
1190: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
11a0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
11b0: 20 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45   right-most SELE
11c0: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  CT statement in 
11d0: 61 20 63 6f 6d 70 6f 75 6e 64 2e 0a 2a 2f 0a 73  a compound..*/.s
11e0: 74 61 74 69 63 20 53 65 6c 65 63 74 20 2a 66 69  tatic Select *fi
11f0: 6e 64 52 69 67 68 74 6d 6f 73 74 28 53 65 6c 65  ndRightmost(Sele
1200: 63 74 20 2a 70 29 7b 0a 20 20 77 68 69 6c 65 28  ct *p){.  while(
1210: 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 20 3d 20   p->pNext ) p = 
1220: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 72 65 74 75  p->pNext;.  retu
1230: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn p;.}../*.** G
1240: 69 76 65 6e 20 31 20 74 6f 20 33 20 69 64 65 6e  iven 1 to 3 iden
1250: 74 69 66 69 65 72 73 20 70 72 65 63 65 64 69 6e  tifiers precedin
1260: 67 20 74 68 65 20 4a 4f 49 4e 20 6b 65 79 77 6f  g the JOIN keywo
1270: 72 64 2c 20 64 65 74 65 72 6d 69 6e 65 20 74 68  rd, determine th
1280: 65 0a 2a 2a 20 74 79 70 65 20 6f 66 20 6a 6f 69  e.** type of joi
1290: 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e  n.  Return an in
12a0: 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 74  teger constant t
12b0: 68 61 74 20 65 78 70 72 65 73 73 65 73 20 74 68  hat expresses th
12c0: 61 74 20 74 79 70 65 0a 2a 2a 20 69 6e 20 74 65  at type.** in te
12d0: 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  rms of the follo
12e0: 77 69 6e 67 20 62 69 74 20 76 61 6c 75 65 73 3a  wing bit values:
12f0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 4a 54 5f 49 4e  .**.**     JT_IN
1300: 4e 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 43 52  NER.**     JT_CR
1310: 4f 53 53 0a 2a 2a 20 20 20 20 20 4a 54 5f 4f 55  OSS.**     JT_OU
1320: 54 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 4e 41  TER.**     JT_NA
1330: 54 55 52 41 4c 0a 2a 2a 20 20 20 20 20 4a 54 5f  TURAL.**     JT_
1340: 4c 45 46 54 0a 2a 2a 20 20 20 20 20 4a 54 5f 52  LEFT.**     JT_R
1350: 49 47 48 54 0a 2a 2a 0a 2a 2a 20 41 20 66 75 6c  IGHT.**.** A ful
1360: 6c 20 6f 75 74 65 72 20 6a 6f 69 6e 20 69 73 20  l outer join is 
1370: 74 68 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  the combination 
1380: 6f 66 20 4a 54 5f 4c 45 46 54 20 61 6e 64 20 4a  of JT_LEFT and J
1390: 54 5f 52 49 47 48 54 2e 0a 2a 2a 0a 2a 2a 20 49  T_RIGHT..**.** I
13a0: 66 20 61 6e 20 69 6c 6c 65 67 61 6c 20 6f 72 20  f an illegal or 
13b0: 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e  unsupported join
13c0: 20 74 79 70 65 20 69 73 20 73 65 65 6e 2c 20 74   type is seen, t
13d0: 68 65 6e 20 73 74 69 6c 6c 20 72 65 74 75 72 6e  hen still return
13e0: 0a 2a 2a 20 61 20 6a 6f 69 6e 20 74 79 70 65 2c  .** a join type,
13f0: 20 62 75 74 20 70 75 74 20 61 6e 20 65 72 72 6f   but put an erro
1400: 72 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20  r in the pParse 
1410: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e  structure..*/.in
1420: 74 20 73 71 6c 69 74 65 33 4a 6f 69 6e 54 79 70  t sqlite3JoinTyp
1430: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
1440: 20 54 6f 6b 65 6e 20 2a 70 41 2c 20 54 6f 6b 65   Token *pA, Toke
1450: 6e 20 2a 70 42 2c 20 54 6f 6b 65 6e 20 2a 70 43  n *pB, Token *pC
1460: 29 7b 0a 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70  ){.  int jointyp
1470: 65 20 3d 20 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a  e = 0;.  Token *
1480: 61 70 41 6c 6c 5b 33 5d 3b 0a 20 20 54 6f 6b 65  apAll[3];.  Toke
1490: 6e 20 2a 70 3b 0a 20 20 20 20 20 20 20 20 20 20  n *p;.          
14a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b0: 20 20 20 2f 2a 20 20 20 30 31 32 33 34 35 36 37     /*   01234567
14c0: 38 39 20 31 32 33 34 35 36 37 38 39 20 31 32 33  89 123456789 123
14d0: 34 35 36 37 38 39 20 31 32 33 20 2a 2f 0a 20 20  456789 123 */.  
14e0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
14f0: 72 20 7a 4b 65 79 54 65 78 74 5b 5d 20 3d 20 22  r zKeyText[] = "
1500: 6e 61 74 75 72 61 6c 65 66 74 6f 75 74 65 72 69  naturaleftouteri
1510: 67 68 74 66 75 6c 6c 69 6e 6e 65 72 63 72 6f 73  ghtfullinnercros
1520: 73 22 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  s";.  static con
1530: 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20  st struct {.    
1540: 75 38 20 69 3b 20 20 20 20 20 20 20 20 2f 2a 20  u8 i;        /* 
1550: 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 6b 65 79  Beginning of key
1560: 77 6f 72 64 20 74 65 78 74 20 69 6e 20 7a 4b 65  word text in zKe
1570: 79 54 65 78 74 5b 5d 20 2a 2f 0a 20 20 20 20 75  yText[] */.    u
1580: 38 20 6e 43 68 61 72 3b 20 20 20 20 2f 2a 20 4c  8 nChar;    /* L
1590: 65 6e 67 74 68 20 6f 66 20 74 68 65 20 6b 65 79  ength of the key
15a0: 77 6f 72 64 20 69 6e 20 63 68 61 72 61 63 74 65  word in characte
15b0: 72 73 20 2a 2f 0a 20 20 20 20 75 38 20 63 6f 64  rs */.    u8 cod
15c0: 65 3b 20 20 20 20 20 2f 2a 20 4a 6f 69 6e 20 74  e;     /* Join t
15d0: 79 70 65 20 6d 61 73 6b 20 2a 2f 0a 20 20 7d 20  ype mask */.  } 
15e0: 61 4b 65 79 77 6f 72 64 5b 5d 20 3d 20 7b 0a 20  aKeyword[] = {. 
15f0: 20 20 20 2f 2a 20 6e 61 74 75 72 61 6c 20 2a 2f     /* natural */
1600: 20 7b 20 30 2c 20 20 37 2c 20 4a 54 5f 4e 41 54   { 0,  7, JT_NAT
1610: 55 52 41 4c 20 20 20 20 20 20 20 20 20 20 20 20  URAL            
1620: 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 6c 65      },.    /* le
1630: 66 74 20 20 20 20 2a 2f 20 7b 20 36 2c 20 20 34  ft    */ { 6,  4
1640: 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54  , JT_LEFT|JT_OUT
1650: 45 52 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  ER          },. 
1660: 20 20 20 2f 2a 20 6f 75 74 65 72 20 20 20 2a 2f     /* outer   */
1670: 20 7b 20 31 30 2c 20 35 2c 20 4a 54 5f 4f 55 54   { 10, 5, JT_OUT
1680: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ER              
1690: 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 72 69      },.    /* ri
16a0: 67 68 74 20 20 20 2a 2f 20 7b 20 31 34 2c 20 35  ght   */ { 14, 5
16b0: 2c 20 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55  , JT_RIGHT|JT_OU
16c0: 54 45 52 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  TER         },. 
16d0: 20 20 20 2f 2a 20 66 75 6c 6c 20 20 20 20 2a 2f     /* full    */
16e0: 20 7b 20 31 39 2c 20 34 2c 20 4a 54 5f 4c 45 46   { 19, 4, JT_LEF
16f0: 54 7c 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55  T|JT_RIGHT|JT_OU
1700: 54 45 52 20 7d 2c 0a 20 20 20 20 2f 2a 20 69 6e  TER },.    /* in
1710: 6e 65 72 20 20 20 2a 2f 20 7b 20 32 33 2c 20 35  ner   */ { 23, 5
1720: 2c 20 4a 54 5f 49 4e 4e 45 52 20 20 20 20 20 20  , JT_INNER      
1730: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
1740: 20 20 20 2f 2a 20 63 72 6f 73 73 20 20 20 2a 2f     /* cross   */
1750: 20 7b 20 32 38 2c 20 35 2c 20 4a 54 5f 49 4e 4e   { 28, 5, JT_INN
1760: 45 52 7c 4a 54 5f 43 52 4f 53 53 20 20 20 20 20  ER|JT_CROSS     
1770: 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e      },.  };.  in
1780: 74 20 69 2c 20 6a 3b 0a 20 20 61 70 41 6c 6c 5b  t i, j;.  apAll[
1790: 30 5d 20 3d 20 70 41 3b 0a 20 20 61 70 41 6c 6c  0] = pA;.  apAll
17a0: 5b 31 5d 20 3d 20 70 42 3b 0a 20 20 61 70 41 6c  [1] = pB;.  apAl
17b0: 6c 5b 32 5d 20 3d 20 70 43 3b 0a 20 20 66 6f 72  l[2] = pC;.  for
17c0: 28 69 3d 30 3b 20 69 3c 33 20 26 26 20 61 70 41  (i=0; i<3 && apA
17d0: 6c 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20  ll[i]; i++){.   
17e0: 20 70 20 3d 20 61 70 41 6c 6c 5b 69 5d 3b 0a 20   p = apAll[i];. 
17f0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 41 72     for(j=0; j<Ar
1800: 72 61 79 53 69 7a 65 28 61 4b 65 79 77 6f 72 64  raySize(aKeyword
1810: 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ); j++){.      i
1820: 66 28 20 70 2d 3e 6e 3d 3d 61 4b 65 79 77 6f 72  f( p->n==aKeywor
1830: 64 5b 6a 5d 2e 6e 43 68 61 72 20 0a 20 20 20 20  d[j].nChar .    
1840: 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
1850: 53 74 72 4e 49 43 6d 70 28 28 63 68 61 72 2a 29  StrNICmp((char*)
1860: 70 2d 3e 7a 2c 20 26 7a 4b 65 79 54 65 78 74 5b  p->z, &zKeyText[
1870: 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 69 5d 2c 20  aKeyword[j].i], 
1880: 70 2d 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  p->n)==0 ){.    
1890: 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20      jointype |= 
18a0: 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 63 6f 64 65  aKeyword[j].code
18b0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
18c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
18d0: 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d     testcase( j==
18e0: 30 20 7c 7c 20 6a 3d 3d 31 20 7c 7c 20 6a 3d 3d  0 || j==1 || j==
18f0: 32 20 7c 7c 20 6a 3d 3d 33 20 7c 7c 20 6a 3d 3d  2 || j==3 || j==
1900: 34 20 7c 7c 20 6a 3d 3d 35 20 7c 7c 20 6a 3d 3d  4 || j==5 || j==
1910: 36 20 29 3b 0a 20 20 20 20 69 66 28 20 6a 3e 3d  6 );.    if( j>=
1920: 41 72 72 61 79 53 69 7a 65 28 61 4b 65 79 77 6f  ArraySize(aKeywo
1930: 72 64 29 20 29 7b 0a 20 20 20 20 20 20 6a 6f 69  rd) ){.      joi
1940: 6e 74 79 70 65 20 7c 3d 20 4a 54 5f 45 52 52 4f  ntype |= JT_ERRO
1950: 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  R;.      break;.
1960: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 0a      }.  }.  if(.
1970: 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26       (jointype &
1980: 20 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55   (JT_INNER|JT_OU
1990: 54 45 52 29 29 3d 3d 28 4a 54 5f 49 4e 4e 45 52  TER))==(JT_INNER
19a0: 7c 4a 54 5f 4f 55 54 45 52 29 20 7c 7c 0a 20 20  |JT_OUTER) ||.  
19b0: 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a     (jointype & J
19c0: 54 5f 45 52 52 4f 52 29 21 3d 30 0a 20 20 29 7b  T_ERROR)!=0.  ){
19d0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
19e0: 2a 7a 53 70 20 3d 20 22 20 22 3b 0a 20 20 20 20  *zSp = " ";.    
19f0: 61 73 73 65 72 74 28 20 70 42 21 3d 30 20 29 3b  assert( pB!=0 );
1a00: 0a 20 20 20 20 69 66 28 20 70 43 3d 3d 30 20 29  .    if( pC==0 )
1a10: 7b 20 7a 53 70 2b 2b 3b 20 7d 0a 20 20 20 20 73  { zSp++; }.    s
1a20: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1a30: 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20  Parse, "unknown 
1a40: 6f 72 20 75 6e 73 75 70 70 6f 72 74 65 64 20 6a  or unsupported j
1a50: 6f 69 6e 20 74 79 70 65 3a 20 22 0a 20 20 20 20  oin type: ".    
1a60: 20 20 20 22 25 54 20 25 54 25 73 25 54 22 2c 20     "%T %T%s%T", 
1a70: 70 41 2c 20 70 42 2c 20 7a 53 70 2c 20 70 43 29  pA, pB, zSp, pC)
1a80: 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d  ;.    jointype =
1a90: 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c   JT_INNER;.  }el
1aa0: 73 65 20 69 66 28 20 28 6a 6f 69 6e 74 79 70 65  se if( (jointype
1ab0: 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20   & JT_OUTER)!=0 
1ac0: 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 6a 6f  .         && (jo
1ad0: 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c 45 46  intype & (JT_LEF
1ae0: 54 7c 4a 54 5f 52 49 47 48 54 29 29 21 3d 4a 54  T|JT_RIGHT))!=JT
1af0: 5f 4c 45 46 54 20 29 7b 0a 20 20 20 20 73 71 6c  _LEFT ){.    sql
1b00: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1b10: 72 73 65 2c 20 0a 20 20 20 20 20 20 22 52 49 47  rse, .      "RIG
1b20: 48 54 20 61 6e 64 20 46 55 4c 4c 20 4f 55 54 45  HT and FULL OUTE
1b30: 52 20 4a 4f 49 4e 73 20 61 72 65 20 6e 6f 74 20  R JOINs are not 
1b40: 63 75 72 72 65 6e 74 6c 79 20 73 75 70 70 6f 72  currently suppor
1b50: 74 65 64 22 29 3b 0a 20 20 20 20 6a 6f 69 6e 74  ted");.    joint
1b60: 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a  ype = JT_INNER;.
1b70: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6f 69    }.  return joi
1b80: 6e 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ntype;.}../*.** 
1b90: 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
1ba0: 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20   of a column in 
1bb0: 61 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  a table.  Return
1bc0: 20 2d 31 20 69 66 20 74 68 65 20 63 6f 6c 75 6d   -1 if the colum
1bd0: 6e 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 74  n.** is not cont
1be0: 61 69 6e 65 64 20 69 6e 20 74 68 65 20 74 61 62  ained in the tab
1bf0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
1c00: 74 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 54 61  t columnIndex(Ta
1c10: 62 6c 65 20 2a 70 54 61 62 2c 20 63 6f 6e 73 74  ble *pTab, const
1c20: 20 63 68 61 72 20 2a 7a 43 6f 6c 29 7b 0a 20 20   char *zCol){.  
1c30: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
1c40: 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; i<pTab->nCol; 
1c50: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71  i++){.    if( sq
1c60: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 54 61  lite3StrICmp(pTa
1c70: 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65  b->aCol[i].zName
1c80: 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 20 72 65 74  , zCol)==0 ) ret
1c90: 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74  urn i;.  }.  ret
1ca0: 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn -1;.}../*.**
1cb0: 20 53 65 61 72 63 68 20 74 68 65 20 66 69 72 73   Search the firs
1cc0: 74 20 4e 20 74 61 62 6c 65 73 20 69 6e 20 70 53  t N tables in pS
1cd0: 72 63 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f  rc, from left to
1ce0: 20 72 69 67 68 74 2c 20 6c 6f 6f 6b 69 6e 67 20   right, looking 
1cf0: 66 6f 72 20 61 0a 2a 2a 20 74 61 62 6c 65 20 74  for a.** table t
1d00: 68 61 74 20 68 61 73 20 61 20 63 6f 6c 75 6d 6e  hat has a column
1d10: 20 6e 61 6d 65 64 20 7a 43 6f 6c 2e 20 20 0a 2a   named zCol.  .*
1d20: 2a 0a 2a 2a 20 57 68 65 6e 20 66 6f 75 6e 64 2c  *.** When found,
1d30: 20 73 65 74 20 2a 70 69 54 61 62 20 61 6e 64 20   set *piTab and 
1d40: 2a 70 69 43 6f 6c 20 74 6f 20 74 68 65 20 74 61  *piCol to the ta
1d50: 62 6c 65 20 69 6e 64 65 78 20 61 6e 64 20 63 6f  ble index and co
1d60: 6c 75 6d 6e 20 69 6e 64 65 78 0a 2a 2a 20 6f 66  lumn index.** of
1d70: 20 74 68 65 20 6d 61 74 63 68 69 6e 67 20 63 6f   the matching co
1d80: 6c 75 6d 6e 20 61 6e 64 20 72 65 74 75 72 6e 20  lumn and return 
1d90: 54 52 55 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  TRUE..**.** If n
1da0: 6f 74 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e  ot found, return
1db0: 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74 69   FALSE..*/.stati
1dc0: 63 20 69 6e 74 20 74 61 62 6c 65 41 6e 64 43 6f  c int tableAndCo
1dd0: 6c 75 6d 6e 49 6e 64 65 78 28 0a 20 20 53 72 63  lumnIndex(.  Src
1de0: 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20  List *pSrc,     
1df0: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 74 61    /* Array of ta
1e00: 62 6c 65 73 20 74 6f 20 73 65 61 72 63 68 20 2a  bles to search *
1e10: 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20  /.  int N,      
1e20: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1e30: 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20  er of tables in 
1e40: 70 53 72 63 2d 3e 61 5b 5d 20 74 6f 20 73 65 61  pSrc->a[] to sea
1e50: 72 63 68 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  rch */.  const c
1e60: 68 61 72 20 2a 7a 43 6f 6c 2c 20 20 20 20 2f 2a  har *zCol,    /*
1e70: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c   Name of the col
1e80: 75 6d 6e 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69  umn we are looki
1e90: 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  ng for */.  int 
1ea0: 2a 70 69 54 61 62 2c 20 20 20 20 20 20 20 20 20  *piTab,         
1eb0: 20 2f 2a 20 57 72 69 74 65 20 69 6e 64 65 78 20   /* Write index 
1ec0: 6f 66 20 70 53 72 63 2d 3e 61 5b 5d 20 68 65 72  of pSrc->a[] her
1ed0: 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 43 6f  e */.  int *piCo
1ee0: 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  l           /* W
1ef0: 72 69 74 65 20 69 6e 64 65 78 20 6f 66 20 70 53  rite index of pS
1f00: 72 63 2d 3e 61 5b 2a 70 69 54 61 62 5d 2e 70 54  rc->a[*piTab].pT
1f10: 61 62 2d 3e 61 43 6f 6c 5b 5d 20 68 65 72 65 20  ab->aCol[] here 
1f20: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  */.){.  int i;  
1f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f40: 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
1f50: 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63 20   tables in pSrc 
1f60: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20  */.  int iCol;  
1f70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
1f80: 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 6d 61 74  ex of column mat
1f90: 63 68 69 6e 67 20 7a 43 6f 6c 20 2a 2f 0a 0a 20  ching zCol */.. 
1fa0: 20 61 73 73 65 72 74 28 20 28 70 69 54 61 62 3d   assert( (piTab=
1fb0: 3d 30 29 3d 3d 28 70 69 43 6f 6c 3d 3d 30 29 20  =0)==(piCol==0) 
1fc0: 29 3b 20 20 2f 2a 20 42 6f 74 68 20 6f 72 20 6e  );  /* Both or n
1fd0: 65 69 74 68 65 72 20 61 72 65 20 4e 55 4c 4c 20  either are NULL 
1fe0: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
1ff0: 4e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 43 6f  N; i++){.    iCo
2000: 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28  l = columnIndex(
2010: 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 54 61 62 2c  pSrc->a[i].pTab,
2020: 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20   zCol);.    if( 
2030: 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20  iCol>=0 ){.     
2040: 20 69 66 28 20 70 69 54 61 62 20 29 7b 0a 20 20   if( piTab ){.  
2050: 20 20 20 20 20 20 2a 70 69 54 61 62 20 3d 20 69        *piTab = i
2060: 3b 0a 20 20 20 20 20 20 20 20 2a 70 69 43 6f 6c  ;.        *piCol
2070: 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 7d   = iCol;.      }
2080: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
2090: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
20a0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
20b0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
20c0: 20 75 73 65 64 20 74 6f 20 61 64 64 20 74 65 72   used to add ter
20d0: 6d 73 20 69 6d 70 6c 69 65 64 20 62 79 20 4a 4f  ms implied by JO
20e0: 49 4e 20 73 79 6e 74 61 78 20 74 6f 20 74 68 65  IN syntax to the
20f0: 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65  .** WHERE clause
2100: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 61   expression of a
2110: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
2120: 74 2e 20 54 68 65 20 6e 65 77 20 74 65 72 6d 2c  t. The new term,
2130: 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 41 4e 44   which.** is AND
2140: 65 64 20 77 69 74 68 20 74 68 65 20 65 78 69 73  ed with the exis
2150: 74 69 6e 67 20 57 48 45 52 45 20 63 6c 61 75 73  ting WHERE claus
2160: 65 2c 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  e, is of the for
2170: 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 74 61 62  m:.**.**    (tab
2180: 31 2e 63 6f 6c 31 20 3d 20 74 61 62 32 2e 63 6f  1.col1 = tab2.co
2190: 6c 32 29 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20  l2).**.** where 
21a0: 74 61 62 31 20 69 73 20 74 68 65 20 69 53 72 63  tab1 is the iSrc
21b0: 27 74 68 20 74 61 62 6c 65 20 69 6e 20 53 72 63  'th table in Src
21c0: 4c 69 73 74 20 70 53 72 63 20 61 6e 64 20 74 61  List pSrc and ta
21d0: 62 32 20 69 73 20 74 68 65 20 0a 2a 2a 20 28 69  b2 is the .** (i
21e0: 53 72 63 2b 31 29 27 74 68 2e 20 43 6f 6c 75 6d  Src+1)'th. Colum
21f0: 6e 20 63 6f 6c 31 20 69 73 20 63 6f 6c 75 6d 6e  n col1 is column
2200: 20 69 43 6f 6c 4c 65 66 74 20 6f 66 20 74 61 62   iColLeft of tab
2210: 31 2c 20 61 6e 64 20 63 6f 6c 32 20 69 73 0a 2a  1, and col2 is.*
2220: 2a 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 52 69 67  * column iColRig
2230: 68 74 20 6f 66 20 74 61 62 32 2e 0a 2a 2f 0a 73  ht of tab2..*/.s
2240: 74 61 74 69 63 20 76 6f 69 64 20 61 64 64 57 68  tatic void addWh
2250: 65 72 65 54 65 72 6d 28 0a 20 20 50 61 72 73 65  ereTerm(.  Parse
2260: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
2270: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
2280: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
2290: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
22a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
22b0: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61     /* List of ta
22c0: 62 6c 65 73 20 69 6e 20 46 52 4f 4d 20 63 6c 61  bles in FROM cla
22d0: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65  use */.  int iLe
22e0: 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ft,             
22f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
2300: 78 20 6f 66 20 66 69 72 73 74 20 74 61 62 6c 65  x of first table
2310: 20 74 6f 20 6a 6f 69 6e 20 69 6e 20 70 53 72 63   to join in pSrc
2320: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 4c 65   */.  int iColLe
2330: 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ft,             
2340: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
2350: 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 66 69 72 73  f column in firs
2360: 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  t table */.  int
2370: 20 69 52 69 67 68 74 2c 20 20 20 20 20 20 20 20   iRight,        
2380: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2390: 49 6e 64 65 78 20 6f 66 20 73 65 63 6f 6e 64 20  Index of second 
23a0: 74 61 62 6c 65 20 69 6e 20 70 53 72 63 20 2a 2f  table in pSrc */
23b0: 0a 20 20 69 6e 74 20 69 43 6f 6c 52 69 67 68 74  .  int iColRight
23c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
23d0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63     /* Index of c
23e0: 6f 6c 75 6d 6e 20 69 6e 20 73 65 63 6f 6e 64 20  olumn in second 
23f0: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
2400: 73 4f 75 74 65 72 4a 6f 69 6e 2c 20 20 20 20 20  sOuterJoin,     
2410: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2420: 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 6e  ue if this is an
2430: 20 4f 55 54 45 52 20 6a 6f 69 6e 20 2a 2f 0a 20   OUTER join */. 
2440: 20 45 78 70 72 20 2a 2a 70 70 57 68 65 72 65 20   Expr **ppWhere 
2450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2460: 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 54 68 65 20   /* IN/OUT: The 
2470: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20  WHERE clause to 
2480: 61 64 64 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73  add to */.){.  s
2490: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
24a0: 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20  rse->db;.  Expr 
24b0: 2a 70 45 31 3b 0a 20 20 45 78 70 72 20 2a 70 45  *pE1;.  Expr *pE
24c0: 32 3b 0a 20 20 45 78 70 72 20 2a 70 45 71 3b 0a  2;.  Expr *pEq;.
24d0: 0a 20 20 61 73 73 65 72 74 28 20 69 4c 65 66 74  .  assert( iLeft
24e0: 3c 69 52 69 67 68 74 20 29 3b 0a 20 20 61 73 73  <iRight );.  ass
24f0: 65 72 74 28 20 70 53 72 63 2d 3e 6e 53 72 63 3e  ert( pSrc->nSrc>
2500: 69 52 69 67 68 74 20 29 3b 0a 20 20 61 73 73 65  iRight );.  asse
2510: 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 4c 65 66  rt( pSrc->a[iLef
2520: 74 5d 2e 70 54 61 62 20 29 3b 0a 20 20 61 73 73  t].pTab );.  ass
2530: 65 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 52 69  ert( pSrc->a[iRi
2540: 67 68 74 5d 2e 70 54 61 62 20 29 3b 0a 0a 20 20  ght].pTab );..  
2550: 70 45 31 20 3d 20 73 71 6c 69 74 65 33 43 72 65  pE1 = sqlite3Cre
2560: 61 74 65 43 6f 6c 75 6d 6e 45 78 70 72 28 64 62  ateColumnExpr(db
2570: 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c 20 69  , pSrc, iLeft, i
2580: 43 6f 6c 4c 65 66 74 29 3b 0a 20 20 70 45 32 20  ColLeft);.  pE2 
2590: 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 43  = sqlite3CreateC
25a0: 6f 6c 75 6d 6e 45 78 70 72 28 64 62 2c 20 70 53  olumnExpr(db, pS
25b0: 72 63 2c 20 69 52 69 67 68 74 2c 20 69 43 6f 6c  rc, iRight, iCol
25c0: 52 69 67 68 74 29 3b 0a 0a 20 20 70 45 71 20 3d  Right);..  pEq =
25d0: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
25e0: 61 72 73 65 2c 20 54 4b 5f 45 51 2c 20 70 45 31  arse, TK_EQ, pE1
25f0: 2c 20 70 45 32 2c 20 30 29 3b 0a 20 20 69 66 28  , pE2, 0);.  if(
2600: 20 70 45 71 20 26 26 20 69 73 4f 75 74 65 72 4a   pEq && isOuterJ
2610: 6f 69 6e 20 29 7b 0a 20 20 20 20 45 78 70 72 53  oin ){.    ExprS
2620: 65 74 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20  etProperty(pEq, 
2630: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20  EP_FromJoin);.  
2640: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
2650: 61 73 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20  asProperty(pEq, 
2660: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
2670: 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20  Reduced) );.    
2680: 45 78 70 72 53 65 74 56 56 41 50 72 6f 70 65 72  ExprSetVVAProper
2690: 74 79 28 70 45 71 2c 20 45 50 5f 4e 6f 52 65 64  ty(pEq, EP_NoRed
26a0: 75 63 65 29 3b 0a 20 20 20 20 70 45 71 2d 3e 69  uce);.    pEq->i
26b0: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d  RightJoinTable =
26c0: 20 28 69 31 36 29 70 45 32 2d 3e 69 54 61 62 6c   (i16)pE2->iTabl
26d0: 65 3b 0a 20 20 7d 0a 20 20 2a 70 70 57 68 65 72  e;.  }.  *ppWher
26e0: 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  e = sqlite3ExprA
26f0: 6e 64 28 64 62 2c 20 2a 70 70 57 68 65 72 65 2c  nd(db, *ppWhere,
2700: 20 70 45 71 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pEq);.}../*.** 
2710: 53 65 74 20 74 68 65 20 45 50 5f 46 72 6f 6d 4a  Set the EP_FromJ
2720: 6f 69 6e 20 70 72 6f 70 65 72 74 79 20 6f 6e 20  oin property on 
2730: 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65  all terms of the
2740: 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
2750: 6e 2e 0a 2a 2a 20 41 6e 64 20 73 65 74 20 74 68  n..** And set th
2760: 65 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69  e Expr.iRightJoi
2770: 6e 54 61 62 6c 65 20 74 6f 20 69 54 61 62 6c 65  nTable to iTable
2780: 20 66 6f 72 20 65 76 65 72 79 20 74 65 72 6d 20   for every term 
2790: 69 6e 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73  in the.** expres
27a0: 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  sion..**.** The 
27b0: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70  EP_FromJoin prop
27c0: 65 72 74 79 20 69 73 20 75 73 65 64 20 6f 6e 20  erty is used on 
27d0: 74 65 72 6d 73 20 6f 66 20 61 6e 20 65 78 70 72  terms of an expr
27e0: 65 73 73 69 6f 6e 20 74 6f 20 74 65 6c 6c 0a 2a  ession to tell.*
27f0: 2a 20 74 68 65 20 4c 45 46 54 20 4f 55 54 45 52  * the LEFT OUTER
2800: 20 4a 4f 49 4e 20 70 72 6f 63 65 73 73 69 6e 67   JOIN processing
2810: 20 6c 6f 67 69 63 20 74 68 61 74 20 74 68 69 73   logic that this
2820: 20 74 65 72 6d 20 69 73 20 70 61 72 74 20 6f 66   term is part of
2830: 20 74 68 65 0a 2a 2a 20 6a 6f 69 6e 20 72 65 73   the.** join res
2840: 74 72 69 63 74 69 6f 6e 20 73 70 65 63 69 66 69  triction specifi
2850: 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20  ed in the ON or 
2860: 55 53 49 4e 47 20 63 6c 61 75 73 65 20 61 6e 64  USING clause and
2870: 20 6e 6f 74 20 61 20 70 61 72 74 0a 2a 2a 20 6f   not a part.** o
2880: 66 20 74 68 65 20 6d 6f 72 65 20 67 65 6e 65 72  f the more gener
2890: 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  al WHERE clause.
28a0: 20 20 54 68 65 73 65 20 74 65 72 6d 73 20 61 72    These terms ar
28b0: 65 20 6d 6f 76 65 64 20 6f 76 65 72 20 74 6f 20  e moved over to 
28c0: 74 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61  the.** WHERE cla
28d0: 75 73 65 20 64 75 72 69 6e 67 20 6a 6f 69 6e 20  use during join 
28e0: 70 72 6f 63 65 73 73 69 6e 67 20 62 75 74 20 77  processing but w
28f0: 65 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62  e need to rememb
2900: 65 72 20 74 68 61 74 20 74 68 65 79 0a 2a 2a 20  er that they.** 
2910: 6f 72 69 67 69 6e 61 74 65 64 20 69 6e 20 74 68  originated in th
2920: 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  e ON or USING cl
2930: 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ause..**.** The 
2940: 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54  Expr.iRightJoinT
2950: 61 62 6c 65 20 74 65 6c 6c 73 20 74 68 65 20 57  able tells the W
2960: 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63  HERE clause proc
2970: 65 73 73 69 6e 67 20 74 68 61 74 20 74 68 65 0a  essing that the.
2980: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65  ** expression de
2990: 70 65 6e 64 73 20 6f 6e 20 74 61 62 6c 65 20 69  pends on table i
29a0: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 65  RightJoinTable e
29b0: 76 65 6e 20 69 66 20 74 68 61 74 20 74 61 62 6c  ven if that tabl
29c0: 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 65 78 70 6c  e is not.** expl
29d0: 69 63 69 74 6c 79 20 6d 65 6e 74 69 6f 6e 65 64  icitly mentioned
29e0: 20 69 6e 20 74 68 65 20 65 78 70 72 65 73 73 69   in the expressi
29f0: 6f 6e 2e 20 20 54 68 61 74 20 69 6e 66 6f 72 6d  on.  That inform
2a00: 61 74 69 6f 6e 20 69 73 20 6e 65 65 64 65 64 0a  ation is needed.
2a10: 2a 2a 20 66 6f 72 20 63 61 73 65 73 20 6c 69 6b  ** for cases lik
2a20: 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
2a30: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
2a40: 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f  1 LEFT JOIN t2 O
2a50: 4e 20 74 31 2e 61 3d 74 32 2e 62 20 41 4e 44 20  N t1.a=t2.b AND 
2a60: 74 31 2e 78 3d 35 0a 2a 2a 0a 2a 2a 20 54 68 65  t1.x=5.**.** The
2a70: 20 77 68 65 72 65 20 63 6c 61 75 73 65 20 6e 65   where clause ne
2a80: 65 64 73 20 74 6f 20 64 65 66 65 72 20 74 68 65  eds to defer the
2a90: 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20 74 68 65   handling of the
2aa0: 20 74 31 2e 78 3d 35 0a 2a 2a 20 74 65 72 6d 20   t1.x=5.** term 
2ab0: 75 6e 74 69 6c 20 61 66 74 65 72 20 74 68 65 20  until after the 
2ac0: 74 32 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 6a  t2 loop of the j
2ad0: 6f 69 6e 2e 20 20 49 6e 20 74 68 61 74 20 77 61  oin.  In that wa
2ae0: 79 2c 20 61 0a 2a 2a 20 4e 55 4c 4c 20 74 32 20  y, a.** NULL t2 
2af0: 72 6f 77 20 77 69 6c 6c 20 62 65 20 69 6e 73 65  row will be inse
2b00: 72 74 65 64 20 77 68 65 6e 65 76 65 72 20 74 31  rted whenever t1
2b10: 2e 78 21 3d 35 2e 20 20 49 66 20 77 65 20 64 6f  .x!=5.  If we do
2b20: 20 6e 6f 74 0a 2a 2a 20 64 65 66 65 72 20 74 68   not.** defer th
2b30: 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20 74 31  e handling of t1
2b40: 2e 78 3d 35 2c 20 69 74 20 77 69 6c 6c 20 62 65  .x=5, it will be
2b50: 20 70 72 6f 63 65 73 73 65 64 20 69 6d 6d 65 64   processed immed
2b60: 69 61 74 65 6c 79 0a 2a 2a 20 61 66 74 65 72 20  iately.** after 
2b70: 74 68 65 20 74 31 20 6c 6f 6f 70 20 61 6e 64 20  the t1 loop and 
2b80: 72 6f 77 73 20 77 69 74 68 20 74 31 2e 78 21 3d  rows with t1.x!=
2b90: 35 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 70 70  5 will never app
2ba0: 65 61 72 20 69 6e 0a 2a 2a 20 74 68 65 20 6f 75  ear in.** the ou
2bb0: 74 70 75 74 2c 20 77 68 69 63 68 20 69 73 20 69  tput, which is i
2bc0: 6e 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73 74 61  ncorrect..*/.sta
2bd0: 74 69 63 20 76 6f 69 64 20 73 65 74 4a 6f 69 6e  tic void setJoin
2be0: 45 78 70 72 28 45 78 70 72 20 2a 70 2c 20 69 6e  Expr(Expr *p, in
2bf0: 74 20 69 54 61 62 6c 65 29 7b 0a 20 20 77 68 69  t iTable){.  whi
2c00: 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 45 78 70  le( p ){.    Exp
2c10: 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 2c 20  rSetProperty(p, 
2c20: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20  EP_FromJoin);.  
2c30: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
2c40: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
2c50: 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65  _TokenOnly|EP_Re
2c60: 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 45 78  duced) );.    Ex
2c70: 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79  prSetVVAProperty
2c80: 28 70 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29  (p, EP_NoReduce)
2c90: 3b 0a 20 20 20 20 70 2d 3e 69 52 69 67 68 74 4a  ;.    p->iRightJ
2ca0: 6f 69 6e 54 61 62 6c 65 20 3d 20 28 69 31 36 29  oinTable = (i16)
2cb0: 69 54 61 62 6c 65 3b 0a 20 20 20 20 73 65 74 4a  iTable;.    setJ
2cc0: 6f 69 6e 45 78 70 72 28 70 2d 3e 70 4c 65 66 74  oinExpr(p->pLeft
2cd0: 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 70  , iTable);.    p
2ce0: 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20   = p->pRight;.  
2cf0: 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  } .}../*.** This
2d00: 20 72 6f 75 74 69 6e 65 20 70 72 6f 63 65 73 73   routine process
2d10: 65 73 20 74 68 65 20 6a 6f 69 6e 20 69 6e 66 6f  es the join info
2d20: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 53 45  rmation for a SE
2d30: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
2d40: 2a 2a 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  ** ON and USING 
2d50: 63 6c 61 75 73 65 73 20 61 72 65 20 63 6f 6e 76  clauses are conv
2d60: 65 72 74 65 64 20 69 6e 74 6f 20 65 78 74 72 61  erted into extra
2d70: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48   terms of the WH
2d80: 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e  ERE clause..** N
2d90: 41 54 55 52 41 4c 20 6a 6f 69 6e 73 20 61 6c 73  ATURAL joins als
2da0: 6f 20 63 72 65 61 74 65 20 65 78 74 72 61 20 57  o create extra W
2db0: 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
2dc0: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72  s..**.** The ter
2dd0: 6d 73 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61  ms of a FROM cla
2de0: 75 73 65 20 61 72 65 20 63 6f 6e 74 61 69 6e 65  use are containe
2df0: 64 20 69 6e 20 74 68 65 20 53 65 6c 65 63 74 2e  d in the Select.
2e00: 70 53 72 63 20 73 74 72 75 63 74 75 72 65 2e 0a  pSrc structure..
2e10: 2a 2a 20 54 68 65 20 6c 65 66 74 20 6d 6f 73 74  ** The left most
2e20: 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 66 69   table is the fi
2e30: 72 73 74 20 65 6e 74 72 79 20 69 6e 20 53 65 6c  rst entry in Sel
2e40: 65 63 74 2e 70 53 72 63 2e 20 20 54 68 65 20 72  ect.pSrc.  The r
2e50: 69 67 68 74 2d 6d 6f 73 74 0a 2a 2a 20 74 61 62  ight-most.** tab
2e60: 6c 65 20 69 73 20 74 68 65 20 6c 61 73 74 20 65  le is the last e
2e70: 6e 74 72 79 2e 20 20 54 68 65 20 6a 6f 69 6e 20  ntry.  The join 
2e80: 6f 70 65 72 61 74 6f 72 20 69 73 20 68 65 6c 64  operator is held
2e90: 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74 6f   in the entry to
2ea0: 0a 2a 2a 20 74 68 65 20 6c 65 66 74 2e 20 20 54  .** the left.  T
2eb0: 68 75 73 20 65 6e 74 72 79 20 30 20 63 6f 6e 74  hus entry 0 cont
2ec0: 61 69 6e 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70  ains the join op
2ed0: 65 72 61 74 6f 72 20 66 6f 72 20 74 68 65 20 6a  erator for the j
2ee0: 6f 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 65  oin between.** e
2ef0: 6e 74 72 69 65 73 20 30 20 61 6e 64 20 31 2e 20  ntries 0 and 1. 
2f00: 20 41 6e 79 20 4f 4e 20 6f 72 20 55 53 49 4e 47   Any ON or USING
2f10: 20 63 6c 61 75 73 65 73 20 61 73 73 6f 63 69 61   clauses associa
2f20: 74 65 64 20 77 69 74 68 20 74 68 65 20 6a 6f 69  ted with the joi
2f30: 6e 20 61 72 65 0a 2a 2a 20 61 6c 73 6f 20 61 74  n are.** also at
2f40: 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65  tached to the le
2f50: 66 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20  ft entry..**.** 
2f60: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
2f70: 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20  urns the number 
2f80: 6f 66 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e  of errors encoun
2f90: 74 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  tered..*/.static
2fa0: 20 69 6e 74 20 73 71 6c 69 74 65 50 72 6f 63 65   int sqliteProce
2fb0: 73 73 4a 6f 69 6e 28 50 61 72 73 65 20 2a 70 50  ssJoin(Parse *pP
2fc0: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29  arse, Select *p)
2fd0: 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  {.  SrcList *pSr
2fe0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
2ff0: 20 20 20 20 2f 2a 20 41 6c 6c 20 74 61 62 6c 65      /* All table
3000: 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
3010: 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  ause */.  int i,
3020: 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
3030: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
3040: 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
3050: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
3060: 74 65 6d 20 2a 70 4c 65 66 74 3b 20 20 20 20 20  tem *pLeft;     
3070: 2f 2a 20 4c 65 66 74 20 74 61 62 6c 65 20 62 65  /* Left table be
3080: 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 20 20  ing joined */.  
3090: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
30a0: 74 65 6d 20 2a 70 52 69 67 68 74 3b 20 20 20 20  tem *pRight;    
30b0: 2f 2a 20 52 69 67 68 74 20 74 61 62 6c 65 20 62  /* Right table b
30c0: 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 0a  eing joined */..
30d0: 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63    pSrc = p->pSrc
30e0: 3b 0a 20 20 70 4c 65 66 74 20 3d 20 26 70 53 72  ;.  pLeft = &pSr
30f0: 63 2d 3e 61 5b 30 5d 3b 0a 20 20 70 52 69 67 68  c->a[0];.  pRigh
3100: 74 20 3d 20 26 70 4c 65 66 74 5b 31 5d 3b 0a 20  t = &pLeft[1];. 
3110: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63   for(i=0; i<pSrc
3120: 2d 3e 6e 53 72 63 2d 31 3b 20 69 2b 2b 2c 20 70  ->nSrc-1; i++, p
3130: 52 69 67 68 74 2b 2b 2c 20 70 4c 65 66 74 2b 2b  Right++, pLeft++
3140: 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4c  ){.    Table *pL
3150: 65 66 74 54 61 62 20 3d 20 70 4c 65 66 74 2d 3e  eftTab = pLeft->
3160: 70 54 61 62 3b 0a 20 20 20 20 54 61 62 6c 65 20  pTab;.    Table 
3170: 2a 70 52 69 67 68 74 54 61 62 20 3d 20 70 52 69  *pRightTab = pRi
3180: 67 68 74 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69  ght->pTab;.    i
3190: 6e 74 20 69 73 4f 75 74 65 72 3b 0a 0a 20 20 20  nt isOuter;..   
31a0: 20 69 66 28 20 4e 45 56 45 52 28 70 4c 65 66 74   if( NEVER(pLeft
31b0: 54 61 62 3d 3d 30 20 7c 7c 20 70 52 69 67 68 74  Tab==0 || pRight
31c0: 54 61 62 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e  Tab==0) ) contin
31d0: 75 65 3b 0a 20 20 20 20 69 73 4f 75 74 65 72 20  ue;.    isOuter 
31e0: 3d 20 28 70 52 69 67 68 74 2d 3e 6a 6f 69 6e 74  = (pRight->joint
31f0: 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21  ype & JT_OUTER)!
3200: 3d 30 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e  =0;..    /* When
3210: 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79   the NATURAL key
3220: 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 2c  word is present,
3230: 20 61 64 64 20 57 48 45 52 45 20 63 6c 61 75 73   add WHERE claus
3240: 65 20 74 65 72 6d 73 20 66 6f 72 0a 20 20 20 20  e terms for.    
3250: 2a 2a 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20  ** every column 
3260: 74 68 61 74 20 74 68 65 20 74 77 6f 20 74 61 62  that the two tab
3270: 6c 65 73 20 68 61 76 65 20 69 6e 20 63 6f 6d 6d  les have in comm
3280: 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  on..    */.    i
3290: 66 28 20 70 52 69 67 68 74 2d 3e 6a 6f 69 6e 74  f( pRight->joint
32a0: 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c  ype & JT_NATURAL
32b0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 52   ){.      if( pR
32c0: 69 67 68 74 2d 3e 70 4f 6e 20 7c 7c 20 70 52 69  ight->pOn || pRi
32d0: 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20  ght->pUsing ){. 
32e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
32f0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
3300: 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 20 6d  a NATURAL join m
3310: 61 79 20 6e 6f 74 20 68 61 76 65 20 22 0a 20 20  ay not have ".  
3320: 20 20 20 20 20 20 20 20 20 22 61 6e 20 4f 4e 20           "an ON 
3330: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 22  or USING clause"
3340: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65  , 0);.        re
3350: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
3360: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
3370: 3c 70 52 69 67 68 74 54 61 62 2d 3e 6e 43 6f 6c  <pRightTab->nCol
3380: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
3390: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f  char *zName;   /
33a0: 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 75 6d 6e  * Name of column
33b0: 20 69 6e 20 74 68 65 20 72 69 67 68 74 20 74 61   in the right ta
33c0: 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ble */.        i
33d0: 6e 74 20 69 4c 65 66 74 3b 20 20 20 20 20 2f 2a  nt iLeft;     /*
33e0: 20 4d 61 74 63 68 69 6e 67 20 6c 65 66 74 20 74   Matching left t
33f0: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
3400: 69 6e 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20 2f  int iLeftCol;  /
3410: 2a 20 4d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d  * Matching colum
3420: 6e 20 69 6e 20 74 68 65 20 6c 65 66 74 20 74 61  n in the left ta
3430: 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  ble */..        
3440: 7a 4e 61 6d 65 20 3d 20 70 52 69 67 68 74 54 61  zName = pRightTa
3450: 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  b->aCol[j].zName
3460: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 74 61  ;.        if( ta
3470: 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65  bleAndColumnInde
3480: 78 28 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e 61  x(pSrc, i+1, zNa
3490: 6d 65 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c 65  me, &iLeft, &iLe
34a0: 66 74 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20  ftCol) ){.      
34b0: 20 20 20 20 61 64 64 57 68 65 72 65 54 65 72 6d      addWhereTerm
34c0: 28 70 50 61 72 73 65 2c 20 70 53 72 63 2c 20 69  (pParse, pSrc, i
34d0: 4c 65 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c 20  Left, iLeftCol, 
34e0: 69 2b 31 2c 20 6a 2c 0a 20 20 20 20 20 20 20 20  i+1, j,.        
34f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
3500: 73 4f 75 74 65 72 2c 20 26 70 2d 3e 70 57 68 65  sOuter, &p->pWhe
3510: 72 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  re);.        }. 
3520: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
3530: 20 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 62 6f    /* Disallow bo
3540: 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  th ON and USING 
3550: 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20 73  clauses in the s
3560: 61 6d 65 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f 0a  ame join.    */.
3570: 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e      if( pRight->
3580: 70 4f 6e 20 26 26 20 70 52 69 67 68 74 2d 3e 70  pOn && pRight->p
3590: 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73  Using ){.      s
35a0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
35b0: 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 68  Parse, "cannot h
35c0: 61 76 65 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20  ave both ON and 
35d0: 55 53 49 4e 47 20 22 0a 20 20 20 20 20 20 20 20  USING ".        
35e0: 22 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20  "clauses in the 
35f0: 73 61 6d 65 20 6a 6f 69 6e 22 29 3b 0a 20 20 20  same join");.   
3600: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
3610: 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74   }..    /* Add t
3620: 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 74 6f 20  he ON clause to 
3630: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57  the end of the W
3640: 48 45 52 45 20 63 6c 61 75 73 65 2c 20 63 6f 6e  HERE clause, con
3650: 6e 65 63 74 65 64 20 62 79 0a 20 20 20 20 2a 2a  nected by.    **
3660: 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72   an AND operator
3670: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
3680: 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 29 7b 0a   pRight->pOn ){.
3690: 20 20 20 20 20 20 69 66 28 20 69 73 4f 75 74 65        if( isOute
36a0: 72 20 29 20 73 65 74 4a 6f 69 6e 45 78 70 72 28  r ) setJoinExpr(
36b0: 70 52 69 67 68 74 2d 3e 70 4f 6e 2c 20 70 52 69  pRight->pOn, pRi
36c0: 67 68 74 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  ght->iCursor);. 
36d0: 20 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d       p->pWhere =
36e0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
36f0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70  pParse->db, p->p
3700: 57 68 65 72 65 2c 20 70 52 69 67 68 74 2d 3e 70  Where, pRight->p
3710: 4f 6e 29 3b 0a 20 20 20 20 20 20 70 52 69 67 68  On);.      pRigh
3720: 74 2d 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20 20 20  t->pOn = 0;.    
3730: 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  }..    /* Create
3740: 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f 6e 20   extra terms on 
3750: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
3760: 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
3770: 20 6e 61 6d 65 64 0a 20 20 20 20 2a 2a 20 69 6e   named.    ** in
3780: 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73   the USING claus
3790: 65 2e 20 20 45 78 61 6d 70 6c 65 3a 20 49 66 20  e.  Example: If 
37a0: 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20 74  the two tables t
37b0: 6f 20 62 65 20 6a 6f 69 6e 65 64 20 61 72 65 20  o be joined are 
37c0: 0a 20 20 20 20 2a 2a 20 41 20 61 6e 64 20 42 20  .    ** A and B 
37d0: 61 6e 64 20 74 68 65 20 55 53 49 4e 47 20 63 6c  and the USING cl
37e0: 61 75 73 65 20 6e 61 6d 65 73 20 58 2c 20 59 2c  ause names X, Y,
37f0: 20 61 6e 64 20 5a 2c 20 74 68 65 6e 20 61 64 64   and Z, then add
3800: 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 74 6f 20   this.    ** to 
3810: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
3820: 3a 20 20 20 20 41 2e 58 3d 42 2e 58 20 41 4e 44  :    A.X=B.X AND
3830: 20 41 2e 59 3d 42 2e 59 20 41 4e 44 20 41 2e 5a   A.Y=B.Y AND A.Z
3840: 3d 42 2e 5a 0a 20 20 20 20 2a 2a 20 52 65 70 6f  =B.Z.    ** Repo
3850: 72 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20 61  rt an error if a
3860: 6e 79 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69 6f  ny column mentio
3870: 6e 65 64 20 69 6e 20 74 68 65 20 55 53 49 4e 47  ned in the USING
3880: 20 63 6c 61 75 73 65 20 69 73 0a 20 20 20 20 2a   clause is.    *
3890: 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20  * not contained 
38a0: 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 20 74  in both tables t
38b0: 6f 20 62 65 20 6a 6f 69 6e 65 64 2e 0a 20 20 20  o be joined..   
38c0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67   */.    if( pRig
38d0: 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20  ht->pUsing ){.  
38e0: 20 20 20 20 49 64 4c 69 73 74 20 2a 70 4c 69 73      IdList *pLis
38f0: 74 20 3d 20 70 52 69 67 68 74 2d 3e 70 55 73 69  t = pRight->pUsi
3900: 6e 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  ng;.      for(j=
3910: 30 3b 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b  0; j<pList->nId;
3920: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   j++){.        c
3930: 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20  har *zName;     
3940: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
3950: 65 72 6d 20 69 6e 20 74 68 65 20 55 53 49 4e 47  erm in the USING
3960: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
3970: 20 20 20 69 6e 74 20 69 4c 65 66 74 3b 20 20 20     int iLeft;   
3980: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6f 6e 20      /* Table on 
3990: 74 68 65 20 6c 65 66 74 20 77 69 74 68 20 6d 61  the left with ma
39a0: 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61  tching column na
39b0: 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  me */.        in
39c0: 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20 20 20 2f  t iLeftCol;    /
39d0: 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  * Column number 
39e0: 6f 66 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75  of matching colu
39f0: 6d 6e 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a  mn on the left *
3a00: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 52  /.        int iR
3a10: 69 67 68 74 43 6f 6c 3b 20 20 20 2f 2a 20 43 6f  ightCol;   /* Co
3a20: 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 6d  lumn number of m
3a30: 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f  atching column o
3a40: 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 0a  n the right */..
3a50: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
3a60: 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d  pList->a[j].zNam
3a70: 65 3b 0a 20 20 20 20 20 20 20 20 69 52 69 67 68  e;.        iRigh
3a80: 74 43 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64  tCol = columnInd
3a90: 65 78 28 70 52 69 67 68 74 54 61 62 2c 20 7a 4e  ex(pRightTab, zN
3aa0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ame);.        if
3ab0: 28 20 69 52 69 67 68 74 43 6f 6c 3c 30 0a 20 20  ( iRightCol<0.  
3ac0: 20 20 20 20 20 20 20 7c 7c 20 21 74 61 62 6c 65         || !table
3ad0: 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70  AndColumnIndex(p
3ae0: 53 72 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65 2c  Src, i+1, zName,
3af0: 20 26 69 4c 65 66 74 2c 20 26 69 4c 65 66 74 43   &iLeft, &iLeftC
3b00: 6f 6c 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  ol).        ){. 
3b10: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
3b20: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
3b30: 20 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75 73   "cannot join us
3b40: 69 6e 67 20 63 6f 6c 75 6d 6e 20 25 73 20 2d 20  ing column %s - 
3b50: 63 6f 6c 75 6d 6e 20 22 0a 20 20 20 20 20 20 20  column ".       
3b60: 20 20 20 20 20 22 6e 6f 74 20 70 72 65 73 65 6e       "not presen
3b70: 74 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73  t in both tables
3b80: 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ", zName);.     
3b90: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
3ba0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
3bb0: 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 70 50   addWhereTerm(pP
3bc0: 61 72 73 65 2c 20 70 53 72 63 2c 20 69 4c 65 66  arse, pSrc, iLef
3bd0: 74 2c 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b 31  t, iLeftCol, i+1
3be0: 2c 20 69 52 69 67 68 74 43 6f 6c 2c 0a 20 20 20  , iRightCol,.   
3bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c00: 20 20 69 73 4f 75 74 65 72 2c 20 26 70 2d 3e 70    isOuter, &p->p
3c10: 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20 7d 0a  Where);.      }.
3c20: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
3c30: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  rn 0;.}../* Forw
3c40: 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
3c50: 0a 73 74 61 74 69 63 20 4b 65 79 49 6e 66 6f 20  .static KeyInfo 
3c60: 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72  *keyInfoFromExpr
3c70: 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  List(.  Parse *p
3c80: 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
3c90: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
3ca0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
3cb0: 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 46 6f 72  List,     /* For
3cc0: 6d 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62  m the KeyInfo ob
3cd0: 6a 65 63 74 20 66 72 6f 6d 20 74 68 69 73 20 45  ject from this E
3ce0: 78 70 72 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  xprList */.  int
3cf0: 20 69 53 74 61 72 74 2c 20 20 20 20 20 20 20 20   iStart,        
3d00: 20 20 2f 2a 20 42 65 67 69 6e 20 77 69 74 68 20    /* Begin with 
3d10: 74 68 69 73 20 63 6f 6c 75 6d 6e 20 6f 66 20 70  this column of p
3d20: 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  List */.  int nE
3d30: 78 74 72 61 20 20 20 20 20 20 20 20 20 20 20 2f  xtra           /
3d40: 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20  * Add this many 
3d50: 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20 74 6f  extra columns to
3d60: 20 74 68 65 20 65 6e 64 20 2a 2f 0a 29 3b 0a 0a   the end */.);..
3d70: 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 63 6f 64  /*.** Insert cod
3d80: 65 20 69 6e 74 6f 20 22 76 22 20 74 68 61 74 20  e into "v" that 
3d90: 77 69 6c 6c 20 70 75 73 68 20 74 68 65 20 72 65  will push the re
3da0: 63 6f 72 64 20 69 6e 20 72 65 67 69 73 74 65 72  cord in register
3db0: 20 72 65 67 44 61 74 61 0a 2a 2a 20 69 6e 74 6f   regData.** into
3dc0: 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a   the sorter..*/.
3dd0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 75 73 68  static void push
3de0: 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20 50 61  OntoSorter(.  Pa
3df0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
3e00: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63       /* Parser c
3e10: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 6f 72 74  ontext */.  Sort
3e20: 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20 20 20  Ctx *pSort,     
3e30: 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f     /* Informatio
3e40: 6e 20 61 62 6f 75 74 20 74 68 65 20 4f 52 44 45  n about the ORDE
3e50: 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
3e60: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
3e70: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 77  ,       /* The w
3e80: 68 6f 6c 65 20 53 45 4c 45 43 54 20 73 74 61 74  hole SELECT stat
3e90: 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 72  ement */.  int r
3ea0: 65 67 44 61 74 61 20 20 20 20 20 20 20 20 20 20  egData          
3eb0: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f    /* Register ho
3ec0: 6c 64 69 6e 67 20 64 61 74 61 20 74 6f 20 62 65  lding data to be
3ed0: 20 73 6f 72 74 65 64 20 2a 2f 0a 29 7b 0a 20 20   sorted */.){.  
3ee0: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
3ef0: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6e  ->pVdbe;.  int n
3f00: 45 78 70 72 20 3d 20 70 53 6f 72 74 2d 3e 70 4f  Expr = pSort->pO
3f10: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
3f20: 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 20 3d   int regRecord =
3f30: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
3f40: 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65 20 3d  .  int regBase =
3f50: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
3f60: 0a 20 20 69 6e 74 20 6e 4f 42 53 61 74 20 3d 20  .  int nOBSat = 
3f70: 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20  pSort->nOBSat;. 
3f80: 20 69 6e 74 20 6f 70 3b 0a 0a 20 20 70 50 61 72   int op;..  pPar
3f90: 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 45 78 70  se->nMem += nExp
3fa0: 72 2b 32 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e  r+2;        /* n
3fb0: 45 78 70 72 2b 32 20 72 65 67 69 73 74 65 72 73  Expr+2 registers
3fc0: 20 61 6c 6c 6f 63 61 74 65 64 20 61 74 20 72 65   allocated at re
3fd0: 67 42 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74  gBase */.  sqlit
3fe0: 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
3ff0: 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69  (pParse);.  sqli
4000: 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c  te3ExprCodeExprL
4010: 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 6f 72  ist(pParse, pSor
4020: 74 2d 3e 70 4f 72 64 65 72 42 79 2c 20 72 65 67  t->pOrderBy, reg
4030: 42 61 73 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69  Base, 0);.  sqli
4040: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
4050: 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 70 53   OP_Sequence, pS
4060: 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72  ort->iECursor, r
4070: 65 67 42 61 73 65 2b 6e 45 78 70 72 29 3b 0a 20  egBase+nExpr);. 
4080: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
4090: 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65 67  Move(pParse, reg
40a0: 44 61 74 61 2c 20 72 65 67 42 61 73 65 2b 6e 45  Data, regBase+nE
40b0: 78 70 72 2b 31 2c 20 31 29 3b 0a 20 20 73 71 6c  xpr+1, 1);.  sql
40c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
40d0: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
40e0: 20 72 65 67 42 61 73 65 2b 6e 4f 42 53 61 74 2c   regBase+nOBSat,
40f0: 20 6e 45 78 70 72 2b 32 2d 6e 4f 42 53 61 74 2c   nExpr+2-nOBSat,
4100: 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 69 66  regRecord);.  if
4110: 28 20 6e 4f 42 53 61 74 3e 30 20 29 7b 0a 20 20  ( nOBSat>0 ){.  
4120: 20 20 69 6e 74 20 72 65 67 50 72 65 76 4b 65 79    int regPrevKey
4130: 3b 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74  ;   /* The first
4140: 20 6e 4f 42 53 61 74 20 63 6f 6c 75 6d 6e 73 20   nOBSat columns 
4150: 6f 66 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  of the previous 
4160: 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61  row */.    int a
4170: 64 64 72 46 69 72 73 74 3b 20 20 20 20 2f 2a 20  ddrFirst;    /* 
4180: 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 4f  Address of the O
4190: 50 5f 49 66 4e 6f 74 20 6f 70 63 6f 64 65 20 2a  P_IfNot opcode *
41a0: 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4a 6d  /.    int addrJm
41b0: 70 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65  p;      /* Addre
41c0: 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 4a 75 6d  ss of the OP_Jum
41d0: 70 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20  p opcode */.    
41e0: 56 64 62 65 4f 70 20 2a 70 4f 70 3b 20 20 20 20  VdbeOp *pOp;    
41f0: 20 20 2f 2a 20 4f 70 63 6f 64 65 20 74 68 61 74    /* Opcode that
4200: 20 6f 70 65 6e 73 20 74 68 65 20 73 6f 72 74 65   opens the sorte
4210: 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4b 65  r */.    int nKe
4220: 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  y;         /* Nu
4230: 6d 62 65 72 20 6f 66 20 73 6f 72 74 69 6e 67 20  mber of sorting 
4240: 6b 65 79 20 63 6f 6c 75 6d 6e 73 2c 20 69 6e 63  key columns, inc
4250: 6c 75 64 69 6e 67 20 4f 50 5f 53 65 71 75 65 6e  luding OP_Sequen
4260: 63 65 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66  ce */.    KeyInf
4270: 6f 20 2a 70 4b 49 3b 20 20 20 20 20 2f 2a 20 4f  o *pKI;     /* O
4280: 72 69 67 69 6e 61 6c 20 4b 65 79 49 6e 66 6f 20  riginal KeyInfo 
4290: 6f 6e 20 74 68 65 20 73 6f 72 74 65 72 20 74 61  on the sorter ta
42a0: 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 72 65 67 50  ble */..    regP
42b0: 72 65 76 4b 65 79 20 3d 20 70 50 61 72 73 65 2d  revKey = pParse-
42c0: 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61  >nMem+1;.    pPa
42d0: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 53 6f  rse->nMem += pSo
42e0: 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20 20 20  rt->nOBSat;.    
42f0: 6e 4b 65 79 20 3d 20 6e 45 78 70 72 20 2d 20 70  nKey = nExpr - p
4300: 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 20 2b 20 31  Sort->nOBSat + 1
4310: 3b 0a 20 20 20 20 61 64 64 72 46 69 72 73 74 20  ;.    addrFirst 
4320: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
4330: 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c  Op1(v, OP_IfNot,
4340: 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 29 3b   regBase+nExpr);
4350: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
4360: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
4370: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
4380: 6d 70 61 72 65 2c 20 72 65 67 50 72 65 76 4b 65  mpare, regPrevKe
4390: 79 2c 20 72 65 67 42 61 73 65 2c 20 70 53 6f 72  y, regBase, pSor
43a0: 74 2d 3e 6e 4f 42 53 61 74 29 3b 0a 20 20 20 20  t->nOBSat);.    
43b0: 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  pOp = sqlite3Vdb
43c0: 65 47 65 74 4f 70 28 76 2c 20 70 53 6f 72 74 2d  eGetOp(v, pSort-
43d0: 3e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29 3b  >addrSortIndex);
43e0: 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
43f0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
4400: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  d ) return;.    
4410: 70 4f 70 2d 3e 70 32 20 3d 20 6e 4b 65 79 20 2b  pOp->p2 = nKey +
4420: 20 31 3b 0a 20 20 20 20 70 4b 49 20 3d 20 70 4f   1;.    pKI = pO
4430: 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a  p->p4.pKeyInfo;.
4440: 20 20 20 20 6d 65 6d 73 65 74 28 70 4b 49 2d 3e      memset(pKI->
4450: 61 53 6f 72 74 4f 72 64 65 72 2c 20 30 2c 20 70  aSortOrder, 0, p
4460: 4b 49 2d 3e 6e 46 69 65 6c 64 29 3b 20 2f 2a 20  KI->nField); /* 
4470: 4d 61 6b 65 73 20 4f 50 5f 4a 75 6d 70 20 62 65  Makes OP_Jump be
4480: 6c 6f 77 20 74 65 73 74 61 62 6c 65 20 2a 2f 0a  low testable */.
4490: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
44a0: 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28  hangeP4(v, -1, (
44b0: 63 68 61 72 2a 29 70 4b 49 2c 20 50 34 5f 4b 45  char*)pKI, P4_KE
44c0: 59 49 4e 46 4f 29 3b 0a 20 20 20 20 70 4f 70 2d  YINFO);.    pOp-
44d0: 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 6b  >p4.pKeyInfo = k
44e0: 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
44f0: 73 74 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74  st(pParse, pSort
4500: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 6e 4f 42 53  ->pOrderBy, nOBS
4510: 61 74 2c 20 31 29 3b 0a 20 20 20 20 61 64 64 72  at, 1);.    addr
4520: 4a 6d 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Jmp = sqlite3Vdb
4530: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
4540: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
4550: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d  AddOp3(v, OP_Jum
4560: 70 2c 20 61 64 64 72 4a 6d 70 2b 31 2c 20 30 2c  p, addrJmp+1, 0,
4570: 20 61 64 64 72 4a 6d 70 2b 31 29 3b 20 56 64 62   addrJmp+1); Vdb
4580: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
4590: 20 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b    pSort->labelBk
45a0: 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Out = sqlite3Vdb
45b0: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
45c0: 20 20 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74     pSort->regRet
45d0: 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  urn = ++pParse->
45e0: 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65  nMem;.    sqlite
45f0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
4600: 50 5f 47 6f 73 75 62 2c 20 70 53 6f 72 74 2d 3e  P_Gosub, pSort->
4610: 72 65 67 52 65 74 75 72 6e 2c 20 70 53 6f 72 74  regReturn, pSort
4620: 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20  ->labelBkOut);. 
4630: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4640: 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73 65 74  dOp1(v, OP_Reset
4650: 53 6f 72 74 65 72 2c 20 70 53 6f 72 74 2d 3e 69  Sorter, pSort->i
4660: 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 73 71  ECursor);.    sq
4670: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
4680: 65 28 76 2c 20 61 64 64 72 46 69 72 73 74 29 3b  e(v, addrFirst);
4690: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
46a0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 6f 76  AddOp3(v, OP_Mov
46b0: 65 2c 20 72 65 67 42 61 73 65 2c 20 72 65 67 50  e, regBase, regP
46c0: 72 65 76 4b 65 79 2c 20 70 53 6f 72 74 2d 3e 6e  revKey, pSort->n
46d0: 4f 42 53 61 74 29 3b 0a 20 20 20 20 73 71 6c 69  OBSat);.    sqli
46e0: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
46f0: 76 2c 20 61 64 64 72 4a 6d 70 29 3b 0a 20 20 7d  v, addrJmp);.  }
4700: 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f  .  if( pSort->so
4710: 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c  rtFlags & SORTFL
4720: 41 47 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a  AG_UseSorter ){.
4730: 20 20 20 20 6f 70 20 3d 20 4f 50 5f 53 6f 72 74      op = OP_Sort
4740: 65 72 49 6e 73 65 72 74 3b 0a 20 20 7d 65 6c 73  erInsert;.  }els
4750: 65 7b 0a 20 20 20 20 6f 70 20 3d 20 4f 50 5f 49  e{.    op = OP_I
4760: 64 78 49 6e 73 65 72 74 3b 0a 20 20 7d 0a 20 20  dxInsert;.  }.  
4770: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4780: 32 28 76 2c 20 6f 70 2c 20 70 53 6f 72 74 2d 3e  2(v, op, pSort->
4790: 69 45 43 75 72 73 6f 72 2c 20 72 65 67 52 65 63  iECursor, regRec
47a0: 6f 72 64 29 3b 0a 20 20 69 66 28 20 70 53 65 6c  ord);.  if( pSel
47b0: 65 63 74 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20  ect->iLimit ){. 
47c0: 20 20 20 69 6e 74 20 61 64 64 72 31 2c 20 61 64     int addr1, ad
47d0: 64 72 32 3b 0a 20 20 20 20 69 6e 74 20 69 4c 69  dr2;.    int iLi
47e0: 6d 69 74 3b 0a 20 20 20 20 69 66 28 20 70 53 65  mit;.    if( pSe
47f0: 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74 20 29 7b  lect->iOffset ){
4800: 0a 20 20 20 20 20 20 69 4c 69 6d 69 74 20 3d 20  .      iLimit = 
4810: 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74  pSelect->iOffset
4820: 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  +1;.    }else{. 
4830: 20 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 70 53       iLimit = pS
4840: 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 3b 0a 20  elect->iLimit;. 
4850: 20 20 20 7d 0a 20 20 20 20 61 64 64 72 31 20 3d     }.    addr1 =
4860: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4870: 70 31 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c  p1(v, OP_IfZero,
4880: 20 69 4c 69 6d 69 74 29 3b 20 56 64 62 65 43 6f   iLimit); VdbeCo
4890: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73  verage(v);.    s
48a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
48b0: 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 69  (v, OP_AddImm, i
48c0: 4c 69 6d 69 74 2c 20 2d 31 29 3b 0a 20 20 20 20  Limit, -1);.    
48d0: 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56  addr2 = sqlite3V
48e0: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
48f0: 47 6f 74 6f 29 3b 0a 20 20 20 20 73 71 6c 69 74  Goto);.    sqlit
4900: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
4910: 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20 73 71  , addr1);.    sq
4920: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
4930: 76 2c 20 4f 50 5f 4c 61 73 74 2c 20 70 53 6f 72  v, OP_Last, pSor
4940: 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20  t->iECursor);.  
4950: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4960: 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65  Op1(v, OP_Delete
4970: 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f  , pSort->iECurso
4980: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  r);.    sqlite3V
4990: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
49a0: 64 64 72 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ddr2);.  }.}../*
49b0: 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 6f 20  .** Add code to 
49c0: 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 4f 46  implement the OF
49d0: 46 53 45 54 0a 2a 2f 0a 73 74 61 74 69 63 20 76  FSET.*/.static v
49e0: 6f 69 64 20 63 6f 64 65 4f 66 66 73 65 74 28 0a  oid codeOffset(.
49f0: 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20    Vdbe *v,      
4a00: 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
4a10: 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56  code into this V
4a20: 4d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66 66 73  M */.  int iOffs
4a30: 65 74 2c 20 20 20 20 20 20 2f 2a 20 52 65 67 69  et,      /* Regi
4a40: 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 74 68 65  ster holding the
4a50: 20 6f 66 66 73 65 74 20 63 6f 75 6e 74 65 72 20   offset counter 
4a60: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e  */.  int iContin
4a70: 75 65 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68  ue     /* Jump h
4a80: 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68 65 20  ere to skip the 
4a90: 63 75 72 72 65 6e 74 20 72 65 63 6f 72 64 20 2a  current record *
4aa0: 2f 0a 29 7b 0a 20 20 69 66 28 20 69 4f 66 66 73  /.){.  if( iOffs
4ab0: 65 74 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  et>0 ){.    int 
4ac0: 61 64 64 72 3b 0a 20 20 20 20 73 71 6c 69 74 65  addr;.    sqlite
4ad0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
4ae0: 50 5f 41 64 64 49 6d 6d 2c 20 69 4f 66 66 73 65  P_AddImm, iOffse
4af0: 74 2c 20 2d 31 29 3b 0a 20 20 20 20 61 64 64 72  t, -1);.    addr
4b00: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
4b10: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 65 67  dOp1(v, OP_IfNeg
4b20: 2c 20 69 4f 66 66 73 65 74 29 3b 20 56 64 62 65  , iOffset); Vdbe
4b30: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
4b40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4b50: 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
4b60: 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20  , iContinue);.  
4b70: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
4b80: 2c 20 22 73 6b 69 70 20 4f 46 46 53 45 54 20 72  , "skip OFFSET r
4b90: 65 63 6f 72 64 73 22 29 29 3b 0a 20 20 20 20 73  ecords"));.    s
4ba0: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
4bb0: 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 7d  re(v, addr);.  }
4bc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f  .}../*.** Add co
4bd0: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 63 68 65  de that will che
4be0: 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ck to make sure 
4bf0: 74 68 65 20 4e 20 72 65 67 69 73 74 65 72 73 20  the N registers 
4c00: 73 74 61 72 74 69 6e 67 20 61 74 20 69 4d 65 6d  starting at iMem
4c10: 0a 2a 2a 20 66 6f 72 6d 20 61 20 64 69 73 74 69  .** form a disti
4c20: 6e 63 74 20 65 6e 74 72 79 2e 20 20 69 54 61 62  nct entry.  iTab
4c30: 20 69 73 20 61 20 73 6f 72 74 69 6e 67 20 69 6e   is a sorting in
4c40: 64 65 78 20 74 68 61 74 20 68 6f 6c 64 73 20 70  dex that holds p
4c50: 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 73 65 65  reviously.** see
4c60: 6e 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f  n combinations o
4c70: 66 20 74 68 65 20 4e 20 76 61 6c 75 65 73 2e 20  f the N values. 
4c80: 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20   A new entry is 
4c90: 6d 61 64 65 20 69 6e 20 69 54 61 62 0a 2a 2a 20  made in iTab.** 
4ca0: 69 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 4e  if the current N
4cb0: 20 76 61 6c 75 65 73 20 61 72 65 20 6e 65 77 2e   values are new.
4cc0: 0a 2a 2a 0a 2a 2a 20 41 20 6a 75 6d 70 20 74 6f  .**.** A jump to
4cd0: 20 61 64 64 72 52 65 70 65 61 74 20 69 73 20 6d   addrRepeat is m
4ce0: 61 64 65 20 61 6e 64 20 74 68 65 20 4e 2b 31 20  ade and the N+1 
4cf0: 76 61 6c 75 65 73 20 61 72 65 20 70 6f 70 70 65  values are poppe
4d00: 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 73 74  d from the.** st
4d10: 61 63 6b 20 69 66 20 74 68 65 20 74 6f 70 20 4e  ack if the top N
4d20: 20 65 6c 65 6d 65 6e 74 73 20 61 72 65 20 6e 6f   elements are no
4d30: 74 20 64 69 73 74 69 6e 63 74 2e 0a 2a 2f 0a 73  t distinct..*/.s
4d40: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 44  tatic void codeD
4d50: 69 73 74 69 6e 63 74 28 0a 20 20 50 61 72 73 65  istinct(.  Parse
4d60: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a   *pParse,     /*
4d70: 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64   Parsing and cod
4d80: 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
4d90: 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54  text */.  int iT
4da0: 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ab,          /* 
4db0: 41 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  A sorting index 
4dc0: 75 73 65 64 20 74 6f 20 74 65 73 74 20 66 6f 72  used to test for
4dd0: 20 64 69 73 74 69 6e 63 74 6e 65 73 73 20 2a 2f   distinctness */
4de0: 0a 20 20 69 6e 74 20 61 64 64 72 52 65 70 65 61  .  int addrRepea
4df0: 74 2c 20 20 20 20 2f 2a 20 4a 75 6d 70 20 74 6f  t,    /* Jump to
4e00: 20 68 65 72 65 20 69 66 20 6e 6f 74 20 64 69 73   here if not dis
4e10: 74 69 6e 63 74 20 2a 2f 0a 20 20 69 6e 74 20 4e  tinct */.  int N
4e20: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
4e30: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   Number of eleme
4e40: 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 65  nts */.  int iMe
4e50: 6d 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  m           /* F
4e60: 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a  irst element */.
4e70: 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  ){.  Vdbe *v;.  
4e80: 69 6e 74 20 72 31 3b 0a 0a 20 20 76 20 3d 20 70  int r1;..  v = p
4e90: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
4ea0: 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
4eb0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
4ec0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4ed0: 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75  Op4Int(v, OP_Fou
4ee0: 6e 64 2c 20 69 54 61 62 2c 20 61 64 64 72 52 65  nd, iTab, addrRe
4ef0: 70 65 61 74 2c 20 69 4d 65 6d 2c 20 4e 29 3b 20  peat, iMem, N); 
4f00: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
4f10: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
4f20: 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
4f30: 65 63 6f 72 64 2c 20 69 4d 65 6d 2c 20 4e 2c 20  ecord, iMem, N, 
4f40: 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  r1);.  sqlite3Vd
4f50: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
4f60: 64 78 49 6e 73 65 72 74 2c 20 69 54 61 62 2c 20  dxInsert, iTab, 
4f70: 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  r1);.  sqlite3Re
4f80: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
4f90: 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 23 69 66  rse, r1);.}..#if
4fa0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
4fb0: 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20  _SUBQUERY./*.** 
4fc0: 47 65 6e 65 72 61 74 65 20 61 6e 20 65 72 72 6f  Generate an erro
4fd0: 72 20 6d 65 73 73 61 67 65 20 77 68 65 6e 20 61  r message when a
4fe0: 20 53 45 4c 45 43 54 20 69 73 20 75 73 65 64 20   SELECT is used 
4ff0: 77 69 74 68 69 6e 20 61 20 73 75 62 65 78 70 72  within a subexpr
5000: 65 73 73 69 6f 6e 0a 2a 2a 20 28 65 78 61 6d 70  ession.** (examp
5010: 6c 65 3a 20 20 22 61 20 49 4e 20 28 53 45 4c 45  le:  "a IN (SELE
5020: 43 54 20 2a 20 46 52 4f 4d 20 74 61 62 6c 65 29  CT * FROM table)
5030: 22 29 20 62 75 74 20 69 74 20 68 61 73 20 6d 6f  ") but it has mo
5040: 72 65 20 74 68 61 6e 20 31 20 72 65 73 75 6c 74  re than 1 result
5050: 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 20 20 57 65 20  .** column.  We 
5060: 64 6f 20 74 68 69 73 20 69 6e 20 61 20 73 75 62  do this in a sub
5070: 72 6f 75 74 69 6e 65 20 62 65 63 61 75 73 65 20  routine because 
5080: 74 68 65 20 65 72 72 6f 72 20 75 73 65 64 20 74  the error used t
5090: 6f 20 6f 63 63 75 72 0a 2a 2a 20 69 6e 20 6d 75  o occur.** in mu
50a0: 6c 74 69 70 6c 65 20 70 6c 61 63 65 73 2e 20 20  ltiple places.  
50b0: 28 54 68 65 20 65 72 72 6f 72 20 6f 6e 6c 79 20  (The error only 
50c0: 6f 63 63 75 72 73 20 69 6e 20 6f 6e 65 20 70 6c  occurs in one pl
50d0: 61 63 65 20 6e 6f 77 2c 20 62 75 74 20 77 65 0a  ace now, but we.
50e0: 2a 2a 20 72 65 74 61 69 6e 20 74 68 65 20 73 75  ** retain the su
50f0: 62 72 6f 75 74 69 6e 65 20 74 6f 20 6d 69 6e 69  broutine to mini
5100: 6d 69 7a 65 20 63 6f 64 65 20 64 69 73 72 75 70  mize code disrup
5110: 74 69 6f 6e 2e 29 0a 2a 2f 0a 73 74 61 74 69 63  tion.).*/.static
5120: 20 69 6e 74 20 63 68 65 63 6b 46 6f 72 4d 75 6c   int checkForMul
5130: 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72  tiColumnSelectEr
5140: 72 6f 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ror(.  Parse *pP
5150: 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
5160: 61 72 73 65 20 63 6f 6e 74 65 78 74 2e 20 2a 2f  arse context. */
5170: 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
5180: 44 65 73 74 2c 20 20 20 2f 2a 20 44 65 73 74 69  Dest,   /* Desti
5190: 6e 61 74 69 6f 6e 20 6f 66 20 53 45 4c 45 43 54  nation of SELECT
51a0: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e   results */.  in
51b0: 74 20 6e 45 78 70 72 20 20 20 20 20 20 20 20 20  t nExpr         
51c0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
51d0: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 72  result columns r
51e0: 65 74 75 72 6e 65 64 20 62 79 20 53 45 4c 45 43  eturned by SELEC
51f0: 54 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 65 44  T */.){.  int eD
5200: 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65  est = pDest->eDe
5210: 73 74 3b 0a 20 20 69 66 28 20 6e 45 78 70 72 3e  st;.  if( nExpr>
5220: 31 20 26 26 20 28 65 44 65 73 74 3d 3d 53 52 54  1 && (eDest==SRT
5230: 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74 3d 3d 53  _Mem || eDest==S
5240: 52 54 5f 53 65 74 29 20 29 7b 0a 20 20 20 20 73  RT_Set) ){.    s
5250: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
5260: 50 61 72 73 65 2c 20 22 6f 6e 6c 79 20 61 20 73  Parse, "only a s
5270: 69 6e 67 6c 65 20 72 65 73 75 6c 74 20 61 6c 6c  ingle result all
5280: 6f 77 65 64 20 66 6f 72 20 22 0a 20 20 20 20 20  owed for ".     
5290: 20 20 22 61 20 53 45 4c 45 43 54 20 74 68 61 74    "a SELECT that
52a0: 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65   is part of an e
52b0: 78 70 72 65 73 73 69 6f 6e 22 29 3b 0a 20 20 20  xpression");.   
52c0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 65 6c   return 1;.  }el
52d0: 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  se{.    return 0
52e0: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
52f0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
5300: 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68 65  ne generates the
5310: 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 69 6e   code for the in
5320: 73 69 64 65 20 6f 66 20 74 68 65 20 69 6e 6e 65  side of the inne
5330: 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 61 20 53  r loop.** of a S
5340: 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ELECT..**.** If 
5350: 73 72 63 54 61 62 20 69 73 20 6e 65 67 61 74 69  srcTab is negati
5360: 76 65 2c 20 74 68 65 6e 20 74 68 65 20 70 45 4c  ve, then the pEL
5370: 69 73 74 20 65 78 70 72 65 73 73 69 6f 6e 73 0a  ist expressions.
5380: 2a 2a 20 61 72 65 20 65 76 61 6c 75 61 74 65 64  ** are evaluated
5390: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74   in order to get
53a0: 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 68   the data for th
53b0: 69 73 20 72 6f 77 2e 20 20 49 66 20 73 72 63 54  is row.  If srcT
53c0: 61 62 20 69 73 0a 2a 2a 20 7a 65 72 6f 20 6f 72  ab is.** zero or
53d0: 20 6d 6f 72 65 2c 20 74 68 65 6e 20 64 61 74 61   more, then data
53e0: 20 69 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20   is pulled from 
53f0: 73 72 63 54 61 62 20 61 6e 64 20 70 45 4c 69 73  srcTab and pELis
5400: 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 0a  t is used only .
5410: 2a 2a 20 74 6f 20 67 65 74 20 6e 75 6d 62 65 72  ** to get number
5420: 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74 68 65   columns and the
5430: 20 64 61 74 61 74 79 70 65 20 66 6f 72 20 65 61   datatype for ea
5440: 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74  ch column..*/.st
5450: 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74  atic void select
5460: 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20 20 50 61 72  InnerLoop(.  Par
5470: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
5480: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
5490: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
54a0: 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
54b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
54c0: 6f 6d 70 6c 65 74 65 20 73 65 6c 65 63 74 20 73  omplete select s
54d0: 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63  tatement being c
54e0: 6f 64 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69  oded */.  ExprLi
54f0: 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20  st *pEList,     
5500: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 76 61 6c    /* List of val
5510: 75 65 73 20 62 65 69 6e 67 20 65 78 74 72 61 63  ues being extrac
5520: 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63  ted */.  int src
5530: 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  Tab,            
5540: 20 2f 2a 20 50 75 6c 6c 20 64 61 74 61 20 66 72   /* Pull data fr
5550: 6f 6d 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f  om this table */
5560: 0a 20 20 53 6f 72 74 43 74 78 20 2a 70 53 6f 72  .  SortCtx *pSor
5570: 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  t,         /* If
5580: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e 66 6f 20   not NULL, info 
5590: 6f 6e 20 68 6f 77 20 74 6f 20 70 72 6f 63 65 73  on how to proces
55a0: 73 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20 20  s ORDER BY */.  
55b0: 44 69 73 74 69 6e 63 74 43 74 78 20 2a 70 44 69  DistinctCtx *pDi
55c0: 73 74 69 6e 63 74 2c 20 2f 2a 20 49 66 20 6e 6f  stinct, /* If no
55d0: 74 20 4e 55 4c 4c 2c 20 69 6e 66 6f 20 6f 6e 20  t NULL, info on 
55e0: 68 6f 77 20 74 6f 20 70 72 6f 63 65 73 73 20 44  how to process D
55f0: 49 53 54 49 4e 43 54 20 2a 2f 0a 20 20 53 65 6c  ISTINCT */.  Sel
5600: 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20  ectDest *pDest, 
5610: 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64       /* How to d
5620: 69 73 70 6f 73 65 20 6f 66 20 74 68 65 20 72 65  ispose of the re
5630: 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69  sults */.  int i
5640: 43 6f 6e 74 69 6e 75 65 2c 20 20 20 20 20 20 20  Continue,       
5650: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
5660: 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68  to continue with
5670: 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a 20 20 69   next row */.  i
5680: 6e 74 20 69 42 72 65 61 6b 20 20 20 20 20 20 20  nt iBreak       
5690: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
56a0: 65 72 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74  ere to break out
56b0: 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f   of the inner lo
56c0: 6f 70 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  op */.){.  Vdbe 
56d0: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
56e0: 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  be;.  int i;.  i
56f0: 6e 74 20 68 61 73 44 69 73 74 69 6e 63 74 3b 20  nt hasDistinct; 
5700: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
5710: 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b  f the DISTINCT k
5720: 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e  eyword is presen
5730: 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65  t */.  int regRe
5740: 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20 20 20  sult;           
5750: 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6d     /* Start of m
5760: 65 6d 6f 72 79 20 68 6f 6c 64 69 6e 67 20 72 65  emory holding re
5770: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e  sult set */.  in
5780: 74 20 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d  t eDest = pDest-
5790: 3e 65 44 65 73 74 3b 20 20 20 2f 2a 20 48 6f 77  >eDest;   /* How
57a0: 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 72   to dispose of r
57b0: 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20  esults */.  int 
57c0: 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69  iParm = pDest->i
57d0: 53 44 50 61 72 6d 3b 20 2f 2a 20 46 69 72 73 74  SDParm; /* First
57e0: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 64 69 73   argument to dis
57f0: 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a  posal method */.
5800: 20 20 69 6e 74 20 6e 52 65 73 75 6c 74 43 6f 6c    int nResultCol
5810: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
5820: 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   Number of resul
5830: 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 0a 20 20  t columns */..  
5840: 61 73 73 65 72 74 28 20 76 20 29 3b 0a 20 20 61  assert( v );.  a
5850: 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30  ssert( pEList!=0
5860: 20 29 3b 0a 20 20 68 61 73 44 69 73 74 69 6e 63   );.  hasDistinc
5870: 74 20 3d 20 70 44 69 73 74 69 6e 63 74 20 3f 20  t = pDistinct ? 
5880: 70 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74  pDistinct->eTnct
5890: 54 79 70 65 20 3a 20 57 48 45 52 45 5f 44 49 53  Type : WHERE_DIS
58a0: 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20 69 66  TINCT_NOOP;.  if
58b0: 28 20 70 53 6f 72 74 20 26 26 20 70 53 6f 72 74  ( pSort && pSort
58c0: 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20  ->pOrderBy==0 ) 
58d0: 70 53 6f 72 74 20 3d 20 30 3b 0a 20 20 69 66 28  pSort = 0;.  if(
58e0: 20 70 53 6f 72 74 3d 3d 30 20 26 26 20 21 68 61   pSort==0 && !ha
58f0: 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  sDistinct ){.   
5900: 20 61 73 73 65 72 74 28 20 69 43 6f 6e 74 69 6e   assert( iContin
5910: 75 65 21 3d 30 20 29 3b 0a 20 20 20 20 63 6f 64  ue!=0 );.    cod
5920: 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f  eOffset(v, p->iO
5930: 66 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65  ffset, iContinue
5940: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c  );.  }..  /* Pul
5950: 6c 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  l the requested 
5960: 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20  columns..  */.  
5970: 6e 52 65 73 75 6c 74 43 6f 6c 20 3d 20 70 45 4c  nResultCol = pEL
5980: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 69  ist->nExpr;..  i
5990: 66 28 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3d  f( pDest->iSdst=
59a0: 3d 30 20 29 7b 0a 20 20 20 20 70 44 65 73 74 2d  =0 ){.    pDest-
59b0: 3e 69 53 64 73 74 20 3d 20 70 50 61 72 73 65 2d  >iSdst = pParse-
59c0: 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61  >nMem+1;.    pPa
59d0: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65  rse->nMem += nRe
59e0: 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d 65 6c 73 65  sultCol;.  }else
59f0: 20 69 66 28 20 70 44 65 73 74 2d 3e 69 53 64 73   if( pDest->iSds
5a00: 74 2b 6e 52 65 73 75 6c 74 43 6f 6c 20 3e 20 70  t+nResultCol > p
5a10: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 7b 0a 20  Parse->nMem ){. 
5a20: 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 6e     /* This is an
5a30: 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e   error condition
5a40: 20 74 68 61 74 20 63 61 6e 20 72 65 73 75 6c 74   that can result
5a50: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77  , for example, w
5a60: 68 65 6e 20 61 20 53 45 4c 45 43 54 0a 20 20 20  hen a SELECT.   
5a70: 20 2a 2a 20 6f 6e 20 74 68 65 20 72 69 67 68 74   ** on the right
5a80: 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 61 6e  -hand side of an
5a90: 20 49 4e 53 45 52 54 20 63 6f 6e 74 61 69 6e 73   INSERT contains
5aa0: 20 6d 6f 72 65 20 72 65 73 75 6c 74 20 63 6f 6c   more result col
5ab0: 75 6d 6e 73 20 74 68 61 6e 0a 20 20 20 20 2a 2a  umns than.    **
5ac0: 20 74 68 65 72 65 20 61 72 65 20 63 6f 6c 75 6d   there are colum
5ad0: 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ns in the table 
5ae0: 6f 6e 20 74 68 65 20 6c 65 66 74 2e 20 20 54 68  on the left.  Th
5af0: 65 20 65 72 72 6f 72 20 77 69 6c 6c 20 62 65 20  e error will be 
5b00: 63 61 75 67 68 74 0a 20 20 20 20 2a 2a 20 61 6e  caught.    ** an
5b10: 64 20 72 65 70 6f 72 74 65 64 20 6c 61 74 65 72  d reported later
5b20: 2e 20 20 42 75 74 20 77 65 20 6e 65 65 64 20 74  .  But we need t
5b30: 6f 20 6d 61 6b 65 20 73 75 72 65 20 65 6e 6f 75  o make sure enou
5b40: 67 68 20 6d 65 6d 6f 72 79 20 69 73 20 61 6c 6c  gh memory is all
5b50: 6f 63 61 74 65 64 0a 20 20 20 20 2a 2a 20 74 6f  ocated.    ** to
5b60: 20 61 76 6f 69 64 20 6f 74 68 65 72 20 73 70 75   avoid other spu
5b70: 72 69 6f 75 73 20 65 72 72 6f 72 73 20 69 6e 20  rious errors in 
5b80: 74 68 65 20 6d 65 61 6e 74 69 6d 65 2e 20 2a 2f  the meantime. */
5b90: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
5ba0: 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b  m += nResultCol;
5bb0: 0a 20 20 7d 0a 20 20 70 44 65 73 74 2d 3e 6e 53  .  }.  pDest->nS
5bc0: 64 73 74 20 3d 20 6e 52 65 73 75 6c 74 43 6f 6c  dst = nResultCol
5bd0: 3b 0a 20 20 72 65 67 52 65 73 75 6c 74 20 3d 20  ;.  regResult = 
5be0: 70 44 65 73 74 2d 3e 69 53 64 73 74 3b 0a 20 20  pDest->iSdst;.  
5bf0: 69 66 28 20 73 72 63 54 61 62 3e 3d 30 20 29 7b  if( srcTab>=0 ){
5c00: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
5c10: 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 69 2b 2b 29  nResultCol; i++)
5c20: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
5c30: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
5c40: 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20  Column, srcTab, 
5c50: 69 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 29 3b  i, regResult+i);
5c60: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
5c70: 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 45 4c  nt((v, "%s", pEL
5c80: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  ist->a[i].zName)
5c90: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
5ca0: 20 69 66 28 20 65 44 65 73 74 21 3d 53 52 54 5f   if( eDest!=SRT_
5cb0: 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20 2f 2a  Exists ){.    /*
5cc0: 20 49 66 20 74 68 65 20 64 65 73 74 69 6e 61 74   If the destinat
5cd0: 69 6f 6e 20 69 73 20 61 6e 20 45 58 49 53 54 53  ion is an EXISTS
5ce0: 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f 6e  (...) expression
5cf0: 2c 20 74 68 65 20 61 63 74 75 61 6c 0a 20 20 20  , the actual.   
5d00: 20 2a 2a 20 76 61 6c 75 65 73 20 72 65 74 75 72   ** values retur
5d10: 6e 65 64 20 62 79 20 74 68 65 20 53 45 4c 45 43  ned by the SELEC
5d20: 54 20 61 72 65 20 6e 6f 74 20 72 65 71 75 69 72  T are not requir
5d30: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ed..    */.    s
5d40: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
5d50: 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
5d60: 45 4c 69 73 74 2c 20 72 65 67 52 65 73 75 6c 74  EList, regResult
5d70: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
5d80: 20 20 20 20 28 65 44 65 73 74 3d 3d 53 52 54 5f      (eDest==SRT_
5d90: 4f 75 74 70 75 74 7c 7c 65 44 65 73 74 3d 3d 53  Output||eDest==S
5da0: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 29 3f 53 51  RT_Coroutine)?SQ
5db0: 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 3a 30 29  LITE_ECEL_DUP:0)
5dc0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
5dd0: 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77  he DISTINCT keyw
5de0: 6f 72 64 20 77 61 73 20 70 72 65 73 65 6e 74 20  ord was present 
5df0: 6f 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  on the SELECT st
5e00: 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e 64  atement.  ** and
5e10: 20 74 68 69 73 20 72 6f 77 20 68 61 73 20 62 65   this row has be
5e20: 65 6e 20 73 65 65 6e 20 62 65 66 6f 72 65 2c 20  en seen before, 
5e30: 74 68 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b 65  then do not make
5e40: 20 74 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20 70   this row.  ** p
5e50: 61 72 74 20 6f 66 20 74 68 65 20 72 65 73 75 6c  art of the resul
5e60: 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 68 61  t..  */.  if( ha
5e70: 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  sDistinct ){.   
5e80: 20 73 77 69 74 63 68 28 20 70 44 69 73 74 69 6e   switch( pDistin
5e90: 63 74 2d 3e 65 54 6e 63 74 54 79 70 65 20 29 7b  ct->eTnctType ){
5ea0: 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45 52  .      case WHER
5eb0: 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52  E_DISTINCT_ORDER
5ec0: 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 56 64  ED: {.        Vd
5ed0: 62 65 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20 20  beOp *pOp;      
5ee0: 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6c 6f 6e 67        /* No long
5ef0: 65 72 20 72 65 71 75 69 72 65 64 20 4f 70 65 6e  er required Open
5f00: 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 2e  Ephemeral instr.
5f10: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
5f20: 69 4a 75 6d 70 3b 20 20 20 20 20 20 20 20 20 20  iJump;          
5f30: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 64 65 73 74      /* Jump dest
5f40: 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ination */.     
5f50: 20 20 20 69 6e 74 20 72 65 67 50 72 65 76 3b 20     int regPrev; 
5f60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
5f70: 65 76 69 6f 75 73 20 72 6f 77 20 63 6f 6e 74 65  evious row conte
5f80: 6e 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f  nt */..        /
5f90: 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
5fa0: 20 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75   for the previou
5fb0: 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 20  s row */.       
5fc0: 20 72 65 67 50 72 65 76 20 3d 20 70 50 61 72 73   regPrev = pPars
5fd0: 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20  e->nMem+1;.     
5fe0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
5ff0: 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 0a  += nResultCol;..
6000: 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67          /* Chang
6010: 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68  e the OP_OpenEph
6020: 65 6d 65 72 61 6c 20 63 6f 64 65 64 20 65 61 72  emeral coded ear
6030: 6c 69 65 72 20 74 6f 20 61 6e 20 4f 50 5f 4e 75  lier to an OP_Nu
6040: 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65  ll.        ** se
6050: 74 73 20 74 68 65 20 4d 45 4d 5f 43 6c 65 61 72  ts the MEM_Clear
6060: 65 64 20 62 69 74 20 6f 6e 20 74 68 65 20 66 69  ed bit on the fi
6070: 72 73 74 20 72 65 67 69 73 74 65 72 20 6f 66 20  rst register of 
6080: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  the.        ** p
6090: 72 65 76 69 6f 75 73 20 76 61 6c 75 65 2e 20 20  revious value.  
60a0: 54 68 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20  This will cause 
60b0: 74 68 65 20 4f 50 5f 4e 65 20 62 65 6c 6f 77 20  the OP_Ne below 
60c0: 74 6f 20 61 6c 77 61 79 73 0a 20 20 20 20 20 20  to always.      
60d0: 20 20 2a 2a 20 66 61 69 6c 20 6f 6e 20 74 68 65    ** fail on the
60e0: 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e   first iteration
60f0: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 65 76 65   of the loop eve
6100: 6e 20 69 66 20 74 68 65 20 66 69 72 73 74 0a 20  n if the first. 
6110: 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 20 69 73         ** row is
6120: 20 61 6c 6c 20 4e 55 4c 4c 73 2e 0a 20 20 20 20   all NULLs..    
6130: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73      */.        s
6140: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
6150: 54 6f 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74 69  ToNoop(v, pDisti
6160: 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a  nct->addrTnct);.
6170: 20 20 20 20 20 20 20 20 70 4f 70 20 3d 20 73 71          pOp = sq
6180: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76  lite3VdbeGetOp(v
6190: 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64 64  , pDistinct->add
61a0: 72 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20 20  rTnct);.        
61b0: 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50  pOp->opcode = OP
61c0: 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70  _Null;.        p
61d0: 4f 70 2d 3e 70 31 20 3d 20 31 3b 0a 20 20 20 20  Op->p1 = 1;.    
61e0: 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 72 65      pOp->p2 = re
61f0: 67 50 72 65 76 3b 0a 0a 20 20 20 20 20 20 20 20  gPrev;..        
6200: 69 4a 75 6d 70 20 3d 20 73 71 6c 69 74 65 33 56  iJump = sqlite3V
6210: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
6220: 29 20 2b 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a  ) + nResultCol;.
6230: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
6240: 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 69   i<nResultCol; i
6250: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 43  ++){.          C
6260: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
6270: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
6280: 65 71 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73  eq(pParse, pELis
6290: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
62a0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3c            if( i<
62b0: 6e 52 65 73 75 6c 74 43 6f 6c 2d 31 20 29 7b 0a  nResultCol-1 ){.
62c0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
62d0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
62e0: 20 4f 50 5f 4e 65 2c 20 72 65 67 52 65 73 75 6c   OP_Ne, regResul
62f0: 74 2b 69 2c 20 69 4a 75 6d 70 2c 20 72 65 67 50  t+i, iJump, regP
6300: 72 65 76 2b 69 29 3b 0a 20 20 20 20 20 20 20 20  rev+i);.        
6310: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
6320: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  (v);.          }
6330: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
6340: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6350: 4f 70 33 28 76 2c 20 4f 50 5f 45 71 2c 20 72 65  Op3(v, OP_Eq, re
6360: 67 52 65 73 75 6c 74 2b 69 2c 20 69 43 6f 6e 74  gResult+i, iCont
6370: 69 6e 75 65 2c 20 72 65 67 50 72 65 76 2b 69 29  inue, regPrev+i)
6380: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 56 64  ;.            Vd
6390: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
63a0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
63b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
63c0: 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c  eChangeP4(v, -1,
63d0: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70   (const char *)p
63e0: 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  Coll, P4_COLLSEQ
63f0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
6400: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
6410: 28 76 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  (v, SQLITE_NULLE
6420: 51 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  Q);.        }.  
6430: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
6440: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
6450: 41 64 64 72 28 76 29 3d 3d 69 4a 75 6d 70 20 29  Addr(v)==iJump )
6460: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
6470: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
6480: 50 5f 43 6f 70 79 2c 20 72 65 67 52 65 73 75 6c  P_Copy, regResul
6490: 74 2c 20 72 65 67 50 72 65 76 2c 20 6e 52 65 73  t, regPrev, nRes
64a0: 75 6c 74 43 6f 6c 2d 31 29 3b 0a 20 20 20 20 20  ultCol-1);.     
64b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
64c0: 7d 0a 0a 20 20 20 20 20 20 63 61 73 65 20 57 48  }..      case WH
64d0: 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49  ERE_DISTINCT_UNI
64e0: 51 55 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  QUE: {.        s
64f0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
6500: 54 6f 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74 69  ToNoop(v, pDisti
6510: 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a  nct->addrTnct);.
6520: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
6530: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 64 65       }..      de
6540: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20  fault: {.       
6550: 20 61 73 73 65 72 74 28 20 70 44 69 73 74 69 6e   assert( pDistin
6560: 63 74 2d 3e 65 54 6e 63 74 54 79 70 65 3d 3d 57  ct->eTnctType==W
6570: 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
6580: 4f 52 44 45 52 45 44 20 29 3b 0a 20 20 20 20 20  ORDERED );.     
6590: 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28     codeDistinct(
65a0: 70 50 61 72 73 65 2c 20 70 44 69 73 74 69 6e 63  pParse, pDistinc
65b0: 74 2d 3e 74 61 62 54 6e 63 74 2c 20 69 43 6f 6e  t->tabTnct, iCon
65c0: 74 69 6e 75 65 2c 20 6e 52 65 73 75 6c 74 43 6f  tinue, nResultCo
65d0: 6c 2c 20 72 65 67 52 65 73 75 6c 74 29 3b 0a 20  l, regResult);. 
65e0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
65f0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
6600: 69 66 28 20 70 53 6f 72 74 3d 3d 30 20 29 7b 0a  if( pSort==0 ){.
6610: 20 20 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74        codeOffset
6620: 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20  (v, p->iOffset, 
6630: 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20  iContinue);.    
6640: 7d 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28  }.  }..  switch(
6650: 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a   eDest ){.    /*
6660: 20 49 6e 20 74 68 69 73 20 6d 6f 64 65 2c 20 77   In this mode, w
6670: 72 69 74 65 20 65 61 63 68 20 71 75 65 72 79 20  rite each query 
6680: 72 65 73 75 6c 74 20 74 6f 20 74 68 65 20 6b 65  result to the ke
6690: 79 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61  y of the tempora
66a0: 72 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20  ry.    ** table 
66b0: 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69  iParm..    */.#i
66c0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
66d0: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
66e0: 54 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 55  T.    case SRT_U
66f0: 6e 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 69 6e  nion: {.      in
6700: 74 20 72 31 3b 0a 20 20 20 20 20 20 72 31 20 3d  t r1;.      r1 =
6710: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
6720: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
6730: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6740: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
6750: 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c  cord, regResult,
6760: 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72 31 29   nResultCol, r1)
6770: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
6780: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
6790: 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  IdxInsert, iParm
67a0: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
67b0: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
67c0: 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
67d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
67e0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 74   }..    /* Const
67f0: 72 75 63 74 20 61 20 72 65 63 6f 72 64 20 66 72  ruct a record fr
6800: 6f 6d 20 74 68 65 20 71 75 65 72 79 20 72 65 73  om the query res
6810: 75 6c 74 2c 20 62 75 74 20 69 6e 73 74 65 61 64  ult, but instead
6820: 20 6f 66 0a 20 20 20 20 2a 2a 20 73 61 76 69 6e   of.    ** savin
6830: 67 20 74 68 61 74 20 72 65 63 6f 72 64 2c 20 75  g that record, u
6840: 73 65 20 69 74 20 61 73 20 61 20 6b 65 79 20 74  se it as a key t
6850: 6f 20 64 65 6c 65 74 65 20 65 6c 65 6d 65 6e 74  o delete element
6860: 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68  s from.    ** th
6870: 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
6880: 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a  e iParm..    */.
6890: 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 63      case SRT_Exc
68a0: 65 70 74 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ept: {.      sql
68b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
68c0: 2c 20 4f 50 5f 49 64 78 44 65 6c 65 74 65 2c 20  , OP_IdxDelete, 
68d0: 69 50 61 72 6d 2c 20 72 65 67 52 65 73 75 6c 74  iParm, regResult
68e0: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20  , nResultCol);. 
68f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6900: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
6910: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
6920: 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 20 20 20 20  _SELECT */..    
6930: 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73  /* Store the res
6940: 75 6c 74 20 61 73 20 64 61 74 61 20 75 73 69 6e  ult as data usin
6950: 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a  g a unique key..
6960: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
6970: 53 52 54 5f 46 69 66 6f 3a 0a 20 20 20 20 63 61  SRT_Fifo:.    ca
6980: 73 65 20 53 52 54 5f 44 69 73 74 46 69 66 6f 3a  se SRT_DistFifo:
6990: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61  .    case SRT_Ta
69a0: 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52  ble:.    case SR
69b0: 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20  T_EphemTab: {.  
69c0: 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c      int r1 = sql
69d0: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
69e0: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 74 65  Parse);.      te
69f0: 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53  stcase( eDest==S
6a00: 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20 20 20  RT_Table );.    
6a10: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
6a20: 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20  t==SRT_EphemTab 
6a30: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
6a40: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
6a50: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
6a60: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
6a70: 6f 6c 2c 20 72 31 29 3b 0a 23 69 66 6e 64 65 66  ol, r1);.#ifndef
6a80: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45   SQLITE_OMIT_CTE
6a90: 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74  .      if( eDest
6aa0: 3d 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20 29  ==SRT_DistFifo )
6ab0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
6ac0: 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  the destination 
6ad0: 69 73 20 44 69 73 74 46 69 66 6f 2c 20 74 68 65  is DistFifo, the
6ae0: 6e 20 63 75 72 73 6f 72 20 28 69 50 61 72 6d 2b  n cursor (iParm+
6af0: 31 29 20 69 73 20 6f 70 65 6e 0a 20 20 20 20 20  1) is open.     
6b00: 20 20 20 2a 2a 20 6f 6e 20 61 6e 20 65 70 68 65     ** on an ephe
6b10: 6d 65 72 61 6c 20 69 6e 64 65 78 2e 20 49 66 20  meral index. If 
6b20: 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20  the current row 
6b30: 69 73 20 61 6c 72 65 61 64 79 20 70 72 65 73 65  is already prese
6b40: 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  nt.        ** in
6b50: 20 74 68 65 20 69 6e 64 65 78 2c 20 64 6f 20 6e   the index, do n
6b60: 6f 74 20 77 72 69 74 65 20 69 74 20 74 6f 20 74  ot write it to t
6b70: 68 65 20 6f 75 74 70 75 74 2e 20 49 66 20 6e 6f  he output. If no
6b80: 74 2c 20 61 64 64 20 74 68 65 0a 20 20 20 20 20  t, add the.     
6b90: 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 72 6f     ** current ro
6ba0: 77 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 61  w to the index a
6bb0: 6e 64 20 70 72 6f 63 65 65 64 20 77 69 74 68 20  nd proceed with 
6bc0: 77 72 69 74 69 6e 67 20 69 74 20 74 6f 20 74 68  writing it to th
6bd0: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74  e.        ** out
6be0: 70 75 74 20 74 61 62 6c 65 20 61 73 20 77 65 6c  put table as wel
6bf0: 6c 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  l.  */.        i
6c00: 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65  nt addr = sqlite
6c10: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
6c20: 28 76 29 20 2b 20 34 3b 0a 20 20 20 20 20 20 20  (v) + 4;.       
6c30: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6c40: 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e  p4Int(v, OP_Foun
6c50: 64 2c 20 69 50 61 72 6d 2b 31 2c 20 61 64 64 72  d, iParm+1, addr
6c60: 2c 20 72 31 2c 20 30 29 3b 20 56 64 62 65 43 6f  , r1, 0); VdbeCo
6c70: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
6c80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6c90: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
6ca0: 73 65 72 74 2c 20 69 50 61 72 6d 2b 31 2c 20 72  sert, iParm+1, r
6cb0: 31 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  1);.        asse
6cc0: 72 74 28 20 70 53 6f 72 74 3d 3d 30 20 29 3b 0a  rt( pSort==0 );.
6cd0: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
6ce0: 20 20 20 20 20 69 66 28 20 70 53 6f 72 74 20 29       if( pSort )
6cf0: 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e  {.        pushOn
6d00: 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c  toSorter(pParse,
6d10: 20 70 53 6f 72 74 2c 20 70 2c 20 72 31 29 3b 0a   pSort, p, r1);.
6d20: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
6d30: 20 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71       int r2 = sq
6d40: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
6d50: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
6d60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6d70: 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  p2(v, OP_NewRowi
6d80: 64 2c 20 69 50 61 72 6d 2c 20 72 32 29 3b 0a 20  d, iParm, r2);. 
6d90: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
6da0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
6db0: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31  nsert, iParm, r1
6dc0: 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 73  , r2);.        s
6dd0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
6de0: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50  P5(v, OPFLAG_APP
6df0: 45 4e 44 29 3b 0a 20 20 20 20 20 20 20 20 73 71  END);.        sq
6e00: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
6e10: 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b  Reg(pParse, r2);
6e20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
6e30: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
6e40: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
6e50: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
6e60: 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51     }..#ifndef SQ
6e70: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
6e80: 52 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20  RY.    /* If we 
6e90: 61 72 65 20 63 72 65 61 74 69 6e 67 20 61 20 73  are creating a s
6ea0: 65 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20  et for an "expr 
6eb0: 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22  IN (SELECT ...)"
6ec0: 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20 20   construct,.    
6ed0: 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73 68  ** then there sh
6ee0: 6f 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c 65  ould be a single
6ef0: 20 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61   item on the sta
6f00: 63 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73 0a  ck.  Write this.
6f10: 20 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f      ** item into
6f20: 20 74 68 65 20 73 65 74 20 74 61 62 6c 65 20 77   the set table w
6f30: 69 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e 0a  ith bogus data..
6f40: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
6f50: 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20  SRT_Set: {.     
6f60: 20 61 73 73 65 72 74 28 20 6e 52 65 73 75 6c 74   assert( nResult
6f70: 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  Col==1 );.      
6f80: 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 20 3d  pDest->affSdst =
6f90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6fa0: 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72     sqlite3Compar
6fb0: 65 41 66 66 69 6e 69 74 79 28 70 45 4c 69 73 74  eAffinity(pEList
6fc0: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 70 44  ->a[0].pExpr, pD
6fd0: 65 73 74 2d 3e 61 66 66 53 64 73 74 29 3b 0a 20  est->affSdst);. 
6fe0: 20 20 20 20 20 69 66 28 20 70 53 6f 72 74 20 29       if( pSort )
6ff0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20  {.        /* At 
7000: 66 69 72 73 74 20 67 6c 61 6e 63 65 20 79 6f 75  first glance you
7010: 20 77 6f 75 6c 64 20 74 68 69 6e 6b 20 77 65 20   would think we 
7020: 63 6f 75 6c 64 20 6f 70 74 69 6d 69 7a 65 20 6f  could optimize o
7030: 75 74 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  ut the.        *
7040: 2a 20 4f 52 44 45 52 20 42 59 20 69 6e 20 74 68  * ORDER BY in th
7050: 69 73 20 63 61 73 65 20 73 69 6e 63 65 20 74 68  is case since th
7060: 65 20 6f 72 64 65 72 20 6f 66 20 65 6e 74 72 69  e order of entri
7070: 65 73 20 69 6e 20 74 68 65 20 73 65 74 0a 20 20  es in the set.  
7080: 20 20 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f        ** does no
7090: 74 20 6d 61 74 74 65 72 2e 20 20 42 75 74 20 74  t matter.  But t
70a0: 68 65 72 65 20 6d 69 67 68 74 20 62 65 20 61 20  here might be a 
70b0: 4c 49 4d 49 54 20 63 6c 61 75 73 65 2c 20 69 6e  LIMIT clause, in
70c0: 20 77 68 69 63 68 0a 20 20 20 20 20 20 20 20 2a   which.        *
70d0: 2a 20 63 61 73 65 20 74 68 65 20 6f 72 64 65 72  * case the order
70e0: 20 64 6f 65 73 20 6d 61 74 74 65 72 20 2a 2f 0a   does matter */.
70f0: 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f          pushOnto
7100: 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70  Sorter(pParse, p
7110: 53 6f 72 74 2c 20 70 2c 20 72 65 67 52 65 73 75  Sort, p, regResu
7120: 6c 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  lt);.      }else
7130: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 31  {.        int r1
7140: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
7150: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
7160: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7170: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61  eAddOp4(v, OP_Ma
7180: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73  keRecord, regRes
7190: 75 6c 74 2c 31 2c 72 31 2c 20 26 70 44 65 73 74  ult,1,r1, &pDest
71a0: 2d 3e 61 66 66 53 64 73 74 2c 20 31 29 3b 0a 20  ->affSdst, 1);. 
71b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
71c0: 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
71d0: 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  hange(pParse, re
71e0: 67 52 65 73 75 6c 74 2c 20 31 29 3b 0a 20 20 20  gResult, 1);.   
71f0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7200: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
7210: 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72  Insert, iParm, r
7220: 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
7230: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
7240: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
7250: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
7260: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
7270: 2a 20 49 66 20 61 6e 79 20 72 6f 77 20 65 78 69  * If any row exi
7280: 73 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  st in the result
7290: 20 73 65 74 2c 20 72 65 63 6f 72 64 20 74 68 61   set, record tha
72a0: 74 20 66 61 63 74 20 61 6e 64 20 61 62 6f 72 74  t fact and abort
72b0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
72c0: 65 20 53 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a  e SRT_Exists: {.
72d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
72e0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
72f0: 74 65 67 65 72 2c 20 31 2c 20 69 50 61 72 6d 29  teger, 1, iParm)
7300: 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c  ;.      /* The L
7310: 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c  IMIT clause will
7320: 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c   terminate the l
7330: 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20  oop for us */.  
7340: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7350: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
7360: 20 69 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c   is a scalar sel
7370: 65 63 74 20 74 68 61 74 20 69 73 20 70 61 72 74  ect that is part
7380: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
7390: 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73  n, then.    ** s
73a0: 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
73b0: 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69   in the appropri
73c0: 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  ate memory cell 
73d0: 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20  and break out.  
73e0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 61 6e    ** of the scan
73f0: 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20   loop..    */.  
7400: 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20    case SRT_Mem: 
7410: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
7420: 6e 52 65 73 75 6c 74 43 6f 6c 3d 3d 31 20 29 3b  nResultCol==1 );
7430: 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f 72 74  .      if( pSort
7440: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68   ){.        push
7450: 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73  OntoSorter(pPars
7460: 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67  e, pSort, p, reg
7470: 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d  Result);.      }
7480: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
7490: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76  lite3ExprCodeMov
74a0: 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 73  e(pParse, regRes
74b0: 75 6c 74 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a  ult, iParm, 1);.
74c0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c          /* The L
74d0: 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c  IMIT clause will
74e0: 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65   jump out of the
74f0: 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a   loop for us */.
7500: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
7510: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
7520: 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c  f /* #ifndef SQL
7530: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
7540: 59 20 2a 2f 0a 0a 20 20 20 20 63 61 73 65 20 53  Y */..    case S
7550: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 20 20  RT_Coroutine:   
7560: 20 20 20 20 2f 2a 20 53 65 6e 64 20 64 61 74 61      /* Send data
7570: 20 74 6f 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65   to a co-routine
7580: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
7590: 5f 4f 75 74 70 75 74 3a 20 7b 20 20 20 20 20 20  _Output: {      
75a0: 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20    /* Return the 
75b0: 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20 20  results */.     
75c0: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
75d0: 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20  ==SRT_Coroutine 
75e0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
75f0: 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  e( eDest==SRT_Ou
7600: 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20 69 66  tput );.      if
7610: 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20  ( pSort ){.     
7620: 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69     int r1 = sqli
7630: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
7640: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
7650: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
7660: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
7670: 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52  d, regResult, nR
7680: 65 73 75 6c 74 43 6f 6c 2c 20 72 31 29 3b 0a 20  esultCol, r1);. 
7690: 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53         pushOntoS
76a0: 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 53  orter(pParse, pS
76b0: 6f 72 74 2c 20 70 2c 20 72 31 29 3b 0a 20 20 20  ort, p, r1);.   
76c0: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
76d0: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
76e0: 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 7d 65  e, r1);.      }e
76f0: 6c 73 65 20 69 66 28 20 65 44 65 73 74 3d 3d 53  lse if( eDest==S
7700: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a  RT_Coroutine ){.
7710: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
7720: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
7730: 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53  Yield, pDest->iS
7740: 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65  DParm);.      }e
7750: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
7760: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
7770: 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  , OP_ResultRow, 
7780: 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75  regResult, nResu
7790: 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20  ltCol);.        
77a0: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
77b0: 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
77c0: 50 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74  Parse, regResult
77d0: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20  , nResultCol);. 
77e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
77f0: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64  ak;.    }..#ifnd
7800: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
7810: 54 45 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20  TE.    /* Write 
7820: 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 74 6f  the results into
7830: 20 61 20 70 72 69 6f 72 69 74 79 20 71 75 65 75   a priority queu
7840: 65 20 74 68 61 74 20 69 73 20 6f 72 64 65 72 20  e that is order 
7850: 61 63 63 6f 72 64 69 6e 67 20 74 6f 0a 20 20 20  according to.   
7860: 20 2a 2a 20 70 44 65 73 74 2d 3e 70 4f 72 64 65   ** pDest->pOrde
7870: 72 42 79 20 28 69 6e 20 70 53 4f 29 2e 20 20 70  rBy (in pSO).  p
7880: 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 20 28 69  Dest->iSDParm (i
7890: 6e 20 69 50 61 72 6d 29 20 69 73 20 74 68 65 20  n iParm) is the 
78a0: 63 75 72 73 6f 72 20 66 6f 72 20 61 6e 0a 20 20  cursor for an.  
78b0: 20 20 2a 2a 20 69 6e 64 65 78 20 77 69 74 68 20    ** index with 
78c0: 70 53 4f 2d 3e 6e 45 78 70 72 2b 32 20 63 6f 6c  pSO->nExpr+2 col
78d0: 75 6d 6e 73 2e 20 20 42 75 69 6c 64 20 61 20 6b  umns.  Build a k
78e0: 65 79 20 75 73 69 6e 67 20 70 53 4f 20 66 6f 72  ey using pSO for
78f0: 20 74 68 65 20 66 69 72 73 74 0a 20 20 20 20 2a   the first.    *
7900: 2a 20 70 53 4f 2d 3e 6e 45 78 70 72 20 63 6f 6c  * pSO->nExpr col
7910: 75 6d 6e 73 2c 20 74 68 65 6e 20 6d 61 6b 65 20  umns, then make 
7920: 73 75 72 65 20 61 6c 6c 20 6b 65 79 73 20 61 72  sure all keys ar
7930: 65 20 75 6e 69 71 75 65 20 62 79 20 61 64 64 69  e unique by addi
7940: 6e 67 20 61 0a 20 20 20 20 2a 2a 20 66 69 6e 61  ng a.    ** fina
7950: 6c 20 4f 50 5f 53 65 71 75 65 6e 63 65 20 63 6f  l OP_Sequence co
7960: 6c 75 6d 6e 2e 20 20 54 68 65 20 6c 61 73 74 20  lumn.  The last 
7970: 63 6f 6c 75 6d 6e 20 69 73 20 74 68 65 20 72 65  column is the re
7980: 63 6f 72 64 20 61 73 20 61 20 62 6c 6f 62 2e 0a  cord as a blob..
7990: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
79a0: 53 52 54 5f 44 69 73 74 51 75 65 75 65 3a 0a 20  SRT_DistQueue:. 
79b0: 20 20 20 63 61 73 65 20 53 52 54 5f 51 75 65 75     case SRT_Queu
79c0: 65 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  e: {.      int n
79d0: 4b 65 79 3b 0a 20 20 20 20 20 20 69 6e 74 20 72  Key;.      int r
79e0: 31 2c 20 72 32 2c 20 72 33 3b 0a 20 20 20 20 20  1, r2, r3;.     
79f0: 20 69 6e 74 20 61 64 64 72 54 65 73 74 20 3d 20   int addrTest = 
7a00: 30 3b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73  0;.      ExprLis
7a10: 74 20 2a 70 53 4f 3b 0a 20 20 20 20 20 20 70 53  t *pSO;.      pS
7a20: 4f 20 3d 20 70 44 65 73 74 2d 3e 70 4f 72 64 65  O = pDest->pOrde
7a30: 72 42 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72  rBy;.      asser
7a40: 74 28 20 70 53 4f 20 29 3b 0a 20 20 20 20 20 20  t( pSO );.      
7a50: 6e 4b 65 79 20 3d 20 70 53 4f 2d 3e 6e 45 78 70  nKey = pSO->nExp
7a60: 72 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  r;.      r1 = sq
7a70: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
7a80: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 72  pParse);.      r
7a90: 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  2 = sqlite3GetTe
7aa0: 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
7ab0: 6e 4b 65 79 2b 32 29 3b 0a 20 20 20 20 20 20 72  nKey+2);.      r
7ac0: 33 20 3d 20 72 32 2b 6e 4b 65 79 2b 31 3b 0a 20  3 = r2+nKey+1;. 
7ad0: 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d       if( eDest==
7ae0: 53 52 54 5f 44 69 73 74 51 75 65 75 65 20 29 7b  SRT_DistQueue ){
7af0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
7b00: 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69  he destination i
7b10: 73 20 44 69 73 74 51 75 65 75 65 2c 20 74 68 65  s DistQueue, the
7b20: 6e 20 63 75 72 73 6f 72 20 28 69 50 61 72 6d 2b  n cursor (iParm+
7b30: 31 29 20 69 73 20 6f 70 65 6e 0a 20 20 20 20 20  1) is open.     
7b40: 20 20 20 2a 2a 20 6f 6e 20 61 20 73 65 63 6f 6e     ** on a secon
7b50: 64 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65  d ephemeral inde
7b60: 78 20 74 68 61 74 20 68 6f 6c 64 73 20 61 6c 6c  x that holds all
7b70: 20 76 61 6c 75 65 73 20 65 76 65 72 79 20 70 72   values every pr
7b80: 65 76 69 6f 75 73 6c 79 0a 20 20 20 20 20 20 20  eviously.       
7b90: 20 2a 2a 20 61 64 64 65 64 20 74 6f 20 74 68 65   ** added to the
7ba0: 20 71 75 65 75 65 2e 20 2a 2f 0a 20 20 20 20 20   queue. */.     
7bb0: 20 20 20 61 64 64 72 54 65 73 74 20 3d 20 73 71     addrTest = sq
7bc0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
7bd0: 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20  nt(v, OP_Found, 
7be0: 69 50 61 72 6d 2b 31 2c 20 30 2c 20 0a 20 20 20  iParm+1, 0, .   
7bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c10: 20 20 20 20 20 72 65 67 52 65 73 75 6c 74 2c 20       regResult, 
7c20: 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20  nResultCol);.   
7c30: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
7c40: 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  e(v);.      }.  
7c50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7c60: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
7c70: 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c  Record, regResul
7c80: 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72  t, nResultCol, r
7c90: 33 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44  3);.      if( eD
7ca0: 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 51 75 65  est==SRT_DistQue
7cb0: 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ue ){.        sq
7cc0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
7cd0: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
7ce0: 20 69 50 61 72 6d 2b 31 2c 20 72 33 29 3b 0a 20   iParm+1, r3);. 
7cf0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
7d00: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
7d10: 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55  FLAG_USESEEKRESU
7d20: 4c 54 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  LT);.      }.   
7d30: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4b     for(i=0; i<nK
7d40: 65 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ey; i++){.      
7d50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7d60: 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c  Op2(v, OP_SCopy,
7d70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7d80: 20 20 20 20 20 20 20 20 20 20 20 72 65 67 52 65             regRe
7d90: 73 75 6c 74 20 2b 20 70 53 4f 2d 3e 61 5b 69 5d  sult + pSO->a[i]
7da0: 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  .u.x.iOrderByCol
7db0: 20 2d 20 31 2c 0a 20 20 20 20 20 20 20 20 20 20   - 1,.          
7dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7dd0: 72 32 2b 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20  r2+i);.      }. 
7de0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7df0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71  AddOp2(v, OP_Seq
7e00: 75 65 6e 63 65 2c 20 69 50 61 72 6d 2c 20 72 32  uence, iParm, r2
7e10: 2b 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20 73 71  +nKey);.      sq
7e20: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
7e30: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
7e40: 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 2c 20 72 31  , r2, nKey+2, r1
7e50: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
7e60: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
7e70: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72  _IdxInsert, iPar
7e80: 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 69 66  m, r1);.      if
7e90: 28 20 61 64 64 72 54 65 73 74 20 29 20 73 71 6c  ( addrTest ) sql
7ea0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
7eb0: 28 76 2c 20 61 64 64 72 54 65 73 74 29 3b 0a 20  (v, addrTest);. 
7ec0: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
7ed0: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
7ee0: 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  e, r1);.      sq
7ef0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
7f00: 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 32  Range(pParse, r2
7f10: 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20 20 20 20 20  , nKey+2);.     
7f20: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
7f30: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
7f40: 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a 0a 0a 23 69  MIT_CTE */....#i
7f50: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
7f60: 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 0a  E_OMIT_TRIGGER).
7f70: 20 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74      /* Discard t
7f80: 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68 69  he results.  Thi
7f90: 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 53 45  s is used for SE
7fa0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
7fb0: 69 6e 73 69 64 65 0a 20 20 20 20 2a 2a 20 74 68  inside.    ** th
7fc0: 65 20 62 6f 64 79 20 6f 66 20 61 20 54 52 49 47  e body of a TRIG
7fd0: 47 45 52 2e 20 20 54 68 65 20 70 75 72 70 6f 73  GER.  The purpos
7fe0: 65 20 6f 66 20 73 75 63 68 20 73 65 6c 65 63 74  e of such select
7ff0: 73 20 69 73 20 74 6f 20 63 61 6c 6c 0a 20 20 20  s is to call.   
8000: 20 2a 2a 20 75 73 65 72 2d 64 65 66 69 6e 65 64   ** user-defined
8010: 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20   functions that 
8020: 68 61 76 65 20 73 69 64 65 20 65 66 66 65 63 74  have side effect
8030: 73 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 63 61  s.  We do not ca
8040: 72 65 0a 20 20 20 20 2a 2a 20 61 62 6f 75 74 20  re.    ** about 
8050: 74 68 65 20 61 63 74 75 61 6c 20 72 65 73 75 6c  the actual resul
8060: 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ts of the select
8070: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66  ..    */.    def
8080: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73  ault: {.      as
8090: 73 65 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54  sert( eDest==SRT
80a0: 5f 44 69 73 63 61 72 64 20 29 3b 0a 20 20 20 20  _Discard );.    
80b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
80c0: 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20  endif.  }..  /* 
80d0: 4a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20  Jump to the end 
80e0: 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74  of the loop if t
80f0: 68 65 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63  he LIMIT is reac
8100: 68 65 64 2e 20 20 45 78 63 65 70 74 2c 20 69 66  hed.  Except, if
8110: 0a 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20 61  .  ** there is a
8120: 20 73 6f 72 74 65 72 2c 20 69 6e 20 77 68 69 63   sorter, in whic
8130: 68 20 63 61 73 65 20 74 68 65 20 73 6f 72 74 65  h case the sorte
8140: 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6c 69  r has already li
8150: 6d 69 74 65 64 0a 20 20 2a 2a 20 74 68 65 20 6f  mited.  ** the o
8160: 75 74 70 75 74 20 66 6f 72 20 75 73 2e 0a 20 20  utput for us..  
8170: 2a 2f 0a 20 20 69 66 28 20 70 53 6f 72 74 3d 3d  */.  if( pSort==
8180: 30 20 26 26 20 70 2d 3e 69 4c 69 6d 69 74 20 29  0 && p->iLimit )
8190: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
81a0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66  eAddOp3(v, OP_If
81b0: 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c  Zero, p->iLimit,
81c0: 20 69 42 72 65 61 6b 2c 20 2d 31 29 3b 20 56 64   iBreak, -1); Vd
81d0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
81e0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f   }.}../*.** Allo
81f0: 63 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 6f  cate a KeyInfo o
8200: 62 6a 65 63 74 20 73 75 66 66 69 63 69 65 6e 74  bject sufficient
8210: 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 20 6f 66   for an index of
8220: 20 4e 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 61   N key columns a
8230: 6e 64 0a 2a 2a 20 58 20 65 78 74 72 61 20 63 6f  nd.** X extra co
8240: 6c 75 6d 6e 73 2e 0a 2a 2f 0a 4b 65 79 49 6e 66  lumns..*/.KeyInf
8250: 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  o *sqlite3KeyInf
8260: 6f 41 6c 6c 6f 63 28 73 71 6c 69 74 65 33 20 2a  oAlloc(sqlite3 *
8270: 64 62 2c 20 69 6e 74 20 4e 2c 20 69 6e 74 20 58  db, int N, int X
8280: 29 7b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 20  ){.  KeyInfo *p 
8290: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
82a0: 63 5a 65 72 6f 28 30 2c 20 0a 20 20 20 20 20 20  cZero(0, .      
82b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a               siz
82c0: 65 6f 66 28 4b 65 79 49 6e 66 6f 29 20 2b 20 28  eof(KeyInfo) + (
82d0: 69 36 34 29 28 4e 2b 58 29 2a 28 73 69 7a 65 6f  i64)(N+X)*(sizeo
82e0: 66 28 43 6f 6c 6c 53 65 71 2a 29 2b 31 29 29 3b  f(CollSeq*)+1));
82f0: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
8300: 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20  p->aSortOrder = 
8310: 28 75 38 2a 29 26 70 2d 3e 61 43 6f 6c 6c 5b 4e  (u8*)&p->aColl[N
8320: 2b 58 5d 3b 0a 20 20 20 20 70 2d 3e 6e 46 69 65  +X];.    p->nFie
8330: 6c 64 20 3d 20 28 75 31 36 29 4e 3b 0a 20 20 20  ld = (u16)N;.   
8340: 20 70 2d 3e 6e 58 46 69 65 6c 64 20 3d 20 28 75   p->nXField = (u
8350: 31 36 29 58 3b 0a 20 20 20 20 70 2d 3e 65 6e 63  16)X;.    p->enc
8360: 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 20 20   = ENC(db);.    
8370: 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20  p->db = db;.    
8380: 70 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 7d  p->nRef = 1;.  }
8390: 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d 3e 6d 61  else{.    db->ma
83a0: 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
83b0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
83c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63  }../*.** Dealloc
83d0: 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62  ate a KeyInfo ob
83e0: 6a 65 63 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ject.*/.void sql
83f0: 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66  ite3KeyInfoUnref
8400: 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 0a 20 20  (KeyInfo *p){.  
8410: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 61 73 73  if( p ){.    ass
8420: 65 72 74 28 20 70 2d 3e 6e 52 65 66 3e 30 20 29  ert( p->nRef>0 )
8430: 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2d 2d 3b  ;.    p->nRef--;
8440: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 52 65 66  .    if( p->nRef
8450: 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 44 62 46  ==0 ) sqlite3DbF
8460: 72 65 65 28 30 2c 20 70 29 3b 0a 20 20 7d 0a 7d  ree(0, p);.  }.}
8470: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 6e  ../*.** Make a n
8480: 65 77 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20  ew pointer to a 
8490: 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a  KeyInfo object.*
84a0: 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74  /.KeyInfo *sqlit
84b0: 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 4b 65 79  e3KeyInfoRef(Key
84c0: 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 66 28 20  Info *p){.  if( 
84d0: 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  p ){.    assert(
84e0: 20 70 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20   p->nRef>0 );.  
84f0: 20 20 70 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d    p->nRef++;.  }
8500: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
8510: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
8520: 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  BUG./*.** Return
8530: 20 54 52 55 45 20 69 66 20 61 20 4b 65 79 49 6e   TRUE if a KeyIn
8540: 66 6f 20 6f 62 6a 65 63 74 20 63 61 6e 20 62 65  fo object can be
8550: 20 63 68 61 6e 67 65 2e 20 20 54 68 65 20 4b 65   change.  The Ke
8560: 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2a 20  yInfo object.** 
8570: 63 61 6e 20 6f 6e 6c 79 20 62 65 20 63 68 61 6e  can only be chan
8580: 67 65 64 20 69 66 20 74 68 69 73 20 69 73 20 6a  ged if this is j
8590: 75 73 74 20 61 20 73 69 6e 67 6c 65 20 72 65 66  ust a single ref
85a0: 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 6f 62  erence to the ob
85b0: 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ject..**.** This
85c0: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
85d0: 20 6f 6e 6c 79 20 69 6e 73 69 64 65 20 6f 66 20   only inside of 
85e0: 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
85f0: 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  nts..*/.int sqli
8600: 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74  te3KeyInfoIsWrit
8610: 65 61 62 6c 65 28 4b 65 79 49 6e 66 6f 20 2a 70  eable(KeyInfo *p
8620: 29 7b 20 72 65 74 75 72 6e 20 70 2d 3e 6e 52 65  ){ return p->nRe
8630: 66 3d 3d 31 3b 20 7d 0a 23 65 6e 64 69 66 20 2f  f==1; }.#endif /
8640: 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a  * SQLITE_DEBUG *
8650: 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  /../*.** Given a
8660: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  n expression lis
8670: 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20 4b 65  t, generate a Ke
8680: 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
8690: 74 68 61 74 20 72 65 63 6f 72 64 73 0a 2a 2a 20  that records.** 
86a0: 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  the collating se
86b0: 71 75 65 6e 63 65 20 66 6f 72 20 65 61 63 68 20  quence for each 
86c0: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68  expression in th
86d0: 61 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  at expression li
86e0: 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  st..**.** If the
86f0: 20 45 78 70 72 4c 69 73 74 20 69 73 20 61 6e 20   ExprList is an 
8700: 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55  ORDER BY or GROU
8710: 50 20 42 59 20 63 6c 61 75 73 65 20 74 68 65 6e  P BY clause then
8720: 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 0a 2a   the resulting.*
8730: 2a 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  * KeyInfo struct
8740: 75 72 65 20 69 73 20 61 70 70 72 6f 70 72 69 61  ure is appropria
8750: 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a  te for initializ
8760: 69 6e 67 20 61 20 76 69 72 74 75 61 6c 20 69 6e  ing a virtual in
8770: 64 65 78 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d  dex to.** implem
8780: 65 6e 74 20 74 68 61 74 20 63 6c 61 75 73 65 2e  ent that clause.
8790: 20 20 49 66 20 74 68 65 20 45 78 70 72 4c 69 73    If the ExprLis
87a0: 74 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20  t is the result 
87b0: 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54 0a  set of a SELECT.
87c0: 2a 2a 20 74 68 65 6e 20 74 68 65 20 4b 65 79 49  ** then the KeyI
87d0: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73  nfo structure is
87e0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
87f0: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20   initializing a 
8800: 76 69 72 74 75 61 6c 0a 2a 2a 20 69 6e 64 65 78  virtual.** index
8810: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20   to implement a 
8820: 44 49 53 54 49 4e 43 54 20 74 65 73 74 2e 0a 2a  DISTINCT test..*
8830: 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f  *.** Space to ho
8840: 6c 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  ld the KeyInfo s
8850: 74 72 75 63 74 75 72 65 20 69 73 20 6f 62 74 61  tructure is obta
8860: 69 6e 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20  in from malloc. 
8870: 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   The calling.** 
8880: 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73 70  function is resp
8890: 6f 6e 73 69 62 6c 65 20 66 6f 72 20 73 65 65 69  onsible for seei
88a0: 6e 67 20 74 68 61 74 20 74 68 69 73 20 73 74 72  ng that this str
88b0: 75 63 74 75 72 65 20 69 73 20 65 76 65 6e 74 75  ucture is eventu
88c0: 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 0a 2a  ally.** freed..*
88d0: 2f 0a 73 74 61 74 69 63 20 4b 65 79 49 6e 66 6f  /.static KeyInfo
88e0: 20 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70   *keyInfoFromExp
88f0: 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a  rList(.  Parse *
8900: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
8910: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
8920: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
8930: 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 46 6f  pList,     /* Fo
8940: 72 6d 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6f  rm the KeyInfo o
8950: 62 6a 65 63 74 20 66 72 6f 6d 20 74 68 69 73 20  bject from this 
8960: 45 78 70 72 4c 69 73 74 20 2a 2f 0a 20 20 69 6e  ExprList */.  in
8970: 74 20 69 53 74 61 72 74 2c 20 20 20 20 20 20 20  t iStart,       
8980: 20 20 20 2f 2a 20 42 65 67 69 6e 20 77 69 74 68     /* Begin with
8990: 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 6f 66 20   this column of 
89a0: 70 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  pList */.  int n
89b0: 45 78 74 72 61 20 20 20 20 20 20 20 20 20 20 20  Extra           
89c0: 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79  /* Add this many
89d0: 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20 74   extra columns t
89e0: 6f 20 74 68 65 20 65 6e 64 20 2a 2f 0a 29 7b 0a  o the end */.){.
89f0: 20 20 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20 4b    int nExpr;.  K
8a00: 65 79 49 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20  eyInfo *pInfo;. 
8a10: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
8a20: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
8a30: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
8a40: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
8a50: 69 3b 0a 0a 20 20 6e 45 78 70 72 20 3d 20 70 4c  i;..  nExpr = pL
8a60: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49  ist->nExpr;.  pI
8a70: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79  nfo = sqlite3Key
8a80: 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 45  InfoAlloc(db, nE
8a90: 78 70 72 2b 6e 45 78 74 72 61 2d 69 53 74 61 72  xpr+nExtra-iStar
8aa0: 74 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 49 6e  t, 1);.  if( pIn
8ab0: 66 6f 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  fo ){.    assert
8ac0: 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  ( sqlite3KeyInfo
8ad0: 49 73 57 72 69 74 65 61 62 6c 65 28 70 49 6e 66  IsWriteable(pInf
8ae0: 6f 29 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  o) );.    for(i=
8af0: 69 53 74 61 72 74 2c 20 70 49 74 65 6d 3d 70 4c  iStart, pItem=pL
8b00: 69 73 74 2d 3e 61 2b 69 53 74 61 72 74 3b 20 69  ist->a+iStart; i
8b10: 3c 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74  <nExpr; i++, pIt
8b20: 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 43 6f 6c  em++){.      Col
8b30: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20  lSeq *pColl;.   
8b40: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
8b50: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
8b60: 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78  arse, pItem->pEx
8b70: 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  pr);.      if( !
8b80: 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20  pColl ) pColl = 
8b90: 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
8ba0: 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c       pInfo->aCol
8bb0: 6c 5b 69 2d 69 53 74 61 72 74 5d 20 3d 20 70 43  l[i-iStart] = pC
8bc0: 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f  oll;.      pInfo
8bd0: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 2d 69  ->aSortOrder[i-i
8be0: 53 74 61 72 74 5d 20 3d 20 70 49 74 65 6d 2d 3e  Start] = pItem->
8bf0: 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d  sortOrder;.    }
8c00: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 49  .  }.  return pI
8c10: 6e 66 6f 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  nfo;.}..#ifndef 
8c20: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
8c30: 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a  OUND_SELECT./*.*
8c40: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  * Name of the co
8c50: 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 72 61 74 6f  nnection operato
8c60: 72 2c 20 75 73 65 64 20 66 6f 72 20 65 72 72 6f  r, used for erro
8c70: 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2f 0a 73  r messages..*/.s
8c80: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
8c90: 20 2a 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 69   *selectOpName(i
8ca0: 6e 74 20 69 64 29 7b 0a 20 20 63 68 61 72 20 2a  nt id){.  char *
8cb0: 7a 3b 0a 20 20 73 77 69 74 63 68 28 20 69 64 20  z;.  switch( id 
8cc0: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
8cd0: 4c 4c 3a 20 20 20 20 20 20 20 7a 20 3d 20 22 55  LL:       z = "U
8ce0: 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20 20 62 72 65  NION ALL";   bre
8cf0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
8d00: 49 4e 54 45 52 53 45 43 54 3a 20 7a 20 3d 20 22  INTERSECT: z = "
8d10: 49 4e 54 45 52 53 45 43 54 22 3b 20 20 20 62 72  INTERSECT";   br
8d20: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
8d30: 5f 45 58 43 45 50 54 3a 20 20 20 20 7a 20 3d 20  _EXCEPT:    z = 
8d40: 22 45 58 43 45 50 54 22 3b 20 20 20 20 20 20 62  "EXCEPT";      b
8d50: 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c  reak;.    defaul
8d60: 74 3a 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d  t:           z =
8d70: 20 22 55 4e 49 4f 4e 22 3b 20 20 20 20 20 20 20   "UNION";       
8d80: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
8d90: 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn z;.}.#endif 
8da0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
8db0: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a  OMPOUND_SELECT *
8dc0: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
8dd0: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f  E_OMIT_EXPLAIN./
8de0: 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 61 6e 20 22  *.** Unless an "
8df0: 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
8e00: 41 4e 22 20 63 6f 6d 6d 61 6e 64 20 69 73 20 62  AN" command is b
8e10: 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64 2c 20  eing processed, 
8e20: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
8e30: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68   is a no-op. Oth
8e40: 65 72 77 69 73 65 2c 20 69 74 20 61 64 64 73 20  erwise, it adds 
8e50: 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20  a single row of 
8e60: 6f 75 74 70 75 74 20 74 6f 20 74 68 65 20 45 51  output to the EQ
8e70: 50 20 72 65 73 75 6c 74 2c 0a 2a 2a 20 77 68 65  P result,.** whe
8e80: 72 65 20 74 68 65 20 63 61 70 74 69 6f 6e 20 69  re the caption i
8e90: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a  s of the form:.*
8ea0: 2a 0a 2a 2a 20 20 20 22 55 53 45 20 54 45 4d 50  *.**   "USE TEMP
8eb0: 20 42 2d 54 52 45 45 20 46 4f 52 20 78 78 78 22   B-TREE FOR xxx"
8ec0: 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 78 78 78  .**.** where xxx
8ed0: 20 69 73 20 6f 6e 65 20 6f 66 20 22 44 49 53 54   is one of "DIST
8ee0: 49 4e 43 54 22 2c 20 22 4f 52 44 45 52 20 42 59  INCT", "ORDER BY
8ef0: 22 20 6f 72 20 22 47 52 4f 55 50 20 42 59 22 2e  " or "GROUP BY".
8f00: 20 45 78 61 63 74 6c 79 20 77 68 69 63 68 0a 2a   Exactly which.*
8f10: 2a 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20  * is determined 
8f20: 62 79 20 74 68 65 20 7a 55 73 61 67 65 20 61 72  by the zUsage ar
8f30: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  gument..*/.stati
8f40: 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 54 65  c void explainTe
8f50: 6d 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  mpTable(Parse *p
8f60: 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61  Parse, const cha
8f70: 72 20 2a 7a 55 73 61 67 65 29 7b 0a 20 20 69 66  r *zUsage){.  if
8f80: 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
8f90: 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 56 64 62 65  n==2 ){.    Vdbe
8fa0: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
8fb0: 64 62 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  dbe;.    char *z
8fc0: 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Msg = sqlite3MPr
8fd0: 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c  intf(pParse->db,
8fe0: 20 22 55 53 45 20 54 45 4d 50 20 42 2d 54 52 45   "USE TEMP B-TRE
8ff0: 45 20 46 4f 52 20 25 73 22 2c 20 7a 55 73 61 67  E FOR %s", zUsag
9000: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  e);.    sqlite3V
9010: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
9020: 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d  Explain, pParse-
9030: 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30  >iSelectId, 0, 0
9040: 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d  , zMsg, P4_DYNAM
9050: 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  IC);.  }.}../*.*
9060: 2a 20 41 73 73 69 67 6e 20 65 78 70 72 65 73 73  * Assign express
9070: 69 6f 6e 20 62 20 74 6f 20 6c 76 61 6c 75 65 20  ion b to lvalue 
9080: 61 2e 20 41 20 73 65 63 6f 6e 64 2c 20 6e 6f 2d  a. A second, no-
9090: 6f 70 2c 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  op, version of t
90a0: 68 69 73 20 6d 61 63 72 6f 0a 2a 2a 20 69 73 20  his macro.** is 
90b0: 70 72 6f 76 69 64 65 64 20 77 68 65 6e 20 53 51  provided when SQ
90c0: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
90d0: 4e 20 69 73 20 64 65 66 69 6e 65 64 2e 20 54 68  N is defined. Th
90e0: 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 6f  is allows the co
90f0: 64 65 0a 2a 2a 20 69 6e 20 73 71 6c 69 74 65 33  de.** in sqlite3
9100: 53 65 6c 65 63 74 28 29 20 74 6f 20 61 73 73 69  Select() to assi
9110: 67 6e 20 76 61 6c 75 65 73 20 74 6f 20 73 74 72  gn values to str
9120: 75 63 74 75 72 65 20 6d 65 6d 62 65 72 20 76 61  ucture member va
9130: 72 69 61 62 6c 65 73 20 74 68 61 74 0a 2a 2a 20  riables that.** 
9140: 6f 6e 6c 79 20 65 78 69 73 74 20 69 66 20 53 51  only exist if SQ
9150: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
9160: 4e 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64  N is not defined
9170: 20 77 69 74 68 6f 75 74 20 70 6f 6c 6c 75 74 69   without polluti
9180: 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77  ng the.** code w
9190: 69 74 68 20 23 69 66 6e 64 65 66 20 64 69 72 65  ith #ifndef dire
91a0: 63 74 69 76 65 73 2e 0a 2a 2f 0a 23 20 64 65 66  ctives..*/.# def
91b0: 69 6e 65 20 65 78 70 6c 61 69 6e 53 65 74 49 6e  ine explainSetIn
91c0: 74 65 67 65 72 28 61 2c 20 62 29 20 61 20 3d 20  teger(a, b) a = 
91d0: 62 0a 0a 23 65 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f  b..#else./* No-o
91e0: 70 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68  p versions of th
91f0: 65 20 65 78 70 6c 61 69 6e 58 58 58 28 29 20 66  e explainXXX() f
9200: 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6d 61 63  unctions and mac
9210: 72 6f 73 2e 20 2a 2f 0a 23 20 64 65 66 69 6e 65  ros. */.# define
9220: 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c   explainTempTabl
9230: 65 28 79 2c 7a 29 0a 23 20 64 65 66 69 6e 65 20  e(y,z).# define 
9240: 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
9250: 72 28 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 23  r(y,z).#endif..#
9260: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
9270: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 29  TE_OMIT_EXPLAIN)
9280: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
9290: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
92a0: 44 5f 53 45 4c 45 43 54 29 0a 2f 2a 0a 2a 2a 20  D_SELECT)./*.** 
92b0: 55 6e 6c 65 73 73 20 61 6e 20 22 45 58 50 4c 41  Unless an "EXPLA
92c0: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 22 20 63  IN QUERY PLAN" c
92d0: 6f 6d 6d 61 6e 64 20 69 73 20 62 65 69 6e 67 20  ommand is being 
92e0: 70 72 6f 63 65 73 73 65 64 2c 20 74 68 69 73 20  processed, this 
92f0: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61  function.** is a
9300: 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73   no-op. Otherwis
9310: 65 2c 20 69 74 20 61 64 64 73 20 61 20 73 69 6e  e, it adds a sin
9320: 67 6c 65 20 72 6f 77 20 6f 66 20 6f 75 74 70 75  gle row of outpu
9330: 74 20 74 6f 20 74 68 65 20 45 51 50 20 72 65 73  t to the EQP res
9340: 75 6c 74 2c 0a 2a 2a 20 77 68 65 72 65 20 74 68  ult,.** where th
9350: 65 20 63 61 70 74 69 6f 6e 20 69 73 20 6f 66 20  e caption is of 
9360: 6f 6e 65 20 6f 66 20 74 68 65 20 74 77 6f 20 66  one of the two f
9370: 6f 72 6d 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 43  orms:.**.**   "C
9380: 4f 4d 50 4f 53 49 54 45 20 53 55 42 51 55 45 52  OMPOSITE SUBQUER
9390: 49 45 53 20 69 53 75 62 31 20 61 6e 64 20 69 53  IES iSub1 and iS
93a0: 75 62 32 20 28 6f 70 29 22 0a 2a 2a 20 20 20 22  ub2 (op)".**   "
93b0: 43 4f 4d 50 4f 53 49 54 45 20 53 55 42 51 55 45  COMPOSITE SUBQUE
93c0: 52 49 45 53 20 69 53 75 62 31 20 61 6e 64 20 69  RIES iSub1 and i
93d0: 53 75 62 32 20 55 53 49 4e 47 20 54 45 4d 50 20  Sub2 USING TEMP 
93e0: 42 2d 54 52 45 45 20 28 6f 70 29 22 0a 2a 2a 0a  B-TREE (op)".**.
93f0: 2a 2a 20 77 68 65 72 65 20 69 53 75 62 31 20 61  ** where iSub1 a
9400: 6e 64 20 69 53 75 62 32 20 61 72 65 20 74 68 65  nd iSub2 are the
9410: 20 69 6e 74 65 67 65 72 73 20 70 61 73 73 65 64   integers passed
9420: 20 61 73 20 74 68 65 20 63 6f 72 72 65 73 70 6f   as the correspo
9430: 6e 64 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f  nding.** functio
9440: 6e 20 70 61 72 61 6d 65 74 65 72 73 2c 20 61 6e  n parameters, an
9450: 64 20 6f 70 20 69 73 20 74 68 65 20 74 65 78 74  d op is the text
9460: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
9470: 6f 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72  of the parameter
9480: 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61 6d 65 20  .** of the same 
9490: 6e 61 6d 65 2e 20 54 68 65 20 70 61 72 61 6d 65  name. The parame
94a0: 74 65 72 20 22 6f 70 22 20 6d 75 73 74 20 62 65  ter "op" must be
94b0: 20 6f 6e 65 20 6f 66 20 54 4b 5f 55 4e 49 4f 4e   one of TK_UNION
94c0: 2c 20 54 4b 5f 45 58 43 45 50 54 2c 0a 2a 2a 20  , TK_EXCEPT,.** 
94d0: 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 6f 72 20  TK_INTERSECT or 
94e0: 54 4b 5f 41 4c 4c 2e 20 54 68 65 20 66 69 72 73  TK_ALL. The firs
94f0: 74 20 66 6f 72 6d 20 69 73 20 75 73 65 64 20 69  t form is used i
9500: 66 20 61 72 67 75 6d 65 6e 74 20 62 55 73 65 54  f argument bUseT
9510: 6d 70 20 69 73 20 0a 2a 2a 20 66 61 6c 73 65 2c  mp is .** false,
9520: 20 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20 66   or the second f
9530: 6f 72 6d 20 69 66 20 69 74 20 69 73 20 74 72 75  orm if it is tru
9540: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
9550: 64 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69  d explainComposi
9560: 74 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  te(.  Parse *pPa
9570: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
9580: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63        /* Parse c
9590: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
95a0: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
95b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
95c0: 6e 65 20 6f 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20  ne of TK_UNION, 
95d0: 54 4b 5f 45 58 43 45 50 54 20 65 74 63 2e 20 2a  TK_EXCEPT etc. *
95e0: 2f 0a 20 20 69 6e 74 20 69 53 75 62 31 2c 20 20  /.  int iSub1,  
95f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9600: 20 20 20 20 2f 2a 20 53 75 62 71 75 65 72 79 20      /* Subquery 
9610: 69 64 20 31 20 2a 2f 0a 20 20 69 6e 74 20 69 53  id 1 */.  int iS
9620: 75 62 32 2c 20 20 20 20 20 20 20 20 20 20 20 20  ub2,            
9630: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62            /* Sub
9640: 71 75 65 72 79 20 69 64 20 32 20 2a 2f 0a 20 20  query id 2 */.  
9650: 69 6e 74 20 62 55 73 65 54 6d 70 20 20 20 20 20  int bUseTmp     
9660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9670: 2f 2a 20 54 72 75 65 20 69 66 20 61 20 74 65 6d  /* True if a tem
9680: 70 20 74 61 62 6c 65 20 77 61 73 20 75 73 65 64  p table was used
9690: 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28   */.){.  assert(
96a0: 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 7c 7c   op==TK_UNION ||
96b0: 20 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 7c   op==TK_EXCEPT |
96c0: 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45  | op==TK_INTERSE
96d0: 43 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 41 4c 4c  CT || op==TK_ALL
96e0: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65   );.  if( pParse
96f0: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a  ->explain==2 ){.
9700: 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50      Vdbe *v = pP
9710: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20  arse->pVdbe;.   
9720: 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71   char *zMsg = sq
9730: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 0a 20 20  lite3MPrintf(.  
9740: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62        pParse->db
9750: 2c 20 22 43 4f 4d 50 4f 55 4e 44 20 53 55 42 51  , "COMPOUND SUBQ
9760: 55 45 52 49 45 53 20 25 64 20 41 4e 44 20 25 64  UERIES %d AND %d
9770: 20 25 73 28 25 73 29 22 2c 20 69 53 75 62 31 2c   %s(%s)", iSub1,
9780: 20 69 53 75 62 32 2c 0a 20 20 20 20 20 20 20 20   iSub2,.        
9790: 62 55 73 65 54 6d 70 3f 22 55 53 49 4e 47 20 54  bUseTmp?"USING T
97a0: 45 4d 50 20 42 2d 54 52 45 45 20 22 3a 22 22 2c  EMP B-TREE ":"",
97b0: 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 6f 70   selectOpName(op
97c0: 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c  ).    );.    sql
97d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
97e0: 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50  , OP_Explain, pP
97f0: 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c  arse->iSelectId,
9800: 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f   0, 0, zMsg, P4_
9810: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a  DYNAMIC);.  }.}.
9820: 23 65 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76  #else./* No-op v
9830: 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 65  ersions of the e
9840: 78 70 6c 61 69 6e 58 58 58 28 29 20 66 75 6e 63  xplainXXX() func
9850: 74 69 6f 6e 73 20 61 6e 64 20 6d 61 63 72 6f 73  tions and macros
9860: 2e 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78  . */.# define ex
9870: 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 76  plainComposite(v
9880: 2c 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66  ,w,x,y,z).#endif
9890: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  ../*.** If the i
98a0: 6e 6e 65 72 20 6c 6f 6f 70 20 77 61 73 20 67 65  nner loop was ge
98b0: 6e 65 72 61 74 65 64 20 75 73 69 6e 67 20 61 20  nerated using a 
98c0: 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72 42  non-null pOrderB
98d0: 79 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74  y argument,.** t
98e0: 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20  hen the results 
98f0: 77 65 72 65 20 70 6c 61 63 65 64 20 69 6e 20 61  were placed in a
9900: 20 73 6f 72 74 65 72 2e 20 20 41 66 74 65 72 20   sorter.  After 
9910: 74 68 65 20 6c 6f 6f 70 20 69 73 20 74 65 72 6d  the loop is term
9920: 69 6e 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65 65  inated.** we nee
9930: 64 20 74 6f 20 72 75 6e 20 74 68 65 20 73 6f 72  d to run the sor
9940: 74 65 72 20 61 6e 64 20 6f 75 74 70 75 74 20 74  ter and output t
9950: 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68 65  he results.  The
9960: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f   following.** ro
9970: 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
9980: 74 68 65 20 63 6f 64 65 20 6e 65 65 64 65 64 20  the code needed 
9990: 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73  to do that..*/.s
99a0: 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72  tatic void gener
99b0: 61 74 65 53 6f 72 74 54 61 69 6c 28 0a 20 20 50  ateSortTail(.  P
99c0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
99d0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
99e0: 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
99f0: 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  *p,        /* Th
9a00: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
9a10: 6e 74 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20  nt */.  SortCtx 
9a20: 2a 70 53 6f 72 74 2c 20 20 20 2f 2a 20 49 6e 66  *pSort,   /* Inf
9a30: 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 74 68 65 20  ormation on the 
9a40: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
9a50: 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e  */.  int nColumn
9a60: 2c 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  ,      /* Number
9a70: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64   of columns of d
9a80: 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ata */.  SelectD
9a90: 65 73 74 20 2a 70 44 65 73 74 20 2f 2a 20 57 72  est *pDest /* Wr
9aa0: 69 74 65 20 74 68 65 20 73 6f 72 74 65 64 20 72  ite the sorted r
9ab0: 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29  esults here */.)
9ac0: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
9ad0: 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20  arse->pVdbe;    
9ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9af0: 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65 64   /* The prepared
9b00: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
9b10: 69 6e 74 20 61 64 64 72 42 72 65 61 6b 20 3d 20  int addrBreak = 
9b20: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
9b30: 61 62 65 6c 28 76 29 3b 20 20 20 20 20 2f 2a 20  abel(v);     /* 
9b40: 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 65 78 69  Jump here to exi
9b50: 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  t loop */.  int 
9b60: 61 64 64 72 43 6f 6e 74 69 6e 75 65 20 3d 20 73  addrContinue = s
9b70: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
9b80: 62 65 6c 28 76 29 3b 20 20 2f 2a 20 4a 75 6d 70  bel(v);  /* Jump
9b90: 20 68 65 72 65 20 66 6f 72 20 6e 65 78 74 20 63   here for next c
9ba0: 79 63 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  ycle */.  int ad
9bb0: 64 72 3b 0a 20 20 69 6e 74 20 61 64 64 72 4f 6e  dr;.  int addrOn
9bc0: 63 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54  ce = 0;.  int iT
9bd0: 61 62 3b 0a 20 20 69 6e 74 20 70 73 65 75 64 6f  ab;.  int pseudo
9be0: 54 61 62 20 3d 20 30 3b 0a 20 20 45 78 70 72 4c  Tab = 0;.  ExprL
9bf0: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20  ist *pOrderBy = 
9c00: 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 3b  pSort->pOrderBy;
9c10: 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70  .  int eDest = p
9c20: 44 65 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69  Dest->eDest;.  i
9c30: 6e 74 20 69 50 61 72 6d 20 3d 20 70 44 65 73 74  nt iParm = pDest
9c40: 2d 3e 69 53 44 50 61 72 6d 3b 0a 20 20 69 6e 74  ->iSDParm;.  int
9c50: 20 72 65 67 52 6f 77 3b 0a 20 20 69 6e 74 20 72   regRow;.  int r
9c60: 65 67 52 6f 77 69 64 3b 0a 20 20 69 6e 74 20 6e  egRowid;.  int n
9c70: 4b 65 79 3b 0a 0a 20 20 69 66 28 20 70 53 6f 72  Key;..  if( pSor
9c80: 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 20 29 7b  t->labelBkOut ){
9c90: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
9ca0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
9cb0: 75 62 2c 20 70 53 6f 72 74 2d 3e 72 65 67 52 65  ub, pSort->regRe
9cc0: 74 75 72 6e 2c 20 70 53 6f 72 74 2d 3e 6c 61 62  turn, pSort->lab
9cd0: 65 6c 42 6b 4f 75 74 29 3b 0a 20 20 20 20 73 71  elBkOut);.    sq
9ce0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
9cf0: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61  v, OP_Goto, 0, a
9d00: 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 73  ddrBreak);.    s
9d10: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
9d20: 65 4c 61 62 65 6c 28 76 2c 20 70 53 6f 72 74 2d  eLabel(v, pSort-
9d30: 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20  >labelBkOut);.  
9d40: 20 20 61 64 64 72 4f 6e 63 65 20 3d 20 73 71 6c    addrOnce = sql
9d50: 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61  ite3CodeOnce(pPa
9d60: 72 73 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  rse); VdbeCovera
9d70: 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 69 54 61  ge(v);.  }.  iTa
9d80: 62 20 3d 20 70 53 6f 72 74 2d 3e 69 45 43 75 72  b = pSort->iECur
9d90: 73 6f 72 3b 0a 20 20 72 65 67 52 6f 77 20 3d 20  sor;.  regRow = 
9da0: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
9db0: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  g(pParse);.  if(
9dc0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
9dd0: 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54  ut || eDest==SRT
9de0: 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20  _Coroutine ){.  
9df0: 20 20 70 73 65 75 64 6f 54 61 62 20 3d 20 70 50    pseudoTab = pP
9e00: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
9e10: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9e20: 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73  Op3(v, OP_OpenPs
9e30: 65 75 64 6f 2c 20 70 73 65 75 64 6f 54 61 62 2c  eudo, pseudoTab,
9e40: 20 72 65 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e   regRow, nColumn
9e50: 29 3b 0a 20 20 20 20 72 65 67 52 6f 77 69 64 20  );.    regRowid 
9e60: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
9e70: 20 20 72 65 67 52 6f 77 69 64 20 3d 20 73 71 6c    regRowid = sql
9e80: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
9e90: 50 61 72 73 65 29 3b 0a 20 20 7d 0a 20 20 6e 4b  Parse);.  }.  nK
9ea0: 65 79 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e  ey = pOrderBy->n
9eb0: 45 78 70 72 20 2d 20 70 53 6f 72 74 2d 3e 6e 4f  Expr - pSort->nO
9ec0: 42 53 61 74 3b 0a 20 20 69 66 28 20 70 53 6f 72  BSat;.  if( pSor
9ed0: 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53  t->sortFlags & S
9ee0: 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65  ORTFLAG_UseSorte
9ef0: 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67  r ){.    int reg
9f00: 53 6f 72 74 4f 75 74 20 3d 20 2b 2b 70 50 61 72  SortOut = ++pPar
9f10: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 6e  se->nMem;.    in
9f20: 74 20 70 74 61 62 32 20 3d 20 70 50 61 72 73 65  t ptab2 = pParse
9f30: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 71  ->nTab++;.    sq
9f40: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
9f50: 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f  v, OP_OpenPseudo
9f60: 2c 20 70 74 61 62 32 2c 20 72 65 67 53 6f 72 74  , ptab2, regSort
9f70: 4f 75 74 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20 20  Out, nKey+2);.  
9f80: 20 20 69 66 28 20 61 64 64 72 4f 6e 63 65 20 29    if( addrOnce )
9f90: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
9fa0: 48 65 72 65 28 76 2c 20 61 64 64 72 4f 6e 63 65  Here(v, addrOnce
9fb0: 29 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 31 20  );.    addr = 1 
9fc0: 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  + sqlite3VdbeAdd
9fd0: 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op2(v, OP_Sorter
9fe0: 53 6f 72 74 2c 20 69 54 61 62 2c 20 61 64 64 72  Sort, iTab, addr
9ff0: 42 72 65 61 6b 29 3b 0a 20 20 20 20 56 64 62 65  Break);.    Vdbe
a000: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
a010: 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70   codeOffset(v, p
a020: 2d 3e 69 4f 66 66 73 65 74 2c 20 61 64 64 72 43  ->iOffset, addrC
a030: 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 73 71  ontinue);.    sq
a040: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
a050: 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61 74 61  v, OP_SorterData
a060: 2c 20 69 54 61 62 2c 20 72 65 67 53 6f 72 74 4f  , iTab, regSortO
a070: 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ut);.    sqlite3
a080: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
a090: 5f 43 6f 6c 75 6d 6e 2c 20 70 74 61 62 32 2c 20  _Column, ptab2, 
a0a0: 6e 4b 65 79 2b 31 2c 20 72 65 67 52 6f 77 29 3b  nKey+1, regRow);
a0b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
a0c0: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
a0d0: 41 47 5f 43 4c 45 41 52 43 41 43 48 45 29 3b 0a  AG_CLEARCACHE);.
a0e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
a0f0: 20 61 64 64 72 4f 6e 63 65 20 29 20 73 71 6c 69   addrOnce ) sqli
a100: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
a110: 76 2c 20 61 64 64 72 4f 6e 63 65 29 3b 0a 20 20  v, addrOnce);.  
a120: 20 20 61 64 64 72 20 3d 20 31 20 2b 20 73 71 6c    addr = 1 + sql
a130: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
a140: 2c 20 4f 50 5f 53 6f 72 74 2c 20 69 54 61 62 2c  , OP_Sort, iTab,
a150: 20 61 64 64 72 42 72 65 61 6b 29 3b 20 56 64 62   addrBreak); Vdb
a160: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
a170: 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
a180: 70 2d 3e 69 4f 66 66 73 65 74 2c 20 61 64 64 72  p->iOffset, addr
a190: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 73  Continue);.    s
a1a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
a1b0: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
a1c0: 54 61 62 2c 20 6e 4b 65 79 2b 31 2c 20 72 65 67  Tab, nKey+1, reg
a1d0: 52 6f 77 29 3b 0a 20 20 7d 0a 20 20 73 77 69 74  Row);.  }.  swit
a1e0: 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20  ch( eDest ){.   
a1f0: 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a   case SRT_Table:
a200: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 70  .    case SRT_Ep
a210: 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20  hemTab: {.      
a220: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
a230: 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20  =SRT_Table );.  
a240: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
a250: 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61  est==SRT_EphemTa
a260: 62 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  b );.      sqlit
a270: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
a280: 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50 61  OP_NewRowid, iPa
a290: 72 6d 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20  rm, regRowid);. 
a2a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a2b0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73  AddOp3(v, OP_Ins
a2c0: 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67 52  ert, iParm, regR
a2d0: 6f 77 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20  ow, regRowid);. 
a2e0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a2f0: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
a300: 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20  AG_APPEND);.    
a310: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
a320: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
a330: 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
a340: 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a  case SRT_Set: {.
a350: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
a360: 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20  olumn==1 );.    
a370: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a380: 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op4(v, OP_MakeRe
a390: 63 6f 72 64 2c 20 72 65 67 52 6f 77 2c 20 31 2c  cord, regRow, 1,
a3a0: 20 72 65 67 52 6f 77 69 64 2c 0a 20 20 20 20 20   regRowid,.     
a3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a3c0: 20 20 20 26 70 44 65 73 74 2d 3e 61 66 66 53 64     &pDest->affSd
a3d0: 73 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71  st, 1);.      sq
a3e0: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
a3f0: 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
a400: 72 73 65 2c 20 72 65 67 52 6f 77 2c 20 31 29 3b  rse, regRow, 1);
a410: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
a420: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
a430: 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  dxInsert, iParm,
a440: 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20   regRowid);.    
a450: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
a460: 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a     case SRT_Mem:
a470: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
a480: 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20   nColumn==1 );. 
a490: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
a4a0: 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c  CodeMove(pParse,
a4b0: 20 72 65 67 52 6f 77 2c 20 69 50 61 72 6d 2c 20   regRow, iParm, 
a4c0: 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  1);.      /* The
a4d0: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69   LIMIT clause wi
a4e0: 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  ll terminate the
a4f0: 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a   loop for us */.
a500: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a510: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65   }.#endif.    de
a520: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69  fault: {.      i
a530: 6e 74 20 69 3b 0a 20 20 20 20 20 20 61 73 73 65  nt i;.      asse
a540: 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f  rt( eDest==SRT_O
a550: 75 74 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d  utput || eDest==
a560: 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b  SRT_Coroutine );
a570: 20 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65   .      testcase
a580: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ( eDest==SRT_Out
a590: 70 75 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73  put );.      tes
a5a0: 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52  tcase( eDest==SR
a5b0: 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20  T_Coroutine );. 
a5c0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
a5d0: 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
a5e0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
a5f0: 65 67 52 6f 77 21 3d 70 44 65 73 74 2d 3e 69 53  egRow!=pDest->iS
a600: 64 73 74 2b 69 20 29 3b 0a 20 20 20 20 20 20 20  dst+i );.       
a610: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a620: 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
a630: 20 70 73 65 75 64 6f 54 61 62 2c 20 69 2c 20 70   pseudoTab, i, p
a640: 44 65 73 74 2d 3e 69 53 64 73 74 2b 69 29 3b 0a  Dest->iSdst+i);.
a650: 20 20 20 20 20 20 20 20 69 66 28 20 69 3d 3d 30          if( i==0
a660: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
a670: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
a680: 35 28 76 2c 20 4f 50 46 4c 41 47 5f 43 4c 45 41  5(v, OPFLAG_CLEA
a690: 52 43 41 43 48 45 29 3b 0a 20 20 20 20 20 20 20  RCACHE);.       
a6a0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
a6b0: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
a6c0: 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20  Output ){.      
a6d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a6e0: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74  Op2(v, OP_Result
a6f0: 52 6f 77 2c 20 70 44 65 73 74 2d 3e 69 53 64 73  Row, pDest->iSds
a700: 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  t, nColumn);.   
a710: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
a720: 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
a730: 6e 67 65 28 70 50 61 72 73 65 2c 20 70 44 65 73  nge(pParse, pDes
a740: 74 2d 3e 69 53 64 73 74 2c 20 6e 43 6f 6c 75 6d  t->iSdst, nColum
a750: 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
a760: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
a770: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
a780: 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69  _Yield, pDest->i
a790: 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d  SDParm);.      }
a7a0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
a7b0: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
a7c0: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
a7d0: 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 29 3b  pParse, regRow);
a7e0: 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
a7f0: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
a800: 20 72 65 67 52 6f 77 69 64 29 3b 0a 0a 20 20 2f   regRowid);..  /
a810: 2a 20 54 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20  * The bottom of 
a820: 74 68 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20  the loop.  */.  
a830: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
a840: 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 43  veLabel(v, addrC
a850: 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 69 66 28 20  ontinue);.  if( 
a860: 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73  pSort->sortFlags
a870: 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53   & SORTFLAG_UseS
a880: 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 73 71 6c  orter ){.    sql
a890: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
a8a0: 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c  , OP_SorterNext,
a8b0: 20 69 54 61 62 2c 20 61 64 64 72 29 3b 20 56 64   iTab, addr); Vd
a8c0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
a8d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
a8e0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
a8f0: 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20   OP_Next, iTab, 
a900: 61 64 64 72 29 3b 20 56 64 62 65 43 6f 76 65 72  addr); VdbeCover
a910: 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 69 66  age(v);.  }.  if
a920: 28 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75  ( pSort->regRetu
a930: 72 6e 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  rn ) sqlite3Vdbe
a940: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74  AddOp1(v, OP_Ret
a950: 75 72 6e 2c 20 70 53 6f 72 74 2d 3e 72 65 67 52  urn, pSort->regR
a960: 65 74 75 72 6e 29 3b 0a 20 20 73 71 6c 69 74 65  eturn);.  sqlite
a970: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
a980: 6c 28 76 2c 20 61 64 64 72 42 72 65 61 6b 29 3b  l(v, addrBreak);
a990: 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  .  if( eDest==SR
a9a0: 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73  T_Output || eDes
a9b0: 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t==SRT_Coroutine
a9c0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
a9d0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
a9e0: 43 6c 6f 73 65 2c 20 70 73 65 75 64 6f 54 61 62  Close, pseudoTab
a9f0: 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , 0);.  }.}../*.
aa00: 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
aa10: 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e 67 20  ter to a string 
aa20: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 27  containing the '
aa30: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
aa40: 27 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70 72  ' of the.** expr
aa50: 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 54 68  ession pExpr. Th
aa60: 65 20 73 74 72 69 6e 67 20 6d 61 79 20 62 65 20  e string may be 
aa70: 74 72 65 61 74 65 64 20 61 73 20 73 74 61 74 69  treated as stati
aa80: 63 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e  c by the caller.
aa90: 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 74 72 79 20  .**.** Also try 
aaa0: 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65 20  to estimate the 
aab0: 73 69 7a 65 20 6f 66 20 74 68 65 20 72 65 74 75  size of the retu
aac0: 72 6e 65 64 20 76 61 6c 75 65 20 61 6e 64 20 72  rned value and r
aad0: 65 74 75 72 6e 20 74 68 61 74 0a 2a 2a 20 72 65  eturn that.** re
aae0: 73 75 6c 74 20 69 6e 20 2a 70 45 73 74 57 69 64  sult in *pEstWid
aaf0: 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65  th..**.** The de
ab00: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 69  claration type i
ab10: 73 20 74 68 65 20 65 78 61 63 74 20 64 61 74 61  s the exact data
ab20: 74 79 70 65 20 64 65 66 69 6e 69 74 69 6f 6e 20  type definition 
ab30: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74  extracted from t
ab40: 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 43  he.** original C
ab50: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
ab60: 65 6d 65 6e 74 20 69 66 20 74 68 65 20 65 78 70  ement if the exp
ab70: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c  ression is a col
ab80: 75 6d 6e 2e 20 54 68 65 0a 2a 2a 20 64 65 63 6c  umn. The.** decl
ab90: 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72  aration type for
aba0: 20 61 20 52 4f 57 49 44 20 66 69 65 6c 64 20 69   a ROWID field i
abb0: 73 20 49 4e 54 45 47 45 52 2e 20 45 78 61 63 74  s INTEGER. Exact
abc0: 6c 79 20 77 68 65 6e 20 61 6e 20 65 78 70 72 65  ly when an expre
abd0: 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73  ssion.** is cons
abe0: 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20  idered a column 
abf0: 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65 78 20 69  can be complex i
ac00: 6e 20 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f  n the presence o
ac10: 66 20 73 75 62 71 75 65 72 69 65 73 2e 20 54 68  f subqueries. Th
ac20: 65 0a 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20  e.** result-set 
ac30: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6c  expression in al
ac40: 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  l of the followi
ac50: 6e 67 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ng SELECT statem
ac60: 65 6e 74 73 20 69 73 20 0a 2a 2a 20 63 6f 6e 73  ents is .** cons
ac70: 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20  idered a column 
ac80: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
ac90: 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54  ..**.**   SELECT
aca0: 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a   col FROM tbl;.*
acb0: 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45  *   SELECT (SELE
acc0: 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b  CT col FROM tbl;
acd0: 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45  .**   SELECT (SE
ace0: 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62  LECT col FROM tb
acf0: 6c 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  l);.**   SELECT 
ad00: 61 62 63 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  abc FROM (SELECT
ad10: 20 63 6f 6c 20 41 53 20 61 62 63 20 46 52 4f 4d   col AS abc FROM
ad20: 20 74 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68   tbl);.** .** Th
ad30: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
ad40: 70 65 20 66 6f 72 20 61 6e 79 20 65 78 70 72 65  pe for any expre
ad50: 73 73 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e  ssion other than
ad60: 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c   a column is NUL
ad70: 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  L..**.** This ro
ad80: 75 74 69 6e 65 20 68 61 73 20 65 69 74 68 65 72  utine has either
ad90: 20 33 20 6f 72 20 36 20 70 61 72 61 6d 65 74 65   3 or 6 paramete
ada0: 72 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  rs depending on 
adb0: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a  whether or not.*
adc0: 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41  * the SQLITE_ENA
add0: 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44  BLE_COLUMN_METAD
ade0: 41 54 41 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65  ATA compile-time
adf0: 20 6f 70 74 69 6f 6e 20 69 73 20 75 73 65 64 2e   option is used.
ae00: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
ae10: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
ae20: 4d 45 54 41 44 41 54 41 0a 23 20 64 65 66 69 6e  METADATA.# defin
ae30: 65 20 63 6f 6c 75 6d 6e 54 79 70 65 28 41 2c 42  e columnType(A,B
ae40: 2c 43 2c 44 2c 45 2c 46 29 20 63 6f 6c 75 6d 6e  ,C,D,E,F) column
ae50: 54 79 70 65 49 6d 70 6c 28 41 2c 42 2c 43 2c 44  TypeImpl(A,B,C,D
ae60: 2c 45 2c 46 29 0a 73 74 61 74 69 63 20 63 6f 6e  ,E,F).static con
ae70: 73 74 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e 54  st char *columnT
ae80: 79 70 65 49 6d 70 6c 28 0a 20 20 4e 61 6d 65 43  ypeImpl(.  NameC
ae90: 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 0a 20 20  ontext *pNC, .  
aea0: 45 78 70 72 20 2a 70 45 78 70 72 2c 0a 20 20 63  Expr *pExpr,.  c
aeb0: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72  onst char **pzOr
aec0: 69 67 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68  igDb,.  const ch
aed0: 61 72 20 2a 2a 70 7a 4f 72 69 67 54 61 62 2c 0a  ar **pzOrigTab,.
aee0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70    const char **p
aef0: 7a 4f 72 69 67 43 6f 6c 2c 0a 20 20 75 38 20 2a  zOrigCol,.  u8 *
af00: 70 45 73 74 57 69 64 74 68 0a 29 7b 0a 20 20 63  pEstWidth.){.  c
af10: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67  har const *zOrig
af20: 44 62 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63  Db = 0;.  char c
af30: 6f 6e 73 74 20 2a 7a 4f 72 69 67 54 61 62 20 3d  onst *zOrigTab =
af40: 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74   0;.  char const
af50: 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b 0a   *zOrigCol = 0;.
af60: 23 65 6c 73 65 20 2f 2a 20 69 66 20 21 64 65 66  #else /* if !def
af70: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
af80: 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41  LE_COLUMN_METADA
af90: 54 41 29 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20  TA) */.# define 
afa0: 63 6f 6c 75 6d 6e 54 79 70 65 28 41 2c 42 2c 43  columnType(A,B,C
afb0: 2c 44 2c 45 2c 46 29 20 63 6f 6c 75 6d 6e 54 79  ,D,E,F) columnTy
afc0: 70 65 49 6d 70 6c 28 41 2c 42 2c 46 29 0a 73 74  peImpl(A,B,F).st
afd0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
afe0: 2a 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28  *columnTypeImpl(
aff0: 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
b000: 70 4e 43 2c 20 0a 20 20 45 78 70 72 20 2a 70 45  pNC, .  Expr *pE
b010: 78 70 72 2c 0a 20 20 75 38 20 2a 70 45 73 74 57  xpr,.  u8 *pEstW
b020: 69 64 74 68 0a 29 7b 0a 23 65 6e 64 69 66 20 2f  idth.){.#endif /
b030: 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
b040: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
b050: 4d 45 54 41 44 41 54 41 29 20 2a 2f 0a 20 20 63  METADATA) */.  c
b060: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 79 70 65  har const *zType
b070: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20   = 0;.  int j;. 
b080: 20 75 38 20 65 73 74 57 69 64 74 68 20 3d 20 31   u8 estWidth = 1
b090: 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  ;..  if( NEVER(p
b0a0: 45 78 70 72 3d 3d 30 29 20 7c 7c 20 70 4e 43 2d  Expr==0) || pNC-
b0b0: 3e 70 53 72 63 4c 69 73 74 3d 3d 30 20 29 20 72  >pSrcList==0 ) r
b0c0: 65 74 75 72 6e 20 30 3b 0a 20 20 73 77 69 74 63  eturn 0;.  switc
b0d0: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
b0e0: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
b0f0: 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65  COLUMN:.    case
b100: 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20   TK_COLUMN: {.  
b110: 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
b120: 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d  ssion is a colum
b130: 6e 2e 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61  n. Locate the ta
b140: 62 6c 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69  ble the column i
b150: 73 20 62 65 69 6e 67 0a 20 20 20 20 20 20 2a 2a  s being.      **
b160: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
b170: 69 6e 20 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 70  in NameContext.p
b180: 53 72 63 4c 69 73 74 2e 20 54 68 69 73 20 74 61  SrcList. This ta
b190: 62 6c 65 20 6d 61 79 20 62 65 20 72 65 61 6c 0a  ble may be real.
b1a0: 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
b1b0: 65 20 74 61 62 6c 65 20 6f 72 20 61 20 73 75 62  e table or a sub
b1c0: 71 75 65 72 79 2e 0a 20 20 20 20 20 20 2a 2f 0a  query..      */.
b1d0: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
b1e0: 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
b1f0: 20 20 2f 2a 20 54 61 62 6c 65 20 73 74 72 75 63    /* Table struc
b200: 74 75 72 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65  ture column is e
b210: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f  xtracted from */
b220: 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
b230: 53 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  S = 0;          
b240: 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 74 68 65     /* Select the
b250: 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61   column is extra
b260: 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20  cted from */.   
b270: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45     int iCol = pE
b280: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20 20 2f  xpr->iColumn;  /
b290: 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d  * Index of colum
b2a0: 6e 20 69 6e 20 70 54 61 62 20 2a 2f 0a 20 20 20  n in pTab */.   
b2b0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
b2c0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43  pr->op==TK_AGG_C
b2d0: 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74  OLUMN );.      t
b2e0: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
b2f0: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b  op==TK_COLUMN );
b300: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 4e  .      while( pN
b310: 43 20 26 26 20 21 70 54 61 62 20 29 7b 0a 20 20  C && !pTab ){.  
b320: 20 20 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70        SrcList *p
b330: 54 61 62 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70  TabList = pNC->p
b340: 53 72 63 4c 69 73 74 3b 0a 20 20 20 20 20 20 20  SrcList;.       
b350: 20 66 6f 72 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c   for(j=0;j<pTabL
b360: 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70 54 61  ist->nSrc && pTa
b370: 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72  bList->a[j].iCur
b380: 73 6f 72 21 3d 70 45 78 70 72 2d 3e 69 54 61 62  sor!=pExpr->iTab
b390: 6c 65 3b 6a 2b 2b 29 3b 0a 20 20 20 20 20 20 20  le;j++);.       
b3a0: 20 69 66 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d   if( j<pTabList-
b3b0: 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20 20 20 20  >nSrc ){.       
b3c0: 20 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69     pTab = pTabLi
b3d0: 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20  st->a[j].pTab;. 
b3e0: 20 20 20 20 20 20 20 20 20 70 53 20 3d 20 70 54           pS = pT
b3f0: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 53 65  abList->a[j].pSe
b400: 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 7d 65  lect;.        }e
b410: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
b420: 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e 65 78 74 3b  NC = pNC->pNext;
b430: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
b440: 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54   }..      if( pT
b450: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ab==0 ){.       
b460: 20 2f 2a 20 41 74 20 6f 6e 65 20 74 69 6d 65 2c   /* At one time,
b470: 20 63 6f 64 65 20 73 75 63 68 20 61 73 20 22 53   code such as "S
b480: 45 4c 45 43 54 20 6e 65 77 2e 78 22 20 77 69 74  ELECT new.x" wit
b490: 68 69 6e 20 61 20 74 72 69 67 67 65 72 20 77 6f  hin a trigger wo
b4a0: 75 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  uld.        ** c
b4b0: 61 75 73 65 20 74 68 69 73 20 63 6f 6e 64 69 74  ause this condit
b4c0: 69 6f 6e 20 74 6f 20 72 75 6e 2e 20 20 53 69 6e  ion to run.  Sin
b4d0: 63 65 20 74 68 65 6e 2c 20 77 65 20 68 61 76 65  ce then, we have
b4e0: 20 72 65 73 74 72 75 63 74 75 72 65 64 20 68 6f   restructured ho
b4f0: 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 69  w.        ** tri
b500: 67 67 65 72 20 63 6f 64 65 20 69 73 20 67 65 6e  gger code is gen
b510: 65 72 61 74 65 64 20 61 6e 64 20 73 6f 20 74 68  erated and so th
b520: 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20  is condition is 
b530: 6e 6f 20 6c 6f 6e 67 65 72 20 0a 20 20 20 20 20  no longer .     
b540: 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65 2e 20     ** possible. 
b550: 48 6f 77 65 76 65 72 2c 20 69 74 20 63 61 6e 20  However, it can 
b560: 73 74 69 6c 6c 20 62 65 20 74 72 75 65 20 66 6f  still be true fo
b570: 72 20 73 74 61 74 65 6d 65 6e 74 73 20 6c 69 6b  r statements lik
b580: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  e.        ** the
b590: 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20 20   following:.    
b5a0: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
b5b0: 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  *   CREATE TABLE
b5c0: 20 74 31 28 63 6f 6c 20 49 4e 54 45 47 45 52 29   t1(col INTEGER)
b5d0: 3b 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53  ;.        **   S
b5e0: 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 74 31  ELECT (SELECT t1
b5f0: 2e 63 6f 6c 29 20 46 52 4f 4d 20 46 52 4f 4d 20  .col) FROM FROM 
b600: 74 31 3b 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  t1;.        **. 
b610: 20 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 63         ** when c
b620: 6f 6c 75 6d 6e 54 79 70 65 28 29 20 69 73 20 63  olumnType() is c
b630: 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65 78 70  alled on the exp
b640: 72 65 73 73 69 6f 6e 20 22 74 31 2e 63 6f 6c 22  ression "t1.col"
b650: 20 69 6e 20 74 68 65 20 0a 20 20 20 20 20 20 20   in the .       
b660: 20 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74 2e 20   ** sub-select. 
b670: 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 73 65  In this case, se
b680: 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70  t the column typ
b690: 65 20 74 6f 20 4e 55 4c 4c 2c 20 65 76 65 6e 0a  e to NULL, even.
b6a0: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 6f 75 67          ** thoug
b6b0: 68 20 69 74 20 73 68 6f 75 6c 64 20 72 65 61 6c  h it should real
b6c0: 6c 79 20 62 65 20 22 49 4e 54 45 47 45 52 22 2e  ly be "INTEGER".
b6d0: 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
b6e0: 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e      ** This is n
b6f0: 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2c 20 61 73  ot a problem, as
b700: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65   the column type
b710: 20 6f 66 20 22 74 31 2e 63 6f 6c 22 20 69 73 20   of "t1.col" is 
b720: 6e 65 76 65 72 0a 20 20 20 20 20 20 20 20 2a 2a  never.        **
b730: 20 75 73 65 64 2e 20 57 68 65 6e 20 63 6f 6c 75   used. When colu
b740: 6d 6e 54 79 70 65 28 29 20 69 73 20 63 61 6c 6c  mnType() is call
b750: 65 64 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73  ed on the expres
b760: 73 69 6f 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a  sion .        **
b770: 20 22 28 53 45 4c 45 43 54 20 74 31 2e 63 6f 6c   "(SELECT t1.col
b780: 29 22 2c 20 74 68 65 20 63 6f 72 72 65 63 74 20  )", the correct 
b790: 74 79 70 65 20 69 73 20 72 65 74 75 72 6e 65 64  type is returned
b7a0: 20 28 73 65 65 20 74 68 65 20 54 4b 5f 53 45 4c   (see the TK_SEL
b7b0: 45 43 54 0a 20 20 20 20 20 20 20 20 2a 2a 20 62  ECT.        ** b
b7c0: 72 61 6e 63 68 20 62 65 6c 6f 77 2e 20 20 2a 2f  ranch below.  */
b7d0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
b7e0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61        }..      a
b7f0: 73 73 65 72 74 28 20 70 54 61 62 20 26 26 20 70  ssert( pTab && p
b800: 45 78 70 72 2d 3e 70 54 61 62 3d 3d 70 54 61 62  Expr->pTab==pTab
b810: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53   );.      if( pS
b820: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
b830: 68 65 20 22 74 61 62 6c 65 22 20 69 73 20 61 63  he "table" is ac
b840: 74 75 61 6c 6c 79 20 61 20 73 75 62 2d 73 65 6c  tually a sub-sel
b850: 65 63 74 20 6f 72 20 61 20 76 69 65 77 20 69 6e  ect or a view in
b860: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
b870: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  .        ** of t
b880: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
b890: 65 6e 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20  ent. Return the 
b8a0: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
b8b0: 20 61 6e 64 20 6f 72 69 67 69 6e 0a 20 20 20 20   and origin.    
b8c0: 20 20 20 20 2a 2a 20 64 61 74 61 20 66 6f 72 20      ** data for 
b8d0: 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74 20 63  the result-set c
b8e0: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 73 75 62  olumn of the sub
b8f0: 2d 73 65 6c 65 63 74 2e 0a 20 20 20 20 20 20 20  -select..       
b900: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
b910: 69 43 6f 6c 3e 3d 30 20 26 26 20 41 4c 57 41 59  iCol>=0 && ALWAY
b920: 53 28 69 43 6f 6c 3c 70 53 2d 3e 70 45 4c 69 73  S(iCol<pS->pELis
b930: 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20  t->nExpr) ){.   
b940: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69 43 6f         /* If iCo
b950: 6c 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a  l is less than z
b960: 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 65 78  ero, then the ex
b970: 70 72 65 73 73 69 6f 6e 20 72 65 71 75 65 73 74  pression request
b980: 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  s the.          
b990: 2a 2a 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20  ** rowid of the 
b9a0: 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 76 69  sub-select or vi
b9b0: 65 77 2e 20 54 68 69 73 20 65 78 70 72 65 73 73  ew. This express
b9c0: 69 6f 6e 20 69 73 20 6c 65 67 61 6c 20 28 73 65  ion is legal (se
b9d0: 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  e .          ** 
b9e0: 74 65 73 74 20 63 61 73 65 20 6d 69 73 63 32 2e  test case misc2.
b9f0: 32 2e 32 29 20 2d 20 69 74 20 61 6c 77 61 79 73  2.2) - it always
ba00: 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55   evaluates to NU
ba10: 4c 4c 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  LL..          */
ba20: 0a 20 20 20 20 20 20 20 20 20 20 4e 61 6d 65 43  .          NameC
ba30: 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20  ontext sNC;.    
ba40: 20 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20        Expr *p = 
ba50: 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43  pS->pEList->a[iC
ba60: 6f 6c 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  ol].pExpr;.     
ba70: 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73       sNC.pSrcLis
ba80: 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20  t = pS->pSrc;.  
ba90: 20 20 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78          sNC.pNex
baa0: 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 20  t = pNC;.       
bab0: 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20     sNC.pParse = 
bac0: 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20  pNC->pParse;.   
bad0: 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63         zType = c
bae0: 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20  olumnType(&sNC, 
baf0: 70 2c 26 7a 4f 72 69 67 44 62 2c 26 7a 4f 72 69  p,&zOrigDb,&zOri
bb00: 67 54 61 62 2c 26 7a 4f 72 69 67 43 6f 6c 2c 20  gTab,&zOrigCol, 
bb10: 26 65 73 74 57 69 64 74 68 29 3b 20 0a 20 20 20  &estWidth); .   
bb20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
bb30: 73 65 20 69 66 28 20 70 54 61 62 2d 3e 70 53 63  se if( pTab->pSc
bb40: 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20 20  hema ){.        
bb50: 2f 2a 20 41 20 72 65 61 6c 20 74 61 62 6c 65 20  /* A real table 
bb60: 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
bb70: 74 28 20 21 70 53 20 29 3b 0a 20 20 20 20 20 20  t( !pS );.      
bb80: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69    if( iCol<0 ) i
bb90: 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65  Col = pTab->iPKe
bba0: 79 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  y;.        asser
bbb0: 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28  t( iCol==-1 || (
bbc0: 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c  iCol>=0 && iCol<
bbd0: 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 23  pTab->nCol) );.#
bbe0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
bbf0: 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44  BLE_COLUMN_METAD
bc00: 41 54 41 0a 20 20 20 20 20 20 20 20 69 66 28 20  ATA.        if( 
bc10: 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20  iCol<0 ){.      
bc20: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54      zType = "INT
bc30: 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20 20 20  EGER";.         
bc40: 20 7a 4f 72 69 67 43 6f 6c 20 3d 20 22 72 6f 77   zOrigCol = "row
bc50: 69 64 22 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  id";.        }el
bc60: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54  se{.          zT
bc70: 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  ype = pTab->aCol
bc80: 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20  [iCol].zType;.  
bc90: 20 20 20 20 20 20 20 20 7a 4f 72 69 67 43 6f 6c          zOrigCol
bca0: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   = pTab->aCol[iC
bcb0: 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ol].zName;.     
bcc0: 20 20 20 20 20 65 73 74 57 69 64 74 68 20 3d 20       estWidth = 
bcd0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
bce0: 2e 73 7a 45 73 74 3b 0a 20 20 20 20 20 20 20 20  .szEst;.        
bcf0: 7d 0a 20 20 20 20 20 20 20 20 7a 4f 72 69 67 54  }.        zOrigT
bd00: 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ab = pTab->zName
bd10: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  ;.        if( pN
bd20: 43 2d 3e 70 50 61 72 73 65 20 29 7b 0a 20 20 20  C->pParse ){.   
bd30: 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d         int iDb =
bd40: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
bd50: 49 6e 64 65 78 28 70 4e 43 2d 3e 70 50 61 72 73  Index(pNC->pPars
bd60: 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  e->db, pTab->pSc
bd70: 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 20  hema);.         
bd80: 20 7a 4f 72 69 67 44 62 20 3d 20 70 4e 43 2d 3e   zOrigDb = pNC->
bd90: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b  pParse->db->aDb[
bda0: 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  iDb].zName;.    
bdb0: 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
bdc0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
bdd0: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70  {.          zTyp
bde0: 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20  e = "INTEGER";. 
bdf0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
be00: 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20          zType = 
be10: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
be20: 2e 7a 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20  .zType;.        
be30: 20 20 65 73 74 57 69 64 74 68 20 3d 20 70 54 61    estWidth = pTa
be40: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 73 7a  b->aCol[iCol].sz
be50: 45 73 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23  Est;.        }.#
be60: 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20  endif.      }.  
be70: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
be80: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
be90: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
bea0: 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54    case TK_SELECT
beb0: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  : {.      /* The
bec0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
bed0: 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 52 65 74   sub-select. Ret
bee0: 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74  urn the declarat
bef0: 69 6f 6e 20 74 79 70 65 20 61 6e 64 0a 20 20 20  ion type and.   
bf00: 20 20 20 2a 2a 20 6f 72 69 67 69 6e 20 69 6e 66     ** origin inf
bf10: 6f 20 66 6f 72 20 74 68 65 20 73 69 6e 67 6c 65  o for the single
bf20: 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72   column in the r
bf30: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
bf40: 20 53 45 4c 45 43 54 0a 20 20 20 20 20 20 2a 2a   SELECT.      **
bf50: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20   statement..    
bf60: 20 20 2a 2f 0a 20 20 20 20 20 20 4e 61 6d 65 43    */.      NameC
bf70: 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20  ontext sNC;.    
bf80: 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 70    Select *pS = p
bf90: 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b  Expr->x.pSelect;
bfa0: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d  .      Expr *p =
bfb0: 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30   pS->pEList->a[0
bfc0: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61  ].pExpr;.      a
bfd0: 73 73 65 72 74 28 20 45 78 70 72 48 61 73 50 72  ssert( ExprHasPr
bfe0: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
bff0: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
c000: 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73       sNC.pSrcLis
c010: 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20  t = pS->pSrc;.  
c020: 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20      sNC.pNext = 
c030: 70 4e 43 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70  pNC;.      sNC.p
c040: 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61  Parse = pNC->pPa
c050: 72 73 65 3b 0a 20 20 20 20 20 20 7a 54 79 70 65  rse;.      zType
c060: 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73   = columnType(&s
c070: 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c  NC, p, &zOrigDb,
c080: 20 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72   &zOrigTab, &zOr
c090: 69 67 43 6f 6c 2c 20 26 65 73 74 57 69 64 74 68  igCol, &estWidth
c0a0: 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ); .      break;
c0b0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
c0c0: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
c0d0: 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
c0e0: 45 54 41 44 41 54 41 20 20 0a 20 20 69 66 28 20  ETADATA  .  if( 
c0f0: 70 7a 4f 72 69 67 44 62 20 29 7b 0a 20 20 20 20  pzOrigDb ){.    
c100: 61 73 73 65 72 74 28 20 70 7a 4f 72 69 67 54 61  assert( pzOrigTa
c110: 62 20 26 26 20 70 7a 4f 72 69 67 43 6f 6c 20 29  b && pzOrigCol )
c120: 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 44 62 20  ;.    *pzOrigDb 
c130: 3d 20 7a 4f 72 69 67 44 62 3b 0a 20 20 20 20 2a  = zOrigDb;.    *
c140: 70 7a 4f 72 69 67 54 61 62 20 3d 20 7a 4f 72 69  pzOrigTab = zOri
c150: 67 54 61 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69  gTab;.    *pzOri
c160: 67 43 6f 6c 20 3d 20 7a 4f 72 69 67 43 6f 6c 3b  gCol = zOrigCol;
c170: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
c180: 28 20 70 45 73 74 57 69 64 74 68 20 29 20 2a 70  ( pEstWidth ) *p
c190: 45 73 74 57 69 64 74 68 20 3d 20 65 73 74 57 69  EstWidth = estWi
c1a0: 64 74 68 3b 0a 20 20 72 65 74 75 72 6e 20 7a 54  dth;.  return zT
c1b0: 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ype;.}../*.** Ge
c1c0: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
c1d0: 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56   will tell the V
c1e0: 44 42 45 20 74 68 65 20 64 65 63 6c 61 72 61 74  DBE the declarat
c1f0: 69 6f 6e 20 74 79 70 65 73 20 6f 66 20 63 6f 6c  ion types of col
c200: 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72  umns.** in the r
c210: 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74  esult set..*/.st
c220: 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61  atic void genera
c230: 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 0a 20  teColumnTypes(. 
c240: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
c250: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63       /* Parser c
c260: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
c270: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20  ist *pTabList,  
c280: 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65  /* List of table
c290: 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  s */.  ExprList 
c2a0: 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78  *pEList    /* Ex
c2b0: 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69  pressions defini
c2c0: 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ng the result se
c2d0: 74 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20  t */.){.#ifndef 
c2e0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c  SQLITE_OMIT_DECL
c2f0: 54 59 50 45 0a 20 20 56 64 62 65 20 2a 76 20 3d  TYPE.  Vdbe *v =
c300: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
c310: 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43    int i;.  NameC
c320: 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 73 4e  ontext sNC;.  sN
c330: 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61  C.pSrcList = pTa
c340: 62 4c 69 73 74 3b 0a 20 20 73 4e 43 2e 70 50 61  bList;.  sNC.pPa
c350: 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
c360: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73  for(i=0; i<pELis
c370: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
c380: 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45      Expr *p = pE
c390: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
c3a0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
c3b0: 20 2a 7a 54 79 70 65 3b 0a 23 69 66 64 65 66 20   *zType;.#ifdef 
c3c0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
c3d0: 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20  LUMN_METADATA.  
c3e0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
c3f0: 72 69 67 44 62 20 3d 20 30 3b 0a 20 20 20 20 63  rigDb = 0;.    c
c400: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67  onst char *zOrig
c410: 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e  Tab = 0;.    con
c420: 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 43 6f  st char *zOrigCo
c430: 6c 20 3d 20 30 3b 0a 20 20 20 20 7a 54 79 70 65  l = 0;.    zType
c440: 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73   = columnType(&s
c450: 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c  NC, p, &zOrigDb,
c460: 20 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72   &zOrigTab, &zOr
c470: 69 67 43 6f 6c 2c 20 30 29 3b 0a 0a 20 20 20 20  igCol, 0);..    
c480: 2f 2a 20 54 68 65 20 76 64 62 65 20 6d 75 73 74  /* The vdbe must
c490: 20 6d 61 6b 65 20 69 74 73 20 6f 77 6e 20 63 6f   make its own co
c4a0: 70 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  py of the column
c4b0: 2d 74 79 70 65 20 61 6e 64 20 6f 74 68 65 72 20  -type and other 
c4c0: 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 73  .    ** column s
c4d0: 70 65 63 69 66 69 63 20 73 74 72 69 6e 67 73 2c  pecific strings,
c4e0: 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 63 68   in case the sch
c4f0: 65 6d 61 20 69 73 20 72 65 73 65 74 20 62 65 66  ema is reset bef
c500: 6f 72 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  ore this.    ** 
c510: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
c520: 69 73 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20  is deleted..    
c530: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
c540: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
c550: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 41 54 41 42  i, COLNAME_DATAB
c560: 41 53 45 2c 20 7a 4f 72 69 67 44 62 2c 20 53 51  ASE, zOrigDb, SQ
c570: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
c580: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
c590: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
c5a0: 20 43 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45 2c 20   COLNAME_TABLE, 
c5b0: 7a 4f 72 69 67 54 61 62 2c 20 53 51 4c 49 54 45  zOrigTab, SQLITE
c5c0: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
c5d0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
c5e0: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
c5f0: 4e 41 4d 45 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f 72  NAME_COLUMN, zOr
c600: 69 67 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52  igCol, SQLITE_TR
c610: 41 4e 53 49 45 4e 54 29 3b 0a 23 65 6c 73 65 0a  ANSIENT);.#else.
c620: 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75      zType = colu
c630: 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20  mnType(&sNC, p, 
c640: 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 23 65 6e  0, 0, 0, 0);.#en
c650: 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 56  dif.    sqlite3V
c660: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
c670: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 45 43 4c   i, COLNAME_DECL
c680: 54 59 50 45 2c 20 7a 54 79 70 65 2c 20 53 51 4c  TYPE, zType, SQL
c690: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
c6a0: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64    }.#endif /* !d
c6b0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
c6c0: 49 54 5f 44 45 43 4c 54 59 50 45 29 20 2a 2f 0a  IT_DECLTYPE) */.
c6d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
c6e0: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
c6f0: 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74   tell the VDBE t
c700: 68 65 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c 75  he names of colu
c710: 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65  mns.** in the re
c720: 73 75 6c 74 20 73 65 74 2e 20 20 54 68 69 73 20  sult set.  This 
c730: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75  information is u
c740: 73 65 64 20 74 6f 20 70 72 6f 76 69 64 65 20 74  sed to provide t
c750: 68 65 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d 20 76 61  he.** azCol[] va
c760: 6c 75 65 73 20 69 6e 20 74 68 65 20 63 61 6c 6c  lues in the call
c770: 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  back..*/.static 
c780: 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c  void generateCol
c790: 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 50 61 72 73  umnNames(.  Pars
c7a0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
c7b0: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
c7c0: 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
c7d0: 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69  pTabList,  /* Li
c7e0: 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a  st of tables */.
c7f0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
c800: 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73  st    /* Express
c810: 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68  ions defining th
c820: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
c830: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
c840: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
c850: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69  int i, j;.  sqli
c860: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
c870: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c 6c  ->db;.  int full
c880: 4e 61 6d 65 73 2c 20 73 68 6f 72 74 4e 61 6d 65  Names, shortName
c890: 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  s;..#ifndef SQLI
c8a0: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
c8b0: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
c8c0: 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b 69 70  an EXPLAIN, skip
c8d0: 20 74 68 69 73 20 73 74 65 70 20 2a 2f 0a 20 20   this step */.  
c8e0: 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
c8f0: 61 69 6e 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ain ){.    retur
c900: 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  n;.  }.#endif.. 
c910: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6c   if( pParse->col
c920: 4e 61 6d 65 73 53 65 74 20 7c 7c 20 4e 45 56 45  NamesSet || NEVE
c930: 52 28 76 3d 3d 30 29 20 7c 7c 20 64 62 2d 3e 6d  R(v==0) || db->m
c940: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
c950: 74 75 72 6e 3b 0a 20 20 70 50 61 72 73 65 2d 3e  turn;.  pParse->
c960: 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31 3b  colNamesSet = 1;
c970: 0a 20 20 66 75 6c 6c 4e 61 6d 65 73 20 3d 20 28  .  fullNames = (
c980: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
c990: 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29  TE_FullColNames)
c9a0: 21 3d 30 3b 0a 20 20 73 68 6f 72 74 4e 61 6d 65  !=0;.  shortName
c9b0: 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  s = (db->flags &
c9c0: 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c   SQLITE_ShortCol
c9d0: 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73 71 6c  Names)!=0;.  sql
c9e0: 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f  ite3VdbeSetNumCo
c9f0: 6c 73 28 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  ls(v, pEList->nE
ca00: 78 70 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  xpr);.  for(i=0;
ca10: 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
ca20: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
ca30: 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 70 45 4c   *p;.    p = pEL
ca40: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
ca50: 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 70  .    if( NEVER(p
ca60: 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ==0) ) continue;
ca70: 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d  .    if( pEList-
ca80: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20  >a[i].zName ){. 
ca90: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
caa0: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
cab0: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 73 71 6c  zName;.      sql
cac0: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
cad0: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
cae0: 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53 51  _NAME, zName, SQ
caf0: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
cb00: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
cb10: 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  p->op==TK_COLUMN
cb20: 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 47   || p->op==TK_AG
cb30: 47 5f 43 4f 4c 55 4d 4e 29 20 26 26 20 70 54 61  G_COLUMN) && pTa
cb40: 62 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 54  bList ){.      T
cb50: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
cb60: 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20    char *zCol;.  
cb70: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
cb80: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
cb90: 20 66 6f 72 28 6a 3d 30 3b 20 41 4c 57 41 59 53   for(j=0; ALWAYS
cba0: 28 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  (j<pTabList->nSr
cbb0: 63 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  c); j++){.      
cbc0: 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e    if( pTabList->
cbd0: 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 3d 3d 70 2d  a[j].iCursor==p-
cbe0: 3e 69 54 61 62 6c 65 20 29 20 62 72 65 61 6b 3b  >iTable ) break;
cbf0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
cc00: 73 73 65 72 74 28 20 6a 3c 70 54 61 62 4c 69 73  ssert( j<pTabLis
cc10: 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 20 20 20  t->nSrc );.     
cc20: 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74   pTab = pTabList
cc30: 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20  ->a[j].pTab;.   
cc40: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20     if( iCol<0 ) 
cc50: 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b  iCol = pTab->iPK
cc60: 65 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ey;.      assert
cc70: 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69  ( iCol==-1 || (i
cc80: 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70  Col>=0 && iCol<p
cc90: 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20  Tab->nCol) );.  
cca0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
ccb0: 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d  {.        zCol =
ccc0: 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20   "rowid";.      
ccd0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a  }else{.        z
cce0: 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  Col = pTab->aCol
ccf0: 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  [iCol].zName;.  
cd00: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
cd10: 21 73 68 6f 72 74 4e 61 6d 65 73 20 26 26 20 21  !shortNames && !
cd20: 66 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20 20  fullNames ){.   
cd30: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
cd40: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
cd50: 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 0a   COLNAME_NAME, .
cd60: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
cd70: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
cd80: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70  pEList->a[i].zSp
cd90: 61 6e 29 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41  an), SQLITE_DYNA
cda0: 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  MIC);.      }els
cdb0: 65 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20  e if( fullNames 
cdc0: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
cdd0: 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  *zName = 0;.    
cde0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
cdf0: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
ce00: 25 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e  %s.%s", pTab->zN
ce10: 61 6d 65 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20  ame, zCol);.    
ce20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
ce30: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
ce40: 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e  COLNAME_NAME, zN
ce50: 61 6d 65 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41  ame, SQLITE_DYNA
ce60: 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  MIC);.      }els
ce70: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
ce80: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
ce90: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e  (v, i, COLNAME_N
cea0: 41 4d 45 2c 20 7a 43 6f 6c 2c 20 53 51 4c 49 54  AME, zCol, SQLIT
ceb0: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
cec0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
ced0: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
cee0: 72 20 2a 7a 20 3d 20 70 45 4c 69 73 74 2d 3e 61  r *z = pEList->a
cef0: 5b 69 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20  [i].zSpan;.     
cf00: 20 7a 20 3d 20 7a 3d 3d 30 20 3f 20 73 71 6c 69   z = z==0 ? sqli
cf10: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
cf20: 63 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b 31 29 20  column%d", i+1) 
cf30: 3a 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  : sqlite3DbStrDu
cf40: 70 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20  p(db, z);.      
cf50: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
cf60: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
cf70: 41 4d 45 5f 4e 41 4d 45 2c 20 7a 2c 20 53 51 4c  AME_NAME, z, SQL
cf80: 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ITE_DYNAMIC);.  
cf90: 20 20 7d 0a 20 20 7d 0a 20 20 67 65 6e 65 72 61    }.  }.  genera
cfa0: 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50  teColumnTypes(pP
cfb0: 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
cfc0: 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pEList);.}../*.*
cfd0: 2a 20 47 69 76 65 6e 20 61 20 61 6e 20 65 78 70  * Given a an exp
cfe0: 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 28 77 68  ression list (wh
cff0: 69 63 68 20 69 73 20 72 65 61 6c 6c 79 20 74 68  ich is really th
d000: 65 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73  e list of expres
d010: 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 66 6f  sions.** that fo
d020: 72 6d 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  rm the result se
d030: 74 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74  t of a SELECT st
d040: 61 74 65 6d 65 6e 74 29 20 63 6f 6d 70 75 74 65  atement) compute
d050: 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20   appropriate.** 
d060: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72  column names for
d070: 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 77 6f   a table that wo
d080: 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 78 70  uld hold the exp
d090: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a  ression list..**
d0a0: 0a 2a 2a 20 41 6c 6c 20 63 6f 6c 75 6d 6e 20 6e  .** All column n
d0b0: 61 6d 65 73 20 77 69 6c 6c 20 62 65 20 75 6e 69  ames will be uni
d0c0: 71 75 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20  que..**.** Only 
d0d0: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
d0e0: 20 61 72 65 20 63 6f 6d 70 75 74 65 64 2e 20 20   are computed.  
d0f0: 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 2c 20 43 6f  Column.zType, Co
d100: 6c 75 6d 6e 2e 7a 43 6f 6c 6c 2c 0a 2a 2a 20 61  lumn.zColl,.** a
d110: 6e 64 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20  nd other fields 
d120: 6f 66 20 43 6f 6c 75 6d 6e 20 61 72 65 20 7a 65  of Column are ze
d130: 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  roed..**.** Retu
d140: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
d150: 73 75 63 63 65 73 73 2e 20 20 49 66 20 61 20 6d  success.  If a m
d160: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
d170: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a   error occurs,.*
d180: 2a 20 73 74 6f 72 65 20 4e 55 4c 4c 20 69 6e 20  * store NULL in 
d190: 2a 70 61 43 6f 6c 20 61 6e 64 20 30 20 69 6e 20  *paCol and 0 in 
d1a0: 2a 70 6e 43 6f 6c 20 61 6e 64 20 72 65 74 75 72  *pnCol and retur
d1b0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a  n SQLITE_NOMEM..
d1c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
d1d0: 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45  lectColumnsFromE
d1e0: 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65  xprList(.  Parse
d1f0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
d200: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
d210: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
d220: 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20  ist *pEList,    
d230: 20 20 20 2f 2a 20 45 78 70 72 20 6c 69 73 74 20     /* Expr list 
d240: 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 64 65  from which to de
d250: 72 69 76 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  rive column name
d260: 73 20 2a 2f 0a 20 20 69 31 36 20 2a 70 6e 43 6f  s */.  i16 *pnCo
d270: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l,             /
d280: 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62  * Write the numb
d290: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 68 65  er of columns he
d2a0: 72 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a  re */.  Column *
d2b0: 2a 70 61 43 6f 6c 20 20 20 20 20 20 20 20 20 20  *paCol          
d2c0: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 65 77  /* Write the new
d2d0: 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 65 72   column list her
d2e0: 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  e */.){.  sqlite
d2f0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
d300: 64 62 3b 20 20 20 2f 2a 20 44 61 74 61 62 61 73  db;   /* Databas
d310: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
d320: 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
d330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d340: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
d350: 2f 0a 20 20 69 6e 74 20 63 6e 74 3b 20 20 20 20  /.  int cnt;    
d360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d370: 2f 2a 20 49 6e 64 65 78 20 61 64 64 65 64 20 74  /* Index added t
d380: 6f 20 6d 61 6b 65 20 74 68 65 20 6e 61 6d 65 20  o make the name 
d390: 75 6e 69 71 75 65 20 2a 2f 0a 20 20 43 6f 6c 75  unique */.  Colu
d3a0: 6d 6e 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b  mn *aCol, *pCol;
d3b0: 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
d3c0: 6f 6f 70 69 6e 67 20 6f 76 65 72 20 72 65 73 75  ooping over resu
d3d0: 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  lt columns */.  
d3e0: 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20  int nCol;       
d3f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
d400: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
d410: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
d420: 65 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 3b  et */.  Expr *p;
d430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d440: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
d450: 6e 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 72  n for a single r
d460: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  esult column */.
d470: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20    char *zName;  
d480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d490: 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a   Column name */.
d4a0: 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20    int nName;    
d4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d4c0: 20 53 69 7a 65 20 6f 66 20 6e 61 6d 65 20 69 6e   Size of name in
d4d0: 20 7a 4e 61 6d 65 5b 5d 20 2a 2f 0a 0a 20 20 69   zName[] */..  i
d4e0: 66 28 20 70 45 4c 69 73 74 20 29 7b 0a 20 20 20  f( pEList ){.   
d4f0: 20 6e 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e   nCol = pEList->
d500: 6e 45 78 70 72 3b 0a 20 20 20 20 61 43 6f 6c 20  nExpr;.    aCol 
d510: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
d520: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
d530: 28 61 43 6f 6c 5b 30 5d 29 2a 28 69 36 34 29 6e  (aCol[0])*(i64)n
d540: 43 6f 6c 29 3b 0a 20 20 20 20 74 65 73 74 63 61  Col);.    testca
d550: 73 65 28 20 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20  se( aCol==0 );. 
d560: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c   }else{.    nCol
d570: 20 3d 20 30 3b 0a 20 20 20 20 61 43 6f 6c 20 3d   = 0;.    aCol =
d580: 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 6e 43 6f 6c   0;.  }.  *pnCol
d590: 20 3d 20 6e 43 6f 6c 3b 0a 20 20 2a 70 61 43 6f   = nCol;.  *paCo
d5a0: 6c 20 3d 20 61 43 6f 6c 3b 0a 0a 20 20 66 6f 72  l = aCol;..  for
d5b0: 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c 3b  (i=0, pCol=aCol;
d5c0: 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43   i<nCol; i++, pC
d5d0: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 47 65  ol++){.    /* Ge
d5e0: 74 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  t an appropriate
d5f0: 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 63 6f   name for the co
d600: 6c 75 6d 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  lumn.    */.    
d610: 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  p = sqlite3ExprS
d620: 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 4c 69 73  kipCollate(pELis
d630: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
d640: 20 20 20 20 69 66 28 20 28 7a 4e 61 6d 65 20 3d      if( (zName =
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 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ame)!=0 ){.     
d670: 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d   /* If the colum
d680: 6e 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 22 41  n contains an "A
d690: 53 20 3c 6e 61 6d 65 3e 22 20 70 68 72 61 73 65  S <name>" phrase
d6a0: 2c 20 75 73 65 20 3c 6e 61 6d 65 3e 20 61 73 20  , use <name> as 
d6b0: 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  the name */.    
d6c0: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
d6d0: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a 4e  3DbStrDup(db, zN
d6e0: 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ame);.    }else{
d6f0: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 43 6f  .      Expr *pCo
d700: 6c 45 78 70 72 20 3d 20 70 3b 20 20 2f 2a 20 54  lExpr = p;  /* T
d710: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  he expression th
d720: 61 74 20 69 73 20 74 68 65 20 72 65 73 75 6c 74  at is the result
d730: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a   column name */.
d740: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
d750: 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61  b;         /* Ta
d760: 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ble associated w
d770: 69 74 68 20 74 68 69 73 20 65 78 70 72 65 73 73  ith this express
d780: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 77 68 69  ion */.      whi
d790: 6c 65 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70  le( pColExpr->op
d7a0: 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20 20  ==TK_DOT ){.    
d7b0: 20 20 20 20 70 43 6f 6c 45 78 70 72 20 3d 20 70      pColExpr = p
d7c0: 43 6f 6c 45 78 70 72 2d 3e 70 52 69 67 68 74 3b  ColExpr->pRight;
d7d0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
d7e0: 20 70 43 6f 6c 45 78 70 72 21 3d 30 20 29 3b 0a   pColExpr!=0 );.
d7f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
d800: 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d  ( pColExpr->op==
d810: 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 41 4c 57  TK_COLUMN && ALW
d820: 41 59 53 28 70 43 6f 6c 45 78 70 72 2d 3e 70 54  AYS(pColExpr->pT
d830: 61 62 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  ab!=0) ){.      
d840: 20 20 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e 73    /* For columns
d850: 20 75 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20   use the column 
d860: 6e 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  name name */.   
d870: 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
d880: 70 43 6f 6c 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  pColExpr->iColum
d890: 6e 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 20  n;.        pTab 
d8a0: 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 54 61 62  = pColExpr->pTab
d8b0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43  ;.        if( iC
d8c0: 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54  ol<0 ) iCol = pT
d8d0: 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20  ab->iPKey;.     
d8e0: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
d8f0: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
d900: 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
d910: 20 20 20 20 20 69 43 6f 6c 3e 3d 30 20 3f 20 70       iCol>=0 ? p
d920: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
d930: 7a 4e 61 6d 65 20 3a 20 22 72 6f 77 69 64 22 29  zName : "rowid")
d940: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
d950: 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d  ( pColExpr->op==
d960: 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20 20 20 20  TK_ID ){.       
d970: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
d980: 73 50 72 6f 70 65 72 74 79 28 70 43 6f 6c 45 78  sProperty(pColEx
d990: 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
d9a0: 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d   );.        zNam
d9b0: 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
d9c0: 74 66 28 64 62 2c 20 22 25 73 22 2c 20 70 43 6f  tf(db, "%s", pCo
d9d0: 6c 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  lExpr->u.zToken)
d9e0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
d9f0: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68         /* Use th
da00: 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 78 74 20  e original text 
da10: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 65 78  of the column ex
da20: 70 72 65 73 73 69 6f 6e 20 61 73 20 69 74 73 20  pression as its 
da30: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  name */.        
da40: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  zName = sqlite3M
da50: 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22 2c  Printf(db, "%s",
da60: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53   pEList->a[i].zS
da70: 70 61 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pan);.      }.  
da80: 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e    }.    if( db->
da90: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
daa0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
dab0: 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a  ree(db, zName);.
dac0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
dad0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20   }..    /* Make 
dae0: 73 75 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20  sure the column 
daf0: 6e 61 6d 65 20 69 73 20 75 6e 69 71 75 65 2e 20  name is unique. 
db00: 20 49 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20   If the name is 
db10: 6e 6f 74 20 75 6e 69 71 75 65 2c 0a 20 20 20 20  not unique,.    
db20: 2a 2a 20 61 70 70 65 6e 64 20 61 20 69 6e 74 65  ** append a inte
db30: 67 65 72 20 74 6f 20 74 68 65 20 6e 61 6d 65 20  ger to the name 
db40: 73 6f 20 74 68 61 74 20 69 74 20 62 65 63 6f 6d  so that it becom
db50: 65 73 20 75 6e 69 71 75 65 2e 0a 20 20 20 20 2a  es unique..    *
db60: 2f 0a 20 20 20 20 6e 4e 61 6d 65 20 3d 20 73 71  /.    nName = sq
db70: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e  lite3Strlen30(zN
db80: 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  ame);.    for(j=
db90: 63 6e 74 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29  cnt=0; j<i; j++)
dba0: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
dbb0: 74 65 33 53 74 72 49 43 6d 70 28 61 43 6f 6c 5b  te3StrICmp(aCol[
dbc0: 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29  j].zName, zName)
dbd0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==0 ){.        c
dbe0: 68 61 72 20 2a 7a 4e 65 77 4e 61 6d 65 3b 0a 20  har *zNewName;. 
dbf0: 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20         int k;.  
dc00: 20 20 20 20 20 20 66 6f 72 28 6b 3d 6e 4e 61 6d        for(k=nNam
dc10: 65 2d 31 3b 20 6b 3e 31 20 26 26 20 73 71 6c 69  e-1; k>1 && sqli
dc20: 74 65 33 49 73 64 69 67 69 74 28 7a 4e 61 6d 65  te3Isdigit(zName
dc30: 5b 6b 5d 29 3b 20 6b 2d 2d 29 7b 7d 0a 20 20 20  [k]); k--){}.   
dc40: 20 20 20 20 20 69 66 28 20 6b 3e 3d 30 20 26 26       if( k>=0 &&
dc50: 20 7a 4e 61 6d 65 5b 6b 5d 3d 3d 27 3a 27 20 29   zName[k]==':' )
dc60: 20 6e 4e 61 6d 65 20 3d 20 6b 3b 0a 20 20 20 20   nName = k;.    
dc70: 20 20 20 20 7a 4e 61 6d 65 5b 6e 4e 61 6d 65 5d      zName[nName]
dc80: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a 4e   = 0;.        zN
dc90: 65 77 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  ewName = sqlite3
dca0: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 3a  MPrintf(db, "%s:
dcb0: 25 64 22 2c 20 7a 4e 61 6d 65 2c 20 2b 2b 63 6e  %d", zName, ++cn
dcc0: 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
dcd0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e  te3DbFree(db, zN
dce0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7a 4e  ame);.        zN
dcf0: 61 6d 65 20 3d 20 7a 4e 65 77 4e 61 6d 65 3b 0a  ame = zNewName;.
dd00: 20 20 20 20 20 20 20 20 6a 20 3d 20 2d 31 3b 0a          j = -1;.
dd10: 20 20 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d          if( zNam
dd20: 65 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  e==0 ) break;.  
dd30: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
dd40: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e  pCol->zName = zN
dd50: 61 6d 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64  ame;.  }.  if( d
dd60: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
dd70: 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  ){.    for(j=0; 
dd80: 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  j<i; j++){.     
dd90: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
dda0: 62 2c 20 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  b, aCol[j].zName
ddb0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
ddc0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 61  ite3DbFree(db, a
ddd0: 43 6f 6c 29 3b 0a 20 20 20 20 2a 70 61 43 6f 6c  Col);.    *paCol
dde0: 20 3d 20 30 3b 0a 20 20 20 20 2a 70 6e 43 6f 6c   = 0;.    *pnCol
ddf0: 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
de00: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
de10: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
de20: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
de30: 41 64 64 20 74 79 70 65 20 61 6e 64 20 63 6f 6c  Add type and col
de40: 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69  lation informati
de50: 6f 6e 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 6c  on to a column l
de60: 69 73 74 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20  ist based on.** 
de70: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
de80: 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 63  nt..** .** The c
de90: 6f 6c 75 6d 6e 20 6c 69 73 74 20 70 72 65 73 75  olumn list presu
dea0: 6d 61 62 6c 79 20 63 61 6d 65 20 66 72 6f 6d 20  mably came from 
deb0: 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 4e 61 6d 65  selectColumnName
dec0: 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 29 2e  sFromExprList().
ded0: 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c  .** The column l
dee0: 69 73 74 20 68 61 73 20 6f 6e 6c 79 20 6e 61 6d  ist has only nam
def0: 65 73 2c 20 6e 6f 74 20 74 79 70 65 73 20 6f 72  es, not types or
df00: 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e 20 20 54 68   collations.  Th
df10: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 6f  is.** routine go
df20: 65 73 20 74 68 72 6f 75 67 68 20 61 6e 64 20 61  es through and a
df30: 64 64 73 20 74 68 65 20 74 79 70 65 73 20 61 6e  dds the types an
df40: 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e 0a 2a 2a  d collations..**
df50: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
df60: 20 72 65 71 75 69 72 65 73 20 74 68 61 74 20 61   requires that a
df70: 6c 6c 20 69 64 65 6e 74 69 66 69 65 72 73 20 69  ll identifiers i
df80: 6e 20 74 68 65 20 53 45 4c 45 43 54 0a 2a 2a 20  n the SELECT.** 
df90: 73 74 61 74 65 6d 65 6e 74 20 62 65 20 72 65 73  statement be res
dfa0: 6f 6c 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  olved..*/.static
dfb0: 20 76 6f 69 64 20 73 65 6c 65 63 74 41 64 64 43   void selectAddC
dfc0: 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c  olumnTypeAndColl
dfd0: 61 74 69 6f 6e 28 0a 20 20 50 61 72 73 65 20 2a  ation(.  Parse *
dfe0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
dff0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
e000: 74 73 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  ts */.  Table *p
e010: 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  Tab,          /*
e020: 20 41 64 64 20 63 6f 6c 75 6d 6e 20 74 79 70 65   Add column type
e030: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20   information to 
e040: 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20  this table */.  
e050: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20  Select *pSelect 
e060: 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20        /* SELECT 
e070: 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e  used to determin
e080: 65 20 74 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c  e types and coll
e090: 61 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 73  ations */.){.  s
e0a0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
e0b0: 72 73 65 2d 3e 64 62 3b 0a 20 20 4e 61 6d 65 43  rse->db;.  NameC
e0c0: 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 43 6f  ontext sNC;.  Co
e0d0: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 43 6f  lumn *pCol;.  Co
e0e0: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
e0f0: 69 6e 74 20 69 3b 0a 20 20 45 78 70 72 20 2a 70  int i;.  Expr *p
e100: 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  ;.  struct ExprL
e110: 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 75  ist_item *a;.  u
e120: 36 34 20 73 7a 41 6c 6c 20 3d 20 30 3b 0a 0a 20  64 szAll = 0;.. 
e130: 20 61 73 73 65 72 74 28 20 70 53 65 6c 65 63 74   assert( pSelect
e140: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
e150: 20 28 70 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c   (pSelect->selFl
e160: 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c 76 65  ags & SF_Resolve
e170: 64 29 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  d)!=0 );.  asser
e180: 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 70  t( pTab->nCol==p
e190: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
e1a0: 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c  nExpr || db->mal
e1b0: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69  locFailed );.  i
e1c0: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
e1d0: 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
e1e0: 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20  memset(&sNC, 0, 
e1f0: 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20  sizeof(sNC));.  
e200: 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
e210: 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20  Select->pSrc;.  
e220: 61 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c  a = pSelect->pEL
e230: 69 73 74 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d  ist->a;.  for(i=
e240: 30 2c 20 70 43 6f 6c 3d 70 54 61 62 2d 3e 61 43  0, pCol=pTab->aC
e250: 6f 6c 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c  ol; i<pTab->nCol
e260: 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; i++, pCol++){.
e270: 20 20 20 20 70 20 3d 20 61 5b 69 5d 2e 70 45 78      p = a[i].pEx
e280: 70 72 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 54  pr;.    pCol->zT
e290: 79 70 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ype = sqlite3DbS
e2a0: 74 72 44 75 70 28 64 62 2c 20 63 6f 6c 75 6d 6e  trDup(db, column
e2b0: 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 30 2c 30  Type(&sNC, p,0,0
e2c0: 2c 30 2c 20 26 70 43 6f 6c 2d 3e 73 7a 45 73 74  ,0, &pCol->szEst
e2d0: 29 29 3b 0a 20 20 20 20 73 7a 41 6c 6c 20 2b 3d  ));.    szAll +=
e2e0: 20 70 43 6f 6c 2d 3e 73 7a 45 73 74 3b 0a 20 20   pCol->szEst;.  
e2f0: 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79    pCol->affinity
e300: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66   = sqlite3ExprAf
e310: 66 69 6e 69 74 79 28 70 29 3b 0a 20 20 20 20 69  finity(p);.    i
e320: 66 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  f( pCol->affinit
e330: 79 3d 3d 30 20 29 20 70 43 6f 6c 2d 3e 61 66 66  y==0 ) pCol->aff
e340: 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41  inity = SQLITE_A
e350: 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 70 43 6f  FF_NONE;.    pCo
e360: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
e370: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
e380: 70 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c  p);.    if( pCol
e390: 6c 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d  l ){.      pCol-
e3a0: 3e 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  >zColl = sqlite3
e3b0: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 43 6f  DbStrDup(db, pCo
e3c0: 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ll->zName);.    
e3d0: 7d 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 73 7a  }.  }.  pTab->sz
e3e0: 54 61 62 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  TabRow = sqlite3
e3f0: 4c 6f 67 45 73 74 28 73 7a 41 6c 6c 2a 34 29 3b  LogEst(szAll*4);
e400: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
e410: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
e420: 6e 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20 54  nt, generate a T
e430: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74  able structure t
e440: 68 61 74 20 64 65 73 63 72 69 62 65 73 0a 2a 2a  hat describes.**
e450: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
e460: 6f 66 20 74 68 61 74 20 53 45 4c 45 43 54 2e 0a  of that SELECT..
e470: 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65  */.Table *sqlite
e480: 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
e490: 63 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ct(Parse *pParse
e4a0: 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63  , Select *pSelec
e4b0: 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  t){.  Table *pTa
e4c0: 62 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  b;.  sqlite3 *db
e4d0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
e4e0: 20 69 6e 74 20 73 61 76 65 64 46 6c 61 67 73 3b   int savedFlags;
e4f0: 0a 0a 20 20 73 61 76 65 64 46 6c 61 67 73 20 3d  ..  savedFlags =
e500: 20 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 64 62   db->flags;.  db
e510: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ->flags &= ~SQLI
e520: 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 3b  TE_FullColNames;
e530: 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20  .  db->flags |= 
e540: 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e  SQLITE_ShortColN
e550: 61 6d 65 73 3b 0a 20 20 73 71 6c 69 74 65 33 53  ames;.  sqlite3S
e560: 65 6c 65 63 74 50 72 65 70 28 70 50 61 72 73 65  electPrep(pParse
e570: 2c 20 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20  , pSelect, 0);. 
e580: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
e590: 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  r ) return 0;.  
e5a0: 77 68 69 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e  while( pSelect->
e5b0: 70 50 72 69 6f 72 20 29 20 70 53 65 6c 65 63 74  pPrior ) pSelect
e5c0: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69   = pSelect->pPri
e5d0: 6f 72 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20  or;.  db->flags 
e5e0: 3d 20 73 61 76 65 64 46 6c 61 67 73 3b 0a 20 20  = savedFlags;.  
e5f0: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62  pTab = sqlite3Db
e600: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
e610: 69 7a 65 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a  izeof(Table) );.
e620: 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b    if( pTab==0 ){
e630: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
e640: 20 7d 0a 20 20 2f 2a 20 54 68 65 20 73 71 6c 69   }.  /* The sqli
e650: 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
e660: 6c 65 63 74 28 29 20 69 73 20 6f 6e 6c 79 20 75  lect() is only u
e670: 73 65 64 20 6e 20 63 6f 6e 74 65 78 74 73 20 77  sed n contexts w
e680: 68 65 72 65 20 6c 6f 6f 6b 61 73 69 64 65 0a 20  here lookaside. 
e690: 20 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64 20   ** is disabled 
e6a0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  */.  assert( db-
e6b0: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62  >lookaside.bEnab
e6c0: 6c 65 64 3d 3d 30 20 29 3b 0a 20 20 70 54 61 62  led==0 );.  pTab
e6d0: 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70 54  ->nRef = 1;.  pT
e6e0: 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20  ab->zName = 0;. 
e6f0: 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73   pTab->nRowLogEs
e700: 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28  t = 200; assert(
e710: 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67   200==sqlite3Log
e720: 45 73 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a  Est(1048576) );.
e730: 20 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46    selectColumnsF
e740: 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
e750: 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c  se, pSelect->pEL
e760: 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c  ist, &pTab->nCol
e770: 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a  , &pTab->aCol);.
e780: 20 20 73 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d    selectAddColum
e790: 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f  nTypeAndCollatio
e7a0: 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  n(pParse, pTab, 
e7b0: 70 53 65 6c 65 63 74 29 3b 0a 20 20 70 54 61 62  pSelect);.  pTab
e7c0: 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20  ->iPKey = -1;.  
e7d0: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
e7e0: 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  iled ){.    sqli
e7f0: 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64  te3DeleteTable(d
e800: 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 72 65  b, pTab);.    re
e810: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65  turn 0;.  }.  re
e820: 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a  turn pTab;.}../*
e830: 0a 2a 2a 20 47 65 74 20 61 20 56 44 42 45 20 66  .** Get a VDBE f
e840: 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 72  or the given par
e850: 73 65 72 20 63 6f 6e 74 65 78 74 2e 20 20 43 72  ser context.  Cr
e860: 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69  eate a new one i
e870: 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20  f necessary..** 
e880: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
e890: 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20  rs, return NULL 
e8a0: 61 6e 64 20 6c 65 61 76 65 20 61 20 6d 65 73 73  and leave a mess
e8b0: 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a  age in pParse..*
e8c0: 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 33 47  /.Vdbe *sqlite3G
e8d0: 65 74 56 64 62 65 28 50 61 72 73 65 20 2a 70 50  etVdbe(Parse *pP
e8e0: 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76  arse){.  Vdbe *v
e8f0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
e900: 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a  ;.  if( v==0 ){.
e910: 20 20 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e      v = pParse->
e920: 70 56 64 62 65 20 3d 20 73 71 6c 69 74 65 33 56  pVdbe = sqlite3V
e930: 64 62 65 43 72 65 61 74 65 28 70 50 61 72 73 65  dbeCreate(pParse
e940: 29 3b 0a 20 20 20 20 69 66 28 20 76 20 29 20 73  );.    if( v ) s
e950: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
e960: 28 76 2c 20 4f 50 5f 49 6e 69 74 29 3b 0a 20 20  (v, OP_Init);.  
e970: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 54    if( pParse->pT
e980: 6f 70 6c 65 76 65 6c 3d 3d 30 0a 20 20 20 20 20  oplevel==0.     
e990: 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45  && OptimizationE
e9a0: 6e 61 62 6c 65 64 28 70 50 61 72 73 65 2d 3e 64  nabled(pParse->d
e9b0: 62 2c 53 51 4c 49 54 45 5f 46 61 63 74 6f 72 4f  b,SQLITE_FactorO
e9c0: 75 74 43 6f 6e 73 74 29 0a 20 20 20 20 29 7b 0a  utConst).    ){.
e9d0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6f 6b        pParse->ok
e9e0: 43 6f 6e 73 74 46 61 63 74 6f 72 20 3d 20 31 3b  ConstFactor = 1;
e9f0: 0a 20 20 20 20 7d 0a 0a 20 20 7d 0a 20 20 72 65  .    }..  }.  re
ea00: 74 75 72 6e 20 76 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  turn v;.}.../*.*
ea10: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 69 4c  * Compute the iL
ea20: 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74  imit and iOffset
ea30: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 53   fields of the S
ea40: 45 4c 45 43 54 20 62 61 73 65 64 20 6f 6e 20 74  ELECT based on t
ea50: 68 65 0a 2a 2a 20 70 4c 69 6d 69 74 20 61 6e 64  he.** pLimit and
ea60: 20 70 4f 66 66 73 65 74 20 65 78 70 72 65 73 73   pOffset express
ea70: 69 6f 6e 73 2e 20 20 70 4c 69 6d 69 74 20 61 6e  ions.  pLimit an
ea80: 64 20 70 4f 66 66 73 65 74 20 68 6f 6c 64 20 74  d pOffset hold t
ea90: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a  he expressions.*
eaa0: 2a 20 74 68 61 74 20 61 70 70 65 61 72 20 69 6e  * that appear in
eab0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51   the original SQ
eac0: 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 66 74 65  L statement afte
ead0: 72 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20  r the LIMIT and 
eae0: 4f 46 46 53 45 54 0a 2a 2a 20 6b 65 79 77 6f 72  OFFSET.** keywor
eaf0: 64 73 2e 20 20 4f 72 20 4e 55 4c 4c 20 69 66 20  ds.  Or NULL if 
eb00: 74 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 61  those keywords a
eb10: 72 65 20 6f 6d 69 74 74 65 64 2e 20 69 4c 69 6d  re omitted. iLim
eb20: 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 0a  it and iOffset .
eb30: 2a 2a 20 61 72 65 20 74 68 65 20 69 6e 74 65 67  ** are the integ
eb40: 65 72 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74  er memory regist
eb50: 65 72 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 63  er numbers for c
eb60: 6f 75 6e 74 65 72 73 20 75 73 65 64 20 74 6f 20  ounters used to 
eb70: 63 6f 6d 70 75 74 65 20 0a 2a 2a 20 74 68 65 20  compute .** the 
eb80: 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74  limit and offset
eb90: 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  .  If there is n
eba0: 6f 20 6c 69 6d 69 74 20 61 6e 64 2f 6f 72 20 6f  o limit and/or o
ebb0: 66 66 73 65 74 2c 20 74 68 65 6e 20 0a 2a 2a 20  ffset, then .** 
ebc0: 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73  iLimit and iOffs
ebd0: 65 74 20 61 72 65 20 6e 65 67 61 74 69 76 65 2e  et are negative.
ebe0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
ebf0: 69 6e 65 20 63 68 61 6e 67 65 73 20 74 68 65 20  ine changes the 
ec00: 76 61 6c 75 65 73 20 6f 66 20 69 4c 69 6d 69 74  values of iLimit
ec10: 20 61 6e 64 20 69 4f 66 66 73 65 74 20 6f 6e 6c   and iOffset onl
ec20: 79 20 69 66 0a 2a 2a 20 61 20 6c 69 6d 69 74 20  y if.** a limit 
ec30: 6f 72 20 6f 66 66 73 65 74 20 69 73 20 64 65 66  or offset is def
ec40: 69 6e 65 64 20 62 79 20 70 4c 69 6d 69 74 20 61  ined by pLimit a
ec50: 6e 64 20 70 4f 66 66 73 65 74 2e 20 20 69 4c 69  nd pOffset.  iLi
ec60: 6d 69 74 20 61 6e 64 0a 2a 2a 20 69 4f 66 66 73  mit and.** iOffs
ec70: 65 74 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62  et should have b
ec80: 65 65 6e 20 70 72 65 73 65 74 20 74 6f 20 61 70  een preset to ap
ec90: 70 72 6f 70 72 69 61 74 65 20 64 65 66 61 75 6c  propriate defaul
eca0: 74 20 76 61 6c 75 65 73 20 28 7a 65 72 6f 29 0a  t values (zero).
ecb0: 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c  ** prior to call
ecc0: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
ecd0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 4f 66 66  ..**.** The iOff
ece0: 73 65 74 20 72 65 67 69 73 74 65 72 20 28 69 66  set register (if
ecf0: 20 69 74 20 65 78 69 73 74 73 29 20 69 73 20 69   it exists) is i
ed00: 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 74 68  nitialized to th
ed10: 65 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68  e value.** of th
ed20: 65 20 4f 46 46 53 45 54 2e 20 20 54 68 65 20 69  e OFFSET.  The i
ed30: 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72 20 69  Limit register i
ed40: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
ed50: 20 4c 49 4d 49 54 2e 20 20 52 65 67 69 73 74 65   LIMIT.  Registe
ed60: 72 0a 2a 2a 20 69 4f 66 66 73 65 74 2b 31 20 69  r.** iOffset+1 i
ed70: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
ed80: 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 2e 0a 2a   LIMIT+OFFSET..*
ed90: 2a 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20 70 4c 69  *.** Only if pLi
eda0: 6d 69 74 21 3d 30 20 6f 72 20 70 4f 66 66 73 65  mit!=0 or pOffse
edb0: 74 21 3d 30 20 64 6f 20 74 68 65 20 6c 69 6d 69  t!=0 do the limi
edc0: 74 20 72 65 67 69 73 74 65 72 73 20 67 65 74 0a  t registers get.
edd0: 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e 20 20 54  ** redefined.  T
ede0: 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65  he UNION ALL ope
edf0: 72 61 74 6f 72 20 75 73 65 73 20 74 68 69 73 20  rator uses this 
ee00: 70 72 6f 70 65 72 74 79 20 74 6f 20 66 6f 72 63  property to forc
ee10: 65 0a 2a 2a 20 74 68 65 20 72 65 75 73 65 20 6f  e.** the reuse o
ee20: 66 20 74 68 65 20 73 61 6d 65 20 6c 69 6d 69 74  f the same limit
ee30: 20 61 6e 64 20 6f 66 66 73 65 74 20 72 65 67 69   and offset regi
ee40: 73 74 65 72 73 20 61 63 72 6f 73 73 20 6d 75 6c  sters across mul
ee50: 74 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20  tiple.** SELECT 
ee60: 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73  statements..*/.s
ee70: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75  tatic void compu
ee80: 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
ee90: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
eea0: 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69  Select *p, int i
eeb0: 42 72 65 61 6b 29 7b 0a 20 20 56 64 62 65 20 2a  Break){.  Vdbe *
eec0: 76 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c 69  v = 0;.  int iLi
eed0: 6d 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  mit = 0;.  int i
eee0: 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 61 64  Offset;.  int ad
eef0: 64 72 31 2c 20 6e 3b 0a 20 20 69 66 28 20 70 2d  dr1, n;.  if( p-
ef00: 3e 69 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e  >iLimit ) return
ef10: 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 22 4c  ;..  /* .  ** "L
ef20: 49 4d 49 54 20 2d 31 22 20 61 6c 77 61 79 73 20  IMIT -1" always 
ef30: 73 68 6f 77 73 20 61 6c 6c 20 72 6f 77 73 2e 20  shows all rows. 
ef40: 20 54 68 65 72 65 20 69 73 20 73 6f 6d 65 0a 20   There is some. 
ef50: 20 2a 2a 20 63 6f 6e 74 72 6f 76 65 72 73 79 20   ** controversy 
ef60: 61 62 6f 75 74 20 77 68 61 74 20 74 68 65 20 63  about what the c
ef70: 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f 72 20  orrect behavior 
ef80: 73 68 6f 75 6c 64 20 62 65 2e 0a 20 20 2a 2a 20  should be..  ** 
ef90: 54 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c  The current impl
efa0: 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74 65 72  ementation inter
efb0: 70 72 65 74 73 20 22 4c 49 4d 49 54 20 30 22 20  prets "LIMIT 0" 
efc0: 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20  to mean.  ** no 
efd0: 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  rows..  */.  sql
efe0: 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
eff0: 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73  ar(pParse);.  as
f000: 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74  sert( p->pOffset
f010: 3d 3d 30 20 7c 7c 20 70 2d 3e 70 4c 69 6d 69 74  ==0 || p->pLimit
f020: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  !=0 );.  if( p->
f030: 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 70 2d  pLimit ){.    p-
f040: 3e 69 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74  >iLimit = iLimit
f050: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
f060: 6d 3b 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74  m;.    v = sqlit
f070: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
f080: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 76  );.    assert( v
f090: 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 73  !=0 );.    if( s
f0a0: 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
f0b0: 67 65 72 28 70 2d 3e 70 4c 69 6d 69 74 2c 20 26  ger(p->pLimit, &
f0c0: 6e 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  n) ){.      sqli
f0d0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
f0e0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6e 2c 20   OP_Integer, n, 
f0f0: 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 56  iLimit);.      V
f100: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
f110: 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29  LIMIT counter"))
f120: 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30  ;.      if( n==0
f130: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
f140: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
f150: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 42 72   OP_Goto, 0, iBr
f160: 65 61 6b 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  eak);.      }els
f170: 65 20 69 66 28 20 6e 3e 3d 30 20 26 26 20 70 2d  e if( n>=0 && p-
f180: 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 28 75 36 34  >nSelectRow>(u64
f190: 29 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  )n ){.        p-
f1a0: 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 6e 3b  >nSelectRow = n;
f1b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
f1c0: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
f1d0: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
f1e0: 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 69 4c 69  , p->pLimit, iLi
f1f0: 6d 69 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  mit);.      sqli
f200: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
f210: 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69   OP_MustBeInt, i
f220: 4c 69 6d 69 74 29 3b 20 56 64 62 65 43 6f 76 65  Limit); VdbeCove
f230: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56  rage(v);.      V
f240: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
f250: 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29  LIMIT counter"))
f260: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
f270: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
f280: 49 66 5a 65 72 6f 2c 20 69 4c 69 6d 69 74 2c 20  IfZero, iLimit, 
f290: 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76  iBreak); VdbeCov
f2a0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a  erage(v);.    }.
f2b0: 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 66 66 73      if( p->pOffs
f2c0: 65 74 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69  et ){.      p->i
f2d0: 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 73 65 74  Offset = iOffset
f2e0: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
f2f0: 6d 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  m;.      pParse-
f300: 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 2f 2a 20 41 6c  >nMem++;   /* Al
f310: 6c 6f 63 61 74 65 20 61 6e 20 65 78 74 72 61 20  locate an extra 
f320: 72 65 67 69 73 74 65 72 20 66 6f 72 20 6c 69 6d  register for lim
f330: 69 74 2b 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20  it+offset */.   
f340: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
f350: 64 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4f  de(pParse, p->pO
f360: 66 66 73 65 74 2c 20 69 4f 66 66 73 65 74 29 3b  ffset, iOffset);
f370: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
f380: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d  beAddOp1(v, OP_M
f390: 75 73 74 42 65 49 6e 74 2c 20 69 4f 66 66 73 65  ustBeInt, iOffse
f3a0: 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
f3b0: 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  (v);.      VdbeC
f3c0: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46 46 53  omment((v, "OFFS
f3d0: 45 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20  ET counter"));. 
f3e0: 20 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c       addr1 = sql
f3f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
f400: 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4f 66 66  , OP_IfPos, iOff
f410: 73 65 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  set); VdbeCovera
f420: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  ge(v);.      sql
f430: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
f440: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
f450: 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20   iOffset);.     
f460: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
f470: 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
f480: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f490: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41 64  eAddOp3(v, OP_Ad
f4a0: 64 2c 20 69 4c 69 6d 69 74 2c 20 69 4f 66 66 73  d, iLimit, iOffs
f4b0: 65 74 2c 20 69 4f 66 66 73 65 74 2b 31 29 3b 0a  et, iOffset+1);.
f4c0: 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
f4d0: 74 28 28 76 2c 20 22 4c 49 4d 49 54 2b 4f 46 46  t((v, "LIMIT+OFF
f4e0: 53 45 54 22 29 29 3b 0a 20 20 20 20 20 20 61 64  SET"));.      ad
f4f0: 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
f500: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
f510: 50 6f 73 2c 20 69 4c 69 6d 69 74 29 3b 20 56 64  Pos, iLimit); Vd
f520: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
f530: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f540: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
f550: 65 67 65 72 2c 20 2d 31 2c 20 69 4f 66 66 73 65  eger, -1, iOffse
f560: 74 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  t+1);.      sqli
f570: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
f580: 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20 7d  v, addr1);.    }
f590: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  .  }.}..#ifndef 
f5a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
f5b0: 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a  OUND_SELECT./*.*
f5c0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 70 70  * Return the app
f5d0: 72 6f 70 72 69 61 74 65 20 63 6f 6c 6c 61 74 69  ropriate collati
f5e0: 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
f5f0: 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75  the iCol-th colu
f600: 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 72 65 73  mn of.** the res
f610: 75 6c 74 20 73 65 74 20 66 6f 72 20 74 68 65 20  ult set for the 
f620: 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20  compound-select 
f630: 73 74 61 74 65 6d 65 6e 74 20 22 70 22 2e 20 20  statement "p".  
f640: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a  Return NULL if.*
f650: 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73  * the column has
f660: 20 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c   no default coll
f670: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a  ating sequence..
f680: 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74  **.** The collat
f690: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
f6a0: 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65   the compound se
f6b0: 6c 65 63 74 20 69 73 20 74 61 6b 65 6e 20 66 72  lect is taken fr
f6c0: 6f 6d 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d  om the.** left-m
f6d0: 6f 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ost term of the 
f6e0: 73 65 6c 65 63 74 20 74 68 61 74 20 68 61 73 20  select that has 
f6f0: 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  a collating sequ
f700: 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ence..*/.static 
f710: 43 6f 6c 6c 53 65 71 20 2a 6d 75 6c 74 69 53 65  CollSeq *multiSe
f720: 6c 65 63 74 43 6f 6c 6c 53 65 71 28 50 61 72 73  lectCollSeq(Pars
f730: 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
f740: 74 20 2a 70 2c 20 69 6e 74 20 69 43 6f 6c 29 7b  t *p, int iCol){
f750: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 74  .  CollSeq *pRet
f760: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  ;.  if( p->pPrio
f770: 72 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20  r ){.    pRet = 
f780: 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53  multiSelectCollS
f790: 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 50  eq(pParse, p->pP
f7a0: 72 69 6f 72 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d  rior, iCol);.  }
f7b0: 65 6c 73 65 7b 0a 20 20 20 20 70 52 65 74 20 3d  else{.    pRet =
f7c0: 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   0;.  }.  assert
f7d0: 28 20 69 43 6f 6c 3e 3d 30 20 29 3b 0a 20 20 69  ( iCol>=0 );.  i
f7e0: 66 28 20 70 52 65 74 3d 3d 30 20 26 26 20 69 43  f( pRet==0 && iC
f7f0: 6f 6c 3c 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  ol<p->pEList->nE
f800: 78 70 72 20 29 7b 0a 20 20 20 20 70 52 65 74 20  xpr ){.    pRet 
f810: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
f820: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e  lSeq(pParse, p->
f830: 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e  pEList->a[iCol].
f840: 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65  pExpr);.  }.  re
f850: 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn pRet;.}../*
f860: 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63 74 20 73  .** The select s
f870: 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20  tatement passed 
f880: 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61  as the second pa
f890: 72 61 6d 65 74 65 72 20 69 73 20 61 20 63 6f 6d  rameter is a com
f8a0: 70 6f 75 6e 64 20 53 45 4c 45 43 54 0a 2a 2a 20  pound SELECT.** 
f8b0: 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59  with an ORDER BY
f8c0: 20 63 6c 61 75 73 65 2e 20 54 68 69 73 20 66 75   clause. This fu
f8d0: 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73  nction allocates
f8e0: 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20 4b   and returns a K
f8f0: 65 79 49 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74  eyInfo.** struct
f900: 75 72 65 20 73 75 69 74 61 62 6c 65 20 66 6f 72  ure suitable for
f910: 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68   implementing th
f920: 65 20 4f 52 44 45 52 20 42 59 2e 0a 2a 2a 0a 2a  e ORDER BY..**.*
f930: 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20  * Space to hold 
f940: 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
f950: 63 74 75 72 65 20 69 73 20 6f 62 74 61 69 6e 65  cture is obtaine
f960: 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 54  d from malloc. T
f970: 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75  he calling.** fu
f980: 6e 63 74 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e  nction is respon
f990: 73 69 62 6c 65 20 66 6f 72 20 65 6e 73 75 72 69  sible for ensuri
f9a0: 6e 67 20 74 68 61 74 20 74 68 69 73 20 73 74 72  ng that this str
f9b0: 75 63 74 75 72 65 20 69 73 20 65 76 65 6e 74 75  ucture is eventu
f9c0: 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 0a 2a  ally.** freed..*
f9d0: 2f 0a 73 74 61 74 69 63 20 4b 65 79 49 6e 66 6f  /.static KeyInfo
f9e0: 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64   *multiSelectOrd
f9f0: 65 72 42 79 4b 65 79 49 6e 66 6f 28 50 61 72 73  erByKeyInfo(Pars
fa00: 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
fa10: 74 20 2a 70 2c 20 69 6e 74 20 6e 45 78 74 72 61  t *p, int nExtra
fa20: 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  ){.  ExprList *p
fa30: 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
fa40: 64 65 72 42 79 3b 0a 20 20 69 6e 74 20 6e 4f 72  derBy;.  int nOr
fa50: 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
fa60: 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 73 71  rBy->nExpr;.  sq
fa70: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
fa80: 73 65 2d 3e 64 62 3b 0a 20 20 4b 65 79 49 6e 66  se->db;.  KeyInf
fa90: 6f 20 2a 70 52 65 74 20 3d 20 73 71 6c 69 74 65  o *pRet = sqlite
faa0: 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62  3KeyInfoAlloc(db
fab0: 2c 20 6e 4f 72 64 65 72 42 79 2b 6e 45 78 74 72  , nOrderBy+nExtr
fac0: 61 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 52 65  a, 1);.  if( pRe
fad0: 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  t ){.    int i;.
fae0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
faf0: 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20  OrderBy; i++){. 
fb00: 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
fb10: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
fb20: 20 3d 20 26 70 4f 72 64 65 72 42 79 2d 3e 61 5b   = &pOrderBy->a[
fb30: 69 5d 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  i];.      Expr *
fb40: 70 54 65 72 6d 20 3d 20 70 49 74 65 6d 2d 3e 70  pTerm = pItem->p
fb50: 45 78 70 72 3b 0a 20 20 20 20 20 20 43 6f 6c 6c  Expr;.      Coll
fb60: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 20  Seq *pColl;..   
fb70: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 66 6c     if( pTerm->fl
fb80: 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65  ags & EP_Collate
fb90: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c   ){.        pCol
fba0: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
fbb0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
fbc0: 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Term);.      }el
fbd0: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  se{.        pCol
fbe0: 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43  l = multiSelectC
fbf0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
fc00: 2c 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72  , pItem->u.x.iOr
fc10: 64 65 72 42 79 43 6f 6c 2d 31 29 3b 0a 20 20 20  derByCol-1);.   
fc20: 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d       if( pColl==
fc30: 30 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e  0 ) pColl = db->
fc40: 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
fc50: 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69     pOrderBy->a[i
fc60: 5d 2e 70 45 78 70 72 20 3d 0a 20 20 20 20 20 20  ].pExpr =.      
fc70: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
fc80: 64 64 43 6f 6c 6c 61 74 65 53 74 72 69 6e 67 28  ddCollateString(
fc90: 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70  pParse, pTerm, p
fca0: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Coll->zName);.  
fcb0: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
fcc0: 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  rt( sqlite3KeyIn
fcd0: 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 52  foIsWriteable(pR
fce0: 65 74 29 20 29 3b 0a 20 20 20 20 20 20 70 52 65  et) );.      pRe
fcf0: 74 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43  t->aColl[i] = pC
fd00: 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 52 65 74 2d  oll;.      pRet-
fd10: 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d  >aSortOrder[i] =
fd20: 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
fd30: 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d  sortOrder;.    }
fd40: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
fd50: 52 65 74 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  Ret;.}..#ifndef 
fd60: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
fd70: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
fd80: 6e 65 20 67 65 6e 65 72 61 74 65 73 20 56 44 42  ne generates VDB
fd90: 45 20 63 6f 64 65 20 74 6f 20 63 6f 6d 70 75 74  E code to comput
fda0: 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  e the content of
fdb0: 20 61 20 57 49 54 48 20 52 45 43 55 52 53 49 56   a WITH RECURSIV
fdc0: 45 0a 2a 2a 20 71 75 65 72 79 20 6f 66 20 74 68  E.** query of th
fdd0: 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20  e form:.**.**   
fde0: 3c 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65  <recursive-table
fdf0: 3e 20 41 53 20 28 3c 73 65 74 75 70 2d 71 75 65  > AS (<setup-que
fe00: 72 79 3e 20 55 4e 49 4f 4e 20 5b 41 4c 4c 5d 20  ry> UNION [ALL] 
fe10: 3c 72 65 63 75 72 73 69 76 65 2d 71 75 65 72 79  <recursive-query
fe20: 3e 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  >).**           
fe30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f                \_
fe40: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20  __________/     
fe50: 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f          \_______
fe60: 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20  ________/.**    
fe70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe80: 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72         p->pPrior
fe90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fea0: 20 20 20 20 20 20 70 0a 2a 2a 0a 2a 2a 0a 2a 2a        p.**.**.**
feb0: 20 54 68 65 72 65 20 69 73 20 65 78 61 63 74 6c   There is exactl
fec0: 79 20 6f 6e 65 20 72 65 66 65 72 65 6e 63 65 20  y one reference 
fed0: 74 6f 20 74 68 65 20 72 65 63 75 72 73 69 76 65  to the recursive
fee0: 2d 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52  -table in the FR
fef0: 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20 6f 66 20  OM clause.** of 
ff00: 72 65 63 75 72 73 69 76 65 2d 71 75 65 72 79 2c  recursive-query,
ff10: 20 6d 61 72 6b 65 64 20 77 69 74 68 20 74 68 65   marked with the
ff20: 20 53 72 63 4c 69 73 74 2d 3e 61 5b 5d 2e 69 73   SrcList->a[].is
ff30: 52 65 63 75 72 73 69 76 65 20 66 6c 61 67 2e 0a  Recursive flag..
ff40: 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 74 75 70 2d  **.** The setup-
ff50: 71 75 65 72 79 20 72 75 6e 73 20 6f 6e 63 65 20  query runs once 
ff60: 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e 20 69  to generate an i
ff70: 6e 69 74 69 61 6c 20 73 65 74 20 6f 66 20 72 6f  nitial set of ro
ff80: 77 73 20 74 68 61 74 20 67 6f 0a 2a 2a 20 69 6e  ws that go.** in
ff90: 74 6f 20 61 20 51 75 65 75 65 20 74 61 62 6c 65  to a Queue table
ffa0: 2e 20 20 52 6f 77 73 20 61 72 65 20 65 78 74 72  .  Rows are extr
ffb0: 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20 51  acted from the Q
ffc0: 75 65 75 65 20 74 61 62 6c 65 20 6f 6e 65 20 62  ueue table one b
ffd0: 79 0a 2a 2a 20 6f 6e 65 2e 20 20 45 61 63 68 20  y.** one.  Each 
ffe0: 72 6f 77 20 65 78 74 72 61 63 74 65 64 20 66 72  row extracted fr
fff0: 6f 6d 20 51 75 65 75 65 20 69 73 20 6f 75 74 70  om Queue is outp
10000 75 74 20 74 6f 20 70 44 65 73 74 2e 20 20 54 68  ut to pDest.  Th
10010 65 6e 20 74 68 65 20 73 69 6e 67 6c 65 0a 2a 2a  en the single.**
10020 20 65 78 74 72 61 63 74 65 64 20 72 6f 77 20 28   extracted row (
10030 6e 6f 77 20 69 6e 20 74 68 65 20 69 43 75 72 72  now in the iCurr
10040 65 6e 74 20 74 61 62 6c 65 29 20 62 65 63 6f 6d  ent table) becom
10050 65 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  es the content o
10060 66 20 74 68 65 0a 2a 2a 20 72 65 63 75 72 73 69  f the.** recursi
10070 76 65 2d 74 61 62 6c 65 20 66 6f 72 20 61 20 72  ve-table for a r
10080 65 63 75 72 73 69 76 65 2d 71 75 65 72 79 20 72  ecursive-query r
10090 75 6e 2e 20 20 54 68 65 20 6f 75 74 70 75 74 20  un.  The output 
100a0 6f 66 20 74 68 65 20 72 65 63 75 72 73 69 76 65  of the recursive
100b0 2d 71 75 65 72 79 0a 2a 2a 20 69 73 20 61 64 64  -query.** is add
100c0 65 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  ed back into the
100d0 20 51 75 65 75 65 20 74 61 62 6c 65 2e 20 20 54   Queue table.  T
100e0 68 65 6e 20 61 6e 6f 74 68 65 72 20 72 6f 77 20  hen another row 
100f0 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
10100 6d 20 51 75 65 75 65 0a 2a 2a 20 61 6e 64 20 74  m Queue.** and t
10110 68 65 20 69 74 65 72 61 74 69 6f 6e 20 63 6f 6e  he iteration con
10120 74 69 6e 75 65 73 20 75 6e 74 69 6c 20 74 68 65  tinues until the
10130 20 51 75 65 75 65 20 74 61 62 6c 65 20 69 73 20   Queue table is 
10140 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  empty..**.** If 
10150 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  the compound que
10160 72 79 20 6f 70 65 72 61 74 6f 72 20 69 73 20 55  ry operator is U
10170 4e 49 4f 4e 20 74 68 65 6e 20 6e 6f 20 64 75 70  NION then no dup
10180 6c 69 63 61 74 65 20 72 6f 77 73 20 61 72 65 20  licate rows are 
10190 65 76 65 72 0a 2a 2a 20 69 6e 73 65 72 74 65 64  ever.** inserted
101a0 20 69 6e 74 6f 20 74 68 65 20 51 75 65 75 65 20   into the Queue 
101b0 74 61 62 6c 65 2e 20 20 54 68 65 20 69 44 69 73  table.  The iDis
101c0 74 69 6e 63 74 20 74 61 62 6c 65 20 6b 65 65 70  tinct table keep
101d0 73 20 61 20 63 6f 70 79 20 6f 66 20 61 6c 6c 20  s a copy of all 
101e0 72 6f 77 73 0a 2a 2a 20 74 68 61 74 20 68 61 76  rows.** that hav
101f0 65 20 65 76 65 72 20 62 65 65 6e 20 69 6e 73 65  e ever been inse
10200 72 74 65 64 20 69 6e 74 6f 20 51 75 65 75 65 20  rted into Queue 
10210 61 6e 64 20 63 61 75 73 65 73 20 64 75 70 6c 69  and causes dupli
10220 63 61 74 65 73 20 74 6f 20 62 65 0a 2a 2a 20 64  cates to be.** d
10230 69 73 63 61 72 64 65 64 2e 20 20 49 66 20 74 68  iscarded.  If th
10240 65 20 6f 70 65 72 61 74 6f 72 20 69 73 20 55 4e  e operator is UN
10250 49 4f 4e 20 41 4c 4c 2c 20 74 68 65 6e 20 64 75  ION ALL, then du
10260 70 6c 69 63 61 74 65 73 20 61 72 65 20 61 6c 6c  plicates are all
10270 6f 77 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20  owed..** .** If 
10280 74 68 65 20 71 75 65 72 79 20 68 61 73 20 61 6e  the query has an
10290 20 4f 52 44 45 52 20 42 59 2c 20 74 68 65 6e 20   ORDER BY, then 
102a0 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 51  entries in the Q
102b0 75 65 75 65 20 74 61 62 6c 65 20 61 72 65 20 6b  ueue table are k
102c0 65 70 74 20 69 6e 0a 2a 2a 20 4f 52 44 45 52 20  ept in.** ORDER 
102d0 42 59 20 6f 72 64 65 72 20 61 6e 64 20 74 68 65  BY order and the
102e0 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 73 20   first entry is 
102f0 65 78 74 72 61 63 74 65 64 20 66 6f 72 20 65 61  extracted for ea
10300 63 68 20 63 79 63 6c 65 2e 20 20 57 69 74 68 6f  ch cycle.  Witho
10310 75 74 0a 2a 2a 20 61 6e 20 4f 52 44 45 52 20 42  ut.** an ORDER B
10320 59 2c 20 74 68 65 20 51 75 65 75 65 20 74 61 62  Y, the Queue tab
10330 6c 65 20 69 73 20 6a 75 73 74 20 61 20 46 49 46  le is just a FIF
10340 4f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 4c 49  O..**.** If a LI
10350 4d 49 54 20 63 6c 61 75 73 65 20 69 73 20 70 72  MIT clause is pr
10360 6f 76 69 64 65 64 2c 20 74 68 65 6e 20 74 68 65  ovided, then the
10370 20 69 74 65 72 61 74 69 6f 6e 20 73 74 6f 70 73   iteration stops
10380 20 61 66 74 65 72 20 4c 49 4d 49 54 20 72 6f 77   after LIMIT row
10390 73 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 6f  s.** have been o
103a0 75 74 70 75 74 20 74 6f 20 70 44 65 73 74 2e 20  utput to pDest. 
103b0 20 41 20 4c 49 4d 49 54 20 6f 66 20 7a 65 72 6f   A LIMIT of zero
103c0 20 6d 65 61 6e 73 20 74 6f 20 6f 75 74 70 75 74   means to output
103d0 20 6e 6f 20 72 6f 77 73 20 61 6e 64 20 61 0a 2a   no rows and a.*
103e0 2a 20 6e 65 67 61 74 69 76 65 20 4c 49 4d 49 54  * negative LIMIT
103f0 20 6d 65 61 6e 73 20 74 6f 20 6f 75 74 70 75 74   means to output
10400 20 61 6c 6c 20 72 6f 77 73 2e 20 20 49 66 20 74   all rows.  If t
10410 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61 6e 20  here is also an 
10420 4f 46 46 53 45 54 20 63 6c 61 75 73 65 0a 2a 2a  OFFSET clause.**
10430 20 77 69 74 68 20 61 20 70 6f 73 69 74 69 76 65   with a positive
10440 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 68 65   value, then the
10450 20 66 69 72 73 74 20 4f 46 46 53 45 54 20 6f 75   first OFFSET ou
10460 74 70 75 74 73 20 61 72 65 20 64 69 73 63 61 72  tputs are discar
10470 64 65 64 20 72 61 74 68 65 72 0a 2a 2a 20 74 68  ded rather.** th
10480 61 6e 20 62 65 69 6e 67 20 73 65 6e 74 20 74 6f  an being sent to
10490 20 70 44 65 73 74 2e 20 20 54 68 65 20 4c 49 4d   pDest.  The LIM
104a0 49 54 20 63 6f 75 6e 74 20 64 6f 65 73 20 6e 6f  IT count does no
104b0 74 20 62 65 67 69 6e 20 75 6e 74 69 6c 20 61 66  t begin until af
104c0 74 65 72 20 4f 46 46 53 45 54 0a 2a 2a 20 72 6f  ter OFFSET.** ro
104d0 77 73 20 68 61 76 65 20 62 65 65 6e 20 73 6b 69  ws have been ski
104e0 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pped..*/.static 
104f0 76 6f 69 64 20 67 65 6e 65 72 61 74 65 57 69 74  void generateWit
10500 68 52 65 63 75 72 73 69 76 65 51 75 65 72 79 28  hRecursiveQuery(
10510 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
10520 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
10530 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
10540 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
10550 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
10560 63 75 72 73 69 76 65 20 53 45 4c 45 43 54 20 74  cursive SELECT t
10570 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
10580 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
10590 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f  t     /* What to
105a0 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72   do with query r
105b0 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 53  esults */.){.  S
105c0 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70  rcList *pSrc = p
105d0 2d 3e 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20  ->pSrc;      /* 
105e0 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
105f0 6f 66 20 74 68 65 20 72 65 63 75 72 73 69 76 65  of the recursive
10600 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20   query */.  int 
10610 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74  nCol = p->pEList
10620 2d 3e 6e 45 78 70 72 3b 20 20 2f 2a 20 4e 75 6d  ->nExpr;  /* Num
10630 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
10640 6e 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20  n the recursive 
10650 74 61 62 6c 65 20 2a 2f 0a 20 20 56 64 62 65 20  table */.  Vdbe 
10660 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
10670 62 65 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  be;      /* The 
10680 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
10690 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  nt under constru
106a0 63 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63  ction */.  Selec
106b0 74 20 2a 70 53 65 74 75 70 20 3d 20 70 2d 3e 70  t *pSetup = p->p
106c0 50 72 69 6f 72 3b 20 20 20 2f 2a 20 54 68 65 20  Prior;   /* The 
106d0 73 65 74 75 70 20 71 75 65 72 79 20 2a 2f 0a 20  setup query */. 
106e0 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20   int addrTop;   
106f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10700 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f  * Top of the loo
10710 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43  p */.  int addrC
10720 6f 6e 74 2c 20 61 64 64 72 42 72 65 61 6b 3b 20  ont, addrBreak; 
10730 20 20 20 20 20 2f 2a 20 43 4f 4e 54 49 4e 55 45       /* CONTINUE
10740 20 61 6e 64 20 42 52 45 41 4b 20 61 64 64 72 65   and BREAK addre
10750 73 73 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43  sses */.  int iC
10760 75 72 72 65 6e 74 20 3d 20 30 3b 20 20 20 20 20  urrent = 0;     
10770 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 43          /* The C
10780 75 72 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a  urrent table */.
10790 20 20 69 6e 74 20 72 65 67 43 75 72 72 65 6e 74    int regCurrent
107a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
107b0 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
107c0 69 6e 67 20 43 75 72 72 65 6e 74 20 74 61 62 6c  ing Current tabl
107d0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 51 75 65 75  e */.  int iQueu
107e0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
107f0 20 20 20 20 20 2f 2a 20 54 68 65 20 51 75 65 75       /* The Queu
10800 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  e table */.  int
10810 20 69 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 20   iDistinct = 0; 
10820 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
10830 20 65 6e 73 75 72 65 20 75 6e 69 71 75 65 20 72   ensure unique r
10840 65 73 75 6c 74 73 20 69 66 20 55 4e 49 4f 4e 20  esults if UNION 
10850 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d  */.  int eDest =
10860 20 53 52 54 5f 46 69 66 6f 3b 20 20 20 20 20 20   SRT_Fifo;      
10870 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 77 72 69     /* How to wri
10880 74 65 20 74 6f 20 51 75 65 75 65 20 2a 2f 0a 20  te to Queue */. 
10890 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
108a0 51 75 65 75 65 3b 20 20 20 20 20 20 20 20 20 2f  Queue;         /
108b0 2a 20 53 65 6c 65 63 74 44 65 73 74 20 74 61 72  * SelectDest tar
108c0 67 65 74 74 69 6e 67 20 74 68 65 20 51 75 65 75  getting the Queu
108d0 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  e table */.  int
108e0 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
108f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
10900 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
10910 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
10920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10930 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a   Result code */.
10940 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
10950 65 72 42 79 3b 20 20 20 20 20 20 20 20 20 20 20  erBy;           
10960 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
10970 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
10980 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73   *pLimit, *pOffs
10990 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 61 76  et;       /* Sav
109a0 65 64 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  ed LIMIT and OFF
109b0 53 45 54 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  SET */.  int reg
109c0 4c 69 6d 69 74 2c 20 72 65 67 4f 66 66 73 65 74  Limit, regOffset
109d0 3b 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74  ;      /* Regist
109e0 65 72 73 20 75 73 65 64 20 62 79 20 4c 49 4d 49  ers used by LIMI
109f0 54 20 61 6e 64 20 4f 46 46 53 45 54 20 2a 2f 0a  T and OFFSET */.
10a00 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 75 74  .  /* Obtain aut
10a10 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20 64 6f  horization to do
10a20 20 61 20 72 65 63 75 72 73 69 76 65 20 71 75 65   a recursive que
10a30 72 79 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  ry */.  if( sqli
10a40 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
10a50 72 73 65 2c 20 53 51 4c 49 54 45 5f 52 45 43 55  rse, SQLITE_RECU
10a60 52 53 49 56 45 2c 20 30 2c 20 30 2c 20 30 29 20  RSIVE, 0, 0, 0) 
10a70 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20  ) return;..  /* 
10a80 50 72 6f 63 65 73 73 20 74 68 65 20 4c 49 4d 49  Process the LIMI
10a90 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61  T and OFFSET cla
10aa0 75 73 65 73 2c 20 69 66 20 74 68 65 79 20 65 78  uses, if they ex
10ab0 69 73 74 20 2a 2f 0a 20 20 61 64 64 72 42 72 65  ist */.  addrBre
10ac0 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ak = sqlite3Vdbe
10ad0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
10ae0 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
10af0 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c  sters(pParse, p,
10b00 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 70   addrBreak);.  p
10b10 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69  Limit = p->pLimi
10b20 74 3b 0a 20 20 70 4f 66 66 73 65 74 20 3d 20 70  t;.  pOffset = p
10b30 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 72 65 67  ->pOffset;.  reg
10b40 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69  Limit = p->iLimi
10b50 74 3b 0a 20 20 72 65 67 4f 66 66 73 65 74 20 3d  t;.  regOffset =
10b60 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 70   p->iOffset;.  p
10b70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4f  ->pLimit = p->pO
10b80 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 70 2d 3e  ffset = 0;.  p->
10b90 69 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4f 66 66  iLimit = p->iOff
10ba0 73 65 74 20 3d 20 30 3b 0a 20 20 70 4f 72 64 65  set = 0;.  pOrde
10bb0 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
10bc0 79 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20  y;..  /* Locate 
10bd0 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
10be0 72 20 6f 66 20 74 68 65 20 43 75 72 72 65 6e 74  r of the Current
10bf0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28   table */.  for(
10c00 69 3d 30 3b 20 41 4c 57 41 59 53 28 69 3c 70 53  i=0; ALWAYS(i<pS
10c10 72 63 2d 3e 6e 53 72 63 29 3b 20 69 2b 2b 29 7b  rc->nSrc); i++){
10c20 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 61  .    if( pSrc->a
10c30 5b 69 5d 2e 69 73 52 65 63 75 72 73 69 76 65 20  [i].isRecursive 
10c40 29 7b 0a 20 20 20 20 20 20 69 43 75 72 72 65 6e  ){.      iCurren
10c50 74 20 3d 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 69  t = pSrc->a[i].i
10c60 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 62 72  Cursor;.      br
10c70 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
10c80 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 63 75    /* Allocate cu
10c90 72 73 6f 72 73 20 6e 75 6d 62 65 72 73 20 66 6f  rsors numbers fo
10ca0 72 20 51 75 65 75 65 20 61 6e 64 20 44 69 73 74  r Queue and Dist
10cb0 69 6e 63 74 2e 20 20 54 68 65 20 63 75 72 73 6f  inct.  The curso
10cc0 72 20 6e 75 6d 62 65 72 20 66 6f 72 0a 20 20 2a  r number for.  *
10cd0 2a 20 74 68 65 20 44 69 73 74 69 6e 63 74 20 74  * the Distinct t
10ce0 61 62 6c 65 20 6d 75 73 74 20 62 65 20 65 78 61  able must be exa
10cf0 63 74 6c 79 20 6f 6e 65 20 67 72 65 61 74 65 72  ctly one greater
10d00 20 74 68 61 6e 20 51 75 65 75 65 20 69 6e 20 6f   than Queue in o
10d10 72 64 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68  rder.  ** for th
10d20 65 20 53 52 54 5f 44 69 73 74 46 69 66 6f 20 61  e SRT_DistFifo a
10d30 6e 64 20 53 52 54 5f 44 69 73 74 51 75 65 75 65  nd SRT_DistQueue
10d40 20 64 65 73 74 69 6e 61 74 69 6f 6e 73 20 74 6f   destinations to
10d50 20 77 6f 72 6b 2e 20 2a 2f 0a 20 20 69 51 75 65   work. */.  iQue
10d60 75 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ue = pParse->nTa
10d70 62 2b 2b 3b 0a 20 20 69 66 28 20 70 2d 3e 6f 70  b++;.  if( p->op
10d80 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20  ==TK_UNION ){.  
10d90 20 20 65 44 65 73 74 20 3d 20 70 4f 72 64 65 72    eDest = pOrder
10da0 42 79 20 3f 20 53 52 54 5f 44 69 73 74 51 75 65  By ? SRT_DistQue
10db0 75 65 20 3a 20 53 52 54 5f 44 69 73 74 46 69 66  ue : SRT_DistFif
10dc0 6f 3b 0a 20 20 20 20 69 44 69 73 74 69 6e 63 74  o;.    iDistinct
10dd0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
10de0 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  +;.  }else{.    
10df0 65 44 65 73 74 20 3d 20 70 4f 72 64 65 72 42 79  eDest = pOrderBy
10e00 20 3f 20 53 52 54 5f 51 75 65 75 65 20 3a 20 53   ? SRT_Queue : S
10e10 52 54 5f 46 69 66 6f 3b 0a 20 20 7d 0a 20 20 73  RT_Fifo;.  }.  s
10e20 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
10e30 49 6e 69 74 28 26 64 65 73 74 51 75 65 75 65 2c  Init(&destQueue,
10e40 20 65 44 65 73 74 2c 20 69 51 75 65 75 65 29 3b   eDest, iQueue);
10e50 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
10e60 63 75 72 73 6f 72 73 20 66 6f 72 20 43 75 72 72  cursors for Curr
10e70 65 6e 74 2c 20 51 75 65 75 65 2c 20 61 6e 64 20  ent, Queue, and 
10e80 44 69 73 74 69 6e 63 74 2e 20 2a 2f 0a 20 20 72  Distinct. */.  r
10e90 65 67 43 75 72 72 65 6e 74 20 3d 20 2b 2b 70 50  egCurrent = ++pP
10ea0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71  arse->nMem;.  sq
10eb0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
10ec0 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f  v, OP_OpenPseudo
10ed0 2c 20 69 43 75 72 72 65 6e 74 2c 20 72 65 67 43  , iCurrent, regC
10ee0 75 72 72 65 6e 74 2c 20 6e 43 6f 6c 29 3b 0a 20  urrent, nCol);. 
10ef0 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
10f00 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
10f10 65 79 49 6e 66 6f 20 3d 20 6d 75 6c 74 69 53 65  eyInfo = multiSe
10f20 6c 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e  lectOrderByKeyIn
10f30 66 6f 28 70 50 61 72 73 65 2c 20 70 2c 20 31 29  fo(pParse, p, 1)
10f40 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
10f50 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
10f60 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69 51 75  enEphemeral, iQu
10f70 65 75 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e  eue, pOrderBy->n
10f80 45 78 70 72 2b 32 2c 20 30 2c 0a 20 20 20 20 20  Expr+2, 0,.     
10f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10fa0 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
10fb0 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
10fc0 20 20 20 64 65 73 74 51 75 65 75 65 2e 70 4f 72     destQueue.pOr
10fd0 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
10fe0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
10ff0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
11000 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
11010 65 72 61 6c 2c 20 69 51 75 65 75 65 2c 20 6e 43  eral, iQueue, nC
11020 6f 6c 29 3b 0a 20 20 7d 0a 20 20 56 64 62 65 43  ol);.  }.  VdbeC
11030 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 51 75 65 75  omment((v, "Queu
11040 65 20 74 61 62 6c 65 22 29 29 3b 0a 20 20 69 66  e table"));.  if
11050 28 20 69 44 69 73 74 69 6e 63 74 20 29 7b 0a 20  ( iDistinct ){. 
11060 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70     p->addrOpenEp
11070 68 6d 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 56  hm[0] = sqlite3V
11080 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
11090 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69  OpenEphemeral, i
110a0 44 69 73 74 69 6e 63 74 2c 20 30 29 3b 0a 20 20  Distinct, 0);.  
110b0 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d    p->selFlags |=
110c0 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61   SF_UsesEphemera
110d0 6c 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74  l;.  }..  /* Det
110e0 61 63 68 20 74 68 65 20 4f 52 44 45 52 20 42 59  ach the ORDER BY
110f0 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65   clause from the
11100 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
11110 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42   */.  p->pOrderB
11120 79 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53 74 6f  y = 0;..  /* Sto
11130 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  re the results o
11140 66 20 74 68 65 20 73 65 74 75 70 2d 71 75 65 72  f the setup-quer
11150 79 20 69 6e 20 51 75 65 75 65 2e 20 2a 2f 0a 20  y in Queue. */. 
11160 20 70 53 65 74 75 70 2d 3e 70 4e 65 78 74 20 3d   pSetup->pNext =
11170 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   0;.  rc = sqlit
11180 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
11190 20 70 53 65 74 75 70 2c 20 26 64 65 73 74 51 75   pSetup, &destQu
111a0 65 75 65 29 3b 0a 20 20 70 53 65 74 75 70 2d 3e  eue);.  pSetup->
111b0 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 69 66 28  pNext = p;.  if(
111c0 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 6f   rc ) goto end_o
111d0 66 5f 72 65 63 75 72 73 69 76 65 5f 71 75 65 72  f_recursive_quer
111e0 79 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68  y;..  /* Find th
111f0 65 20 6e 65 78 74 20 72 6f 77 20 69 6e 20 74 68  e next row in th
11200 65 20 51 75 65 75 65 20 61 6e 64 20 6f 75 74 70  e Queue and outp
11210 75 74 20 74 68 61 74 20 72 6f 77 20 2a 2f 0a 20  ut that row */. 
11220 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74   addrTop = sqlit
11230 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
11240 4f 50 5f 52 65 77 69 6e 64 2c 20 69 51 75 65 75  OP_Rewind, iQueu
11250 65 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 20 56  e, addrBreak); V
11260 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
11270 0a 20 20 2f 2a 20 54 72 61 6e 73 66 65 72 20 74  .  /* Transfer t
11280 68 65 20 6e 65 78 74 20 72 6f 77 20 69 6e 20 51  he next row in Q
11290 75 65 75 65 20 6f 76 65 72 20 74 6f 20 43 75 72  ueue over to Cur
112a0 72 65 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  rent */.  sqlite
112b0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
112c0 50 5f 4e 75 6c 6c 52 6f 77 2c 20 69 43 75 72 72  P_NullRow, iCurr
112d0 65 6e 74 29 3b 20 2f 2a 20 54 6f 20 72 65 73 65  ent); /* To rese
112e0 74 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 2a  t column cache *
112f0 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  /.  if( pOrderBy
11300 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
11310 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
11320 43 6f 6c 75 6d 6e 2c 20 69 51 75 65 75 65 2c 20  Column, iQueue, 
11330 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b  pOrderBy->nExpr+
11340 31 2c 20 72 65 67 43 75 72 72 65 6e 74 29 3b 0a  1, regCurrent);.
11350 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
11360 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
11370 2c 20 4f 50 5f 52 6f 77 44 61 74 61 2c 20 69 51  , OP_RowData, iQ
11380 75 65 75 65 2c 20 72 65 67 43 75 72 72 65 6e 74  ueue, regCurrent
11390 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
113a0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
113b0 5f 44 65 6c 65 74 65 2c 20 69 51 75 65 75 65 29  _Delete, iQueue)
113c0 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 74  ;..  /* Output t
113d0 68 65 20 73 69 6e 67 6c 65 20 72 6f 77 20 69 6e  he single row in
113e0 20 43 75 72 72 65 6e 74 20 2a 2f 0a 20 20 61 64   Current */.  ad
113f0 64 72 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33  drCont = sqlite3
11400 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
11410 3b 0a 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76  ;.  codeOffset(v
11420 2c 20 72 65 67 4f 66 66 73 65 74 2c 20 61 64 64  , regOffset, add
11430 72 43 6f 6e 74 29 3b 0a 20 20 73 65 6c 65 63 74  rCont);.  select
11440 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
11450 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  , p, p->pEList, 
11460 69 43 75 72 72 65 6e 74 2c 0a 20 20 20 20 20 20  iCurrent,.      
11470 30 2c 20 30 2c 20 70 44 65 73 74 2c 20 61 64 64  0, 0, pDest, add
11480 72 43 6f 6e 74 2c 20 61 64 64 72 42 72 65 61 6b  rCont, addrBreak
11490 29 3b 0a 20 20 69 66 28 20 72 65 67 4c 69 6d 69  );.  if( regLimi
114a0 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
114b0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
114c0 5f 49 66 5a 65 72 6f 2c 20 72 65 67 4c 69 6d 69  _IfZero, regLimi
114d0 74 2c 20 61 64 64 72 42 72 65 61 6b 2c 20 2d 31  t, addrBreak, -1
114e0 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
114f0 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71  age(v);.  }.  sq
11500 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
11510 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 43 6f 6e  Label(v, addrCon
11520 74 29 3b 0a 0a 20 20 2f 2a 20 45 78 65 63 75 74  t);..  /* Execut
11530 65 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20  e the recursive 
11540 53 45 4c 45 43 54 20 74 61 6b 69 6e 67 20 74 68  SELECT taking th
11550 65 20 73 69 6e 67 6c 65 20 72 6f 77 20 69 6e 20  e single row in 
11560 43 75 72 72 65 6e 74 20 61 73 0a 20 20 2a 2a 20  Current as.  ** 
11570 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68  the value for th
11580 65 20 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c  e recursive-tabl
11590 65 2e 20 53 74 6f 72 65 20 74 68 65 20 72 65 73  e. Store the res
115a0 75 6c 74 73 20 69 6e 20 74 68 65 20 51 75 65 75  ults in the Queu
115b0 65 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 50 72  e..  */.  p->pPr
115c0 69 6f 72 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ior = 0;.  sqlit
115d0 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
115e0 20 70 2c 20 26 64 65 73 74 51 75 65 75 65 29 3b   p, &destQueue);
115f0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50  .  assert( p->pP
11600 72 69 6f 72 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e  rior==0 );.  p->
11610 70 50 72 69 6f 72 20 3d 20 70 53 65 74 75 70 3b  pPrior = pSetup;
11620 0a 0a 20 20 2f 2a 20 4b 65 65 70 20 72 75 6e 6e  ..  /* Keep runn
11630 69 6e 67 20 74 68 65 20 6c 6f 6f 70 20 75 6e 74  ing the loop unt
11640 69 6c 20 74 68 65 20 51 75 65 75 65 20 69 73 20  il the Queue is 
11650 65 6d 70 74 79 20 2a 2f 0a 20 20 73 71 6c 69 74  empty */.  sqlit
11660 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
11670 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72  OP_Goto, 0, addr
11680 54 6f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  Top);.  sqlite3V
11690 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
116a0 76 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 0a  v, addrBreak);..
116b0 65 6e 64 5f 6f 66 5f 72 65 63 75 72 73 69 76 65  end_of_recursive
116c0 5f 71 75 65 72 79 3a 0a 20 20 73 71 6c 69 74 65  _query:.  sqlite
116d0 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
116e0 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70  pParse->db, p->p
116f0 4f 72 64 65 72 42 79 29 3b 0a 20 20 70 2d 3e 70  OrderBy);.  p->p
11700 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
11710 42 79 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20  By;.  p->pLimit 
11720 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e 70  = pLimit;.  p->p
11730 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74  Offset = pOffset
11740 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65  ;.  return;.}.#e
11750 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
11760 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a 2f 2a 20 46  MIT_CTE */../* F
11770 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
11780 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s */.static int 
11790 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72  multiSelectOrder
117a0 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  By(.  Parse *pPa
117b0 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
117c0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
117d0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
117e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
117f0 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53   right-most of S
11800 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64  ELECTs to be cod
11810 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ed */.  SelectDe
11820 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a  st *pDest     /*
11830 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
11840 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
11850 2f 0a 29 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  /.);.../*.** Thi
11860 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
11870 6c 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 61  led to process a
11880 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20   compound query 
11890 66 6f 72 6d 20 66 72 6f 6d 0a 2a 2a 20 74 77 6f  form from.** two
118a0 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74   or more separat
118b0 65 20 71 75 65 72 69 65 73 20 75 73 69 6e 67 20  e queries using 
118c0 55 4e 49 4f 4e 2c 20 55 4e 49 4f 4e 20 41 4c 4c  UNION, UNION ALL
118d0 2c 20 45 58 43 45 50 54 2c 20 6f 72 0a 2a 2a 20  , EXCEPT, or.** 
118e0 49 4e 54 45 52 53 45 43 54 0a 2a 2a 0a 2a 2a 20  INTERSECT.**.** 
118f0 22 70 22 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  "p" points to th
11900 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20  e right-most of 
11910 74 68 65 20 74 77 6f 20 71 75 65 72 69 65 73 2e  the two queries.
11920 20 20 74 68 65 20 71 75 65 72 79 20 6f 6e 20 74    the query on t
11930 68 65 0a 2a 2a 20 6c 65 66 74 20 69 73 20 70 2d  he.** left is p-
11940 3e 70 50 72 69 6f 72 2e 20 20 54 68 65 20 6c 65  >pPrior.  The le
11950 66 74 20 71 75 65 72 79 20 63 6f 75 6c 64 20 61  ft query could a
11960 6c 73 6f 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e  lso be a compoun
11970 64 20 71 75 65 72 79 0a 2a 2a 20 69 6e 20 77 68  d query.** in wh
11980 69 63 68 20 63 61 73 65 20 74 68 69 73 20 72 6f  ich case this ro
11990 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61  utine will be ca
119a0 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c 79  lled recursively
119b0 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73  . .**.** The res
119c0 75 6c 74 73 20 6f 66 20 74 68 65 20 74 6f 74 61  ults of the tota
119d0 6c 20 71 75 65 72 79 20 61 72 65 20 74 6f 20 62  l query are to b
119e0 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 61  e written into a
119f0 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20   destination.** 
11a00 6f 66 20 74 79 70 65 20 65 44 65 73 74 20 77 69  of type eDest wi
11a10 74 68 20 70 61 72 61 6d 65 74 65 72 20 69 50 61  th parameter iPa
11a20 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c  rm..**.** Exampl
11a30 65 20 31 3a 20 20 43 6f 6e 73 69 64 65 72 20 61  e 1:  Consider a
11a40 20 74 68 72 65 65 2d 77 61 79 20 63 6f 6d 70 6f   three-way compo
11a50 75 6e 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  und SQL statemen
11a60 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  t..**.**     SEL
11a70 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20 55 4e  ECT a FROM t1 UN
11a80 49 4f 4e 20 53 45 4c 45 43 54 20 62 20 46 52 4f  ION SELECT b FRO
11a90 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43  M t2 UNION SELEC
11aa0 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 0a 2a  T c FROM t3.**.*
11ab0 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74  * This statement
11ac0 20 69 73 20 70 61 72 73 65 64 20 75 70 20 61 73   is parsed up as
11ad0 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
11ae0 20 20 20 20 53 45 4c 45 43 54 20 63 20 46 52 4f      SELECT c FRO
11af0 4d 20 74 33 0a 2a 2a 20 20 20 20 20 20 7c 0a 2a  M t3.**      |.*
11b00 2a 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 3e 20 20  *      `----->  
11b10 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32  SELECT b FROM t2
11b20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
11b30 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
11b40 20 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 2d 3e 20         `------> 
11b50 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74   SELECT a FROM t
11b60 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 72 6f  1.**.** The arro
11b70 77 73 20 69 6e 20 74 68 65 20 64 69 61 67 72 61  ws in the diagra
11b80 6d 20 61 62 6f 76 65 20 72 65 70 72 65 73 65 6e  m above represen
11b90 74 20 74 68 65 20 53 65 6c 65 63 74 2e 70 50 72  t the Select.pPr
11ba0 69 6f 72 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 20  ior pointer..** 
11bb0 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  So if this routi
11bc0 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74  ne is called wit
11bd0 68 20 70 20 65 71 75 61 6c 20 74 6f 20 74 68 65  h p equal to the
11be0 20 74 33 20 71 75 65 72 79 2c 20 74 68 65 6e 0a   t3 query, then.
11bf0 2a 2a 20 70 50 72 69 6f 72 20 77 69 6c 6c 20 62  ** pPrior will b
11c00 65 20 74 68 65 20 74 32 20 71 75 65 72 79 2e 20  e the t2 query. 
11c10 20 70 2d 3e 6f 70 20 77 69 6c 6c 20 62 65 20 54   p->op will be T
11c20 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74 68 69 73 20  K_UNION in this 
11c30 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69  case..**.** Noti
11c40 63 65 20 74 68 61 74 20 62 65 63 61 75 73 65 20  ce that because 
11c50 6f 66 20 74 68 65 20 77 61 79 20 53 51 4c 69 74  of the way SQLit
11c60 65 20 70 61 72 73 65 73 20 63 6f 6d 70 6f 75 6e  e parses compoun
11c70 64 20 53 45 4c 45 43 54 73 2c 20 74 68 65 0a 2a  d SELECTs, the.*
11c80 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 73 65 6c  * individual sel
11c90 65 63 74 73 20 61 6c 77 61 79 73 20 67 72 6f 75  ects always grou
11ca0 70 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72  p from left to r
11cb0 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ight..*/.static 
11cc0 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 28  int multiSelect(
11cd0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
11ce0 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
11cf0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
11d00 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
11d10 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
11d20 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45  ght-most of SELE
11d30 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20  CTs to be coded 
11d40 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
11d50 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68  *pDest     /* Wh
11d60 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75  at to do with qu
11d70 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29  ery results */.)
11d80 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
11d90 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20 53 75 63  ITE_OK;   /* Suc
11da0 63 65 73 73 20 63 6f 64 65 20 66 72 6f 6d 20 61  cess code from a
11db0 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
11dc0 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b   Select *pPrior;
11dd0 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65         /* Anothe
11de0 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69 61  r SELECT immedia
11df0 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66 74  tely to our left
11e00 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
11e10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47              /* G
11e20 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
11e30 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 53  this VDBE */.  S
11e40 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 20  electDest dest; 
11e50 20 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74       /* Alternat
11e60 69 76 65 20 64 61 74 61 20 64 65 73 74 69 6e 61  ive data destina
11e70 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74  tion */.  Select
11e80 20 2a 70 44 65 6c 65 74 65 20 3d 20 30 3b 20 20   *pDelete = 0;  
11e90 2f 2a 20 43 68 61 69 6e 20 6f 66 20 73 69 6d 70  /* Chain of simp
11ea0 6c 65 20 73 65 6c 65 63 74 73 20 74 6f 20 64 65  le selects to de
11eb0 6c 65 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  lete */.  sqlite
11ec0 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
11ed0 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
11ee0 65 63 74 69 6f 6e 20 2a 2f 0a 23 69 66 6e 64 65  ection */.#ifnde
11ef0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
11f00 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69 53 75 62  PLAIN.  int iSub
11f10 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  1 = 0;        /*
11f20 20 45 51 50 20 69 64 20 6f 66 20 6c 65 66 74 2d   EQP id of left-
11f30 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 20 20  hand query */.  
11f40 69 6e 74 20 69 53 75 62 32 20 3d 20 30 3b 20 20  int iSub2 = 0;  
11f50 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20        /* EQP id 
11f60 6f 66 20 72 69 67 68 74 2d 68 61 6e 64 20 71 75  of right-hand qu
11f70 65 72 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20  ery */.#endif.. 
11f80 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
11f90 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20  ere is no ORDER 
11fa0 42 59 20 6f 72 20 4c 49 4d 49 54 20 63 6c 61 75  BY or LIMIT clau
11fb0 73 65 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45  se on prior SELE
11fc0 43 54 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20  CTs.  Only.  ** 
11fd0 74 68 65 20 6c 61 73 74 20 28 72 69 67 68 74 2d  the last (right-
11fe0 6d 6f 73 74 29 20 53 45 4c 45 43 54 20 69 6e 20  most) SELECT in 
11ff0 74 68 65 20 73 65 72 69 65 73 20 6d 61 79 20 68  the series may h
12000 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20  ave an ORDER BY 
12010 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20  or LIMIT..  */. 
12020 20 61 73 73 65 72 74 28 20 70 20 26 26 20 70 2d   assert( p && p-
12030 3e 70 50 72 69 6f 72 20 29 3b 20 20 2f 2a 20 43  >pPrior );  /* C
12040 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
12050 67 75 61 72 61 6e 74 65 65 73 20 74 68 69 73 20  guarantees this 
12060 6d 75 63 68 20 2a 2f 0a 20 20 61 73 73 65 72 74  much */.  assert
12070 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
12080 20 53 46 5f 52 65 63 75 72 73 69 76 65 29 3d 3d   SF_Recursive)==
12090 30 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41  0 || p->op==TK_A
120a0 4c 4c 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  LL || p->op==TK_
120b0 55 4e 49 4f 4e 20 29 3b 0a 20 20 64 62 20 3d 20  UNION );.  db = 
120c0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 50  pParse->db;.  pP
120d0 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72  rior = p->pPrior
120e0 3b 0a 20 20 64 65 73 74 20 3d 20 2a 70 44 65 73  ;.  dest = *pDes
120f0 74 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d  t;.  if( pPrior-
12100 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
12110 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
12120 28 70 50 61 72 73 65 2c 22 4f 52 44 45 52 20 42  (pParse,"ORDER B
12130 59 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20  Y clause should 
12140 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f  come after %s no
12150 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20  t before",.     
12160 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d   selectOpName(p-
12170 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  >op));.    rc = 
12180 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  1;.    goto mult
12190 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
121a0 7d 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e  }.  if( pPrior->
121b0 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71  pLimit ){.    sq
121c0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
121d0 61 72 73 65 2c 22 4c 49 4d 49 54 20 63 6c 61 75  arse,"LIMIT clau
121e0 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61  se should come a
121f0 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f  fter %s not befo
12200 72 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63  re",.      selec
12210 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b  tOpName(p->op));
12220 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20  .    rc = 1;.   
12230 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
12240 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 76  ct_end;.  }..  v
12250 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
12260 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73  e(pParse);.  ass
12270 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20 2f 2a  ert( v!=0 );  /*
12280 20 54 68 65 20 56 44 42 45 20 61 6c 72 65 61 64   The VDBE alread
12290 79 20 63 72 65 61 74 65 64 20 62 79 20 63 61 6c  y created by cal
122a0 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  ling function */
122b0 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68  ..  /* Create th
122c0 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 65  e destination te
122d0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 66  mporary table if
122e0 20 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2f 0a   necessary.  */.
122f0 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74    if( dest.eDest
12300 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29  ==SRT_EphemTab )
12310 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
12320 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 73  >pEList );.    s
12330 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
12340 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
12350 65 72 61 6c 2c 20 64 65 73 74 2e 69 53 44 50 61  eral, dest.iSDPa
12360 72 6d 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  rm, p->pEList->n
12370 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  Expr);.    sqlit
12380 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
12390 2c 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45  , BTREE_UNORDERE
123a0 44 29 3b 0a 20 20 20 20 64 65 73 74 2e 65 44 65  D);.    dest.eDe
123b0 73 74 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a  st = SRT_Table;.
123c0 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
123d0 75 72 65 20 61 6c 6c 20 53 45 4c 45 43 54 73 20  ure all SELECTs 
123e0 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
123f0 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e   have the same n
12400 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
12410 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 69 72 20  s.  ** in their 
12420 72 65 73 75 6c 74 20 73 65 74 73 2e 0a 20 20 2a  result sets..  *
12430 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  /.  assert( p->p
12440 45 4c 69 73 74 20 26 26 20 70 50 72 69 6f 72 2d  EList && pPrior-
12450 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 69 66 28  >pEList );.  if(
12460 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
12470 72 21 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73  r!=pPrior->pELis
12480 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
12490 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
124a0 26 20 53 46 5f 56 61 6c 75 65 73 20 29 7b 0a 20  & SF_Values ){. 
124b0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
124c0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 6c  rMsg(pParse, "al
124d0 6c 20 56 41 4c 55 45 53 20 6d 75 73 74 20 68 61  l VALUES must ha
124e0 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  ve the same numb
124f0 65 72 20 6f 66 20 74 65 72 6d 73 22 29 3b 0a 20  er of terms");. 
12500 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12510 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
12520 70 50 61 72 73 65 2c 20 22 53 45 4c 45 43 54 73  pParse, "SELECTs
12530 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6e 64   to the left and
12540 20 72 69 67 68 74 20 6f 66 20 25 73 22 0a 20 20   right of %s".  
12550 20 20 20 20 20 20 22 20 64 6f 20 6e 6f 74 20 68        " do not h
12560 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  ave the same num
12570 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
12580 6c 75 6d 6e 73 22 2c 20 73 65 6c 65 63 74 4f 70  lumns", selectOp
12590 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20  Name(p->op));.  
125a0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a    }.    rc = 1;.
125b0 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
125c0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a  elect_end;.  }..
125d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
125e0 4d 49 54 5f 43 54 45 0a 20 20 69 66 28 20 70 2d  MIT_CTE.  if( p-
125f0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52  >selFlags & SF_R
12600 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20  ecursive ){.    
12610 67 65 6e 65 72 61 74 65 57 69 74 68 52 65 63 75  generateWithRecu
12620 72 73 69 76 65 51 75 65 72 79 28 70 50 61 72 73  rsiveQuery(pPars
12630 65 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20  e, p, &dest);.  
12640 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20  }else.#endif..  
12650 2f 2a 20 43 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  /* Compound SELE
12660 43 54 73 20 74 68 61 74 20 68 61 76 65 20 61 6e  CTs that have an
12670 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
12680 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65 70   are handled sep
12690 61 72 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20  arately..  */.  
126a0 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
126b0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 75  ){.    return mu
126c0 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79  ltiSelectOrderBy
126d0 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73  (pParse, p, pDes
126e0 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f  t);.  }else..  /
126f0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
12700 66 6f 72 20 74 68 65 20 6c 65 66 74 20 61 6e 64  for the left and
12710 20 72 69 67 68 74 20 53 45 4c 45 43 54 20 73 74   right SELECT st
12720 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20  atements..  */. 
12730 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29   switch( p->op )
12740 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c  {.    case TK_AL
12750 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61  L: {.      int a
12760 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  ddr = 0;.      i
12770 6e 74 20 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20  nt nLimit;.     
12780 20 61 73 73 65 72 74 28 20 21 70 50 72 69 6f 72   assert( !pPrior
12790 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a 20 20 20 20  ->pLimit );.    
127a0 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74    pPrior->iLimit
127b0 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20   = p->iLimit;.  
127c0 20 20 20 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66      pPrior->iOff
127d0 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74  set = p->iOffset
127e0 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e  ;.      pPrior->
127f0 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d  pLimit = p->pLim
12800 69 74 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72  it;.      pPrior
12810 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70  ->pOffset = p->p
12820 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 65 78  Offset;.      ex
12830 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
12840 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69  iSub1, pParse->i
12850 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20  NextSelectId);. 
12860 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
12870 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
12880 70 50 72 69 6f 72 2c 20 26 64 65 73 74 29 3b 0a  pPrior, &dest);.
12890 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20        p->pLimit 
128a0 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f  = 0;.      p->pO
128b0 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  ffset = 0;.     
128c0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
128d0 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
128e0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
128f0 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  }.      p->pPrio
12900 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  r = 0;.      p->
12910 69 4c 69 6d 69 74 20 3d 20 70 50 72 69 6f 72 2d  iLimit = pPrior-
12920 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70  >iLimit;.      p
12930 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70 50 72 69  ->iOffset = pPri
12940 6f 72 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20  or->iOffset;.   
12950 20 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74     if( p->iLimit
12960 20 29 7b 0a 20 20 20 20 20 20 20 20 61 64 64 72   ){.        addr
12970 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
12980 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 5a 65 72  dOp1(v, OP_IfZer
12990 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 29 3b 20 56  o, p->iLimit); V
129a0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
129b0 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
129c0 65 6e 74 28 28 76 2c 20 22 4a 75 6d 70 20 61 68  ent((v, "Jump ah
129d0 65 61 64 20 69 66 20 4c 49 4d 49 54 20 72 65 61  ead if LIMIT rea
129e0 63 68 65 64 22 29 29 3b 0a 20 20 20 20 20 20 7d  ched"));.      }
129f0 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65  .      explainSe
12a00 74 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20  tInteger(iSub2, 
12a10 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
12a20 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63  ectId);.      rc
12a30 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
12a40 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73  (pParse, p, &des
12a50 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  t);.      testca
12a60 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
12a70 4b 20 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65  K );.      pDele
12a80 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a  te = p->pPrior;.
12a90 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
12aa0 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  = pPrior;.      
12ab0 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 2b 3d  p->nSelectRow +=
12ac0 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74   pPrior->nSelect
12ad0 52 6f 77 3b 0a 20 20 20 20 20 20 69 66 28 20 70  Row;.      if( p
12ae0 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 0a 20 20  Prior->pLimit.  
12af0 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 45       && sqlite3E
12b00 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 50 72  xprIsInteger(pPr
12b10 69 6f 72 2d 3e 70 4c 69 6d 69 74 2c 20 26 6e 4c  ior->pLimit, &nL
12b20 69 6d 69 74 29 0a 20 20 20 20 20 20 20 26 26 20  imit).       && 
12b30 6e 4c 69 6d 69 74 3e 30 20 26 26 20 70 2d 3e 6e  nLimit>0 && p->n
12b40 53 65 6c 65 63 74 52 6f 77 20 3e 20 28 75 36 34  SelectRow > (u64
12b50 29 6e 4c 69 6d 69 74 20 0a 20 20 20 20 20 20 29  )nLimit .      )
12b60 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 65  {.        p->nSe
12b70 6c 65 63 74 52 6f 77 20 3d 20 6e 4c 69 6d 69 74  lectRow = nLimit
12b80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12b90 69 66 28 20 61 64 64 72 20 29 7b 0a 20 20 20 20  if( addr ){.    
12ba0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
12bb0 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29  umpHere(v, addr)
12bc0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12bd0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
12be0 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a   case TK_EXCEPT:
12bf0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4e 49  .    case TK_UNI
12c00 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ON: {.      int 
12c10 75 6e 69 6f 6e 54 61 62 3b 20 20 20 20 2f 2a 20  unionTab;    /* 
12c20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  Cursor number of
12c30 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
12c40 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20 72 65 73  able holding res
12c50 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20 75 38 20  ult */.      u8 
12c60 6f 70 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  op = 0;       /*
12c70 20 4f 6e 65 20 6f 66 20 74 68 65 20 53 52 54 5f   One of the SRT_
12c80 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 61   operations to a
12c90 70 70 6c 79 20 74 6f 20 73 65 6c 66 20 2a 2f 0a  pply to self */.
12ca0 20 20 20 20 20 20 69 6e 74 20 70 72 69 6f 72 4f        int priorO
12cb0 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 53 52  p;     /* The SR
12cc0 54 5f 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20  T_ operation to 
12cd0 61 70 70 6c 79 20 74 6f 20 70 72 69 6f 72 20 73  apply to prior s
12ce0 65 6c 65 63 74 73 20 2a 2f 0a 20 20 20 20 20 20  elects */.      
12cf0 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70  Expr *pLimit, *p
12d00 4f 66 66 73 65 74 3b 20 2f 2a 20 53 61 76 65 64  Offset; /* Saved
12d10 20 76 61 6c 75 65 73 20 6f 66 20 70 2d 3e 6e 4c   values of p->nL
12d20 69 6d 69 74 20 61 6e 64 20 70 2d 3e 6e 4f 66 66  imit and p->nOff
12d30 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  set */.      int
12d40 20 61 64 64 72 3b 0a 20 20 20 20 20 20 53 65 6c   addr;.      Sel
12d50 65 63 74 44 65 73 74 20 75 6e 69 6f 6e 64 65 73  ectDest uniondes
12d60 74 3b 0a 0a 20 20 20 20 20 20 74 65 73 74 63 61  t;..      testca
12d70 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58  se( p->op==TK_EX
12d80 43 45 50 54 20 29 3b 0a 20 20 20 20 20 20 74 65  CEPT );.      te
12d90 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54  stcase( p->op==T
12da0 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20  K_UNION );.     
12db0 20 70 72 69 6f 72 4f 70 20 3d 20 53 52 54 5f 55   priorOp = SRT_U
12dc0 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28 20  nion;.      if( 
12dd0 64 65 73 74 2e 65 44 65 73 74 3d 3d 70 72 69 6f  dest.eDest==prio
12de0 72 4f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  rOp ){.        /
12df0 2a 20 57 65 20 63 61 6e 20 72 65 75 73 65 20 61  * We can reuse a
12e00 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
12e10 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 61 20   generated by a 
12e20 53 45 4c 45 43 54 20 74 6f 20 6f 75 72 0a 20 20  SELECT to our.  
12e30 20 20 20 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a        ** right..
12e40 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
12e50 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4c     assert( p->pL
12e60 69 6d 69 74 3d 3d 30 20 29 3b 20 20 20 20 20 20  imit==0 );      
12e70 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f  /* Not allowed o
12e80 6e 20 6c 65 66 74 77 61 72 64 20 65 6c 65 6d 65  n leftward eleme
12e90 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  nts */.        a
12ea0 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65  ssert( p->pOffse
12eb0 74 3d 3d 30 20 29 3b 20 20 20 20 20 2f 2a 20 4e  t==0 );     /* N
12ec0 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65  ot allowed on le
12ed0 66 74 77 61 72 64 20 65 6c 65 6d 65 6e 74 73 20  ftward elements 
12ee0 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e  */.        union
12ef0 54 61 62 20 3d 20 64 65 73 74 2e 69 53 44 50 61  Tab = dest.iSDPa
12f00 72 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  rm;.      }else{
12f10 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 77  .        /* We w
12f20 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 72 65 61  ill need to crea
12f30 74 65 20 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f  te our own tempo
12f40 72 61 72 79 20 74 61 62 6c 65 20 74 6f 20 68 6f  rary table to ho
12f50 6c 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  ld the.        *
12f60 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72  * intermediate r
12f70 65 73 75 6c 74 73 2e 0a 20 20 20 20 20 20 20 20  esults..        
12f80 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e  */.        union
12f90 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Tab = pParse->nT
12fa0 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73  ab++;.        as
12fb0 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42  sert( p->pOrderB
12fc0 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  y==0 );.        
12fd0 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
12fe0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
12ff0 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 75 6e  penEphemeral, un
13000 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20  ionTab, 0);.    
13010 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
13020 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
13030 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  = -1 );.        
13040 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
13050 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20  0] = addr;.     
13060 20 20 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74     findRightmost
13070 28 70 29 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d  (p)->selFlags |=
13080 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61   SF_UsesEphemera
13090 6c 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  l;.        asser
130a0 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
130b0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
130c0 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43  * Code the SELEC
130d0 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  T statements to 
130e0 6f 75 72 20 6c 65 66 74 0a 20 20 20 20 20 20 2a  our left.      *
130f0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
13100 21 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42  !pPrior->pOrderB
13110 79 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  y );.      sqlit
13120 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
13130 28 26 75 6e 69 6f 6e 64 65 73 74 2c 20 70 72 69  (&uniondest, pri
13140 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54 61 62 29 3b  orOp, unionTab);
13150 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65  .      explainSe
13160 74 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20  tInteger(iSub1, 
13170 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
13180 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63  ectId);.      rc
13190 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
131a0 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c  (pParse, pPrior,
131b0 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20   &uniondest);.  
131c0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
131d0 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
131e0 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
131f0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43     }..      /* C
13200 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ode the current 
13210 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
13220 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
13230 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58  if( p->op==TK_EX
13240 43 45 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20  CEPT ){.        
13250 6f 70 20 3d 20 53 52 54 5f 45 78 63 65 70 74 3b  op = SRT_Except;
13260 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
13270 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
13280 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b  >op==TK_UNION );
13290 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20 53 52  .        op = SR
132a0 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 7d  T_Union;.      }
132b0 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
132c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d   = 0;.      pLim
132d0 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a  it = p->pLimit;.
132e0 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20        p->pLimit 
132f0 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 66 66 73  = 0;.      pOffs
13300 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b  et = p->pOffset;
13310 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65  .      p->pOffse
13320 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 75 6e 69  t = 0;.      uni
13330 6f 6e 64 65 73 74 2e 65 44 65 73 74 20 3d 20 6f  ondest.eDest = o
13340 70 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e  p;.      explain
13350 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 32  SetInteger(iSub2
13360 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  , pParse->iNextS
13370 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20  electId);.      
13380 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
13390 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 75  ct(pParse, p, &u
133a0 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20  niondest);.     
133b0 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
133c0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
133d0 20 20 2f 2a 20 51 75 65 72 79 20 66 6c 61 74 74    /* Query flatt
133e0 65 6e 69 6e 67 20 69 6e 20 73 71 6c 69 74 65 33  ening in sqlite3
133f0 53 65 6c 65 63 74 28 29 20 6d 69 67 68 74 20 72  Select() might r
13400 65 66 69 6c 6c 20 70 2d 3e 70 4f 72 64 65 72 42  efill p->pOrderB
13410 79 2e 0a 20 20 20 20 20 20 2a 2a 20 42 65 20 73  y..      ** Be s
13420 75 72 65 20 74 6f 20 64 65 6c 65 74 65 20 70 2d  ure to delete p-
13430 3e 70 4f 72 64 65 72 42 79 2c 20 74 68 65 72 65  >pOrderBy, there
13440 66 6f 72 65 2c 20 74 6f 20 61 76 6f 69 64 20 61  fore, to avoid a
13450 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 2e 20 2a 2f   memory leak. */
13460 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
13470 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
13480 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20   p->pOrderBy);. 
13490 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70       pDelete = p
134a0 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  ->pPrior;.      
134b0 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
134c0 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72  or;.      p->pOr
134d0 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20  derBy = 0;.     
134e0 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55   if( p->op==TK_U
134f0 4e 49 4f 4e 20 29 20 70 2d 3e 6e 53 65 6c 65 63  NION ) p->nSelec
13500 74 52 6f 77 20 2b 3d 20 70 50 72 69 6f 72 2d 3e  tRow += pPrior->
13510 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20  nSelectRow;.    
13520 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
13530 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69  ete(db, p->pLimi
13540 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69  t);.      p->pLi
13550 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
13560 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d      p->pOffset =
13570 20 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20   pOffset;.      
13580 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  p->iLimit = 0;. 
13590 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20       p->iOffset 
135a0 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43  = 0;..      /* C
135b0 6f 6e 76 65 72 74 20 74 68 65 20 64 61 74 61 20  onvert the data 
135c0 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  in the temporary
135d0 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 61 74   table into what
135e0 65 76 65 72 20 66 6f 72 6d 0a 20 20 20 20 20 20  ever form.      
135f0 2a 2a 20 69 74 20 69 73 20 74 68 61 74 20 77 65  ** it is that we
13600 20 63 75 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e   currently need.
13610 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
13620 61 73 73 65 72 74 28 20 75 6e 69 6f 6e 54 61 62  assert( unionTab
13630 3d 3d 64 65 73 74 2e 69 53 44 50 61 72 6d 20 7c  ==dest.iSDParm |
13640 7c 20 64 65 73 74 2e 65 44 65 73 74 21 3d 70 72  | dest.eDest!=pr
13650 69 6f 72 4f 70 20 29 3b 0a 20 20 20 20 20 20 69  iorOp );.      i
13660 66 28 20 64 65 73 74 2e 65 44 65 73 74 21 3d 70  f( dest.eDest!=p
13670 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20 20  riorOp ){.      
13680 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72    int iCont, iBr
13690 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20  eak, iStart;.   
136a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
136b0 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20  pEList );.      
136c0 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74    if( dest.eDest
136d0 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a  ==SRT_Output ){.
136e0 20 20 20 20 20 20 20 20 20 20 53 65 6c 65 63 74            Select
136f0 20 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20   *pFirst = p;.  
13700 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
13710 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20  First->pPrior ) 
13720 70 46 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d  pFirst = pFirst-
13730 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20  >pPrior;.       
13740 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d     generateColum
13750 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30  nNames(pParse, 0
13760 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74  , pFirst->pEList
13770 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
13780 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71       iBreak = sq
13790 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
137a0 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69  el(v);.        i
137b0 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Cont = sqlite3Vd
137c0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
137d0 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c          computeL
137e0 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
137f0 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29  arse, p, iBreak)
13800 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
13810 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
13820 50 5f 52 65 77 69 6e 64 2c 20 75 6e 69 6f 6e 54  P_Rewind, unionT
13830 61 62 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62  ab, iBreak); Vdb
13840 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
13850 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73        iStart = s
13860 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
13870 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
13880 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
13890 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e  p(pParse, p, p->
138a0 70 45 4c 69 73 74 2c 20 75 6e 69 6f 6e 54 61 62  pEList, unionTab
138b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
138c0 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20            0, 0, 
138d0 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42  &dest, iCont, iB
138e0 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73  reak);.        s
138f0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
13900 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29  eLabel(v, iCont)
13910 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
13920 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
13930 50 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e 54 61 62  P_Next, unionTab
13940 2c 20 69 53 74 61 72 74 29 3b 20 56 64 62 65 43  , iStart); VdbeC
13950 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
13960 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
13970 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
13980 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20  Break);.        
13990 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
139a0 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 75  2(v, OP_Close, u
139b0 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20  nionTab, 0);.   
139c0 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
139d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
139e0 75 6c 74 3a 20 61 73 73 65 72 74 28 20 70 2d 3e  ult: assert( p->
139f0 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54  op==TK_INTERSECT
13a00 20 29 3b 20 7b 0a 20 20 20 20 20 20 69 6e 74 20   ); {.      int 
13a10 74 61 62 31 2c 20 74 61 62 32 3b 0a 20 20 20 20  tab1, tab2;.    
13a20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72    int iCont, iBr
13a30 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20  eak, iStart;.   
13a40 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c     Expr *pLimit,
13a50 20 2a 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20   *pOffset;.     
13a60 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
13a70 20 53 65 6c 65 63 74 44 65 73 74 20 69 6e 74 65   SelectDest inte
13a80 72 73 65 63 74 64 65 73 74 3b 0a 20 20 20 20 20  rsectdest;.     
13a90 20 69 6e 74 20 72 31 3b 0a 0a 20 20 20 20 20 20   int r1;..      
13aa0 2f 2a 20 49 4e 54 45 52 53 45 43 54 20 69 73 20  /* INTERSECT is 
13ab0 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74  different from t
13ac0 68 65 20 6f 74 68 65 72 73 20 73 69 6e 63 65 20  he others since 
13ad0 69 74 20 72 65 71 75 69 72 65 73 0a 20 20 20 20  it requires.    
13ae0 20 20 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61    ** two tempora
13af0 72 79 20 74 61 62 6c 65 73 2e 20 20 48 65 6e 63  ry tables.  Henc
13b00 65 20 69 74 20 68 61 73 20 69 74 73 20 6f 77 6e  e it has its own
13b10 20 63 61 73 65 2e 20 20 42 65 67 69 6e 0a 20 20   case.  Begin.  
13b20 20 20 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61      ** by alloca
13b30 74 69 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20  ting the tables 
13b40 77 65 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20  we will need..  
13b50 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 61 62      */.      tab
13b60 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  1 = pParse->nTab
13b70 2b 2b 3b 0a 20 20 20 20 20 20 74 61 62 32 20 3d  ++;.      tab2 =
13b80 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
13b90 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
13ba0 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b  ->pOrderBy==0 );
13bb0 0a 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ..      addr = s
13bc0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
13bd0 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
13be0 65 72 61 6c 2c 20 74 61 62 31 2c 20 30 29 3b 0a  eral, tab1, 0);.
13bf0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
13c00 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
13c10 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20   == -1 );.      
13c20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
13c30 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20  0] = addr;.     
13c40 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70   findRightmost(p
13c50 29 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  )->selFlags |= S
13c60 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b  F_UsesEphemeral;
13c70 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
13c80 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 0a 20 20 20  ->pEList );..   
13c90 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53     /* Code the S
13ca0 45 4c 45 43 54 73 20 74 6f 20 6f 75 72 20 6c 65  ELECTs to our le
13cb0 66 74 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72  ft into temporar
13cc0 79 20 74 61 62 6c 65 20 22 74 61 62 31 22 2e 0a  y table "tab1"..
13cd0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
13ce0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
13cf0 49 6e 69 74 28 26 69 6e 74 65 72 73 65 63 74 64  Init(&intersectd
13d00 65 73 74 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20  est, SRT_Union, 
13d10 74 61 62 31 29 3b 0a 20 20 20 20 20 20 65 78 70  tab1);.      exp
13d20 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69  lainSetInteger(i
13d30 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e  Sub1, pParse->iN
13d40 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
13d50 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
13d60 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
13d70 50 72 69 6f 72 2c 20 26 69 6e 74 65 72 73 65 63  Prior, &intersec
13d80 74 64 65 73 74 29 3b 0a 20 20 20 20 20 20 69 66  tdest);.      if
13d90 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
13da0 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
13db0 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a  t_end;.      }..
13dc0 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68        /* Code th
13dd0 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54  e current SELECT
13de0 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20   into temporary 
13df0 74 61 62 6c 65 20 22 74 61 62 32 22 0a 20 20 20  table "tab2".   
13e00 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72     */.      addr
13e10 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
13e20 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
13e30 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 32 2c 20  phemeral, tab2, 
13e40 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  0);.      assert
13e50 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  ( p->addrOpenEph
13e60 6d 5b 31 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20  m[1] == -1 );.  
13e70 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45      p->addrOpenE
13e80 70 68 6d 5b 31 5d 20 3d 20 61 64 64 72 3b 0a 20  phm[1] = addr;. 
13e90 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
13ea0 20 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74   0;.      pLimit
13eb0 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20   = p->pLimit;.  
13ec0 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
13ed0 30 3b 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74  0;.      pOffset
13ee0 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20   = p->pOffset;. 
13ef0 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20       p->pOffset 
13f00 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 65 72  = 0;.      inter
13f10 73 65 63 74 64 65 73 74 2e 69 53 44 50 61 72 6d  sectdest.iSDParm
13f20 20 3d 20 74 61 62 32 3b 0a 20 20 20 20 20 20 65   = tab2;.      e
13f30 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
13f40 28 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e  (iSub2, pParse->
13f50 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
13f60 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
13f70 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
13f80 20 70 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65   p, &intersectde
13f90 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  st);.      testc
13fa0 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
13fb0 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70 44 65 6c  OK );.      pDel
13fc0 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ete = p->pPrior;
13fd0 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
13fe0 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20   = pPrior;.     
13ff0 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52   if( p->nSelectR
14000 6f 77 3e 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65  ow>pPrior->nSele
14010 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65  ctRow ) p->nSele
14020 63 74 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e  ctRow = pPrior->
14030 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20  nSelectRow;.    
14040 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
14050 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69  ete(db, p->pLimi
14060 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69  t);.      p->pLi
14070 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
14080 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d      p->pOffset =
14090 20 70 4f 66 66 73 65 74 3b 0a 0a 20 20 20 20 20   pOffset;..     
140a0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
140b0 65 20 74 6f 20 74 61 6b 65 20 74 68 65 20 69 6e  e to take the in
140c0 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 68  tersection of th
140d0 65 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a  e two temporary.
140e0 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 2e        ** tables.
140f0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
14100 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
14110 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64  t );.      if( d
14120 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 4f  est.eDest==SRT_O
14130 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20  utput ){.       
14140 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20   Select *pFirst 
14150 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 77 68 69  = p;.        whi
14160 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69  le( pFirst->pPri
14170 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20 70 46  or ) pFirst = pF
14180 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  irst->pPrior;.  
14190 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f        generateCo
141a0 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
141b0 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c  , 0, pFirst->pEL
141c0 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ist);.      }.  
141d0 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c      iBreak = sql
141e0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
141f0 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 43 6f 6e  l(v);.      iCon
14200 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
14210 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
14220 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52     computeLimitR
14230 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
14240 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20   p, iBreak);.   
14250 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14260 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
14270 64 2c 20 74 61 62 31 2c 20 69 42 72 65 61 6b 29  d, tab1, iBreak)
14280 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
14290 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
142a0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
142b0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69  pParse);.      i
142c0 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56  Start = sqlite3V
142d0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
142e0 52 6f 77 4b 65 79 2c 20 74 61 62 31 2c 20 72 31  RowKey, tab1, r1
142f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14300 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
14310 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61   OP_NotFound, ta
14320 62 32 2c 20 69 43 6f 6e 74 2c 20 72 31 2c 20 30  b2, iCont, r1, 0
14330 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
14340 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
14350 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
14360 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
14370 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f     selectInnerLo
14380 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  op(pParse, p, p-
14390 3e 70 45 4c 69 73 74 2c 20 74 61 62 31 2c 0a 20  >pEList, tab1,. 
143a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
143b0 20 20 20 20 20 30 2c 20 30 2c 20 26 64 65 73 74       0, 0, &dest
143c0 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29  , iCont, iBreak)
143d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
143e0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
143f0 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20  v, iCont);.     
14400 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14410 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 74  p2(v, OP_Next, t
14420 61 62 31 2c 20 69 53 74 61 72 74 29 3b 20 56 64  ab1, iStart); Vd
14430 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
14440 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
14450 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
14460 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73  iBreak);.      s
14470 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
14480 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61  (v, OP_Close, ta
14490 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  b2, 0);.      sq
144a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
144b0 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62  v, OP_Close, tab
144c0 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  1, 0);.      bre
144d0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
144e0 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74   explainComposit
144f0 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 6f 70 2c  e(pParse, p->op,
14500 20 69 53 75 62 31 2c 20 69 53 75 62 32 2c 20 70   iSub1, iSub2, p
14510 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 3b 0a 0a  ->op!=TK_ALL);..
14520 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c    /* Compute col
14530 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73  lating sequences
14540 20 75 73 65 64 20 62 79 20 0a 20 20 2a 2a 20 74   used by .  ** t
14550 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 20  emporary tables 
14560 6e 65 65 64 65 64 20 74 6f 20 69 6d 70 6c 65 6d  needed to implem
14570 65 6e 74 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64  ent the compound
14580 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2a 20 41 74   select..  ** At
14590 74 61 63 68 20 74 68 65 20 4b 65 79 49 6e 66 6f  tach the KeyInfo
145a0 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 61 6c   structure to al
145b0 6c 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  l temporary tabl
145c0 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  es..  **.  ** Th
145d0 69 73 20 73 65 63 74 69 6f 6e 20 69 73 20 72 75  is section is ru
145e0 6e 20 62 79 20 74 68 65 20 72 69 67 68 74 2d 6d  n by the right-m
145f0 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ost SELECT state
14600 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20  ment only..  ** 
14610 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
14620 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6c  s to the left al
14630 77 61 79 73 20 73 6b 69 70 20 74 68 69 73 20 70  ways skip this p
14640 61 72 74 2e 20 20 54 68 65 20 72 69 67 68 74 2d  art.  The right-
14650 6d 6f 73 74 0a 20 20 2a 2a 20 53 45 4c 45 43 54  most.  ** SELECT
14660 20 6d 69 67 68 74 20 61 6c 73 6f 20 73 6b 69 70   might also skip
14670 20 74 68 69 73 20 70 61 72 74 20 69 66 20 69 74   this part if it
14680 20 68 61 73 20 6e 6f 20 4f 52 44 45 52 20 42 59   has no ORDER BY
14690 20 63 6c 61 75 73 65 20 61 6e 64 0a 20 20 2a 2a   clause and.  **
146a0 20 6e 6f 20 74 65 6d 70 20 74 61 62 6c 65 73 20   no temp tables 
146b0 61 72 65 20 72 65 71 75 69 72 65 64 2e 0a 20 20  are required..  
146c0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  */.  if( p->selF
146d0 6c 61 67 73 20 26 20 53 46 5f 55 73 65 73 45 70  lags & SF_UsesEp
146e0 68 65 6d 65 72 61 6c 20 29 7b 0a 20 20 20 20 69  hemeral ){.    i
146f0 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
14700 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14710 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
14720 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
14730 79 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20  yInfo;          
14740 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73    /* Collating s
14750 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
14760 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
14770 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b    Select *pLoop;
14780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14790 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74  /* For looping t
147a0 68 72 6f 75 67 68 20 53 45 4c 45 43 54 20 73 74  hrough SELECT st
147b0 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  atements */.    
147c0 43 6f 6c 6c 53 65 71 20 2a 2a 61 70 43 6f 6c 6c  CollSeq **apColl
147d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
147e0 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72   For looping thr
147f0 6f 75 67 68 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  ough pKeyInfo->a
14800 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e  Coll[] */.    in
14810 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  t nCol;         
14820 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
14830 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
14840 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 20 2a   in result set *
14850 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  /..    assert( p
14860 2d 3e 70 4e 65 78 74 3d 3d 30 20 29 3b 0a 20 20  ->pNext==0 );.  
14870 20 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69    nCol = p->pELi
14880 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 70  st->nExpr;.    p
14890 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  KeyInfo = sqlite
148a0 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62  3KeyInfoAlloc(db
148b0 2c 20 6e 43 6f 6c 2c 20 31 29 3b 0a 20 20 20 20  , nCol, 1);.    
148c0 69 66 28 20 21 70 4b 65 79 49 6e 66 6f 20 29 7b  if( !pKeyInfo ){
148d0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
148e0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
148f0 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
14900 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20  t_end;.    }.   
14910 20 66 6f 72 28 69 3d 30 2c 20 61 70 43 6f 6c 6c   for(i=0, apColl
14920 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c  =pKeyInfo->aColl
14930 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 61  ; i<nCol; i++, a
14940 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20 20  pColl++){.      
14950 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53  *apColl = multiS
14960 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61  electCollSeq(pPa
14970 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20  rse, p, i);.    
14980 20 20 69 66 28 20 30 3d 3d 2a 61 70 43 6f 6c 6c    if( 0==*apColl
14990 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 61 70 43   ){.        *apC
149a0 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
149b0 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oll;.      }.   
149c0 20 7d 0a 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f   }..    for(pLoo
149d0 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f  p=p; pLoop; pLoo
149e0 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 29  p=pLoop->pPrior)
149f0 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  {.      for(i=0;
14a00 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<2; i++){.    
14a10 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 70      int addr = p
14a20 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  Loop->addrOpenEp
14a30 68 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69  hm[i];.        i
14a40 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20  f( addr<0 ){.   
14a50 20 20 20 20 20 20 20 2f 2a 20 49 66 20 5b 30 5d         /* If [0]
14a60 20 69 73 20 75 6e 75 73 65 64 20 74 68 65 6e 20   is unused then 
14a70 5b 31 5d 20 69 73 20 61 6c 73 6f 20 75 6e 75 73  [1] is also unus
14a80 65 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 0a 20  ed.  So we can. 
14a90 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61           ** alwa
14aa0 79 73 20 73 61 66 65 6c 79 20 61 62 6f 72 74 20  ys safely abort 
14ab0 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 66  as soon as the f
14ac0 69 72 73 74 20 75 6e 75 73 65 64 20 73 6c 6f 74  irst unused slot
14ad0 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20   is found */.   
14ae0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
14af0 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  Loop->addrOpenEp
14b00 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20 20 20 20  hm[1]<0 );.     
14b10 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14b20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
14b30 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
14b40 32 28 76 2c 20 61 64 64 72 2c 20 6e 43 6f 6c 29  2(v, addr, nCol)
14b50 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
14b60 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
14b70 20 61 64 64 72 2c 20 28 63 68 61 72 2a 29 73 71   addr, (char*)sq
14b80 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28  lite3KeyInfoRef(
14b90 70 4b 65 79 49 6e 66 6f 29 2c 0a 20 20 20 20 20  pKeyInfo),.     
14ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14bb0 20 20 20 20 20 20 20 50 34 5f 4b 45 59 49 4e 46         P4_KEYINF
14bc0 4f 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f  O);.        pLoo
14bd0 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
14be0 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  i] = -1;.      }
14bf0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
14c00 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70  e3KeyInfoUnref(p
14c10 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a 6d  KeyInfo);.  }..m
14c20 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3a  ulti_select_end:
14c30 0a 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20  .  pDest->iSdst 
14c40 3d 20 64 65 73 74 2e 69 53 64 73 74 3b 0a 20 20  = dest.iSdst;.  
14c50 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 64  pDest->nSdst = d
14c60 65 73 74 2e 6e 53 64 73 74 3b 0a 20 20 73 71 6c  est.nSdst;.  sql
14c70 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
14c80 28 64 62 2c 20 70 44 65 6c 65 74 65 29 3b 0a 20  (db, pDelete);. 
14c90 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
14ca0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
14cb0 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
14cc0 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f  ECT */../*.** Co
14cd0 64 65 20 61 6e 20 6f 75 74 70 75 74 20 73 75 62  de an output sub
14ce0 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 20 63 6f  routine for a co
14cf0 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e  routine implemen
14d00 74 61 74 69 6f 6e 20 6f 66 20 61 0a 2a 2a 20 53  tation of a.** S
14d10 45 4c 45 43 54 20 73 74 61 74 6d 65 6e 74 2e 0a  ELECT statment..
14d20 2a 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61 20 74  **.** The data t
14d30 6f 20 62 65 20 6f 75 74 70 75 74 20 69 73 20 63  o be output is c
14d40 6f 6e 74 61 69 6e 65 64 20 69 6e 20 70 49 6e 2d  ontained in pIn-
14d50 3e 69 53 64 73 74 2e 20 20 54 68 65 72 65 20 61  >iSdst.  There a
14d60 72 65 0a 2a 2a 20 70 49 6e 2d 3e 6e 53 64 73 74  re.** pIn->nSdst
14d70 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 6f   columns to be o
14d80 75 74 70 75 74 2e 20 20 70 44 65 73 74 20 69 73  utput.  pDest is
14d90 20 77 68 65 72 65 20 74 68 65 20 6f 75 74 70 75   where the outpu
14da0 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73  t should.** be s
14db0 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 72 65 67 52 65  ent..**.** regRe
14dc0 74 75 72 6e 20 69 73 20 74 68 65 20 6e 75 6d 62  turn is the numb
14dd0 65 72 20 6f 66 20 74 68 65 20 72 65 67 69 73 74  er of the regist
14de0 65 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73  er holding the s
14df0 75 62 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74  ubroutine.** ret
14e00 75 72 6e 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a  urn address..**.
14e10 2a 2a 20 49 66 20 72 65 67 50 72 65 76 3e 30 20  ** If regPrev>0 
14e20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 66  then it is the f
14e30 69 72 73 74 20 72 65 67 69 73 74 65 72 20 69 6e  irst register in
14e40 20 61 20 76 65 63 74 6f 72 20 74 68 61 74 0a 2a   a vector that.*
14e50 2a 20 72 65 63 6f 72 64 73 20 74 68 65 20 70 72  * records the pr
14e60 65 76 69 6f 75 73 20 6f 75 74 70 75 74 2e 20 20  evious output.  
14e70 6d 65 6d 5b 72 65 67 50 72 65 76 5d 20 69 73 20  mem[regPrev] is 
14e80 61 20 66 6c 61 67 20 74 68 61 74 20 69 73 20 66  a flag that is f
14e90 61 6c 73 65 0a 2a 2a 20 69 66 20 74 68 65 72 65  alse.** if there
14ea0 20 68 61 73 20 62 65 65 6e 20 6e 6f 20 70 72 65   has been no pre
14eb0 76 69 6f 75 73 20 6f 75 74 70 75 74 2e 20 20 49  vious output.  I
14ec0 66 20 72 65 67 50 72 65 76 3e 30 20 74 68 65 6e  f regPrev>0 then
14ed0 20 63 6f 64 65 20 69 73 0a 2a 2a 20 67 65 6e 65   code is.** gene
14ee0 72 61 74 65 64 20 74 6f 20 73 75 70 70 72 65 73  rated to suppres
14ef0 73 20 64 75 70 6c 69 63 61 74 65 73 2e 20 20 70  s duplicates.  p
14f00 4b 65 79 49 6e 66 6f 20 69 73 20 75 73 65 64 20  KeyInfo is used 
14f10 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67 0a 2a 2a  for comparing.**
14f20 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   keys..**.** If 
14f30 74 68 65 20 4c 49 4d 49 54 20 66 6f 75 6e 64 20  the LIMIT found 
14f40 69 6e 20 70 2d 3e 69 4c 69 6d 69 74 20 69 73 20  in p->iLimit is 
14f50 72 65 61 63 68 65 64 2c 20 6a 75 6d 70 20 69 6d  reached, jump im
14f60 6d 65 64 69 61 74 65 6c 79 20 74 6f 0a 2a 2a 20  mediately to.** 
14f70 69 42 72 65 61 6b 2e 0a 2a 2f 0a 73 74 61 74 69  iBreak..*/.stati
14f80 63 20 69 6e 74 20 67 65 6e 65 72 61 74 65 4f 75  c int generateOu
14f90 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28 0a  tputSubroutine(.
14fa0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
14fb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
14fc0 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
14fd0 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
14fe0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
14ff0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
15000 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  t */.  SelectDes
15010 74 20 2a 70 49 6e 2c 20 20 20 20 20 20 20 20 2f  t *pIn,        /
15020 2a 20 43 6f 72 6f 75 74 69 6e 65 20 73 75 70 70  * Coroutine supp
15030 6c 79 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20  lying data */.  
15040 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
15050 74 2c 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65  t,      /* Where
15060 20 74 6f 20 73 65 6e 64 20 74 68 65 20 64 61 74   to send the dat
15070 61 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65  a */.  int regRe
15080 74 75 72 6e 2c 20 20 20 20 20 20 20 20 20 20 2f  turn,          /
15090 2a 20 54 68 65 20 72 65 74 75 72 6e 20 61 64 64  * The return add
150a0 72 65 73 73 20 72 65 67 69 73 74 65 72 20 2a 2f  ress register */
150b0 0a 20 20 69 6e 74 20 72 65 67 50 72 65 76 2c 20  .  int regPrev, 
150c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
150d0 65 76 69 6f 75 73 20 72 65 73 75 6c 74 20 72 65  evious result re
150e0 67 69 73 74 65 72 2e 20 20 4e 6f 20 75 6e 69 71  gister.  No uniq
150f0 75 65 6e 65 73 73 20 69 66 20 30 20 2a 2f 0a 20  ueness if 0 */. 
15100 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
15110 66 6f 2c 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  fo,      /* For 
15120 63 6f 6d 70 61 72 69 6e 67 20 77 69 74 68 20 70  comparing with p
15130 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20 2a 2f  revious entry */
15140 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20 20  .  int iBreak   
15150 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
15160 6d 70 20 68 65 72 65 20 69 66 20 77 65 20 68 69  mp here if we hi
15170 74 20 74 68 65 20 4c 49 4d 49 54 20 2a 2f 0a 29  t the LIMIT */.)
15180 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
15190 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
151a0 6e 74 20 69 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  nt iContinue;.  
151b0 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20 61 64 64  int addr;..  add
151c0 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  r = sqlite3VdbeC
151d0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
151e0 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c   iContinue = sql
151f0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
15200 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 53 75 70 70  l(v);..  /* Supp
15210 72 65 73 73 20 64 75 70 6c 69 63 61 74 65 73 20  ress duplicates 
15220 66 6f 72 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50  for UNION, EXCEP
15230 54 2c 20 61 6e 64 20 49 4e 54 45 52 53 45 43 54  T, and INTERSECT
15240 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 67   .  */.  if( reg
15250 50 72 65 76 20 29 7b 0a 20 20 20 20 69 6e 74 20  Prev ){.    int 
15260 6a 31 2c 20 6a 32 3b 0a 20 20 20 20 6a 31 20 3d  j1, j2;.    j1 =
15270 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15280 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20  p1(v, OP_IfNot, 
15290 72 65 67 50 72 65 76 29 3b 20 56 64 62 65 43 6f  regPrev); VdbeCo
152a0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 6a  verage(v);.    j
152b0 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  2 = sqlite3VdbeA
152c0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70  ddOp4(v, OP_Comp
152d0 61 72 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c  are, pIn->iSdst,
152e0 20 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d   regPrev+1, pIn-
152f0 3e 6e 53 64 73 74 2c 0a 20 20 20 20 20 20 20 20  >nSdst,.        
15300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15310 20 20 20 20 20 20 28 63 68 61 72 2a 29 73 71 6c        (char*)sql
15320 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70  ite3KeyInfoRef(p
15330 4b 65 79 49 6e 66 6f 29 2c 20 50 34 5f 4b 45 59  KeyInfo), P4_KEY
15340 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74  INFO);.    sqlit
15350 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
15360 4f 50 5f 4a 75 6d 70 2c 20 6a 32 2b 32 2c 20 69  OP_Jump, j2+2, i
15370 43 6f 6e 74 69 6e 75 65 2c 20 6a 32 2b 32 29 3b  Continue, j2+2);
15380 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
15390 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
153a0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29  eJumpHere(v, j1)
153b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
153c0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
153d0 70 79 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  py, pIn->iSdst, 
153e0 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e  regPrev+1, pIn->
153f0 6e 53 64 73 74 2d 31 29 3b 0a 20 20 20 20 73 71  nSdst-1);.    sq
15400 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15410 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
15420 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20 7d 0a  , regPrev);.  }.
15430 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62    if( pParse->db
15440 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
15450 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a   return 0;..  /*
15460 20 53 75 70 70 72 65 73 73 20 74 68 65 20 66 69   Suppress the fi
15470 72 73 74 20 4f 46 46 53 45 54 20 65 6e 74 72 69  rst OFFSET entri
15480 65 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  es if there is a
15490 6e 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 0a  n OFFSET clause.
154a0 20 20 2a 2f 0a 20 20 63 6f 64 65 4f 66 66 73 65    */.  codeOffse
154b0 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c  t(v, p->iOffset,
154c0 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 0a 20 20   iContinue);..  
154d0 73 77 69 74 63 68 28 20 70 44 65 73 74 2d 3e 65  switch( pDest->e
154e0 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 53  Dest ){.    /* S
154f0 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20  tore the result 
15500 61 73 20 64 61 74 61 20 75 73 69 6e 67 20 61 20  as data using a 
15510 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20  unique key..    
15520 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
15530 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20  Table:.    case 
15540 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a  SRT_EphemTab: {.
15550 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73        int r1 = s
15560 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
15570 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
15580 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33  int r2 = sqlite3
15590 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
155a0 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  e);.      testca
155b0 73 65 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74  se( pDest->eDest
155c0 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20  ==SRT_Table );. 
155d0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
155e0 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
155f0 5f 45 70 68 65 6d 54 61 62 20 29 3b 0a 20 20 20  _EphemTab );.   
15600 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15610 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
15620 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 53 64 73  ecord, pIn->iSds
15630 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 20 72  t, pIn->nSdst, r
15640 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
15650 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
15660 50 5f 4e 65 77 52 6f 77 69 64 2c 20 70 44 65 73  P_NewRowid, pDes
15670 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 32 29 3b  t->iSDParm, r2);
15680 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
15690 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
156a0 6e 73 65 72 74 2c 20 70 44 65 73 74 2d 3e 69 53  nsert, pDest->iS
156b0 44 50 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a  DParm, r1, r2);.
156c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
156d0 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
156e0 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20  LAG_APPEND);.   
156f0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
15700 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
15710 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r2);.      sqli
15720 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
15730 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
15740 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15750 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
15760 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
15770 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65      /* If we are
15780 20 63 72 65 61 74 69 6e 67 20 61 20 73 65 74 20   creating a set 
15790 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20  for an "expr IN 
157a0 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f  (SELECT ...)" co
157b0 6e 73 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20  nstruct,.    ** 
157c0 74 68 65 6e 20 74 68 65 72 65 20 73 68 6f 75 6c  then there shoul
157d0 64 20 62 65 20 61 20 73 69 6e 67 6c 65 20 69 74  d be a single it
157e0 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  em on the stack.
157f0 20 20 57 72 69 74 65 20 74 68 69 73 0a 20 20 20    Write this.   
15800 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74 68   ** item into th
15810 65 20 73 65 74 20 74 61 62 6c 65 20 77 69 74 68  e set table with
15820 20 62 6f 67 75 73 20 64 61 74 61 2e 0a 20 20 20   bogus data..   
15830 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
15840 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e  _Set: {.      in
15850 74 20 72 31 3b 0a 20 20 20 20 20 20 61 73 73 65  t r1;.      asse
15860 72 74 28 20 70 49 6e 2d 3e 6e 53 64 73 74 3d 3d  rt( pIn->nSdst==
15870 31 20 29 3b 0a 20 20 20 20 20 20 70 44 65 73 74  1 );.      pDest
15880 2d 3e 61 66 66 53 64 73 74 20 3d 20 0a 20 20 20  ->affSdst = .   
15890 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d        sqlite3Com
158a0 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 2d 3e  pareAffinity(p->
158b0 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
158c0 70 72 2c 20 70 44 65 73 74 2d 3e 61 66 66 53 64  pr, pDest->affSd
158d0 73 74 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  st);.      r1 = 
158e0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
158f0 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
15900 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15910 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p4(v, OP_MakeRec
15920 6f 72 64 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c  ord, pIn->iSdst,
15930 20 31 2c 20 72 31 2c 20 26 70 44 65 73 74 2d 3e   1, r1, &pDest->
15940 61 66 66 53 64 73 74 2c 31 29 3b 0a 20 20 20 20  affSdst,1);.    
15950 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
15960 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
15970 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53  (pParse, pIn->iS
15980 64 73 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 73  dst, 1);.      s
15990 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
159a0 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
159b0 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
159c0 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
159d0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
159e0 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
159f0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15a00 20 7d 0a 0a 23 69 66 20 30 20 20 2f 2a 20 4e 65   }..#if 0  /* Ne
15a10 76 65 72 20 6f 63 63 75 72 73 20 6f 6e 20 61 6e  ver occurs on an
15a20 20 4f 52 44 45 52 20 42 59 20 71 75 65 72 79 20   ORDER BY query 
15a30 2a 2f 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 79  */.    /* If any
15a40 20 72 6f 77 20 65 78 69 73 74 20 69 6e 20 74 68   row exist in th
15a50 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20 72 65  e result set, re
15a60 63 6f 72 64 20 74 68 61 74 20 66 61 63 74 20 61  cord that fact a
15a70 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20 20 2a 2f  nd abort..    */
15a80 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 78  .    case SRT_Ex
15a90 69 73 74 73 3a 20 7b 0a 20 20 20 20 20 20 73 71  ists: {.      sq
15aa0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15ab0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
15ac0 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
15ad0 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  );.      /* The 
15ae0 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c  LIMIT clause wil
15af0 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  l terminate the 
15b00 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20  loop for us */. 
15b10 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15b20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
15b30 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73 63   If this is a sc
15b40 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68 61 74  alar select that
15b50 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65   is part of an e
15b60 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a  xpression, then.
15b70 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65      ** store the
15b80 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20   results in the 
15b90 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f  appropriate memo
15ba0 72 79 20 63 65 6c 6c 20 61 6e 64 20 62 72 65 61  ry cell and brea
15bb0 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20  k out.    ** of 
15bc0 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20  the scan loop.. 
15bd0 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
15be0 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20  RT_Mem: {.      
15bf0 61 73 73 65 72 74 28 20 70 49 6e 2d 3e 6e 53 64  assert( pIn->nSd
15c00 73 74 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73  st==1 );.      s
15c10 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f  qlite3ExprCodeMo
15c20 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e  ve(pParse, pIn->
15c30 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e 69 53  iSdst, pDest->iS
15c40 44 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20  DParm, 1);.     
15c50 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c   /* The LIMIT cl
15c60 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f  ause will jump o
15c70 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66  ut of the loop f
15c80 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62  or us */.      b
15c90 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
15ca0 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51  if /* #ifndef SQ
15cb0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
15cc0 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 54 68  RY */..    /* Th
15cd0 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 73 74  e results are st
15ce0 6f 72 65 64 20 69 6e 20 61 20 73 65 71 75 65 6e  ored in a sequen
15cf0 63 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 0a  ce of registers.
15d00 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20      ** starting 
15d10 61 74 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2e  at pDest->iSdst.
15d20 20 20 54 68 65 6e 20 74 68 65 20 63 6f 2d 72 6f    Then the co-ro
15d30 75 74 69 6e 65 20 79 69 65 6c 64 73 2e 0a 20 20  utine yields..  
15d40 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
15d50 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 7b 0a 20  T_Coroutine: {. 
15d60 20 20 20 20 20 69 66 28 20 70 44 65 73 74 2d 3e       if( pDest->
15d70 69 53 64 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  iSdst==0 ){.    
15d80 20 20 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74      pDest->iSdst
15d90 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
15da0 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70  pRange(pParse, p
15db0 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20  In->nSdst);.    
15dc0 20 20 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74      pDest->nSdst
15dd0 20 3d 20 70 49 6e 2d 3e 6e 53 64 73 74 3b 0a 20   = pIn->nSdst;. 
15de0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
15df0 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65  ite3ExprCodeMove
15e00 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53  (pParse, pIn->iS
15e10 64 73 74 2c 20 70 44 65 73 74 2d 3e 69 53 64 73  dst, pDest->iSds
15e20 74 2c 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 29  t, pDest->nSdst)
15e30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
15e40 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
15e50 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53  Yield, pDest->iS
15e60 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 62 72  DParm);.      br
15e70 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
15e80 2f 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68  /* If none of th
15e90 65 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 74 68  e above, then th
15ea0 65 20 72 65 73 75 6c 74 20 64 65 73 74 69 6e 61  e result destina
15eb0 74 69 6f 6e 20 6d 75 73 74 20 62 65 0a 20 20 20  tion must be.   
15ec0 20 2a 2a 20 53 52 54 5f 4f 75 74 70 75 74 2e 20   ** SRT_Output. 
15ed0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
15ee0 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 77 69   never called wi
15ef0 74 68 20 61 6e 79 20 6f 74 68 65 72 0a 20 20 20  th any other.   
15f00 20 2a 2a 20 64 65 73 74 69 6e 61 74 69 6f 6e 20   ** destination 
15f10 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 6f  other than the o
15f20 6e 65 73 20 68 61 6e 64 6c 65 64 20 61 62 6f 76  nes handled abov
15f30 65 20 6f 72 20 53 52 54 5f 4f 75 74 70 75 74 2e  e or SRT_Output.
15f40 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46  .    **.    ** F
15f50 6f 72 20 53 52 54 5f 4f 75 74 70 75 74 2c 20 72  or SRT_Output, r
15f60 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65  esults are store
15f70 64 20 69 6e 20 61 20 73 65 71 75 65 6e 63 65 20  d in a sequence 
15f80 6f 66 20 72 65 67 69 73 74 65 72 73 2e 20 20 0a  of registers.  .
15f90 20 20 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20      ** Then the 
15fa0 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20 6f 70 63  OP_ResultRow opc
15fb0 6f 64 65 20 69 73 20 75 73 65 64 20 74 6f 20 63  ode is used to c
15fc0 61 75 73 65 20 73 71 6c 69 74 65 33 5f 73 74 65  ause sqlite3_ste
15fd0 70 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20 72 65  p() to.    ** re
15fe0 74 75 72 6e 20 74 68 65 20 6e 65 78 74 20 72 6f  turn the next ro
15ff0 77 20 6f 66 20 72 65 73 75 6c 74 2e 0a 20 20 20  w of result..   
16000 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a   */.    default:
16010 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
16020 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
16030 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20  RT_Output );.   
16040 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16050 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(v, OP_Resul
16060 74 52 6f 77 2c 20 70 49 6e 2d 3e 69 53 64 73 74  tRow, pIn->iSdst
16070 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20  , pIn->nSdst);. 
16080 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
16090 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
160a0 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d  nge(pParse, pIn-
160b0 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64  >iSdst, pIn->nSd
160c0 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  st);.      break
160d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
160e0 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e  * Jump to the en
160f0 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 66  d of the loop if
16100 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20 72 65   the LIMIT is re
16110 61 63 68 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  ached..  */.  if
16120 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20  ( p->iLimit ){. 
16130 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16140 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 5a 65 72  dOp3(v, OP_IfZer
16150 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42  o, p->iLimit, iB
16160 72 65 61 6b 2c 20 2d 31 29 3b 20 56 64 62 65 43  reak, -1); VdbeC
16170 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a  overage(v);.  }.
16180 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74  .  /* Generate t
16190 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 72 65  he subroutine re
161a0 74 75 72 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  turn.  */.  sqli
161b0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
161c0 62 65 6c 28 76 2c 20 69 43 6f 6e 74 69 6e 75 65  bel(v, iContinue
161d0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
161e0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74  AddOp1(v, OP_Ret
161f0 75 72 6e 2c 20 72 65 67 52 65 74 75 72 6e 29 3b  urn, regReturn);
16200 0a 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b  ..  return addr;
16210 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 74 65 72 6e  .}../*.** Altern
16220 61 74 69 76 65 20 63 6f 6d 70 6f 75 6e 64 20 73  ative compound s
16230 65 6c 65 63 74 20 63 6f 64 65 20 67 65 6e 65 72  elect code gener
16240 61 74 6f 72 20 66 6f 72 20 63 61 73 65 73 20 77  ator for cases w
16250 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 69 73 20  hen there.** is 
16260 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
16270 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73 73  se..**.** We ass
16280 75 6d 65 20 61 20 71 75 65 72 79 20 6f 66 20 74  ume a query of t
16290 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72  he following for
162a0 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 3c 73  m:.**.**      <s
162b0 65 6c 65 63 74 41 3e 20 20 3c 6f 70 65 72 61 74  electA>  <operat
162c0 6f 72 3e 20 20 3c 73 65 6c 65 63 74 42 3e 20 20  or>  <selectB>  
162d0 4f 52 44 45 52 20 42 59 20 3c 6f 72 64 65 72 62  ORDER BY <orderb
162e0 79 6c 69 73 74 3e 0a 2a 2a 0a 2a 2a 20 3c 6f 70  ylist>.**.** <op
162f0 65 72 61 74 6f 72 3e 20 69 73 20 6f 6e 65 20 6f  erator> is one o
16300 66 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 55 4e 49  f UNION ALL, UNI
16310 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72 20 49  ON, EXCEPT, or I
16320 4e 54 45 52 53 45 43 54 2e 20 20 54 68 65 20 69  NTERSECT.  The i
16330 64 65 61 0a 2a 2a 20 69 73 20 74 6f 20 63 6f 64  dea.** is to cod
16340 65 20 62 6f 74 68 20 3c 73 65 6c 65 63 74 41 3e  e both <selectA>
16350 20 61 6e 64 20 3c 73 65 6c 65 63 74 42 3e 20 77   and <selectB> w
16360 69 74 68 20 74 68 65 20 4f 52 44 45 52 20 42 59  ith the ORDER BY
16370 20 63 6c 61 75 73 65 20 61 73 0a 2a 2a 20 63 6f   clause as.** co
16380 2d 72 6f 75 74 69 6e 65 73 2e 20 20 54 68 65 6e  -routines.  Then
16390 20 72 75 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74   run the co-rout
163a0 69 6e 65 73 20 69 6e 20 70 61 72 61 6c 6c 65 6c  ines in parallel
163b0 20 61 6e 64 20 6d 65 72 67 65 20 74 68 65 20 72   and merge the r
163c0 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 74  esults.** into t
163d0 68 65 20 6f 75 74 70 75 74 2e 20 20 49 6e 20 61  he output.  In a
163e0 64 64 69 74 69 6f 6e 20 74 6f 20 74 68 65 20 74  ddition to the t
163f0 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20 28 63  wo coroutines (c
16400 61 6c 6c 65 64 20 73 65 6c 65 63 74 41 20 61 6e  alled selectA an
16410 64 0a 2a 2a 20 73 65 6c 65 63 74 42 29 20 74 68  d.** selectB) th
16420 65 72 65 20 61 72 65 20 37 20 73 75 62 72 6f 75  ere are 7 subrou
16430 74 69 6e 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tines:.**.**    
16440 6f 75 74 41 3a 20 20 20 20 4d 6f 76 65 20 74 68  outA:    Move th
16450 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20  e output of the 
16460 73 65 6c 65 63 74 41 20 63 6f 72 6f 75 74 69 6e  selectA coroutin
16470 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75  e into the outpu
16480 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
16490 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   of the compound
164a0 20 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20   query..**.**   
164b0 20 6f 75 74 42 3a 20 20 20 20 4d 6f 76 65 20 74   outB:    Move t
164c0 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65  he output of the
164d0 20 73 65 6c 65 63 74 42 20 63 6f 72 6f 75 74 69   selectB corouti
164e0 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70  ne into the outp
164f0 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ut.**           
16500 20 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e    of the compoun
16510 64 20 71 75 65 72 79 2e 20 20 28 4f 6e 6c 79 20  d query.  (Only 
16520 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 55 4e  generated for UN
16530 49 4f 4e 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  ION and.**      
16540 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c         UNION ALL
16550 2e 20 20 45 58 43 45 50 54 20 61 6e 64 20 49 4e  .  EXCEPT and IN
16560 53 45 52 54 53 45 43 54 20 6e 65 76 65 72 20 6f  SERTSECT never o
16570 75 74 70 75 74 20 61 20 72 6f 77 20 74 68 61 74  utput a row that
16580 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
16590 61 70 70 65 61 72 73 20 6f 6e 6c 79 20 69 6e 20  appears only in 
165a0 42 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20 41 6c 74  B.).**.**    Alt
165b0 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65  B:    Called whe
165c0 6e 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20  n there is data 
165d0 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74  from both corout
165e0 69 6e 65 73 20 61 6e 64 20 41 3c 42 2e 0a 2a 2a  ines and A<B..**
165f0 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20 20 20 20  .**    AeqB:    
16600 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72  Called when ther
16610 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62  e is data from b
16620 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61  oth coroutines a
16630 6e 64 20 41 3d 3d 42 2e 0a 2a 2a 0a 2a 2a 20 20  nd A==B..**.**  
16640 20 20 41 67 74 42 3a 20 20 20 20 43 61 6c 6c 65    AgtB:    Calle
16650 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  d when there is 
16660 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63  data from both c
16670 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3e  oroutines and A>
16680 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 41  B..**.**    EofA
16690 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e  :    Called when
166a0 20 64 61 74 61 20 69 73 20 65 78 68 61 75 73 74   data is exhaust
166b0 65 64 20 66 72 6f 6d 20 73 65 6c 65 63 74 41 2e  ed from selectA.
166c0 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20  .**.**    EofB: 
166d0 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 64     Called when d
166e0 61 74 61 20 69 73 20 65 78 68 61 75 73 74 65 64  ata is exhausted
166f0 20 66 72 6f 6d 20 73 65 6c 65 63 74 42 2e 0a 2a   from selectB..*
16700 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65  *.** The impleme
16710 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c  ntation of the l
16720 61 74 74 65 72 20 66 69 76 65 20 73 75 62 72 6f  atter five subro
16730 75 74 69 6e 65 73 20 64 65 70 65 6e 64 20 6f 6e  utines depend on
16740 20 77 68 69 63 68 20 0a 2a 2a 20 3c 6f 70 65 72   which .** <oper
16750 61 74 6f 72 3e 20 69 73 20 75 73 65 64 3a 0a 2a  ator> is used:.*
16760 2a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  *.**.**         
16770 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 20 20 20      UNION ALL   
16780 20 20 20 20 20 20 55 4e 49 4f 4e 20 20 20 20 20        UNION     
16790 20 20 20 20 20 20 20 45 58 43 45 50 54 20 20 20         EXCEPT   
167a0 20 20 20 20 20 20 20 49 4e 54 45 52 53 45 43 54         INTERSECT
167b0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2d 2d 2d  .**          ---
167c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d  ----------  ----
167d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d  -------------  -
167e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d  -------------  -
167f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16800 0a 2a 2a 20 20 20 41 6c 74 42 3a 20 20 20 6f 75  .**   AltB:   ou
16810 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 6f  tA, nextA      o
16820 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
16830 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
16840 20 20 20 20 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a       nextA.**.**
16850 20 20 20 41 65 71 42 3a 20 20 20 6f 75 74 41 2c     AeqB:   outA,
16860 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 6e   nextA         n
16870 65 78 74 41 20 20 20 20 20 20 20 20 20 20 20 20  extA            
16880 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 6f   nextA         o
16890 75 74 41 2c 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a  utA, nextA.**.**
168a0 20 20 20 41 67 74 42 3a 20 20 20 6f 75 74 42 2c     AgtB:   outB,
168b0 20 6e 65 78 74 42 20 20 20 20 20 20 6f 75 74 42   nextB      outB
168c0 2c 20 6e 65 78 74 42 20 20 20 20 20 20 20 20 20  , nextB         
168d0 20 6e 65 78 74 42 20 20 20 20 20 20 20 20 20 20   nextB          
168e0 20 20 6e 65 78 74 42 0a 2a 2a 0a 2a 2a 20 20 20    nextB.**.**   
168f0 45 6f 66 41 3a 20 20 20 6f 75 74 42 2c 20 6e 65  EofA:   outB, ne
16900 78 74 42 20 20 20 20 20 20 6f 75 74 42 2c 20 6e  xtB      outB, n
16910 65 78 74 42 20 20 20 20 20 20 20 20 20 20 68 61  extB          ha
16920 6c 74 20 20 20 20 20 20 20 20 20 20 20 20 20 68  lt             h
16930 61 6c 74 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 42  alt.**.**   EofB
16940 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20  :   outA, nextA 
16950 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41       outA, nextA
16960 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78         outA, nex
16970 74 41 20 20 20 20 20 20 20 20 20 68 61 6c 74 0a  tA         halt.
16980 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 41 6c 74  **.** In the Alt
16990 42 2c 20 41 65 71 42 2c 20 61 6e 64 20 41 67 74  B, AeqB, and Agt
169a0 42 20 73 75 62 72 6f 75 74 69 6e 65 73 2c 20 61  B subroutines, a
169b0 6e 20 45 4f 46 20 6f 6e 20 41 20 66 6f 6c 6c 6f  n EOF on A follo
169c0 77 69 6e 67 20 6e 65 78 74 41 0a 2a 2a 20 63 61  wing nextA.** ca
169d0 75 73 65 73 20 61 6e 20 69 6d 6d 65 64 69 61 74  uses an immediat
169e0 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66 41 20 61  e jump to EofA a
169f0 6e 64 20 61 6e 20 45 4f 46 20 6f 6e 20 42 20 66  nd an EOF on B f
16a00 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 42 20 63  ollowing nextB c
16a10 61 75 73 65 73 0a 2a 2a 20 61 6e 20 69 6d 6d 65  auses.** an imme
16a20 64 69 61 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f  diate jump to Eo
16a30 66 42 2e 20 20 57 69 74 68 69 6e 20 45 6f 66 41  fB.  Within EofA
16a40 20 61 6e 64 20 45 6f 66 42 2c 20 61 6e 64 20 45   and EofB, and E
16a50 4f 46 20 6f 6e 20 65 6e 74 72 79 20 6f 72 0a 2a  OF on entry or.*
16a60 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74  * following next
16a70 58 20 63 61 75 73 65 73 20 61 20 6a 75 6d 70 20  X causes a jump 
16a80 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
16a90 65 20 73 65 6c 65 63 74 20 70 72 6f 63 65 73 73  e select process
16aa0 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 44 75 70 6c 69  ing..**.** Dupli
16ab0 63 61 74 65 20 72 65 6d 6f 76 61 6c 20 69 6e 20  cate removal in 
16ac0 74 68 65 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50  the UNION, EXCEP
16ad0 54 2c 20 61 6e 64 20 49 4e 54 45 52 53 45 43 54  T, and INTERSECT
16ae0 20 63 61 73 65 73 20 69 73 20 68 61 6e 64 6c 65   cases is handle
16af0 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20  d.** within the 
16b00 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e  output subroutin
16b10 65 2e 20 20 54 68 65 20 72 65 67 50 72 65 76 20  e.  The regPrev 
16b20 72 65 67 69 73 74 65 72 20 73 65 74 20 68 6f 6c  register set hol
16b30 64 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c  ds the previousl
16b40 79 0a 2a 2a 20 6f 75 74 70 75 74 20 76 61 6c 75  y.** output valu
16b50 65 2e 20 20 41 20 63 6f 6d 70 61 72 69 73 6f 6e  e.  A comparison
16b60 20 69 73 20 6d 61 64 65 20 61 67 61 69 6e 73 74   is made against
16b70 20 74 68 69 73 20 76 61 6c 75 65 20 61 6e 64 20   this value and 
16b80 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 69 73  the output.** is
16b90 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 65 20   skipped if the 
16ba0 6e 65 78 74 20 72 65 73 75 6c 74 73 20 77 6f 75  next results wou
16bb0 6c 64 20 62 65 20 74 68 65 20 73 61 6d 65 20 61  ld be the same a
16bc0 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 2e 0a  s the previous..
16bd0 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d  **.** The implem
16be0 65 6e 74 61 74 69 6f 6e 20 70 6c 61 6e 20 69 73  entation plan is
16bf0 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
16c00 65 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73  e two coroutines
16c10 20 61 6e 64 20 73 65 76 65 6e 0a 2a 2a 20 73 75   and seven.** su
16c20 62 72 6f 75 74 69 6e 65 73 20 66 69 72 73 74 2c  broutines first,
16c30 20 74 68 65 6e 20 70 75 74 20 74 68 65 20 63 6f   then put the co
16c40 6e 74 72 6f 6c 20 6c 6f 67 69 63 20 61 74 20 74  ntrol logic at t
16c50 68 65 20 62 6f 74 74 6f 6d 2e 20 20 4c 69 6b 65  he bottom.  Like
16c60 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
16c70 20 20 20 20 20 20 67 6f 74 6f 20 49 6e 69 74 0a        goto Init.
16c80 2a 2a 20 20 20 20 20 63 6f 41 3a 20 63 6f 72 6f  **     coA: coro
16c90 75 74 69 6e 65 20 66 6f 72 20 6c 65 66 74 20 71  utine for left q
16ca0 75 65 72 79 20 28 41 29 0a 2a 2a 20 20 20 20 20  uery (A).**     
16cb0 63 6f 42 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66  coB: coroutine f
16cc0 6f 72 20 72 69 67 68 74 20 71 75 65 72 79 20 28  or right query (
16cd0 42 29 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20 6f  B).**    outA: o
16ce0 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66  utput one row of
16cf0 20 41 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20 6f   A.**    outB: o
16d00 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66  utput one row of
16d10 20 42 20 28 55 4e 49 4f 4e 20 61 6e 64 20 55 4e   B (UNION and UN
16d20 49 4f 4e 20 41 4c 4c 20 6f 6e 6c 79 29 0a 2a 2a  ION ALL only).**
16d30 20 20 20 20 45 6f 66 41 3a 20 2e 2e 2e 0a 2a 2a      EofA: ....**
16d40 20 20 20 20 45 6f 66 42 3a 20 2e 2e 2e 0a 2a 2a      EofB: ....**
16d50 20 20 20 20 41 6c 74 42 3a 20 2e 2e 2e 0a 2a 2a      AltB: ....**
16d60 20 20 20 20 41 65 71 42 3a 20 2e 2e 2e 0a 2a 2a      AeqB: ....**
16d70 20 20 20 20 41 67 74 42 3a 20 2e 2e 2e 0a 2a 2a      AgtB: ....**
16d80 20 20 20 20 49 6e 69 74 3a 20 69 6e 69 74 69 61      Init: initia
16d90 6c 69 7a 65 20 63 6f 72 6f 75 74 69 6e 65 20 72  lize coroutine r
16da0 65 67 69 73 74 65 72 73 0a 2a 2a 20 20 20 20 20  egisters.**     
16db0 20 20 20 20 20 79 69 65 6c 64 20 63 6f 41 0a 2a       yield coA.*
16dc0 2a 20 20 20 20 20 20 20 20 20 20 69 66 20 65 6f  *          if eo
16dd0 66 28 41 29 20 67 6f 74 6f 20 45 6f 66 41 0a 2a  f(A) goto EofA.*
16de0 2a 20 20 20 20 20 20 20 20 20 20 79 69 65 6c 64  *          yield
16df0 20 63 6f 42 0a 2a 2a 20 20 20 20 20 20 20 20 20   coB.**         
16e00 20 69 66 20 65 6f 66 28 42 29 20 67 6f 74 6f 20   if eof(B) goto 
16e10 45 6f 66 42 0a 2a 2a 20 20 20 20 43 6d 70 72 3a  EofB.**    Cmpr:
16e20 20 43 6f 6d 70 61 72 65 20 41 2c 20 42 0a 2a 2a   Compare A, B.**
16e30 20 20 20 20 20 20 20 20 20 20 4a 75 6d 70 20 41            Jump A
16e40 6c 74 42 2c 20 41 65 71 42 2c 20 41 67 74 42 0a  ltB, AeqB, AgtB.
16e50 2a 2a 20 20 20 20 20 45 6e 64 3a 20 2e 2e 2e 0a  **     End: ....
16e60 2a 2a 0a 2a 2a 20 57 65 20 63 61 6c 6c 20 41 6c  **.** We call Al
16e70 74 42 2c 20 41 65 71 42 2c 20 41 67 74 42 2c 20  tB, AeqB, AgtB, 
16e80 45 6f 66 41 2c 20 61 6e 64 20 45 6f 66 42 20 22  EofA, and EofB "
16e90 73 75 62 72 6f 75 74 69 6e 65 73 22 20 62 75 74  subroutines" but
16ea0 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a 2a 2a   they are not.**
16eb0 20 61 63 74 75 61 6c 6c 79 20 63 61 6c 6c 65 64   actually called
16ec0 20 75 73 69 6e 67 20 47 6f 73 75 62 20 61 6e 64   using Gosub and
16ed0 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 52 65 74   they do not Ret
16ee0 75 72 6e 2e 20 20 45 6f 66 41 20 61 6e 64 20 45  urn.  EofA and E
16ef0 6f 66 42 20 6c 6f 6f 70 0a 2a 2a 20 75 6e 74 69  ofB loop.** unti
16f00 6c 20 61 6c 6c 20 64 61 74 61 20 69 73 20 65 78  l all data is ex
16f10 68 61 75 73 74 65 64 20 74 68 65 6e 20 6a 75 6d  hausted then jum
16f20 70 20 74 6f 20 74 68 65 20 22 65 6e 64 22 20 6c  p to the "end" l
16f30 61 62 65 2e 20 20 41 6c 74 42 2c 20 41 65 71 42  abe.  AltB, AeqB
16f40 2c 0a 2a 2a 20 61 6e 64 20 41 67 74 42 20 6a 75  ,.** and AgtB ju
16f50 6d 70 20 74 6f 20 65 69 74 68 65 72 20 4c 32 20  mp to either L2 
16f60 6f 72 20 74 6f 20 6f 6e 65 20 6f 66 20 45 6f 66  or to one of Eof
16f70 41 20 6f 72 20 45 6f 66 42 2e 0a 2a 2f 0a 23 69  A or EofB..*/.#i
16f80 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
16f90 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
16fa0 54 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c  T.static int mul
16fb0 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28  tiSelectOrderBy(
16fc0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
16fd0 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
16fe0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
16ff0 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
17000 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
17010 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45  ght-most of SELE
17020 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20  CTs to be coded 
17030 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
17040 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68  *pDest     /* Wh
17050 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75  at to do with qu
17060 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29  ery results */.)
17070 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20  {.  int i, j;   
17080 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
17090 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
170a0 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20  Select *pPrior; 
170b0 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72        /* Another
170c0 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69 61 74   SELECT immediat
170d0 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66 74 20  ely to our left 
170e0 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
170f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65             /* Ge
17100 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74  nerate code to t
17110 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 53 65  his VDBE */.  Se
17120 6c 65 63 74 44 65 73 74 20 64 65 73 74 41 3b 20  lectDest destA; 
17130 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69      /* Destinati
17140 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65  on for coroutine
17150 20 41 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65   A */.  SelectDe
17160 73 74 20 64 65 73 74 42 3b 20 20 20 20 20 2f 2a  st destB;     /*
17170 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72   Destination for
17180 20 63 6f 72 6f 75 74 69 6e 65 20 42 20 2a 2f 0a   coroutine B */.
17190 20 20 69 6e 74 20 72 65 67 41 64 64 72 41 3b 20    int regAddrA; 
171a0 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
171b0 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ss register for 
171c0 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74 69  select-A corouti
171d0 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41  ne */.  int regA
171e0 64 64 72 42 3b 20 20 20 20 20 20 20 20 20 2f 2a  ddrB;         /*
171f0 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65   Address registe
17200 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 42 20 63  r for select-B c
17210 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  oroutine */.  in
17220 74 20 61 64 64 72 53 65 6c 65 63 74 41 3b 20 20  t addrSelectA;  
17230 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
17240 66 20 74 68 65 20 73 65 6c 65 63 74 2d 41 20 63  f the select-A c
17250 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  oroutine */.  in
17260 74 20 61 64 64 72 53 65 6c 65 63 74 42 3b 20 20  t addrSelectB;  
17270 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
17280 66 20 74 68 65 20 73 65 6c 65 63 74 2d 42 20 63  f the select-B c
17290 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  oroutine */.  in
172a0 74 20 72 65 67 4f 75 74 41 3b 20 20 20 20 20 20  t regOutA;      
172b0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72      /* Address r
172c0 65 67 69 73 74 65 72 20 66 6f 72 20 74 68 65 20  egister for the 
172d0 6f 75 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74  output-A subrout
172e0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ine */.  int reg
172f0 4f 75 74 42 3b 20 20 20 20 20 20 20 20 20 20 2f  OutB;          /
17300 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74  * Address regist
17310 65 72 20 66 6f 72 20 74 68 65 20 6f 75 74 70 75  er for the outpu
17320 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  t-B subroutine *
17330 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f 75 74 41  /.  int addrOutA
17340 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
17350 72 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74 70  ress of the outp
17360 75 74 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 20  ut-A subroutine 
17370 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f 75 74  */.  int addrOut
17380 42 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 41 64  B = 0;     /* Ad
17390 64 72 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74  dress of the out
173a0 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  put-B subroutine
173b0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f   */.  int addrEo
173c0 66 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  fA;         /* A
173d0 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65  ddress of the se
173e0 6c 65 63 74 2d 41 2d 65 78 68 61 75 73 74 65 64  lect-A-exhausted
173f0 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
17400 20 69 6e 74 20 61 64 64 72 45 6f 66 41 5f 6e 6f   int addrEofA_no
17410 42 3b 20 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e  B;     /* Altern
17420 61 74 65 20 61 64 64 72 45 6f 66 41 20 69 66 20  ate addrEofA if 
17430 42 20 69 73 20 75 6e 69 6e 69 74 69 61 6c 69 7a  B is uninitializ
17440 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ed */.  int addr
17450 45 6f 66 42 3b 20 20 20 20 20 20 20 20 20 2f 2a  EofB;         /*
17460 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
17470 73 65 6c 65 63 74 2d 42 2d 65 78 68 61 75 73 74  select-B-exhaust
17480 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  ed subroutine */
17490 0a 20 20 69 6e 74 20 61 64 64 72 41 6c 74 42 3b  .  int addrAltB;
174a0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
174b0 65 73 73 20 6f 66 20 74 68 65 20 41 3c 42 20 73  ess of the A<B s
174c0 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
174d0 6e 74 20 61 64 64 72 41 65 71 42 3b 20 20 20 20  nt addrAeqB;    
174e0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
174f0 6f 66 20 74 68 65 20 41 3d 3d 42 20 73 75 62 72  of the A==B subr
17500 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
17510 61 64 64 72 41 67 74 42 3b 20 20 20 20 20 20 20  addrAgtB;       
17520 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
17530 74 68 65 20 41 3e 42 20 73 75 62 72 6f 75 74 69  the A>B subrouti
17540 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c  ne */.  int regL
17550 69 6d 69 74 41 3b 20 20 20 20 20 20 20 20 2f 2a  imitA;        /*
17560 20 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72 20   Limit register 
17570 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a  for select-A */.
17580 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 42 3b    int regLimitB;
17590 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74          /* Limit
175a0 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65   register for se
175b0 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20  lect-A */.  int 
175c0 72 65 67 50 72 65 76 3b 20 20 20 20 20 20 20 20  regPrev;        
175d0 20 20 2f 2a 20 41 20 72 61 6e 67 65 20 6f 66 20    /* A range of 
175e0 72 65 67 69 73 74 65 72 73 20 74 6f 20 68 6f 6c  registers to hol
175f0 64 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75  d previous outpu
17600 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64  t */.  int saved
17610 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a 20  Limit;       /* 
17620 53 61 76 65 64 20 76 61 6c 75 65 20 6f 66 20 70  Saved value of p
17630 2d 3e 69 4c 69 6d 69 74 20 2a 2f 0a 20 20 69 6e  ->iLimit */.  in
17640 74 20 73 61 76 65 64 4f 66 66 73 65 74 3b 20 20  t savedOffset;  
17650 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c      /* Saved val
17660 75 65 20 6f 66 20 70 2d 3e 69 4f 66 66 73 65 74  ue of p->iOffset
17670 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 43   */.  int labelC
17680 6d 70 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c  mpr;        /* L
17690 61 62 65 6c 20 66 6f 72 20 74 68 65 20 73 74 61  abel for the sta
176a0 72 74 20 6f 66 20 74 68 65 20 6d 65 72 67 65 20  rt of the merge 
176b0 61 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a 20 20 69  algorithm */.  i
176c0 6e 74 20 6c 61 62 65 6c 45 6e 64 3b 20 20 20 20  nt labelEnd;    
176d0 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f       /* Label fo
176e0 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  r the end of the
176f0 20 6f 76 65 72 61 6c 6c 20 53 45 4c 45 43 54 20   overall SELECT 
17700 73 74 6d 74 20 2a 2f 0a 20 20 69 6e 74 20 6a 31  stmt */.  int j1
17710 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17720 2f 2a 20 4a 75 6d 70 20 69 6e 73 74 72 75 63 74  /* Jump instruct
17730 69 6f 6e 73 20 74 68 61 74 20 67 65 74 20 72 65  ions that get re
17740 74 61 72 67 65 74 74 65 64 20 2a 2f 0a 20 20 69  targetted */.  i
17750 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20  nt op;          
17760 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54       /* One of T
17770 4b 5f 41 4c 4c 2c 20 54 4b 5f 55 4e 49 4f 4e 2c  K_ALL, TK_UNION,
17780 20 54 4b 5f 45 58 43 45 50 54 2c 20 54 4b 5f 49   TK_EXCEPT, TK_I
17790 4e 54 45 52 53 45 43 54 20 2a 2f 0a 20 20 4b 65  NTERSECT */.  Ke
177a0 79 49 6e 66 6f 20 2a 70 4b 65 79 44 75 70 20 3d  yInfo *pKeyDup =
177b0 20 30 3b 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f   0; /* Compariso
177c0 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  n information fo
177d0 72 20 64 75 70 6c 69 63 61 74 65 20 72 65 6d 6f  r duplicate remo
177e0 76 61 6c 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f  val */.  KeyInfo
177f0 20 2a 70 4b 65 79 4d 65 72 67 65 3b 20 20 20 2f   *pKeyMerge;   /
17800 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66  * Comparison inf
17810 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 6d 65 72  ormation for mer
17820 67 69 6e 67 20 72 6f 77 73 20 2a 2f 0a 20 20 73  ging rows */.  s
17830 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
17840 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
17850 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
17860 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
17870 72 42 79 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52  rBy;   /* The OR
17880 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
17890 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b  .  int nOrderBy;
178a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
178b0 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 74  er of terms in t
178c0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
178d0 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 50 65  se */.  int *aPe
178e0 72 6d 75 74 65 3b 20 20 20 20 20 20 20 20 2f 2a  rmute;        /*
178f0 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 4f 52   Mapping from OR
17900 44 45 52 20 42 59 20 74 65 72 6d 73 20 74 6f 20  DER BY terms to 
17910 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6c 75 6d  result set colum
17920 6e 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  ns */.#ifndef SQ
17930 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
17940 4e 0a 20 20 69 6e 74 20 69 53 75 62 31 3b 20 20  N.  int iSub1;  
17950 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50            /* EQP
17960 20 69 64 20 6f 66 20 6c 65 66 74 2d 68 61 6e 64   id of left-hand
17970 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20   query */.  int 
17980 69 53 75 62 32 3b 20 20 20 20 20 20 20 20 20 20  iSub2;          
17990 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 72    /* EQP id of r
179a0 69 67 68 74 2d 68 61 6e 64 20 71 75 65 72 79 20  ight-hand query 
179b0 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  */.#endif..  ass
179c0 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
179d0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
179e0 20 70 4b 65 79 44 75 70 3d 3d 30 20 29 3b 20 2f   pKeyDup==0 ); /
179f0 2a 20 22 4d 61 6e 61 67 65 64 22 20 63 6f 64 65  * "Managed" code
17a00 20 6e 65 65 64 73 20 74 68 69 73 2e 20 20 54 69   needs this.  Ti
17a10 63 6b 65 74 20 23 33 33 38 32 2e 20 2a 2f 0a 20  cket #3382. */. 
17a20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
17a30 3b 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  v = pParse->
17a40 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28  pVdbe;.  assert(
17a50 20 76 21 3d 30 20 29 3b 20 20 20 20 20 20 20 2f   v!=0 );       /
17a60 2a 20 41 6c 72 65 61 64 79 20 74 68 72 6f 77 6e  * Already thrown
17a70 20 74 68 65 20 65 72 72 6f 72 20 69 66 20 56 44   the error if VD
17a80 42 45 20 61 6c 6c 6f 63 20 66 61 69 6c 65 64 20  BE alloc failed 
17a90 2a 2f 0a 20 20 6c 61 62 65 6c 45 6e 64 20 3d 20  */.  labelEnd = 
17aa0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
17ab0 61 62 65 6c 28 76 29 3b 0a 20 20 6c 61 62 65 6c  abel(v);.  label
17ac0 43 6d 70 72 20 3d 20 73 71 6c 69 74 65 33 56 64  Cmpr = sqlite3Vd
17ad0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
17ae0 0a 0a 20 20 2f 2a 20 50 61 74 63 68 20 75 70 20  ..  /* Patch up 
17af0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
17b00 75 73 65 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20  use.  */.  op = 
17b10 70 2d 3e 6f 70 3b 20 20 0a 20 20 70 50 72 69 6f  p->op;  .  pPrio
17b20 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  r = p->pPrior;. 
17b30 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d   assert( pPrior-
17b40 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a  >pOrderBy==0 );.
17b50 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e    pOrderBy = p->
17b60 70 4f 72 64 65 72 42 79 3b 0a 20 20 61 73 73 65  pOrderBy;.  asse
17b70 72 74 28 20 70 4f 72 64 65 72 42 79 20 29 3b 0a  rt( pOrderBy );.
17b80 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f 72    nOrderBy = pOr
17b90 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 0a 20  derBy->nExpr;.. 
17ba0 20 2f 2a 20 46 6f 72 20 6f 70 65 72 61 74 6f 72   /* For operator
17bb0 73 20 6f 74 68 65 72 20 74 68 61 6e 20 55 4e 49  s other than UNI
17bc0 4f 4e 20 41 4c 4c 20 77 65 20 68 61 76 65 20 74  ON ALL we have t
17bd0 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
17be0 0a 20 20 2a 2a 20 74 68 65 20 4f 52 44 45 52 20  .  ** the ORDER 
17bf0 42 59 20 63 6c 61 75 73 65 20 63 6f 76 65 72 73  BY clause covers
17c00 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66 20 74   every term of t
17c10 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20  he result set.  
17c20 41 64 64 0a 20 20 2a 2a 20 74 65 72 6d 73 20 74  Add.  ** terms t
17c30 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  o the ORDER BY c
17c40 6c 61 75 73 65 20 61 73 20 6e 65 63 65 73 73 61  lause as necessa
17c50 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f  ry..  */.  if( o
17c60 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20  p!=TK_ALL ){.   
17c70 20 66 6f 72 28 69 3d 31 3b 20 64 62 2d 3e 6d 61   for(i=1; db->ma
17c80 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 26 26  llocFailed==0 &&
17c90 20 69 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e   i<=p->pEList->n
17ca0 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
17cb0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
17cc0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
17cd0 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49       for(j=0, pI
17ce0 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b  tem=pOrderBy->a;
17cf0 20 6a 3c 6e 4f 72 64 65 72 42 79 3b 20 6a 2b 2b   j<nOrderBy; j++
17d00 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
17d10 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
17d20 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  m->u.x.iOrderByC
17d30 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  ol>0 );.        
17d40 69 66 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69  if( pItem->u.x.i
17d50 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 69 20 29 20  OrderByCol==i ) 
17d60 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
17d70 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 4f 72 64       if( j==nOrd
17d80 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
17d90 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c  Expr *pNew = sql
17da0 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f  ite3Expr(db, TK_
17db0 49 4e 54 45 47 45 52 2c 20 30 29 3b 0a 20 20 20  INTEGER, 0);.   
17dc0 20 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30       if( pNew==0
17dd0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
17de0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
17df0 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  pNew->flags |= E
17e00 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20  P_IntValue;.    
17e10 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c      pNew->u.iVal
17e20 75 65 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  ue = i;.        
17e30 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74  pOrderBy = sqlit
17e40 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
17e50 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42  (pParse, pOrderB
17e60 79 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  y, pNew);.      
17e70 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
17e80 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 6e 4f 72   pOrderBy->a[nOr
17e90 64 65 72 42 79 2b 2b 5d 2e 75 2e 78 2e 69 4f 72  derBy++].u.x.iOr
17ea0 64 65 72 42 79 43 6f 6c 20 3d 20 28 75 31 36 29  derByCol = (u16)
17eb0 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  i;.      }.    }
17ec0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  .  }..  /* Compu
17ed0 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  te the compariso
17ee0 6e 20 70 65 72 6d 75 74 61 74 69 6f 6e 20 61 6e  n permutation an
17ef0 64 20 6b 65 79 69 6e 66 6f 20 74 68 61 74 20 69  d keyinfo that i
17f00 73 20 75 73 65 64 20 77 69 74 68 0a 20 20 2a 2a  s used with.  **
17f10 20 74 68 65 20 70 65 72 6d 75 74 61 74 69 6f 6e   the permutation
17f20 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
17f30 6e 65 20 69 66 20 74 68 65 20 6e 65 78 74 0a 20  ne if the next. 
17f40 20 2a 2a 20 72 6f 77 20 6f 66 20 72 65 73 75 6c   ** row of resul
17f50 74 73 20 63 6f 6d 65 73 20 66 72 6f 6d 20 73 65  ts comes from se
17f60 6c 65 63 74 41 20 6f 72 20 73 65 6c 65 63 74 42  lectA or selectB
17f70 2e 20 20 41 6c 73 6f 20 61 64 64 20 65 78 70 6c  .  Also add expl
17f80 69 63 69 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74  icit.  ** collat
17f90 69 6f 6e 73 20 74 6f 20 74 68 65 20 4f 52 44 45  ions to the ORDE
17fa0 52 20 42 59 20 63 6c 61 75 73 65 20 74 65 72 6d  R BY clause term
17fb0 73 20 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74  s so that when t
17fc0 68 65 20 73 75 62 71 75 65 72 69 65 73 0a 20 20  he subqueries.  
17fd0 2a 2a 20 74 6f 20 74 68 65 20 72 69 67 68 74 20  ** to the right 
17fe0 61 6e 64 20 74 68 65 20 6c 65 66 74 20 61 72 65  and the left are
17ff0 20 65 76 61 6c 75 61 74 65 64 2c 20 74 68 65 79   evaluated, they
18000 20 75 73 65 20 74 68 65 20 63 6f 72 72 65 63 74   use the correct
18010 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 2e  .  ** collation.
18020 0a 20 20 2a 2f 0a 20 20 61 50 65 72 6d 75 74 65  .  */.  aPermute
18030 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
18040 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66  ocRaw(db, sizeof
18050 28 69 6e 74 29 2a 28 69 36 34 29 6e 4f 72 64 65  (int)*(i64)nOrde
18060 72 42 79 29 3b 0a 20 20 69 66 28 20 61 50 65 72  rBy);.  if( aPer
18070 6d 75 74 65 20 29 7b 0a 20 20 20 20 73 74 72 75  mute ){.    stru
18080 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
18090 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 66 6f 72   *pItem;.    for
180a0 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64  (i=0, pItem=pOrd
180b0 65 72 42 79 2d 3e 61 3b 20 69 3c 6e 4f 72 64 65  erBy->a; i<nOrde
180c0 72 42 79 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  rBy; i++, pItem+
180d0 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
180e0 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72  ( pItem->u.x.iOr
180f0 64 65 72 42 79 43 6f 6c 3e 30 0a 20 20 20 20 20  derByCol>0.     
18100 20 20 20 20 20 26 26 20 70 49 74 65 6d 2d 3e 75       && pItem->u
18110 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3c 3d  .x.iOrderByCol<=
18120 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
18130 20 29 3b 0a 20 20 20 20 20 20 61 50 65 72 6d 75   );.      aPermu
18140 74 65 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 75  te[i] = pItem->u
18150 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 2d  .x.iOrderByCol -
18160 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b   1;.    }.    pK
18170 65 79 4d 65 72 67 65 20 3d 20 6d 75 6c 74 69 53  eyMerge = multiS
18180 65 6c 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49  electOrderByKeyI
18190 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 2c 20 31  nfo(pParse, p, 1
181a0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
181b0 70 4b 65 79 4d 65 72 67 65 20 3d 20 30 3b 0a 20  pKeyMerge = 0;. 
181c0 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 74 74 61 63   }..  /* Reattac
181d0 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  h the ORDER BY c
181e0 6c 61 75 73 65 20 74 6f 20 74 68 65 20 71 75 65  lause to the que
181f0 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 4f  ry..  */.  p->pO
18200 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
18210 79 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4f 72  y;.  pPrior->pOr
18220 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45  derBy = sqlite3E
18230 78 70 72 4c 69 73 74 44 75 70 28 70 50 61 72 73  xprListDup(pPars
18240 65 2d 3e 64 62 2c 20 70 4f 72 64 65 72 42 79 2c  e->db, pOrderBy,
18250 20 30 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63   0);..  /* Alloc
18260 61 74 65 20 61 20 72 61 6e 67 65 20 6f 66 20 74  ate a range of t
18270 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65  emporary registe
18280 72 73 20 61 6e 64 20 74 68 65 20 4b 65 79 49 6e  rs and the KeyIn
18290 66 6f 20 6e 65 65 64 65 64 0a 20 20 2a 2a 20 66  fo needed.  ** f
182a0 6f 72 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61  or the logic tha
182b0 74 20 72 65 6d 6f 76 65 73 20 64 75 70 6c 69 63  t removes duplic
182c0 61 74 65 20 72 65 73 75 6c 74 20 72 6f 77 73 20  ate result rows 
182d0 77 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 70  when the.  ** op
182e0 65 72 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 2c  erator is UNION,
182f0 20 45 58 43 45 50 54 2c 20 6f 72 20 49 4e 54 45   EXCEPT, or INTE
18300 52 53 45 43 54 20 28 62 75 74 20 6e 6f 74 20 55  RSECT (but not U
18310 4e 49 4f 4e 20 41 4c 4c 29 2e 0a 20 20 2a 2f 0a  NION ALL)..  */.
18320 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c    if( op==TK_ALL
18330 20 29 7b 0a 20 20 20 20 72 65 67 50 72 65 76 20   ){.    regPrev 
18340 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
18350 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 2d    int nExpr = p-
18360 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  >pEList->nExpr;.
18370 20 20 20 20 61 73 73 65 72 74 28 20 6e 4f 72 64      assert( nOrd
18380 65 72 42 79 3e 3d 6e 45 78 70 72 20 7c 7c 20 64  erBy>=nExpr || d
18390 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
183a0 29 3b 0a 20 20 20 20 72 65 67 50 72 65 76 20 3d  );.    regPrev =
183b0 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
183c0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
183d0 6d 20 2b 3d 20 6e 45 78 70 72 2b 31 3b 0a 20 20  m += nExpr+1;.  
183e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
183f0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
18400 72 2c 20 30 2c 20 72 65 67 50 72 65 76 29 3b 0a  r, 0, regPrev);.
18410 20 20 20 20 70 4b 65 79 44 75 70 20 3d 20 73 71      pKeyDup = sq
18420 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f  lite3KeyInfoAllo
18430 63 28 64 62 2c 20 6e 45 78 70 72 2c 20 31 29 3b  c(db, nExpr, 1);
18440 0a 20 20 20 20 69 66 28 20 70 4b 65 79 44 75 70  .    if( pKeyDup
18450 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
18460 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  ( sqlite3KeyInfo
18470 49 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79  IsWriteable(pKey
18480 44 75 70 29 20 29 3b 0a 20 20 20 20 20 20 66 6f  Dup) );.      fo
18490 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20  r(i=0; i<nExpr; 
184a0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4b  i++){.        pK
184b0 65 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b 69 5d 20  eyDup->aColl[i] 
184c0 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c  = multiSelectCol
184d0 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20  lSeq(pParse, p, 
184e0 69 29 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79  i);.        pKey
184f0 44 75 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  Dup->aSortOrder[
18500 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  i] = 0;.      }.
18510 20 20 20 20 7d 0a 20 20 7d 0a 20 0a 20 20 2f 2a      }.  }. .  /*
18520 20 53 65 70 61 72 61 74 65 20 74 68 65 20 6c 65   Separate the le
18530 66 74 20 61 6e 64 20 74 68 65 20 72 69 67 68 74  ft and the right
18540 20 71 75 65 72 79 20 66 72 6f 6d 20 6f 6e 65 20   query from one 
18550 61 6e 6f 74 68 65 72 0a 20 20 2a 2f 0a 20 20 70  another.  */.  p
18560 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
18570 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20  pPrior->pNext = 
18580 30 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f  0;.  sqlite3Reso
18590 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28  lveOrderGroupBy(
185a0 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f  pParse, p, p->pO
185b0 72 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29  rderBy, "ORDER")
185c0 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e  ;.  if( pPrior->
185d0 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20  pPrior==0 ){.   
185e0 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f   sqlite3ResolveO
185f0 72 64 65 72 47 72 6f 75 70 42 79 28 70 50 61 72  rderGroupBy(pPar
18600 73 65 2c 20 70 50 72 69 6f 72 2c 20 70 50 72 69  se, pPrior, pPri
18610 6f 72 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f  or->pOrderBy, "O
18620 52 44 45 52 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f  RDER");.  }..  /
18630 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6c 69  * Compute the li
18640 6d 69 74 20 72 65 67 69 73 74 65 72 73 20 2a 2f  mit registers */
18650 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52  .  computeLimitR
18660 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
18670 20 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20   p, labelEnd);. 
18680 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 26   if( p->iLimit &
18690 26 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a  & op==TK_ALL ){.
186a0 20 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20      regLimitA = 
186b0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
186c0 20 20 20 20 72 65 67 4c 69 6d 69 74 42 20 3d 20      regLimitB = 
186d0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
186e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
186f0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79  ddOp2(v, OP_Copy
18700 2c 20 70 2d 3e 69 4f 66 66 73 65 74 20 3f 20 70  , p->iOffset ? p
18710 2d 3e 69 4f 66 66 73 65 74 2b 31 20 3a 20 70 2d  ->iOffset+1 : p-
18720 3e 69 4c 69 6d 69 74 2c 0a 20 20 20 20 20 20 20  >iLimit,.       
18730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18740 20 20 20 20 20 20 20 20 20 20 20 72 65 67 4c 69             regLi
18750 6d 69 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74  mitA);.    sqlit
18760 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
18770 4f 50 5f 43 6f 70 79 2c 20 72 65 67 4c 69 6d 69  OP_Copy, regLimi
18780 74 41 2c 20 72 65 67 4c 69 6d 69 74 42 29 3b 0a  tA, regLimitB);.
18790 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67    }else{.    reg
187a0 4c 69 6d 69 74 41 20 3d 20 72 65 67 4c 69 6d 69  LimitA = regLimi
187b0 74 42 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71  tB = 0;.  }.  sq
187c0 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
187d0 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a  db, p->pLimit);.
187e0 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b    p->pLimit = 0;
187f0 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
18800 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 66 66  lete(db, p->pOff
18810 73 65 74 29 3b 0a 20 20 70 2d 3e 70 4f 66 66 73  set);.  p->pOffs
18820 65 74 20 3d 20 30 3b 0a 0a 20 20 72 65 67 41 64  et = 0;..  regAd
18830 64 72 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  drA = ++pParse->
18840 6e 4d 65 6d 3b 0a 20 20 72 65 67 41 64 64 72 42  nMem;.  regAddrB
18850 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
18860 6d 3b 0a 20 20 72 65 67 4f 75 74 41 20 3d 20 2b  m;.  regOutA = +
18870 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
18880 20 72 65 67 4f 75 74 42 20 3d 20 2b 2b 70 50 61   regOutB = ++pPa
18890 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c  rse->nMem;.  sql
188a0 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
188b0 69 74 28 26 64 65 73 74 41 2c 20 53 52 54 5f 43  it(&destA, SRT_C
188c0 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64  oroutine, regAdd
188d0 72 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  rA);.  sqlite3Se
188e0 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65  lectDestInit(&de
188f0 73 74 42 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69  stB, SRT_Corouti
18900 6e 65 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 0a  ne, regAddrB);..
18910 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
18920 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76 61  coroutine to eva
18930 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45 43 54  luate the SELECT
18940 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 74 68   statement to th
18950 65 0a 20 20 2a 2a 20 6c 65 66 74 20 6f 66 20 74  e.  ** left of t
18960 68 65 20 63 6f 6d 70 6f 75 6e 64 20 6f 70 65 72  he compound oper
18970 61 74 6f 72 20 2d 20 74 68 65 20 22 41 22 20 73  ator - the "A" s
18980 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 61 64  elect..  */.  ad
18990 64 72 53 65 6c 65 63 74 41 20 3d 20 73 71 6c 69  drSelectA = sqli
189a0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
189b0 64 72 28 76 29 20 2b 20 31 3b 0a 20 20 6a 31 20  dr(v) + 1;.  j1 
189c0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
189d0 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f  Op3(v, OP_InitCo
189e0 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72  routine, regAddr
189f0 41 2c 20 30 2c 20 61 64 64 72 53 65 6c 65 63 74  A, 0, addrSelect
18a00 41 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e  A);.  VdbeCommen
18a10 74 28 28 76 2c 20 22 6c 65 66 74 20 53 45 4c 45  t((v, "left SELE
18a20 43 54 22 29 29 3b 0a 20 20 70 50 72 69 6f 72 2d  CT"));.  pPrior-
18a30 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d  >iLimit = regLim
18a40 69 74 41 3b 0a 20 20 65 78 70 6c 61 69 6e 53 65  itA;.  explainSe
18a50 74 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20  tInteger(iSub1, 
18a60 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
18a70 65 63 74 49 64 29 3b 0a 20 20 73 71 6c 69 74 65  ectId);.  sqlite
18a80 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
18a90 70 50 72 69 6f 72 2c 20 26 64 65 73 74 41 29 3b  pPrior, &destA);
18aa0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
18ab0 64 4f 70 31 28 76 2c 20 4f 50 5f 45 6e 64 43 6f  dOp1(v, OP_EndCo
18ac0 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72  routine, regAddr
18ad0 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  A);.  sqlite3Vdb
18ae0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29  eJumpHere(v, j1)
18af0 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
18b00 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20   a coroutine to 
18b10 65 76 61 6c 75 61 74 65 20 74 68 65 20 53 45 4c  evaluate the SEL
18b20 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e  ECT statement on
18b30 20 0a 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74   .  ** the right
18b40 20 2d 20 74 68 65 20 22 42 22 20 73 65 6c 65 63   - the "B" selec
18b50 74 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c  t.  */.  addrSel
18b60 65 63 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64  ectB = sqlite3Vd
18b70 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
18b80 20 2b 20 31 3b 0a 20 20 6a 31 20 3d 20 73 71 6c   + 1;.  j1 = sql
18b90 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
18ba0 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69  , OP_InitCorouti
18bb0 6e 65 2c 20 72 65 67 41 64 64 72 42 2c 20 30 2c  ne, regAddrB, 0,
18bc0 20 61 64 64 72 53 65 6c 65 63 74 42 29 3b 0a 20   addrSelectB);. 
18bd0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
18be0 20 22 72 69 67 68 74 20 53 45 4c 45 43 54 22 29   "right SELECT")
18bf0 29 3b 0a 20 20 73 61 76 65 64 4c 69 6d 69 74 20  );.  savedLimit 
18c00 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 73  = p->iLimit;.  s
18c10 61 76 65 64 4f 66 66 73 65 74 20 3d 20 70 2d 3e  avedOffset = p->
18c20 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e 69 4c  iOffset;.  p->iL
18c30 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69 74 42  imit = regLimitB
18c40 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d  ;.  p->iOffset =
18c50 20 30 3b 20 20 0a 20 20 65 78 70 6c 61 69 6e 53   0;  .  explainS
18c60 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c  etInteger(iSub2,
18c70 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
18c80 6c 65 63 74 49 64 29 3b 0a 20 20 73 71 6c 69 74  lectId);.  sqlit
18c90 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
18ca0 20 70 2c 20 26 64 65 73 74 42 29 3b 0a 20 20 70   p, &destB);.  p
18cb0 2d 3e 69 4c 69 6d 69 74 20 3d 20 73 61 76 65 64  ->iLimit = saved
18cc0 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e 69 4f 66 66  Limit;.  p->iOff
18cd0 73 65 74 20 3d 20 73 61 76 65 64 4f 66 66 73 65  set = savedOffse
18ce0 74 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  t;.  sqlite3Vdbe
18cf0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 45 6e 64  AddOp1(v, OP_End
18d00 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64  Coroutine, regAd
18d10 64 72 42 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  drB);..  /* Gene
18d20 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e  rate a subroutin
18d30 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 74  e that outputs t
18d40 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f  he current row o
18d50 66 20 74 68 65 20 41 0a 20 20 2a 2a 20 73 65 6c  f the A.  ** sel
18d60 65 63 74 20 61 73 20 74 68 65 20 6e 65 78 74 20  ect as the next 
18d70 6f 75 74 70 75 74 20 72 6f 77 20 6f 66 20 74 68  output row of th
18d80 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  e compound selec
18d90 74 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f  t..  */.  VdbeNo
18da0 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f  opComment((v, "O
18db0 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20 66 6f  utput routine fo
18dc0 72 20 41 22 29 29 3b 0a 20 20 61 64 64 72 4f 75  r A"));.  addrOu
18dd0 74 41 20 3d 20 67 65 6e 65 72 61 74 65 4f 75 74  tA = generateOut
18de0 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28 70 50  putSubroutine(pP
18df0 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
18e00 20 20 20 20 20 20 20 70 2c 20 26 64 65 73 74 41         p, &destA
18e10 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75 74 41  , pDest, regOutA
18e20 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
18e30 20 20 20 72 65 67 50 72 65 76 2c 20 70 4b 65 79     regPrev, pKey
18e40 44 75 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a  Dup, labelEnd);.
18e50 20 20 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65    .  /* Generate
18e60 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68   a subroutine th
18e70 61 74 20 6f 75 74 70 75 74 73 20 74 68 65 20 63  at outputs the c
18e80 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68  urrent row of th
18e90 65 20 42 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20  e B.  ** select 
18ea0 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70  as the next outp
18eb0 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f  ut row of the co
18ec0 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20  mpound select.. 
18ed0 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b   */.  if( op==TK
18ee0 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55  _ALL || op==TK_U
18ef0 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 56 64 62 65  NION ){.    Vdbe
18f00 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
18f10 22 4f 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20  "Output routine 
18f20 66 6f 72 20 42 22 29 29 3b 0a 20 20 20 20 61 64  for B"));.    ad
18f30 64 72 4f 75 74 42 20 3d 20 67 65 6e 65 72 61 74  drOutB = generat
18f40 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e  eOutputSubroutin
18f50 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
18f60 20 20 20 20 20 20 20 20 20 20 20 70 2c 20 26 64             p, &d
18f70 65 73 74 42 2c 20 70 44 65 73 74 2c 20 72 65 67  estB, pDest, reg
18f80 4f 75 74 42 2c 0a 20 20 20 20 20 20 20 20 20 20  OutB,.          
18f90 20 20 20 20 20 20 20 72 65 67 50 72 65 76 2c 20         regPrev, 
18fa0 70 4b 65 79 44 75 70 2c 20 6c 61 62 65 6c 45 6e  pKeyDup, labelEn
18fb0 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  d);.  }.  sqlite
18fc0 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b  3KeyInfoUnref(pK
18fd0 65 79 44 75 70 29 3b 0a 0a 20 20 2f 2a 20 47 65  eyDup);..  /* Ge
18fe0 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
18ff0 69 6e 65 20 74 6f 20 72 75 6e 20 77 68 65 6e 20  ine to run when 
19000 74 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d  the results from
19010 20 73 65 6c 65 63 74 20 41 0a 20 20 2a 2a 20 61   select A.  ** a
19020 72 65 20 65 78 68 61 75 73 74 65 64 20 61 6e 64  re exhausted and
19030 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20 73 65   only data in se
19040 6c 65 63 74 20 42 20 72 65 6d 61 69 6e 73 2e 0a  lect B remains..
19050 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54    */.  if( op==T
19060 4b 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d  K_EXCEPT || op==
19070 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a  TK_INTERSECT ){.
19080 20 20 20 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42      addrEofA_noB
19090 20 3d 20 61 64 64 72 45 6f 66 41 20 3d 20 6c 61   = addrEofA = la
190a0 62 65 6c 45 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b  belEnd;.  }else{
190b0 20 20 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43    .    VdbeNoopC
190c0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d  omment((v, "eof-
190d0 41 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b  A subroutine"));
190e0 0a 20 20 20 20 61 64 64 72 45 6f 66 41 20 3d 20  .    addrEofA = 
190f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19100 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
19110 65 67 4f 75 74 42 2c 20 61 64 64 72 4f 75 74 42  egOutB, addrOutB
19120 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66 41 5f  );.    addrEofA_
19130 6e 6f 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62  noB = sqlite3Vdb
19140 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69  eAddOp2(v, OP_Yi
19150 65 6c 64 2c 20 72 65 67 41 64 64 72 42 2c 20 6c  eld, regAddrB, l
19160 61 62 65 6c 45 6e 64 29 3b 0a 20 20 20 20 20 20  abelEnd);.      
19170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56                 V
19190 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
191a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
191b0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
191c0 2c 20 30 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a  , 0, addrEofA);.
191d0 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f      p->nSelectRo
191e0 77 20 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65  w += pPrior->nSe
191f0 6c 65 63 74 52 6f 77 3b 0a 20 20 7d 0a 0a 20 20  lectRow;.  }..  
19200 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
19210 62 72 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20  broutine to run 
19220 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73  when the results
19230 20 66 72 6f 6d 20 73 65 6c 65 63 74 20 42 0a 20   from select B. 
19240 20 2a 2a 20 61 72 65 20 65 78 68 61 75 73 74 65   ** are exhauste
19250 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20  d and only data 
19260 69 6e 20 73 65 6c 65 63 74 20 41 20 72 65 6d 61  in select A rema
19270 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ins..  */.  if( 
19280 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54  op==TK_INTERSECT
19290 20 29 7b 0a 20 20 20 20 61 64 64 72 45 6f 66 42   ){.    addrEofB
192a0 20 3d 20 61 64 64 72 45 6f 66 41 3b 0a 20 20 20   = addrEofA;.   
192b0 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52   if( p->nSelectR
192c0 6f 77 20 3e 20 70 50 72 69 6f 72 2d 3e 6e 53 65  ow > pPrior->nSe
192d0 6c 65 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53 65  lectRow ) p->nSe
192e0 6c 65 63 74 52 6f 77 20 3d 20 70 50 72 69 6f 72  lectRow = pPrior
192f0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20  ->nSelectRow;.  
19300 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20 56 64 62  }else{  .    Vdb
19310 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
19320 20 22 65 6f 66 2d 42 20 73 75 62 72 6f 75 74 69   "eof-B subrouti
19330 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72 45  ne"));.    addrE
19340 6f 66 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ofB = sqlite3Vdb
19350 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
19360 73 75 62 2c 20 72 65 67 4f 75 74 41 2c 20 61 64  sub, regOutA, ad
19370 64 72 4f 75 74 41 29 3b 0a 20 20 20 20 73 71 6c  drOutA);.    sql
19380 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
19390 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
193a0 64 64 72 41 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  ddrA, labelEnd);
193b0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
193c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
193d0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
193e0 74 6f 2c 20 30 2c 20 61 64 64 72 45 6f 66 42 29  to, 0, addrEofB)
193f0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65  ;.  }..  /* Gene
19400 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e  rate code to han
19410 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66 20  dle the case of 
19420 41 3c 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e  A<B.  */.  VdbeN
19430 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
19440 41 2d 6c 74 2d 42 20 73 75 62 72 6f 75 74 69 6e  A-lt-B subroutin
19450 65 22 29 29 3b 0a 20 20 61 64 64 72 41 6c 74 42  e"));.  addrAltB
19460 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
19470 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
19480 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f  , regOutA, addrO
19490 75 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  utA);.  sqlite3V
194a0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
194b0 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c  Yield, regAddrA,
194c0 20 61 64 64 72 45 6f 66 41 29 3b 20 56 64 62 65   addrEofA); Vdbe
194d0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73  Coverage(v);.  s
194e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
194f0 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
19500 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f  labelCmpr);..  /
19510 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
19520 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61  to handle the ca
19530 73 65 20 6f 66 20 41 3d 3d 42 0a 20 20 2a 2f 0a  se of A==B.  */.
19540 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c    if( op==TK_ALL
19550 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42   ){.    addrAeqB
19560 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 7d   = addrAltB;.  }
19570 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  else if( op==TK_
19580 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20  INTERSECT ){.   
19590 20 61 64 64 72 41 65 71 42 20 3d 20 61 64 64 72   addrAeqB = addr
195a0 41 6c 74 42 3b 0a 20 20 20 20 61 64 64 72 41 6c  AltB;.    addrAl
195b0 74 42 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  tB++;.  }else{. 
195c0 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65     VdbeNoopComme
195d0 6e 74 28 28 76 2c 20 22 41 2d 65 71 2d 42 20 73  nt((v, "A-eq-B s
195e0 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20  ubroutine"));.  
195f0 20 20 61 64 64 72 41 65 71 42 20 3d 0a 20 20 20    addrAeqB =.   
19600 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19610 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p2(v, OP_Yield, 
19620 72 65 67 41 64 64 72 41 2c 20 61 64 64 72 45 6f  regAddrA, addrEo
19630 66 41 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  fA); VdbeCoverag
19640 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(v);.    sqlite
19650 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
19660 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c  P_Goto, 0, label
19670 43 6d 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Cmpr);.  }..  /*
19680 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
19690 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73  o handle the cas
196a0 65 20 6f 66 20 41 3e 42 0a 20 20 2a 2f 0a 20 20  e of A>B.  */.  
196b0 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
196c0 28 76 2c 20 22 41 2d 67 74 2d 42 20 73 75 62 72  (v, "A-gt-B subr
196d0 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61 64 64  outine"));.  add
196e0 72 41 67 74 42 20 3d 20 73 71 6c 69 74 65 33 56  rAgtB = sqlite3V
196f0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
19700 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  );.  if( op==TK_
19710 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e  ALL || op==TK_UN
19720 49 4f 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ION ){.    sqlit
19730 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
19740 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74  OP_Gosub, regOut
19750 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a 20 20  B, addrOutB);.  
19760 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
19770 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp2(v, OP_Yiel
19780 64 2c 20 72 65 67 41 64 64 72 42 2c 20 61 64 64  d, regAddrB, add
19790 72 45 6f 66 42 29 3b 20 56 64 62 65 43 6f 76 65  rEofB); VdbeCove
197a0 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74  rage(v);.  sqlit
197b0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
197c0 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65  OP_Goto, 0, labe
197d0 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 54 68  lCmpr);..  /* Th
197e0 69 73 20 63 6f 64 65 20 72 75 6e 73 20 6f 6e 63  is code runs onc
197f0 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  e to initialize 
19800 65 76 65 72 79 74 68 69 6e 67 2e 0a 20 20 2a 2f  everything..  */
19810 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
19820 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20  mpHere(v, j1);. 
19830 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19840 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p2(v, OP_Yield, 
19850 72 65 67 41 64 64 72 41 2c 20 61 64 64 72 45 6f  regAddrA, addrEo
19860 66 41 5f 6e 6f 42 29 3b 20 56 64 62 65 43 6f 76  fA_noB); VdbeCov
19870 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69  erage(v);.  sqli
19880 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
19890 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
198a0 64 72 42 2c 20 61 64 64 72 45 6f 66 42 29 3b 20  drB, addrEofB); 
198b0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
198c0 0a 0a 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74  ..  /* Implement
198d0 20 74 68 65 20 6d 61 69 6e 20 6d 65 72 67 65 20   the main merge 
198e0 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  loop.  */.  sqli
198f0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
19900 62 65 6c 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72  bel(v, labelCmpr
19910 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
19920 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 50 65 72  AddOp4(v, OP_Per
19930 6d 75 74 61 74 69 6f 6e 2c 20 30 2c 20 30 2c 20  mutation, 0, 0, 
19940 30 2c 20 28 63 68 61 72 2a 29 61 50 65 72 6d 75  0, (char*)aPermu
19950 74 65 2c 20 50 34 5f 49 4e 54 41 52 52 41 59 29  te, P4_INTARRAY)
19960 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
19970 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70  ddOp4(v, OP_Comp
19980 61 72 65 2c 20 64 65 73 74 41 2e 69 53 64 73 74  are, destA.iSdst
19990 2c 20 64 65 73 74 42 2e 69 53 64 73 74 2c 20 6e  , destB.iSdst, n
199a0 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20  OrderBy,.       
199b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
199c0 20 20 28 63 68 61 72 2a 29 70 4b 65 79 4d 65 72    (char*)pKeyMer
199d0 67 65 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  ge, P4_KEYINFO);
199e0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
199f0 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
19a00 5f 50 45 52 4d 55 54 45 29 3b 0a 20 20 73 71 6c  _PERMUTE);.  sql
19a10 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
19a20 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 41  , OP_Jump, addrA
19a30 6c 74 42 2c 20 61 64 64 72 41 65 71 42 2c 20 61  ltB, addrAeqB, a
19a40 64 64 72 41 67 74 42 29 3b 20 56 64 62 65 43 6f  ddrAgtB); VdbeCo
19a50 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a  verage(v);..  /*
19a60 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 74 68 69   Jump to the thi
19a70 73 20 70 6f 69 6e 74 20 69 6e 20 6f 72 64 65 72  s point in order
19a80 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68   to terminate th
19a90 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  e query..  */.  
19aa0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
19ab0 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c  veLabel(v, label
19ac0 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20  End);..  /* Set 
19ad0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75  the number of ou
19ae0 74 70 75 74 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a  tput columns.  *
19af0 2f 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 65  /.  if( pDest->e
19b00 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
19b10 20 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a   ){.    Select *
19b20 70 46 69 72 73 74 20 3d 20 70 50 72 69 6f 72 3b  pFirst = pPrior;
19b30 0a 20 20 20 20 77 68 69 6c 65 28 20 70 46 69 72  .    while( pFir
19b40 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69  st->pPrior ) pFi
19b50 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50  rst = pFirst->pP
19b60 72 69 6f 72 3b 0a 20 20 20 20 67 65 6e 65 72 61  rior;.    genera
19b70 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  teColumnNames(pP
19b80 61 72 73 65 2c 20 30 2c 20 70 46 69 72 73 74 2d  arse, 0, pFirst-
19b90 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20  >pEList);.  }.. 
19ba0 20 2f 2a 20 52 65 61 73 73 65 6d 62 6c 79 20 74   /* Reassembly t
19bb0 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72  he compound quer
19bc0 79 20 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c  y so that it wil
19bd0 6c 20 62 65 20 66 72 65 65 64 20 63 6f 72 72 65  l be freed corre
19be0 63 74 6c 79 0a 20 20 2a 2a 20 62 79 20 74 68 65  ctly.  ** by the
19bf0 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
19c00 6e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50  n */.  if( p->pP
19c10 72 69 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  rior ){.    sqli
19c20 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
19c30 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a  db, p->pPrior);.
19c40 20 20 7d 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20    }.  p->pPrior 
19c50 3d 20 70 50 72 69 6f 72 3b 0a 20 20 70 50 72 69  = pPrior;.  pPri
19c60 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 0a  or->pNext = p;..
19c70 20 20 2f 2a 2a 2a 20 54 42 44 3a 20 20 49 6e 73    /*** TBD:  Ins
19c80 65 72 74 20 73 75 62 72 6f 75 74 69 6e 65 20 63  ert subroutine c
19c90 61 6c 6c 73 20 74 6f 20 63 6c 6f 73 65 20 63 75  alls to close cu
19ca0 72 73 6f 72 73 20 6f 6e 20 69 6e 63 6f 6d 70 6c  rsors on incompl
19cb0 65 74 65 0a 20 20 2a 2a 2a 2a 20 73 75 62 71 75  ete.  **** subqu
19cc0 65 72 69 65 73 20 2a 2a 2a 2a 2f 0a 20 20 65 78  eries ****/.  ex
19cd0 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 70  plainComposite(p
19ce0 50 61 72 73 65 2c 20 70 2d 3e 6f 70 2c 20 69 53  Parse, p->op, iS
19cf0 75 62 31 2c 20 69 53 75 62 32 2c 20 30 29 3b 0a  ub1, iSub2, 0);.
19d00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
19d10 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  OK;.}.#endif..#i
19d20 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
19d30 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
19d40 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
19d50 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f  ITE_OMIT_VIEW)./
19d60 2a 20 46 6f 72 77 61 72 64 20 44 65 63 6c 61 72  * Forward Declar
19d70 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63  ations */.static
19d80 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c   void substExprL
19d90 69 73 74 28 73 71 6c 69 74 65 33 2a 2c 20 45 78  ist(sqlite3*, Ex
19da0 70 72 4c 69 73 74 2a 2c 20 69 6e 74 2c 20 45 78  prList*, int, Ex
19db0 70 72 4c 69 73 74 2a 29 3b 0a 73 74 61 74 69 63  prList*);.static
19dc0 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63   void substSelec
19dd0 74 28 73 71 6c 69 74 65 33 2a 2c 20 53 65 6c 65  t(sqlite3*, Sele
19de0 63 74 20 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c  ct *, int, ExprL
19df0 69 73 74 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53  ist *);../*.** S
19e00 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20  can through the 
19e10 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
19e20 2e 20 20 52 65 70 6c 61 63 65 20 65 76 65 72 79  .  Replace every
19e30 20 72 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a 2a   reference to.**
19e40 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62   a column in tab
19e50 6c 65 20 6e 75 6d 62 65 72 20 69 54 61 62 6c 65  le number iTable
19e60 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20   with a copy of 
19e70 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a  the iColumn-th.*
19e80 2a 20 65 6e 74 72 79 20 69 6e 20 70 45 4c 69 73  * entry in pELis
19e90 74 2e 20 20 28 42 75 74 20 6c 65 61 76 65 20 72  t.  (But leave r
19ea0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
19eb0 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a   ROWID column .*
19ec0 2a 20 75 6e 63 68 61 6e 67 65 64 2e 29 0a 2a 2a  * unchanged.).**
19ed0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
19ee0 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
19ef0 66 6c 61 74 74 65 6e 69 6e 67 20 70 72 6f 63 65  flattening proce
19f00 64 75 72 65 2e 20 20 41 20 73 75 62 71 75 65 72  dure.  A subquer
19f10 79 0a 2a 2a 20 77 68 6f 73 65 20 72 65 73 75 6c  y.** whose resul
19f20 74 20 73 65 74 20 69 73 20 64 65 66 69 6e 65 64  t set is defined
19f30 20 62 79 20 70 45 4c 69 73 74 20 61 70 70 65 61   by pEList appea
19f40 72 73 20 61 73 20 65 6e 74 72 79 20 69 6e 20 74  rs as entry in t
19f50 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73  he.** FROM claus
19f60 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 75  e of a SELECT su
19f70 63 68 20 74 68 61 74 20 74 68 65 20 56 44 42 45  ch that the VDBE
19f80 20 63 75 72 73 6f 72 20 61 73 73 69 67 6e 65 64   cursor assigned
19f90 20 74 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52 4d   to that.** FORM
19fa0 20 63 6c 61 75 73 65 20 65 6e 74 72 79 20 69 73   clause entry is
19fb0 20 69 54 61 62 6c 65 2e 20 20 54 68 69 73 20 72   iTable.  This r
19fc0 6f 75 74 69 6e 65 20 6d 61 6b 65 20 74 68 65 20  outine make the 
19fd0 6e 65 63 65 73 73 61 72 79 20 0a 2a 2a 20 63 68  necessary .** ch
19fe0 61 6e 67 65 73 20 74 6f 20 70 45 78 70 72 20 73  anges to pExpr s
19ff0 6f 20 74 68 61 74 20 69 74 20 72 65 66 65 72 73  o that it refers
1a000 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65   directly to the
1a010 20 73 6f 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a   source table.**
1a020 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
1a030 20 72 61 74 68 65 72 20 74 68 65 20 72 65 73 75   rather the resu
1a040 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 73 75  lt set of the su
1a050 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  bquery..*/.stati
1a060 63 20 45 78 70 72 20 2a 73 75 62 73 74 45 78 70  c Expr *substExp
1a070 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  r(.  sqlite3 *db
1a080 2c 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f  ,        /* Repo
1a090 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73  rt malloc errors
1a0a0 20 74 6f 20 74 68 69 73 20 63 6f 6e 6e 65 63 74   to this connect
1a0b0 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ion */.  Expr *p
1a0c0 45 78 70 72 2c 20 20 20 20 20 20 20 20 2f 2a 20  Expr,        /* 
1a0d0 45 78 70 72 20 69 6e 20 77 68 69 63 68 20 73 75  Expr in which su
1a0e0 62 73 74 69 74 75 74 69 6f 6e 20 6f 63 63 75 72  bstitution occur
1a0f0 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  s */.  int iTabl
1a100 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61  e,         /* Ta
1a110 62 6c 65 20 74 6f 20 62 65 20 73 75 62 73 74 69  ble to be substi
1a120 74 75 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c  tuted */.  ExprL
1a130 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f  ist *pEList    /
1a140 2a 20 53 75 62 73 74 69 74 75 74 65 20 65 78 70  * Substitute exp
1a150 72 65 73 73 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20  ressions */.){. 
1a160 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20   if( pExpr==0 ) 
1a170 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
1a180 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
1a190 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69  LUMN && pExpr->i
1a1a0 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 29 7b  Table==iTable ){
1a1b0 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e  .    if( pExpr->
1a1c0 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20  iColumn<0 ){.   
1a1d0 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54     pExpr->op = T
1a1e0 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73  K_NULL;.    }els
1a1f0 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  e{.      Expr *p
1a200 4e 65 77 3b 0a 20 20 20 20 20 20 61 73 73 65 72  New;.      asser
1a210 74 28 20 70 45 4c 69 73 74 21 3d 30 20 26 26 20  t( pEList!=0 && 
1a220 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70  pExpr->iColumn<p
1a230 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a  EList->nExpr );.
1a240 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
1a250 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26  xpr->pLeft==0 &&
1a260 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d   pExpr->pRight==
1a270 30 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20  0 );.      pNew 
1a280 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
1a290 28 64 62 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 70  (db, pEList->a[p
1a2a0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70  Expr->iColumn].p
1a2b0 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  Expr, 0);.      
1a2c0 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
1a2d0 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20  e(db, pExpr);.  
1a2e0 20 20 20 20 70 45 78 70 72 20 3d 20 70 4e 65 77      pExpr = pNew
1a2f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
1a300 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66  .    pExpr->pLef
1a310 74 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62  t = substExpr(db
1a320 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1a330 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
1a340 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67  .    pExpr->pRig
1a350 68 74 20 3d 20 73 75 62 73 74 45 78 70 72 28 64  ht = substExpr(d
1a360 62 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  b, pExpr->pRight
1a370 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
1a380 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48  );.    if( ExprH
1a390 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1a3a0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
1a3b0 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 53 65  ){.      substSe
1a3c0 6c 65 63 74 28 64 62 2c 20 70 45 78 70 72 2d 3e  lect(db, pExpr->
1a3d0 78 2e 70 53 65 6c 65 63 74 2c 20 69 54 61 62 6c  x.pSelect, iTabl
1a3e0 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  e, pEList);.    
1a3f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 75 62  }else{.      sub
1a400 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70  stExprList(db, p
1a410 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 20 69  Expr->x.pList, i
1a420 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
1a430 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1a440 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 73 74 61 74  rn pExpr;.}.stat
1a450 69 63 20 76 6f 69 64 20 73 75 62 73 74 45 78 70  ic void substExp
1a460 72 4c 69 73 74 28 0a 20 20 73 71 6c 69 74 65 33  rList(.  sqlite3
1a470 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a   *db,         /*
1a480 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65   Report malloc e
1a490 72 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20 20  rrors here */.  
1a4a0 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
1a4b0 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20       /* List to 
1a4c0 73 63 61 6e 20 61 6e 64 20 69 6e 20 77 68 69 63  scan and in whic
1a4d0 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69  h to make substi
1a4e0 74 75 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69  tutes */.  int i
1a4f0 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20  Table,          
1a500 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 73  /* Table to be s
1a510 75 62 73 74 69 74 75 74 65 64 20 2a 2f 0a 20 20  ubstituted */.  
1a520 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
1a530 20 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75       /* Substitu
1a540 74 65 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a  te values */.){.
1a550 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
1a560 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
1a570 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
1a580 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
1a590 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b  ){.    pList->a[
1a5a0 69 5d 2e 70 45 78 70 72 20 3d 20 73 75 62 73 74  i].pExpr = subst
1a5b0 45 78 70 72 28 64 62 2c 20 70 4c 69 73 74 2d 3e  Expr(db, pList->
1a5c0 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62  a[i].pExpr, iTab
1a5d0 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d  le, pEList);.  }
1a5e0 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  .}.static void s
1a5f0 75 62 73 74 53 65 6c 65 63 74 28 0a 20 20 73 71  ubstSelect(.  sq
1a600 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
1a610 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c     /* Report mal
1a620 6c 6f 63 20 65 72 72 6f 72 73 20 68 65 72 65 20  loc errors here 
1a630 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
1a640 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c            /* SEL
1a650 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e  ECT statement in
1a660 20 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73   which to make s
1a670 75 62 73 74 69 74 75 74 69 6f 6e 73 20 2a 2f 0a  ubstitutions */.
1a680 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
1a690 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
1a6a0 74 6f 20 62 65 20 72 65 70 6c 61 63 65 64 20 2a  to be replaced *
1a6b0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
1a6c0 4c 69 73 74 20 20 20 20 20 2f 2a 20 53 75 62 73  List     /* Subs
1a6d0 74 69 74 75 74 65 20 76 61 6c 75 65 73 20 2a 2f  titute values */
1a6e0 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  .){.  SrcList *p
1a6f0 53 72 63 3b 0a 20 20 73 74 72 75 63 74 20 53 72  Src;.  struct Sr
1a700 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
1a710 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  m;.  int i;.  if
1a720 28 20 21 70 20 29 20 72 65 74 75 72 6e 3b 0a 20  ( !p ) return;. 
1a730 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64   substExprList(d
1a740 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 69 54  b, p->pEList, iT
1a750 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
1a760 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64   substExprList(d
1a770 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20  b, p->pGroupBy, 
1a780 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
1a790 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  .  substExprList
1a7a0 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  (db, p->pOrderBy
1a7b0 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
1a7c0 29 3b 0a 20 20 70 2d 3e 70 48 61 76 69 6e 67 20  );.  p->pHaving 
1a7d0 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20  = substExpr(db, 
1a7e0 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 54 61 62  p->pHaving, iTab
1a7f0 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 70  le, pEList);.  p
1a800 2d 3e 70 57 68 65 72 65 20 3d 20 73 75 62 73 74  ->pWhere = subst
1a810 45 78 70 72 28 64 62 2c 20 70 2d 3e 70 57 68 65  Expr(db, p->pWhe
1a820 72 65 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  re, iTable, pELi
1a830 73 74 29 3b 0a 20 20 73 75 62 73 74 53 65 6c 65  st);.  substSele
1a840 63 74 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72  ct(db, p->pPrior
1a850 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
1a860 29 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70  );.  pSrc = p->p
1a870 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Src;.  assert( p
1a880 53 72 63 20 29 3b 20 20 2f 2a 20 45 76 65 6e 20  Src );  /* Even 
1a890 66 6f 72 20 28 53 45 4c 45 43 54 20 31 29 20 77  for (SELECT 1) w
1a8a0 65 20 68 61 76 65 3a 20 70 53 72 63 21 3d 30 20  e have: pSrc!=0 
1a8b0 62 75 74 20 70 53 72 63 2d 3e 6e 53 72 63 3d 3d  but pSrc->nSrc==
1a8c0 30 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41 59  0 */.  if( ALWAY
1a8d0 53 28 70 53 72 63 29 20 29 7b 0a 20 20 20 20 66  S(pSrc) ){.    f
1a8e0 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2c  or(i=pSrc->nSrc,
1a8f0 20 70 49 74 65 6d 3d 70 53 72 63 2d 3e 61 3b 20   pItem=pSrc->a; 
1a900 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b  i>0; i--, pItem+
1a910 2b 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 53  +){.      substS
1a920 65 6c 65 63 74 28 64 62 2c 20 70 49 74 65 6d 2d  elect(db, pItem-
1a930 3e 70 53 65 6c 65 63 74 2c 20 69 54 61 62 6c 65  >pSelect, iTable
1a940 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d  , pEList);.    }
1a950 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  .  }.}.#endif /*
1a960 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1a970 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
1a980 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
1a990 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f  TE_OMIT_VIEW) */
1a9a0 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
1a9b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
1a9c0 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
1a9d0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
1a9e0 57 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  W)./*.** This ro
1a9f0 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74  utine attempts t
1aa00 6f 20 66 6c 61 74 74 65 6e 20 73 75 62 71 75 65  o flatten subque
1aa10 72 69 65 73 20 61 73 20 61 20 70 65 72 66 6f 72  ries as a perfor
1aa20 6d 61 6e 63 65 20 6f 70 74 69 6d 69 7a 61 74 69  mance optimizati
1aa30 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  on..** This rout
1aa40 69 6e 65 20 72 65 74 75 72 6e 73 20 31 20 69 66  ine returns 1 if
1aa50 20 69 74 20 6d 61 6b 65 73 20 63 68 61 6e 67 65   it makes change
1aa60 73 20 61 6e 64 20 30 20 69 66 20 6e 6f 20 66 6c  s and 0 if no fl
1aa70 61 74 74 65 6e 69 6e 67 20 6f 63 63 75 72 73 2e  attening occurs.
1aa80 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73  .**.** To unders
1aa90 74 61 6e 64 20 74 68 65 20 63 6f 6e 63 65 70 74  tand the concept
1aaa0 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20   of flattening, 
1aab0 63 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c  consider the fol
1aac0 6c 6f 77 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a  lowing.** query:
1aad0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43  .**.**     SELEC
1aae0 54 20 61 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  T a FROM (SELECT
1aaf0 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74   x+y AS a FROM t
1ab00 31 20 57 48 45 52 45 20 7a 3c 31 30 30 29 20 57  1 WHERE z<100) W
1ab10 48 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54  HERE a>5.**.** T
1ab20 68 65 20 64 65 66 61 75 6c 74 20 77 61 79 20 6f  he default way o
1ab30 66 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74  f implementing t
1ab40 68 69 73 20 71 75 65 72 79 20 69 73 20 74 6f 20  his query is to 
1ab50 65 78 65 63 75 74 65 20 74 68 65 0a 2a 2a 20 73  execute the.** s
1ab60 75 62 71 75 65 72 79 20 66 69 72 73 74 20 61 6e  ubquery first an
1ab70 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  d store the resu
1ab80 6c 74 73 20 69 6e 20 61 20 74 65 6d 70 6f 72 61  lts in a tempora
1ab90 72 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a  ry table, then.*
1aba0 2a 20 72 75 6e 20 74 68 65 20 6f 75 74 65 72 20  * run the outer 
1abb0 71 75 65 72 79 20 6f 6e 20 74 68 61 74 20 74 65  query on that te
1abc0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 20  mporary table.  
1abd0 54 68 69 73 20 72 65 71 75 69 72 65 73 20 74 77  This requires tw
1abe0 6f 0a 2a 2a 20 70 61 73 73 65 73 20 6f 76 65 72  o.** passes over
1abf0 20 74 68 65 20 64 61 74 61 2e 20 20 46 75 72 74   the data.  Furt
1ac00 68 65 72 6d 6f 72 65 2c 20 62 65 63 61 75 73 65  hermore, because
1ac10 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
1ac20 61 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69  able.** has no i
1ac30 6e 64 69 63 65 73 2c 20 74 68 65 20 57 48 45 52  ndices, the WHER
1ac40 45 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20  E clause on the 
1ac50 6f 75 74 65 72 20 71 75 65 72 79 20 63 61 6e 6e  outer query cann
1ac60 6f 74 20 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a  ot be.** optimiz
1ac70 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ed..**.** This r
1ac80 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20  outine attempts 
1ac90 74 6f 20 72 65 77 72 69 74 65 20 71 75 65 72 69  to rewrite queri
1aca0 65 73 20 73 75 63 68 20 61 73 20 74 68 65 20 61  es such as the a
1acb0 62 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73  bove into.** a s
1acc0 69 6e 67 6c 65 20 66 6c 61 74 20 73 65 6c 65 63  ingle flat selec
1acd0 74 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  t, like this:.**
1ace0 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78  .**     SELECT x
1acf0 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20  +y AS a FROM t1 
1ad00 57 48 45 52 45 20 7a 3c 31 30 30 20 41 4e 44 20  WHERE z<100 AND 
1ad10 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  a>5.**.** The co
1ad20 64 65 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72  de generated for
1ad30 20 74 68 69 73 20 73 69 6d 70 69 66 69 63 61 74   this simpificat
1ad40 69 6f 6e 20 67 69 76 65 73 20 74 68 65 20 73 61  ion gives the sa
1ad50 6d 65 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74  me result.** but
1ad60 20 6f 6e 6c 79 20 68 61 73 20 74 6f 20 73 63 61   only has to sca
1ad70 6e 20 74 68 65 20 64 61 74 61 20 6f 6e 63 65 2e  n the data once.
1ad80 20 20 41 6e 64 20 62 65 63 61 75 73 65 20 69 6e    And because in
1ad90 64 69 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20  dices might .** 
1ada0 65 78 69 73 74 20 6f 6e 20 74 68 65 20 74 61 62  exist on the tab
1adb0 6c 65 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74  le t1, a complet
1adc0 65 20 73 63 61 6e 20 6f 66 20 74 68 65 20 64 61  e scan of the da
1add0 74 61 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61  ta might be.** a
1ade0 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c  voided..**.** Fl
1adf0 61 74 74 65 6e 69 6e 67 20 69 73 20 6f 6e 6c 79  attening is only
1ae00 20 61 74 74 65 6d 70 74 65 64 20 69 66 20 61 6c   attempted if al
1ae10 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  l of the followi
1ae20 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a  ng are true:.**.
1ae30 2a 2a 20 20 20 28 31 29 20 20 54 68 65 20 73 75  **   (1)  The su
1ae40 62 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f  bquery and the o
1ae50 75 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f  uter query do no
1ae60 74 20 62 6f 74 68 20 75 73 65 20 61 67 67 72 65  t both use aggre
1ae70 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  gates..**.**   (
1ae80 32 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  2)  The subquery
1ae90 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65   is not an aggre
1aea0 67 61 74 65 20 6f 72 20 74 68 65 20 6f 75 74 65  gate or the oute
1aeb0 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  r query is not a
1aec0 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28   join..**.**   (
1aed0 33 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  3)  The subquery
1aee0 20 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68   is not the righ
1aef0 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c  t operand of a l
1af00 65 66 74 20 6f 75 74 65 72 20 6a 6f 69 6e 0a 2a  eft outer join.*
1af10 2a 20 20 20 20 20 20 20 20 28 4f 72 69 67 69 6e  *        (Origin
1af20 61 6c 6c 79 20 74 69 63 6b 65 74 20 23 33 30 36  ally ticket #306
1af30 2e 20 20 53 74 72 65 6e 67 74 68 65 6e 65 64 20  .  Strengthened 
1af40 62 79 20 74 69 63 6b 65 74 20 23 33 33 30 30 29  by ticket #3300)
1af50 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 20 54 68  .**.**   (4)  Th
1af60 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f  e subquery is no
1af70 74 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a  t DISTINCT..**.*
1af80 2a 20 20 28 2a 2a 29 20 20 41 74 20 6f 6e 65 20  *  (**)  At one 
1af90 70 6f 69 6e 74 20 72 65 73 74 72 69 63 74 69 6f  point restrictio
1afa0 6e 73 20 28 34 29 20 61 6e 64 20 28 35 29 20 64  ns (4) and (5) d
1afb0 65 66 69 6e 65 64 20 61 20 73 75 62 73 65 74 20  efined a subset 
1afc0 6f 66 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20 20  of DISTINCT.**  
1afd0 20 20 20 20 20 20 73 75 62 2d 71 75 65 72 69 65        sub-querie
1afe0 73 20 74 68 61 74 20 77 65 72 65 20 65 78 63 6c  s that were excl
1aff0 75 64 65 64 20 66 72 6f 6d 20 74 68 69 73 20 6f  uded from this o
1b000 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 52 65 73  ptimization. Res
1b010 74 72 69 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 20  triction .**    
1b020 20 20 20 20 28 34 29 20 68 61 73 20 73 69 6e 63      (4) has sinc
1b030 65 20 62 65 65 6e 20 65 78 70 61 6e 64 65 64 20  e been expanded 
1b040 74 6f 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 44  to exclude all D
1b050 49 53 54 49 4e 43 54 20 73 75 62 71 75 65 72 69  ISTINCT subqueri
1b060 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29 20  es..**.**   (6) 
1b070 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
1b080 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65  es not use aggre
1b090 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74  gates or the out
1b0a0 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 0a  er query is not.
1b0b0 2a 2a 20 20 20 20 20 20 20 20 44 49 53 54 49 4e  **        DISTIN
1b0c0 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29 20  CT..**.**   (7) 
1b0d0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 68 61   The subquery ha
1b0e0 73 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  s a FROM clause.
1b0f0 20 20 54 4f 44 4f 3a 20 20 46 6f 72 20 73 75 62    TODO:  For sub
1b100 71 75 65 72 69 65 73 20 77 69 74 68 6f 75 74 0a  queries without.
1b110 2a 2a 20 20 20 20 20 20 20 20 41 20 46 52 4f 4d  **        A FROM
1b120 20 63 6c 61 75 73 65 2c 20 63 6f 6e 73 69 64 65   clause, conside
1b130 72 20 61 64 64 69 6e 67 20 61 20 46 52 4f 4d 20  r adding a FROM 
1b140 63 6c 6f 73 65 20 77 69 74 68 20 74 68 65 20 73  close with the s
1b150 70 65 63 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20  pecial.**       
1b160 20 74 61 62 6c 65 20 73 71 6c 69 74 65 5f 6f 6e   table sqlite_on
1b170 63 65 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73  ce that consists
1b180 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 72 6f 77   of a single row
1b190 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a   containing a.**
1b1a0 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 4e          single N
1b1b0 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29  ULL..**.**   (8)
1b1c0 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
1b1d0 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49  oes not use LIMI
1b1e0 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  T or the outer q
1b1f0 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f  uery is not a jo
1b200 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20  in..**.**   (9) 
1b210 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
1b220 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54  es not use LIMIT
1b230 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
1b240 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
1b250 0a 2a 2a 20 20 20 20 20 20 20 20 61 67 67 72 65  .**        aggre
1b260 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  gates..**.**  (1
1b270 30 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  0)  The subquery
1b280 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67   does not use ag
1b290 67 72 65 67 61 74 65 73 20 6f 72 20 74 68 65 20  gregates or the 
1b2a0 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73  outer query does
1b2b0 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 75   not.**        u
1b2c0 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20  se LIMIT..**.** 
1b2d0 20 28 31 31 29 20 20 54 68 65 20 73 75 62 71 75   (11)  The subqu
1b2e0 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65  ery and the oute
1b2f0 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62  r query do not b
1b300 6f 74 68 20 68 61 76 65 20 4f 52 44 45 52 20 42  oth have ORDER B
1b310 59 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a  Y clauses..**.**
1b320 20 20 28 2a 2a 29 20 20 4e 6f 74 20 69 6d 70 6c    (**)  Not impl
1b330 65 6d 65 6e 74 65 64 2e 20 20 53 75 62 73 75 6d  emented.  Subsum
1b340 65 64 20 69 6e 74 6f 20 72 65 73 74 72 69 63 74  ed into restrict
1b350 69 6f 6e 20 28 33 29 2e 20 20 57 61 73 20 70 72  ion (3).  Was pr
1b360 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 20 20 20 20  eviously.**     
1b370 20 20 20 61 20 73 65 70 61 72 61 74 65 20 72 65     a separate re
1b380 73 74 72 69 63 74 69 6f 6e 20 64 65 72 69 76 69  striction derivi
1b390 6e 67 20 66 72 6f 6d 20 74 69 63 6b 65 74 20 23  ng from ticket #
1b3a0 33 35 30 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 33 29  350..**.**  (13)
1b3b0 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61    The subquery a
1b3c0 6e 64 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  nd outer query d
1b3d0 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 4c  o not both use L
1b3e0 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 34  IMIT..**.**  (14
1b3f0 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
1b400 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4f 46 46  does not use OFF
1b410 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 35 29  SET..**.**  (15)
1b420 20 20 54 68 65 20 6f 75 74 65 72 20 71 75 65 72    The outer quer
1b430 79 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66  y is not part of
1b440 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65   a compound sele
1b450 63 74 20 6f 72 20 74 68 65 0a 2a 2a 20 20 20 20  ct or the.**    
1b460 20 20 20 20 73 75 62 71 75 65 72 79 20 64 6f 65      subquery doe
1b470 73 20 6e 6f 74 20 68 61 76 65 20 61 20 4c 49 4d  s not have a LIM
1b480 49 54 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 20 20  IT clause..**   
1b490 20 20 20 20 20 28 53 65 65 20 74 69 63 6b 65 74       (See ticket
1b4a0 20 23 32 33 33 39 20 61 6e 64 20 74 69 63 6b 65   #2339 and ticke
1b4b0 74 20 5b 30 32 61 38 65 38 31 64 34 34 5d 29 2e  t [02a8e81d44]).
1b4c0 0a 2a 2a 0a 2a 2a 20 20 28 31 36 29 20 20 54 68  .**.**  (16)  Th
1b4d0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
1b4e0 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74   not an aggregat
1b4f0 65 20 6f 72 20 74 68 65 20 73 75 62 71 75 65 72  e or the subquer
1b500 79 20 64 6f 65 73 0a 2a 2a 20 20 20 20 20 20 20  y does.**       
1b510 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 4f 52 44   not contain ORD
1b520 45 52 20 42 59 2e 20 20 28 54 69 63 6b 65 74 20  ER BY.  (Ticket 
1b530 23 32 39 34 32 29 20 20 54 68 69 73 20 75 73 65  #2942)  This use
1b540 64 20 74 6f 20 6e 6f 74 20 6d 61 74 74 65 72 0a  d to not matter.
1b550 2a 2a 20 20 20 20 20 20 20 20 75 6e 74 69 6c 20  **        until 
1b560 77 65 20 69 6e 74 72 6f 64 75 63 65 64 20 74 68  we introduced th
1b570 65 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 29  e group_concat()
1b580 20 66 75 6e 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a   function.  .**.
1b590 2a 2a 20 20 28 31 37 29 20 20 54 68 65 20 73 75  **  (17)  The su
1b5a0 62 2d 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  b-query is not a
1b5b0 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
1b5c0 2c 20 6f 72 20 69 74 20 69 73 20 61 20 55 4e 49  , or it is a UNI
1b5d0 4f 4e 20 41 4c 4c 20 0a 2a 2a 20 20 20 20 20 20  ON ALL .**      
1b5e0 20 20 63 6f 6d 70 6f 75 6e 64 20 63 6c 61 75 73    compound claus
1b5f0 65 20 6d 61 64 65 20 75 70 20 65 6e 74 69 72 65  e made up entire
1b600 6c 79 20 6f 66 20 6e 6f 6e 2d 61 67 67 72 65 67  ly of non-aggreg
1b610 61 74 65 20 71 75 65 72 69 65 73 2c 20 61 6e 64  ate queries, and
1b620 20 0a 2a 2a 20 20 20 20 20 20 20 20 74 68 65 20   .**        the 
1b630 70 61 72 65 6e 74 20 71 75 65 72 79 3a 0a 2a 2a  parent query:.**
1b640 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69  .**          * i
1b650 73 20 6e 6f 74 20 69 74 73 65 6c 66 20 70 61 72  s not itself par
1b660 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20  t of a compound 
1b670 73 65 6c 65 63 74 2c 0a 2a 2a 20 20 20 20 20 20  select,.**      
1b680 20 20 20 20 2a 20 69 73 20 6e 6f 74 20 61 6e 20      * is not an 
1b690 61 67 67 72 65 67 61 74 65 20 6f 72 20 44 49 53  aggregate or DIS
1b6a0 54 49 4e 43 54 20 71 75 65 72 79 2c 20 61 6e 64  TINCT query, and
1b6b0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69  .**          * i
1b6c0 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 0a 2a 2a 0a  s not a join.**.
1b6d0 2a 2a 20 20 20 20 20 20 20 20 54 68 65 20 70 61  **        The pa
1b6e0 72 65 6e 74 20 61 6e 64 20 73 75 62 2d 71 75 65  rent and sub-que
1b6f0 72 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 57  ry may contain W
1b700 48 45 52 45 20 63 6c 61 75 73 65 73 2e 20 53 75  HERE clauses. Su
1b710 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 20 20 20 20  bject to.**     
1b720 20 20 20 72 75 6c 65 73 20 28 31 31 29 2c 20 28     rules (11), (
1b730 31 33 29 20 61 6e 64 20 28 31 34 29 2c 20 74 68  13) and (14), th
1b740 65 79 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74  ey may also cont
1b750 61 69 6e 20 4f 52 44 45 52 20 42 59 2c 0a 2a 2a  ain ORDER BY,.**
1b760 20 20 20 20 20 20 20 20 4c 49 4d 49 54 20 61 6e          LIMIT an
1b770 64 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73  d OFFSET clauses
1b780 2e 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  .  The subquery 
1b790 63 61 6e 6e 6f 74 20 75 73 65 20 61 6e 79 20 63  cannot use any c
1b7a0 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20  ompound.**      
1b7b0 20 20 6f 70 65 72 61 74 6f 72 20 6f 74 68 65 72    operator other
1b7c0 20 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20   than UNION ALL 
1b7d0 62 65 63 61 75 73 65 20 61 6c 6c 20 74 68 65 20  because all the 
1b7e0 6f 74 68 65 72 20 63 6f 6d 70 6f 75 6e 64 0a 2a  other compound.*
1b7f0 2a 20 20 20 20 20 20 20 20 6f 70 65 72 61 74 6f  *        operato
1b800 72 73 20 68 61 76 65 20 61 6e 20 69 6d 70 6c 69  rs have an impli
1b810 65 64 20 44 49 53 54 49 4e 43 54 20 77 68 69 63  ed DISTINCT whic
1b820 68 20 69 73 20 64 69 73 61 6c 6c 6f 77 65 64 20  h is disallowed 
1b830 62 79 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 73  by.**        res
1b840 74 72 69 63 74 69 6f 6e 20 28 34 29 2e 0a 2a 2a  triction (4)..**
1b850 0a 2a 2a 20 20 20 20 20 20 20 20 41 6c 73 6f 2c  .**        Also,
1b860 20 65 61 63 68 20 63 6f 6d 70 6f 6e 65 6e 74 20   each component 
1b870 6f 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  of the sub-query
1b880 20 6d 75 73 74 20 72 65 74 75 72 6e 20 74 68 65   must return the
1b890 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20   same number.** 
1b8a0 20 20 20 20 20 20 20 6f 66 20 72 65 73 75 6c 74         of result
1b8b0 20 63 6f 6c 75 6d 6e 73 2e 20 54 68 69 73 20 69   columns. This i
1b8c0 73 20 61 63 74 75 61 6c 6c 79 20 61 20 72 65 71  s actually a req
1b8d0 75 69 72 65 6d 65 6e 74 20 66 6f 72 20 61 6e 79  uirement for any
1b8e0 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20   compound.**    
1b8f0 20 20 20 20 53 45 4c 45 43 54 20 73 74 61 74 65      SELECT state
1b900 6d 65 6e 74 2c 20 62 75 74 20 61 6c 6c 20 74 68  ment, but all th
1b910 65 20 63 6f 64 65 20 68 65 72 65 20 64 6f 65 73  e code here does
1b920 20 69 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68   is make sure th
1b930 61 74 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20  at no.**        
1b940 73 75 63 68 20 28 69 6c 6c 65 67 61 6c 29 20 73  such (illegal) s
1b950 75 62 2d 71 75 65 72 79 20 69 73 20 66 6c 61 74  ub-query is flat
1b960 74 65 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65  tened. The calle
1b970 72 20 77 69 6c 6c 20 64 65 74 65 63 74 20 74 68  r will detect th
1b980 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 79 6e 74  e.**        synt
1b990 61 78 20 65 72 72 6f 72 20 61 6e 64 20 72 65 74  ax error and ret
1b9a0 75 72 6e 20 61 20 64 65 74 61 69 6c 65 64 20 6d  urn a detailed m
1b9b0 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 20 28  essage..**.**  (
1b9c0 31 38 29 20 20 49 66 20 74 68 65 20 73 75 62 2d  18)  If the sub-
1b9d0 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f  query is a compo
1b9e0 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e  und select, then
1b9f0 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68   all terms of th
1ba00 65 0a 2a 2a 20 20 20 20 20 20 20 20 4f 52 44 45  e.**        ORDE
1ba10 52 20 62 79 20 63 6c 61 75 73 65 20 6f 66 20 74  R by clause of t
1ba20 68 65 20 70 61 72 65 6e 74 20 6d 75 73 74 20 62  he parent must b
1ba30 65 20 73 69 6d 70 6c 65 20 72 65 66 65 72 65 6e  e simple referen
1ba40 63 65 73 20 74 6f 20 0a 2a 2a 20 20 20 20 20 20  ces to .**      
1ba50 20 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65    columns of the
1ba60 20 73 75 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a   sub-query..**.*
1ba70 2a 20 20 28 31 39 29 20 20 54 68 65 20 73 75 62  *  (19)  The sub
1ba80 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
1ba90 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20  se LIMIT or the 
1baa0 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73  outer query does
1bab0 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 68   not.**        h
1bac0 61 76 65 20 61 20 57 48 45 52 45 20 63 6c 61 75  ave a WHERE clau
1bad0 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 30 29 20  se..**.**  (20) 
1bae0 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72   If the sub-quer
1baf0 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20  y is a compound 
1bb00 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 69 74 20  select, then it 
1bb10 6d 75 73 74 20 6e 6f 74 20 75 73 65 0a 2a 2a 20  must not use.** 
1bb20 20 20 20 20 20 20 20 61 6e 20 4f 52 44 45 52 20         an ORDER 
1bb30 42 59 20 63 6c 61 75 73 65 2e 20 20 54 69 63 6b  BY clause.  Tick
1bb40 65 74 20 23 33 37 37 33 2e 20 20 57 65 20 63 6f  et #3773.  We co
1bb50 75 6c 64 20 72 65 6c 61 78 20 74 68 69 73 20 63  uld relax this c
1bb60 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 20 20 20  onstraint.**    
1bb70 20 20 20 20 73 6f 6d 65 77 68 61 74 20 62 79 20      somewhat by 
1bb80 73 61 79 69 6e 67 20 74 68 61 74 20 74 68 65 20  saying that the 
1bb90 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44  terms of the ORD
1bba0 45 52 20 42 59 20 63 6c 61 75 73 65 20 6d 75 73  ER BY clause mus
1bbb0 74 0a 2a 2a 20 20 20 20 20 20 20 20 61 70 70 65  t.**        appe
1bbc0 61 72 20 61 73 20 75 6e 6d 6f 64 69 66 69 65 64  ar as unmodified
1bbd0 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
1bbe0 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  in the outer que
1bbf0 72 79 2e 20 20 42 75 74 20 77 65 0a 2a 2a 20 20  ry.  But we.**  
1bc00 20 20 20 20 20 20 68 61 76 65 20 6f 74 68 65 72        have other
1bc10 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 69   optimizations i
1bc20 6e 20 6d 69 6e 64 20 74 6f 20 64 65 61 6c 20 77  n mind to deal w
1bc30 69 74 68 20 74 68 61 74 20 63 61 73 65 2e 0a 2a  ith that case..*
1bc40 2a 0a 2a 2a 20 20 28 32 31 29 20 20 54 68 65 20  *.**  (21)  The 
1bc50 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
1bc60 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74  t use LIMIT or t
1bc70 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
1bc80 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20  s not.**        
1bc90 44 49 53 54 49 4e 43 54 2e 20 20 28 53 65 65 20  DISTINCT.  (See 
1bca0 74 69 63 6b 65 74 20 5b 37 35 32 65 31 36 34 36  ticket [752e1646
1bcb0 66 63 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 32  fc])..**.**  (22
1bcc0 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
1bcd0 69 73 20 6e 6f 74 20 61 20 72 65 63 75 72 73 69  is not a recursi
1bce0 76 65 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 20 28  ve CTE..**.**  (
1bcf0 32 33 29 20 20 54 68 65 20 70 61 72 65 6e 74 20  23)  The parent 
1bd00 69 73 20 6e 6f 74 20 61 20 72 65 63 75 72 73 69  is not a recursi
1bd10 76 65 20 43 54 45 2c 20 6f 72 20 74 68 65 20 73  ve CTE, or the s
1bd20 75 62 2d 71 75 65 72 79 20 69 73 20 6e 6f 74 20  ub-query is not 
1bd30 61 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f 6d 70  a.**        comp
1bd40 6f 75 6e 64 20 71 75 65 72 79 2e 20 54 68 69 73  ound query. This
1bd50 20 72 65 73 74 72 69 63 74 69 6f 6e 20 69 73 20   restriction is 
1bd60 62 65 63 61 75 73 65 20 74 72 61 6e 73 66 6f 72  because transfor
1bd70 6d 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20 20 20  ming the.**     
1bd80 20 20 20 70 61 72 65 6e 74 20 74 6f 20 61 20 63     parent to a c
1bd90 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 63 6f  ompound query co
1bda0 6e 66 75 73 65 73 20 74 68 65 20 63 6f 64 65 20  nfuses the code 
1bdb0 74 68 61 74 20 68 61 6e 64 6c 65 73 0a 2a 2a 20  that handles.** 
1bdc0 20 20 20 20 20 20 20 72 65 63 75 72 73 69 76 65         recursive
1bdd0 20 71 75 65 72 69 65 73 20 69 6e 20 6d 75 6c 74   queries in mult
1bde0 69 53 65 6c 65 63 74 28 29 2e 0a 2a 2a 0a 2a 2a  iSelect()..**.**
1bdf0 0a 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f 75 74  .** In this rout
1be00 69 6e 65 2c 20 74 68 65 20 22 70 22 20 70 61 72  ine, the "p" par
1be10 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e  ameter is a poin
1be20 74 65 72 20 74 6f 20 74 68 65 20 6f 75 74 65 72  ter to the outer
1be30 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73   query..** The s
1be40 75 62 71 75 65 72 79 20 69 73 20 70 2d 3e 70 53  ubquery is p->pS
1be50 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69  rc->a[iFrom].  i
1be60 73 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20  sAgg is true if 
1be70 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a  the outer query.
1be80 2a 2a 20 75 73 65 73 20 61 67 67 72 65 67 61 74  ** uses aggregat
1be90 65 73 20 61 6e 64 20 73 75 62 71 75 65 72 79 49  es and subqueryI
1bea0 73 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20  sAgg is true if 
1beb0 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65  the subquery use
1bec0 73 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a  s aggregates..**
1bed0 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e  .** If flattenin
1bee0 67 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74  g is not attempt
1bef0 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ed, this routine
1bf00 20 69 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20   is a no-op and 
1bf10 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 20 49 66  returns 0..** If
1bf20 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61   flattening is a
1bf30 74 74 65 6d 70 74 65 64 20 74 68 69 73 20 72 6f  ttempted this ro
1bf40 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31 2e  utine returns 1.
1bf50 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68  .**.** All of th
1bf60 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61  e expression ana
1bf70 6c 79 73 69 73 20 6d 75 73 74 20 6f 63 63 75 72  lysis must occur
1bf80 20 6f 6e 20 62 6f 74 68 20 74 68 65 20 6f 75 74   on both the out
1bf90 65 72 20 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20  er query and.** 
1bfa0 74 68 65 20 73 75 62 71 75 65 72 79 20 62 65 66  the subquery bef
1bfb0 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ore this routine
1bfc0 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63   runs..*/.static
1bfd0 20 69 6e 74 20 66 6c 61 74 74 65 6e 53 75 62 71   int flattenSubq
1bfe0 75 65 72 79 28 0a 20 20 50 61 72 73 65 20 2a 70  uery(.  Parse *p
1bff0 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
1c000 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
1c010 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
1c020 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1c030 20 70 61 72 65 6e 74 20 6f 72 20 6f 75 74 65 72   parent or outer
1c040 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1c050 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d  t */.  int iFrom
1c060 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ,           /* I
1c070 6e 64 65 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d  ndex in p->pSrc-
1c080 3e 61 5b 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65  >a[] of the inne
1c090 72 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  r subquery */.  
1c0a0 69 6e 74 20 69 73 41 67 67 2c 20 20 20 20 20 20  int isAgg,      
1c0b0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1c0c0 6f 75 74 65 72 20 53 45 4c 45 43 54 20 75 73 65  outer SELECT use
1c0d0 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  s aggregate func
1c0e0 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 73  tions */.  int s
1c0f0 75 62 71 75 65 72 79 49 73 41 67 67 20 20 20 20  ubqueryIsAgg    
1c100 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 73  /* True if the s
1c110 75 62 71 75 65 72 79 20 75 73 65 73 20 61 67 67  ubquery uses agg
1c120 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
1c130 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63   */.){.  const c
1c140 68 61 72 20 2a 7a 53 61 76 65 64 41 75 74 68 43  har *zSavedAuthC
1c150 6f 6e 74 65 78 74 20 3d 20 70 50 61 72 73 65 2d  ontext = pParse-
1c160 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20  >zAuthContext;. 
1c170 20 53 65 6c 65 63 74 20 2a 70 50 61 72 65 6e 74   Select *pParent
1c180 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62  ;.  Select *pSub
1c190 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69  ;       /* The i
1c1a0 6e 6e 65 72 20 71 75 65 72 79 20 6f 72 20 22 73  nner query or "s
1c1b0 75 62 71 75 65 72 79 22 20 2a 2f 0a 20 20 53 65  ubquery" */.  Se
1c1c0 6c 65 63 74 20 2a 70 53 75 62 31 3b 20 20 20 20  lect *pSub1;    
1c1d0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
1c1e0 74 68 65 20 72 69 67 68 74 6d 6f 73 74 20 73 65  the rightmost se
1c1f0 6c 65 63 74 20 69 6e 20 73 75 62 2d 71 75 65 72  lect in sub-quer
1c200 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  y */.  SrcList *
1c210 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68  pSrc;      /* Th
1c220 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
1c230 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1c240 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
1c250 53 75 62 53 72 63 3b 20 20 20 2f 2a 20 54 68 65  SubSrc;   /* The
1c260 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
1c270 74 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  the subquery */.
1c280 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
1c290 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73  t;    /* The res
1c2a0 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 6f  ult set of the o
1c2b0 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20  uter query */.  
1c2c0 69 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20  int iParent;    
1c2d0 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73      /* VDBE curs
1c2e0 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  or number of the
1c2f0 20 70 53 75 62 20 72 65 73 75 6c 74 20 73 65 74   pSub result set
1c300 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20   temp table */. 
1c310 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
1c320 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
1c330 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a  nter */.  Expr *
1c340 70 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20  pWhere;         
1c350 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1c360 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
1c370 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
1c380 73 74 5f 69 74 65 6d 20 2a 70 53 75 62 69 74 65  st_item *pSubite
1c390 6d 3b 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71  m;   /* The subq
1c3a0 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65  uery */.  sqlite
1c3b0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
1c3c0 64 62 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  db;..  /* Check 
1c3d0 74 6f 20 73 65 65 20 69 66 20 66 6c 61 74 74 65  to see if flatte
1c3e0 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65  ning is permitte
1c3f0 64 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20  d.  Return 0 if 
1c400 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  not..  */.  asse
1c410 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73  rt( p!=0 );.  as
1c420 73 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d  sert( p->pPrior=
1c430 3d 30 20 29 3b 20 20 2f 2a 20 55 6e 61 62 6c 65  =0 );  /* Unable
1c440 20 74 6f 20 66 6c 61 74 74 65 6e 20 63 6f 6d 70   to flatten comp
1c450 6f 75 6e 64 20 71 75 65 72 69 65 73 20 2a 2f 0a  ound queries */.
1c460 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69    if( Optimizati
1c470 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53  onDisabled(db, S
1c480 51 4c 49 54 45 5f 51 75 65 72 79 46 6c 61 74 74  QLITE_QueryFlatt
1c490 65 6e 65 72 29 20 29 20 72 65 74 75 72 6e 20 30  ener) ) return 0
1c4a0 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53  ;.  pSrc = p->pS
1c4b0 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  rc;.  assert( pS
1c4c0 72 63 20 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26  rc && iFrom>=0 &
1c4d0 26 20 69 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53  & iFrom<pSrc->nS
1c4e0 72 63 20 29 3b 0a 20 20 70 53 75 62 69 74 65 6d  rc );.  pSubitem
1c4f0 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69 46 72 6f   = &pSrc->a[iFro
1c500 6d 5d 3b 0a 20 20 69 50 61 72 65 6e 74 20 3d 20  m];.  iParent = 
1c510 70 53 75 62 69 74 65 6d 2d 3e 69 43 75 72 73 6f  pSubitem->iCurso
1c520 72 3b 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62  r;.  pSub = pSub
1c530 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  item->pSelect;. 
1c540 20 61 73 73 65 72 74 28 20 70 53 75 62 21 3d 30   assert( pSub!=0
1c550 20 29 3b 0a 20 20 69 66 28 20 69 73 41 67 67 20   );.  if( isAgg 
1c560 26 26 20 73 75 62 71 75 65 72 79 49 73 41 67 67  && subqueryIsAgg
1c570 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
1c580 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c590 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 29 20  Restriction (1) 
1c5a0 20 2a 2f 0a 20 20 69 66 28 20 73 75 62 71 75 65   */.  if( subque
1c5b0 72 79 49 73 41 67 67 20 26 26 20 70 53 72 63 2d  ryIsAgg && pSrc-
1c5c0 3e 6e 53 72 63 3e 31 20 29 20 72 65 74 75 72 6e  >nSrc>1 ) return
1c5d0 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
1c5e0 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32 29 20  Restriction (2) 
1c5f0 20 2a 2f 0a 20 20 70 53 75 62 53 72 63 20 3d 20   */.  pSubSrc = 
1c600 70 53 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73  pSub->pSrc;.  as
1c610 73 65 72 74 28 20 70 53 75 62 53 72 63 20 29 3b  sert( pSubSrc );
1c620 0a 20 20 2f 2a 20 50 72 69 6f 72 20 74 6f 20 76  .  /* Prior to v
1c630 65 72 73 69 6f 6e 20 33 2e 31 2e 32 2c 20 77 68  ersion 3.1.2, wh
1c640 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  en LIMIT and OFF
1c650 53 45 54 20 68 61 64 20 74 6f 20 62 65 20 73 69  SET had to be si
1c660 6d 70 6c 65 20 63 6f 6e 73 74 61 6e 74 73 2c 0a  mple constants,.
1c670 20 20 2a 2a 20 6e 6f 74 20 61 72 62 69 74 72 61    ** not arbitra
1c680 72 79 20 65 78 70 72 65 73 73 73 69 6f 6e 73 2c  ry expresssions,
1c690 20 77 65 20 61 6c 6c 6f 77 65 64 20 73 6f 6d 65   we allowed some
1c6a0 20 63 6f 6d 62 69 6e 69 6e 67 20 6f 66 20 4c 49   combining of LI
1c6b0 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20  MIT and OFFSET. 
1c6c0 20 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65 79   ** because they
1c6d0 20 63 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74   could be comput
1c6e0 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ed at compile-ti
1c6f0 6d 65 2e 20 20 42 75 74 20 77 68 65 6e 20 4c 49  me.  But when LI
1c700 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20  MIT and OFFSET. 
1c710 20 2a 2a 20 62 65 63 61 6d 65 20 61 72 62 69 74   ** became arbit
1c720 72 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e 73  rary expressions
1c730 2c 20 77 65 20 77 65 72 65 20 66 6f 72 63 65 64  , we were forced
1c740 20 74 6f 20 61 64 64 20 72 65 73 74 72 69 63 74   to add restrict
1c750 69 6f 6e 73 20 28 31 33 29 0a 20 20 2a 2a 20 61  ions (13).  ** a
1c760 6e 64 20 28 31 34 29 2e 20 2a 2f 0a 20 20 69 66  nd (14). */.  if
1c770 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26  ( pSub->pLimit &
1c780 26 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65  & p->pLimit ) re
1c790 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
1c7a0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1c7b0 69 6f 6e 20 28 31 33 29 20 2a 2f 0a 20 20 69 66  ion (13) */.  if
1c7c0 28 20 70 53 75 62 2d 3e 70 4f 66 66 73 65 74 20  ( pSub->pOffset 
1c7d0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
1c7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c7f0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1c800 69 6f 6e 20 28 31 34 29 20 2a 2f 0a 20 20 69 66  ion (14) */.  if
1c810 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
1c820 20 53 46 5f 43 6f 6d 70 6f 75 6e 64 29 21 3d 30   SF_Compound)!=0
1c830 20 26 26 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74   && pSub->pLimit
1c840 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
1c850 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c870 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c880 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 35 29  Restriction (15)
1c890 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 53   */.  }.  if( pS
1c8a0 75 62 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 29  ubSrc->nSrc==0 )
1c8b0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1c8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c8d0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1c8e0 28 37 29 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  (7)  */.  if( pS
1c8f0 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ub->selFlags & S
1c900 46 5f 44 69 73 74 69 6e 63 74 20 29 20 72 65 74  F_Distinct ) ret
1c910 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
1c920 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1c930 28 35 29 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  (5)  */.  if( pS
1c940 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28 70  ub->pLimit && (p
1c950 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69  Src->nSrc>1 || i
1c960 73 41 67 67 29 20 29 7b 0a 20 20 20 20 20 72 65  sAgg) ){.     re
1c970 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
1c980 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 73 20  /* Restrictions 
1c990 28 38 29 28 39 29 20 2a 2f 0a 20 20 7d 0a 20 20  (8)(9) */.  }.  
1c9a0 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  if( (p->selFlags
1c9b0 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21   & SF_Distinct)!
1c9c0 3d 30 20 26 26 20 73 75 62 71 75 65 72 79 49 73  =0 && subqueryIs
1c9d0 41 67 67 20 29 7b 0a 20 20 20 20 20 72 65 74 75  Agg ){.     retu
1c9e0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a  rn 0;         /*
1c9f0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 36 29   Restriction (6)
1ca00 20 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70    */.  }.  if( p
1ca10 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20 70 53  ->pOrderBy && pS
1ca20 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  ub->pOrderBy ){.
1ca30 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
1ca40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca60 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
1ca70 72 69 63 74 69 6f 6e 20 28 31 31 29 20 2a 2f 0a  riction (11) */.
1ca80 20 20 7d 0a 20 20 69 66 28 20 69 73 41 67 67 20    }.  if( isAgg 
1ca90 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42  && pSub->pOrderB
1caa0 79 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  y ) return 0;   
1cab0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1cac0 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 36 29  Restriction (16)
1cad0 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
1cae0 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 57 68  pLimit && p->pWh
1caf0 65 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ere ) return 0; 
1cb00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1cb10 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 39 29  Restriction (19)
1cb20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
1cb30 70 4c 69 6d 69 74 20 26 26 20 28 70 2d 3e 73 65  pLimit && (p->se
1cb40 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74  lFlags & SF_Dist
1cb50 69 6e 63 74 29 21 3d 30 20 29 7b 0a 20 20 20 20  inct)!=0 ){.    
1cb60 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1cb70 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1cb80 6e 20 28 32 31 29 20 2a 2f 0a 20 20 7d 0a 20 20  n (21) */.  }.  
1cb90 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61  if( pSub->selFla
1cba0 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76  gs & SF_Recursiv
1cbb0 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  e ) return 0;   
1cbc0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
1cbd0 63 74 69 6f 6e 20 28 32 32 29 20 20 2a 2f 0a 20  ction (22)  */. 
1cbe0 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67   if( (p->selFlag
1cbf0 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65  s & SF_Recursive
1cc00 29 20 26 26 20 70 53 75 62 2d 3e 70 50 72 69 6f  ) && pSub->pPrio
1cc10 72 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  r ) return 0;   
1cc20 20 20 20 20 2f 2a 20 28 32 33 29 20 20 2a 2f 0a      /* (23)  */.
1cc30 0a 20 20 2f 2a 20 4f 42 53 4f 4c 45 54 45 20 43  .  /* OBSOLETE C
1cc40 4f 4d 4d 45 4e 54 20 31 3a 0a 20 20 2a 2a 20 52  OMMENT 1:.  ** R
1cc50 65 73 74 72 69 63 74 69 6f 6e 20 33 3a 20 20 49  estriction 3:  I
1cc60 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
1cc70 73 20 61 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73  s a join, make s
1cc80 75 72 65 20 74 68 65 20 73 75 62 71 75 65 72 79  ure the subquery
1cc90 20 69 73 20 0a 20 20 2a 2a 20 6e 6f 74 20 75 73   is .  ** not us
1cca0 65 64 20 61 73 20 74 68 65 20 72 69 67 68 74 20  ed as the right 
1ccb0 6f 70 65 72 61 6e 64 20 6f 66 20 61 6e 20 6f 75  operand of an ou
1ccc0 74 65 72 20 6a 6f 69 6e 2e 20 20 45 78 61 6d 70  ter join.  Examp
1ccd0 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69 73 0a  les of why this.
1cce0 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6c 6c 6f    ** is not allo
1ccf0 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  wed:.  **.  **  
1cd00 20 20 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f         t1 LEFT O
1cd10 55 54 45 52 20 4a 4f 49 4e 20 28 74 32 20 4a 4f  UTER JOIN (t2 JO
1cd20 49 4e 20 74 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a  IN t3).  **.  **
1cd30 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74   If we flatten t
1cd40 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75  he above, we wou
1cd50 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a  ld get.  **.  **
1cd60 20 20 20 20 20 20 20 20 20 28 74 31 20 4c 45 46           (t1 LEF
1cd70 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29  T OUTER JOIN t2)
1cd80 20 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a 20 20   JOIN t3.  **.  
1cd90 2a 2a 20 77 68 69 63 68 20 69 73 20 6e 6f 74 20  ** which is not 
1cda0 61 74 20 61 6c 6c 20 74 68 65 20 73 61 6d 65 20  at all the same 
1cdb0 74 68 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  thing..  **.  **
1cdc0 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e   OBSOLETE COMMEN
1cdd0 54 20 32 3a 0a 20 20 2a 2a 20 52 65 73 74 72 69  T 2:.  ** Restri
1cde0 63 74 69 6f 6e 20 31 32 3a 20 20 49 66 20 74 68  ction 12:  If th
1cdf0 65 20 73 75 62 71 75 65 72 79 20 69 73 20 74 68  e subquery is th
1ce00 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  e right operand 
1ce10 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72 0a  of a left outer.
1ce20 20 20 2a 2a 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20    ** join, make 
1ce30 73 75 72 65 20 74 68 65 20 73 75 62 71 75 65 72  sure the subquer
1ce40 79 20 68 61 73 20 6e 6f 20 57 48 45 52 45 20 63  y has no WHERE c
1ce50 6c 61 75 73 65 2e 0a 20 20 2a 2a 20 41 6e 20 65  lause..  ** An e
1ce60 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74  xamples of why t
1ce70 68 69 73 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77  his is not allow
1ce80 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ed:.  **.  **   
1ce90 20 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55        t1 LEFT OU
1cea0 54 45 52 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54  TER JOIN (SELECT
1ceb0 20 2a 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45   * FROM t2 WHERE
1cec0 20 74 32 2e 78 3e 30 29 0a 20 20 2a 2a 0a 20 20   t2.x>0).  **.  
1ced0 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e  ** If we flatten
1cee0 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77   the above, we w
1cef0 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20  ould get.  **.  
1cf00 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31 20 4c  **         (t1 L
1cf10 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74  EFT OUTER JOIN t
1cf20 32 29 20 57 48 45 52 45 20 74 32 2e 78 3e 30 0a  2) WHERE t2.x>0.
1cf30 20 20 2a 2a 0a 20 20 2a 2a 20 42 75 74 20 74 68    **.  ** But th
1cf40 65 20 74 32 2e 78 3e 30 20 74 65 73 74 20 77 69  e t2.x>0 test wi
1cf50 6c 6c 20 61 6c 77 61 79 73 20 66 61 69 6c 20 6f  ll always fail o
1cf60 6e 20 61 20 4e 55 4c 4c 20 72 6f 77 20 6f 66 20  n a NULL row of 
1cf70 74 32 2c 20 77 68 69 63 68 0a 20 20 2a 2a 20 65  t2, which.  ** e
1cf80 66 66 65 63 74 69 76 65 6c 79 20 63 6f 6e 76 65  ffectively conve
1cf90 72 74 73 20 74 68 65 20 4f 55 54 45 52 20 4a 4f  rts the OUTER JO
1cfa0 49 4e 20 69 6e 74 6f 20 61 6e 20 49 4e 4e 45 52  IN into an INNER
1cfb0 20 4a 4f 49 4e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   JOIN..  **.  **
1cfc0 20 54 48 49 53 20 4f 56 45 52 52 49 44 45 53 20   THIS OVERRIDES 
1cfd0 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54  OBSOLETE COMMENT
1cfe0 53 20 31 20 41 4e 44 20 32 20 41 42 4f 56 45 3a  S 1 AND 2 ABOVE:
1cff0 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 33 33  .  ** Ticket #33
1d000 30 30 20 73 68 6f 77 73 20 74 68 61 74 20 66 6c  00 shows that fl
1d010 61 74 74 65 6e 69 6e 67 20 74 68 65 20 72 69 67  attening the rig
1d020 68 74 20 74 65 72 6d 20 6f 66 20 61 20 4c 45 46  ht term of a LEF
1d030 54 20 4a 4f 49 4e 0a 20 20 2a 2a 20 69 73 20 66  T JOIN.  ** is f
1d040 72 61 75 67 68 74 20 77 69 74 68 20 64 61 6e 67  raught with dang
1d050 65 72 2e 20 20 42 65 73 74 20 74 6f 20 61 76 6f  er.  Best to avo
1d060 69 64 20 74 68 65 20 77 68 6f 6c 65 20 74 68 69  id the whole thi
1d070 6e 67 2e 20 20 49 66 20 74 68 65 0a 20 20 2a 2a  ng.  If the.  **
1d080 20 73 75 62 71 75 65 72 79 20 69 73 20 74 68 65   subquery is the
1d090 20 72 69 67 68 74 20 74 65 72 6d 20 6f 66 20 61   right term of a
1d0a0 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e   LEFT JOIN, then
1d0b0 20 64 6f 20 6e 6f 74 20 66 6c 61 74 74 65 6e 2e   do not flatten.
1d0c0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 53 75  .  */.  if( (pSu
1d0d0 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20  bitem->jointype 
1d0e0 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 29  & JT_OUTER)!=0 )
1d0f0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
1d100 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69    }..  /* Restri
1d110 63 74 69 6f 6e 20 31 37 3a 20 49 66 20 74 68 65  ction 17: If the
1d120 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20   sub-query is a 
1d130 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 2c  compound SELECT,
1d140 20 74 68 65 6e 20 69 74 20 6d 75 73 74 0a 20 20   then it must.  
1d150 2a 2a 20 75 73 65 20 6f 6e 6c 79 20 74 68 65 20  ** use only the 
1d160 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74  UNION ALL operat
1d170 6f 72 2e 20 41 6e 64 20 6e 6f 6e 65 20 6f 66 20  or. And none of 
1d180 74 68 65 20 73 69 6d 70 6c 65 20 73 65 6c 65 63  the simple selec
1d190 74 20 71 75 65 72 69 65 73 0a 20 20 2a 2a 20 74  t queries.  ** t
1d1a0 68 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20  hat make up the 
1d1b0 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20  compound SELECT 
1d1c0 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62  are allowed to b
1d1d0 65 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 64  e aggregate or d
1d1e0 69 73 74 69 6e 63 74 0a 20 20 2a 2a 20 71 75 65  istinct.  ** que
1d1f0 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ries..  */.  if(
1d200 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 20 29 7b   pSub->pPrior ){
1d210 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70  .    if( pSub->p
1d220 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
1d230 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 52   return 0;  /* R
1d240 65 73 74 72 69 63 74 69 6f 6e 20 32 30 20 2a 2f  estriction 20 */
1d250 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
1d260 73 41 67 67 20 7c 7c 20 28 70 2d 3e 73 65 6c 46  sAgg || (p->selF
1d270 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
1d280 63 74 29 21 3d 30 20 7c 7c 20 70 53 72 63 2d 3e  ct)!=0 || pSrc->
1d290 6e 53 72 63 21 3d 31 20 29 7b 0a 20 20 20 20 20  nSrc!=1 ){.     
1d2a0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
1d2b0 0a 20 20 20 20 66 6f 72 28 70 53 75 62 31 3d 70  .    for(pSub1=p
1d2c0 53 75 62 3b 20 70 53 75 62 31 3b 20 70 53 75 62  Sub; pSub1; pSub
1d2d0 31 3d 70 53 75 62 31 2d 3e 70 50 72 69 6f 72 29  1=pSub1->pPrior)
1d2e0 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
1d2f0 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61  ( (pSub1->selFla
1d300 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63  gs & (SF_Distinc
1d310 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29  t|SF_Aggregate))
1d320 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b  ==SF_Distinct );
1d330 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1d340 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67   (pSub1->selFlag
1d350 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
1d360 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d  |SF_Aggregate))=
1d370 3d 53 46 5f 41 67 67 72 65 67 61 74 65 20 29 3b  =SF_Aggregate );
1d380 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1d390 53 75 62 2d 3e 70 53 72 63 21 3d 30 20 29 3b 0a  Sub->pSrc!=0 );.
1d3a0 20 20 20 20 20 20 69 66 28 20 28 70 53 75 62 31        if( (pSub1
1d3b0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
1d3c0 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
1d3d0 72 65 67 61 74 65 29 29 21 3d 30 0a 20 20 20 20  regate))!=0.    
1d3e0 20 20 20 7c 7c 20 28 70 53 75 62 31 2d 3e 70 50     || (pSub1->pP
1d3f0 72 69 6f 72 20 26 26 20 70 53 75 62 31 2d 3e 6f  rior && pSub1->o
1d400 70 21 3d 54 4b 5f 41 4c 4c 29 20 0a 20 20 20 20  p!=TK_ALL) .    
1d410 20 20 20 7c 7c 20 70 53 75 62 31 2d 3e 70 53 72     || pSub1->pSr
1d420 63 2d 3e 6e 53 72 63 3c 31 0a 20 20 20 20 20 20  c->nSrc<1.      
1d430 20 7c 7c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74   || pSub->pEList
1d440 2d 3e 6e 45 78 70 72 21 3d 70 53 75 62 31 2d 3e  ->nExpr!=pSub1->
1d450 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 0a 20 20  pEList->nExpr.  
1d460 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 72      ){.        r
1d470 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
1d480 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1d490 20 70 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e 53   pSub1->pSrc->nS
1d4a0 72 63 3e 31 20 29 3b 0a 20 20 20 20 7d 0a 0a 20  rc>1 );.    }.. 
1d4b0 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1d4c0 6e 20 31 38 2e 20 2a 2f 0a 20 20 20 20 69 66 28  n 18. */.    if(
1d4d0 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a   p->pOrderBy ){.
1d4e0 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20        int ii;.  
1d4f0 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
1d500 3c 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  <p->pOrderBy->nE
1d510 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  xpr; ii++){.    
1d520 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65      if( p->pOrde
1d530 72 42 79 2d 3e 61 5b 69 69 5d 2e 75 2e 78 2e 69  rBy->a[ii].u.x.i
1d540 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 30 20 29 20  OrderByCol==0 ) 
1d550 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
1d560 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
1d570 2a 2a 2a 2a 2a 20 49 66 20 77 65 20 72 65 61 63  ***** If we reac
1d580 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 66 6c  h this point, fl
1d590 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d  attening is perm
1d5a0 69 74 74 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a 0a 20  itted. *****/.. 
1d5b0 20 2f 2a 20 41 75 74 68 6f 72 69 7a 65 20 74 68   /* Authorize th
1d5c0 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  e subquery */.  
1d5d0 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e  pParse->zAuthCon
1d5e0 74 65 78 74 20 3d 20 70 53 75 62 69 74 65 6d 2d  text = pSubitem-
1d5f0 3e 7a 4e 61 6d 65 3b 0a 20 20 54 45 53 54 4f 4e  >zName;.  TESTON
1d600 4c 59 28 69 20 3d 29 20 73 71 6c 69 74 65 33 41  LY(i =) sqlite3A
1d610 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
1d620 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20   SQLITE_SELECT, 
1d630 30 2c 20 30 2c 20 30 29 3b 0a 20 20 74 65 73 74  0, 0, 0);.  test
1d640 63 61 73 65 28 20 69 3d 3d 53 51 4c 49 54 45 5f  case( i==SQLITE_
1d650 44 45 4e 59 20 29 3b 0a 20 20 70 50 61 72 73 65  DENY );.  pParse
1d660 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d  ->zAuthContext =
1d670 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65   zSavedAuthConte
1d680 78 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  xt;..  /* If the
1d690 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20   sub-query is a 
1d6a0 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20  compound SELECT 
1d6b0 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20  statement, then 
1d6c0 28 62 79 20 72 65 73 74 72 69 63 74 69 6f 6e 73  (by restrictions
1d6d0 0a 20 20 2a 2a 20 31 37 20 61 6e 64 20 31 38 20  .  ** 17 and 18 
1d6e0 61 62 6f 76 65 29 20 69 74 20 6d 75 73 74 20 62  above) it must b
1d6f0 65 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 61 6e  e a UNION ALL an
1d700 64 20 74 68 65 20 70 61 72 65 6e 74 20 71 75 65  d the parent que
1d710 72 79 20 6d 75 73 74 20 0a 20 20 2a 2a 20 62 65  ry must .  ** be
1d720 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20   of the form:.  
1d730 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  **.  **     SELE
1d740 43 54 20 3c 65 78 70 72 2d 6c 69 73 74 3e 20 46  CT <expr-list> F
1d750 52 4f 4d 20 28 3c 73 75 62 2d 71 75 65 72 79 3e  ROM (<sub-query>
1d760 29 20 3c 77 68 65 72 65 2d 63 6c 61 75 73 65 3e  ) <where-clause>
1d770 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 66 6f 6c 6c   .  **.  ** foll
1d780 6f 77 65 64 20 62 79 20 61 6e 79 20 4f 52 44 45  owed by any ORDE
1d790 52 20 42 59 2c 20 4c 49 4d 49 54 20 61 6e 64 2f  R BY, LIMIT and/
1d7a0 6f 72 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65  or OFFSET clause
1d7b0 73 2e 20 54 68 69 73 20 62 6c 6f 63 6b 0a 20 20  s. This block.  
1d7c0 2a 2a 20 63 72 65 61 74 65 73 20 4e 2d 31 20 63  ** creates N-1 c
1d7d0 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70 61 72  opies of the par
1d7e0 65 6e 74 20 71 75 65 72 79 20 77 69 74 68 6f 75  ent query withou
1d7f0 74 20 61 6e 79 20 4f 52 44 45 52 20 42 59 2c 20  t any ORDER BY, 
1d800 4c 49 4d 49 54 20 6f 72 20 0a 20 20 2a 2a 20 4f  LIMIT or .  ** O
1d810 46 46 53 45 54 20 63 6c 61 75 73 65 73 20 61 6e  FFSET clauses an
1d820 64 20 6a 6f 69 6e 73 20 74 68 65 6d 20 74 6f 20  d joins them to 
1d830 74 68 65 20 6c 65 66 74 2d 68 61 6e 64 2d 73 69  the left-hand-si
1d840 64 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e  de of the origin
1d850 61 6c 0a 20 20 2a 2a 20 75 73 69 6e 67 20 55 4e  al.  ** using UN
1d860 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72  ION ALL operator
1d870 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  s. In this case 
1d880 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  N is the number 
1d890 6f 66 20 73 69 6d 70 6c 65 0a 20 20 2a 2a 20 73  of simple.  ** s
1d8a0 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73  elect statements
1d8b0 20 69 6e 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   in the compound
1d8c0 20 73 75 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2a   sub-query..  **
1d8d0 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20  .  ** Example:. 
1d8e0 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c   **.  **     SEL
1d8f0 45 43 54 20 61 2b 31 20 46 52 4f 4d 20 28 0a 20  ECT a+1 FROM (. 
1d900 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43   **        SELEC
1d910 54 20 78 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a  T x FROM tab.  *
1d920 2a 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41  *        UNION A
1d930 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53  LL.  **        S
1d940 45 4c 45 43 54 20 79 20 46 52 4f 4d 20 74 61 62  ELECT y FROM tab
1d950 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 55 4e 49  .  **        UNI
1d960 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20  ON ALL.  **     
1d970 20 20 20 53 45 4c 45 43 54 20 61 62 73 28 7a 2a     SELECT abs(z*
1d980 32 29 20 46 52 4f 4d 20 74 61 62 32 0a 20 20 2a  2) FROM tab2.  *
1d990 2a 20 20 20 20 20 29 20 57 48 45 52 45 20 61 21  *     ) WHERE a!
1d9a0 3d 35 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20  =5 ORDER BY 1.  
1d9b0 2a 2a 0a 20 20 2a 2a 20 54 72 61 6e 73 66 6f 72  **.  ** Transfor
1d9c0 6d 65 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20  med into:.  **. 
1d9d0 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78   **     SELECT x
1d9e0 2b 31 20 46 52 4f 4d 20 74 61 62 20 57 48 45 52  +1 FROM tab WHER
1d9f0 45 20 78 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20  E x+1!=5.  **   
1da00 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a    UNION ALL.  **
1da10 20 20 20 20 20 53 45 4c 45 43 54 20 79 2b 31 20       SELECT y+1 
1da20 46 52 4f 4d 20 74 61 62 20 57 48 45 52 45 20 79  FROM tab WHERE y
1da30 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55  +1!=5.  **     U
1da40 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20  NION ALL.  **   
1da50 20 20 53 45 4c 45 43 54 20 61 62 73 28 7a 2a 32    SELECT abs(z*2
1da60 29 2b 31 20 46 52 4f 4d 20 74 61 62 32 20 57 48  )+1 FROM tab2 WH
1da70 45 52 45 20 61 62 73 28 7a 2a 32 29 2b 31 21 3d  ERE abs(z*2)+1!=
1da80 35 0a 20 20 2a 2a 20 20 20 20 20 4f 52 44 45 52  5.  **     ORDER
1da90 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20   BY 1.  **.  ** 
1daa0 57 65 20 63 61 6c 6c 20 74 68 69 73 20 74 68 65  We call this the
1dab0 20 22 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75   "compound-subqu
1dac0 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 22 2e  ery flattening".
1dad0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 53 75 62  .  */.  for(pSub
1dae0 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 3b 20 70  =pSub->pPrior; p
1daf0 53 75 62 3b 20 70 53 75 62 3d 70 53 75 62 2d 3e  Sub; pSub=pSub->
1db00 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 53 65 6c  pPrior){.    Sel
1db10 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 45  ect *pNew;.    E
1db20 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
1db30 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
1db40 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69  .    Expr *pLimi
1db50 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20  t = p->pLimit;. 
1db60 20 20 20 45 78 70 72 20 2a 70 4f 66 66 73 65 74     Expr *pOffset
1db70 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20   = p->pOffset;. 
1db80 20 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f     Select *pPrio
1db90 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  r = p->pPrior;. 
1dba0 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
1dbb0 20 30 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63 20   0;.    p->pSrc 
1dbc0 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69  = 0;.    p->pPri
1dbd0 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70  or = 0;.    p->p
1dbe0 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 70  Limit = 0;.    p
1dbf0 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->pOffset = 0;. 
1dc00 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
1dc10 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
1dc20 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 66  , 0);.    p->pOf
1dc30 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a  fset = pOffset;.
1dc40 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
1dc50 70 4c 69 6d 69 74 3b 0a 20 20 20 20 70 2d 3e 70  pLimit;.    p->p
1dc60 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
1dc70 42 79 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63 20  By;.    p->pSrc 
1dc80 3d 20 70 53 72 63 3b 0a 20 20 20 20 70 2d 3e 6f  = pSrc;.    p->o
1dc90 70 20 3d 20 54 4b 5f 41 4c 4c 3b 0a 20 20 20 20  p = TK_ALL;.    
1dca0 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
1dcb0 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
1dcc0 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 7d 65 6c   pPrior;.    }el
1dcd0 73 65 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  se{.      pNew->
1dce0 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
1dcf0 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 69 6f  .      if( pPrio
1dd00 72 20 29 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78  r ) pPrior->pNex
1dd10 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  t = pNew;.      
1dd20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70 3b  pNew->pNext = p;
1dd30 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
1dd40 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 7d 0a 20   = pNew;.    }. 
1dd50 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
1dd60 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
1dd70 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65   1;.  }..  /* Be
1dd80 67 69 6e 20 66 6c 61 74 74 65 6e 69 6e 67 20 74  gin flattening t
1dd90 68 65 20 69 46 72 6f 6d 2d 74 68 20 65 6e 74 72  he iFrom-th entr
1dda0 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  y of the FROM cl
1ddb0 61 75 73 65 20 0a 20 20 2a 2a 20 69 6e 20 74 68  ause .  ** in th
1ddc0 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20  e outer query.. 
1ddd0 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20 70 53 75   */.  pSub = pSu
1dde0 62 31 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70  b1 = pSubitem->p
1ddf0 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20 44 65  Select;..  /* De
1de00 6c 65 74 65 20 74 68 65 20 74 72 61 6e 73 69 65  lete the transie
1de10 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74 75  nt table structu
1de20 72 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  re associated wi
1de30 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71  th the.  ** subq
1de40 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  uery.  */.  sqli
1de50 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53  te3DbFree(db, pS
1de60 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73  ubitem->zDatabas
1de70 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  e);.  sqlite3DbF
1de80 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d  ree(db, pSubitem
1de90 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  ->zName);.  sqli
1dea0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53  te3DbFree(db, pS
1deb0 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b  ubitem->zAlias);
1dec0 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61  .  pSubitem->zDa
1ded0 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 70 53  tabase = 0;.  pS
1dee0 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20  ubitem->zName = 
1def0 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a  0;.  pSubitem->z
1df00 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 70 53 75  Alias = 0;.  pSu
1df10 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d  bitem->pSelect =
1df20 20 30 3b 0a 0a 20 20 2f 2a 20 44 65 66 65 72 20   0;..  /* Defer 
1df30 64 65 6c 65 74 69 6e 67 20 74 68 65 20 54 61 62  deleting the Tab
1df40 6c 65 20 6f 62 6a 65 63 74 20 61 73 73 6f 63 69  le object associ
1df50 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 20 20  ated with the.  
1df60 2a 2a 20 73 75 62 71 75 65 72 79 20 75 6e 74 69  ** subquery unti
1df70 6c 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f  l code generatio
1df80 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 6c 65  n is.  ** comple
1df90 74 65 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20  te, since there 
1dfa0 6d 61 79 20 73 74 69 6c 6c 20 65 78 69 73 74 20  may still exist 
1dfb0 45 78 70 72 2e 70 54 61 62 20 65 6e 74 72 69 65  Expr.pTab entrie
1dfc0 73 20 74 68 61 74 0a 20 20 2a 2a 20 72 65 66 65  s that.  ** refe
1dfd0 72 20 74 6f 20 74 68 65 20 73 75 62 71 75 65 72  r to the subquer
1dfe0 79 20 65 76 65 6e 20 61 66 74 65 72 20 66 6c 61  y even after fla
1dff0 74 74 65 6e 69 6e 67 2e 20 20 54 69 63 6b 65 74  ttening.  Ticket
1e000 20 23 33 33 34 36 2e 0a 20 20 2a 2a 0a 20 20 2a   #3346..  **.  *
1e010 2a 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62  * pSubitem->pTab
1e020 20 69 73 20 61 6c 77 61 79 73 20 6e 6f 6e 2d 4e   is always non-N
1e030 55 4c 4c 20 62 79 20 74 65 73 74 20 72 65 73 74  ULL by test rest
1e040 72 69 63 74 69 6f 6e 73 20 61 6e 64 20 74 65 73  rictions and tes
1e050 74 73 20 61 62 6f 76 65 2e 0a 20 20 2a 2f 0a 20  ts above..  */. 
1e060 20 69 66 28 20 41 4c 57 41 59 53 28 70 53 75 62   if( ALWAYS(pSub
1e070 69 74 65 6d 2d 3e 70 54 61 62 21 3d 30 29 20 29  item->pTab!=0) )
1e080 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
1e090 62 54 6f 44 65 6c 20 3d 20 70 53 75 62 69 74 65  bToDel = pSubite
1e0a0 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28  m->pTab;.    if(
1e0b0 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65 66   pTabToDel->nRef
1e0c0 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 50 61 72  ==1 ){.      Par
1e0d0 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20  se *pToplevel = 
1e0e0 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c  sqlite3ParseTopl
1e0f0 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20  evel(pParse);.  
1e100 20 20 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e 70      pTabToDel->p
1e110 4e 65 78 74 5a 6f 6d 62 69 65 20 3d 20 70 54 6f  NextZombie = pTo
1e120 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54  plevel->pZombieT
1e130 61 62 3b 0a 20 20 20 20 20 20 70 54 6f 70 6c 65  ab;.      pTople
1e140 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 20  vel->pZombieTab 
1e150 3d 20 70 54 61 62 54 6f 44 65 6c 3b 0a 20 20 20  = pTabToDel;.   
1e160 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54   }else{.      pT
1e170 61 62 54 6f 44 65 6c 2d 3e 6e 52 65 66 2d 2d 3b  abToDel->nRef--;
1e180 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 75 62 69  .    }.    pSubi
1e190 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20  tem->pTab = 0;. 
1e1a0 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c   }..  /* The fol
1e1b0 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72 75 6e 73  lowing loop runs
1e1c0 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74   once for each t
1e1d0 65 72 6d 20 69 6e 20 61 20 63 6f 6d 70 6f 75 6e  erm in a compoun
1e1e0 64 2d 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20  d-subquery.  ** 
1e1f0 66 6c 61 74 74 65 6e 69 6e 67 20 28 61 73 20 64  flattening (as d
1e200 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 29 2e  escribed above).
1e210 20 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e    If we are doin
1e220 67 20 61 20 64 69 66 66 65 72 65 6e 74 20 6b 69  g a different ki
1e230 6e 64 0a 20 20 2a 2a 20 6f 66 20 66 6c 61 74 74  nd.  ** of flatt
1e240 65 6e 69 6e 67 20 2d 20 61 20 66 6c 61 74 74 65  ening - a flatte
1e250 6e 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  ning other than 
1e260 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75  a compound-subqu
1e270 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d  ery flattening -
1e280 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 69 73 20  .  ** then this 
1e290 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e 73 20 6f  loop only runs o
1e2a0 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  nce..  **.  ** T
1e2b0 68 69 73 20 6c 6f 6f 70 20 6d 6f 76 65 73 20 61  his loop moves a
1e2c0 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 65  ll of the FROM e
1e2d0 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 73  lements of the s
1e2e0 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65  ubquery into the
1e2f0 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63  .  ** the FROM c
1e300 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74  lause of the out
1e310 65 72 20 71 75 65 72 79 2e 20 20 42 65 66 6f 72  er query.  Befor
1e320 65 20 64 6f 69 6e 67 20 74 68 69 73 2c 20 72 65  e doing this, re
1e330 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65 20  member.  ** the 
1e340 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  cursor number fo
1e350 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f  r the original o
1e360 75 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20  uter query FROM 
1e370 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a 20  element in.  ** 
1e380 69 50 61 72 65 6e 74 2e 20 20 54 68 65 20 69 50  iParent.  The iP
1e390 61 72 65 6e 74 20 63 75 72 73 6f 72 20 77 69 6c  arent cursor wil
1e3a0 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 2e  l never be used.
1e3b0 20 20 53 75 62 73 65 71 75 65 6e 74 20 63 6f 64    Subsequent cod
1e3c0 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e  e.  ** will scan
1e3d0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f 6f   expressions loo
1e3e0 6b 69 6e 67 20 66 6f 72 20 69 50 61 72 65 6e 74  king for iParent
1e3f0 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20   references and 
1e400 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68 6f  replace.  ** tho
1e410 73 65 20 72 65 66 65 72 65 6e 63 65 73 20 77 69  se references wi
1e420 74 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74  th expressions t
1e430 68 61 74 20 72 65 73 6f 6c 76 65 20 74 6f 20 74  hat resolve to t
1e440 68 65 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d  he subquery FROM
1e450 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77  .  ** elements w
1e460 65 20 61 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e  e are now copyin
1e470 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  g in..  */.  for
1e480 28 70 50 61 72 65 6e 74 3d 70 3b 20 70 50 61 72  (pParent=p; pPar
1e490 65 6e 74 3b 20 70 50 61 72 65 6e 74 3d 70 50 61  ent; pParent=pPa
1e4a0 72 65 6e 74 2d 3e 70 50 72 69 6f 72 2c 20 70 53  rent->pPrior, pS
1e4b0 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29  ub=pSub->pPrior)
1e4c0 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75 62 53 72  {.    int nSubSr
1e4d0 63 3b 0a 20 20 20 20 75 38 20 6a 6f 69 6e 74 79  c;.    u8 jointy
1e4e0 70 65 20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62  pe = 0;.    pSub
1e4f0 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63  Src = pSub->pSrc
1e500 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c  ;     /* FROM cl
1e510 61 75 73 65 20 6f 66 20 73 75 62 71 75 65 72 79  ause of subquery
1e520 20 2a 2f 0a 20 20 20 20 6e 53 75 62 53 72 63 20   */.    nSubSrc 
1e530 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3b  = pSubSrc->nSrc;
1e540 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
1e550 65 72 6d 73 20 69 6e 20 73 75 62 71 75 65 72 79  erms in subquery
1e560 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
1e570 20 20 20 20 70 53 72 63 20 3d 20 70 50 61 72 65      pSrc = pPare
1e580 6e 74 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a  nt->pSrc;     /*
1e590 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
1e5a0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1e5b0 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70 53 72 63  */..    if( pSrc
1e5c0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
1e5d0 28 20 70 50 61 72 65 6e 74 3d 3d 70 20 29 3b 20  ( pParent==p ); 
1e5e0 20 2f 2a 20 46 69 72 73 74 20 74 69 6d 65 20 74   /* First time t
1e5f0 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20  hrough the loop 
1e600 2a 2f 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70  */.      jointyp
1e610 65 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 6a 6f  e = pSubitem->jo
1e620 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d 65 6c 73  intype;.    }els
1e630 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
1e640 20 70 50 61 72 65 6e 74 21 3d 70 20 29 3b 20 20   pParent!=p );  
1e650 2f 2a 20 32 6e 64 20 61 6e 64 20 73 75 62 73 65  /* 2nd and subse
1e660 71 75 65 6e 74 20 74 69 6d 65 73 20 74 68 72 6f  quent times thro
1e670 75 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a  ugh the loop */.
1e680 20 20 20 20 20 20 70 53 72 63 20 3d 20 70 50 61        pSrc = pPa
1e690 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 73 71 6c  rent->pSrc = sql
1e6a0 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
1e6b0 64 28 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  d(db, 0, 0, 0);.
1e6c0 20 20 20 20 20 20 69 66 28 20 70 53 72 63 3d 3d        if( pSrc==
1e6d0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  0 ){.        ass
1e6e0 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ert( db->mallocF
1e6f0 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20  ailed );.       
1e700 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1e710 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68      }..    /* Th
1e720 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20  e subquery uses 
1e730 61 20 73 69 6e 67 6c 65 20 73 6c 6f 74 20 6f 66  a single slot of
1e740 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1e750 20 6f 66 20 74 68 65 20 6f 75 74 65 72 0a 20 20   of the outer.  
1e760 20 20 2a 2a 20 71 75 65 72 79 2e 20 20 49 66 20    ** query.  If 
1e770 74 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73  the subquery has
1e780 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 65   more than one e
1e790 6c 65 6d 65 6e 74 20 69 6e 20 69 74 73 20 46 52  lement in its FR
1e7a0 4f 4d 20 63 6c 61 75 73 65 2c 0a 20 20 20 20 2a  OM clause,.    *
1e7b0 2a 20 74 68 65 6e 20 65 78 70 61 6e 64 20 74 68  * then expand th
1e7c0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 74 6f  e outer query to
1e7d0 20 6d 61 6b 65 20 73 70 61 63 65 20 66 6f 72 20   make space for 
1e7e0 69 74 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 65  it to hold all e
1e7f0 6c 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6f  lements.    ** o
1e800 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a  f the subquery..
1e810 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78      **.    ** Ex
1e820 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20  ample:.    **.  
1e830 20 20 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a    **    SELECT *
1e840 20 46 52 4f 4d 20 74 61 62 41 2c 20 28 53 45 4c   FROM tabA, (SEL
1e850 45 43 54 20 2a 20 46 52 4f 4d 20 73 75 62 31 2c  ECT * FROM sub1,
1e860 20 73 75 62 32 29 2c 20 74 61 62 42 3b 0a 20 20   sub2), tabB;.  
1e870 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
1e880 6f 75 74 65 72 20 71 75 65 72 79 20 68 61 73 20  outer query has 
1e890 33 20 73 6c 6f 74 73 20 69 6e 20 69 74 73 20 46  3 slots in its F
1e8a0 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 4f 6e 65  ROM clause.  One
1e8b0 20 73 6c 6f 74 20 6f 66 20 74 68 65 0a 20 20 20   slot of the.   
1e8c0 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20   ** outer query 
1e8d0 28 74 68 65 20 6d 69 64 64 6c 65 20 73 6c 6f 74  (the middle slot
1e8e0 29 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  ) is used by the
1e8f0 20 73 75 62 71 75 65 72 79 2e 20 20 54 68 65 20   subquery.  The 
1e900 6e 65 78 74 0a 20 20 20 20 2a 2a 20 62 6c 6f 63  next.    ** bloc
1e910 6b 20 6f 66 20 63 6f 64 65 20 77 69 6c 6c 20 65  k of code will e
1e920 78 70 61 6e 64 20 74 68 65 20 6f 75 74 20 71 75  xpand the out qu
1e930 65 72 79 20 74 6f 20 34 20 73 6c 6f 74 73 2e 20  ery to 4 slots. 
1e940 20 54 68 65 20 6d 69 64 64 6c 65 0a 20 20 20 20   The middle.    
1e950 2a 2a 20 73 6c 6f 74 20 69 73 20 65 78 70 61 6e  ** slot is expan
1e960 64 65 64 20 74 6f 20 74 77 6f 20 73 6c 6f 74 73  ded to two slots
1e970 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b   in order to mak
1e980 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 0a  e space for the.
1e990 20 20 20 20 2a 2a 20 74 77 6f 20 65 6c 65 6d 65      ** two eleme
1e9a0 6e 74 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  nts in the FROM 
1e9b0 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 75  clause of the su
1e9c0 62 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20  bquery..    */. 
1e9d0 20 20 20 69 66 28 20 6e 53 75 62 53 72 63 3e 31     if( nSubSrc>1
1e9e0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e   ){.      pParen
1e9f0 74 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 20 3d  t->pSrc = pSrc =
1ea00 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45   sqlite3SrcListE
1ea10 6e 6c 61 72 67 65 28 64 62 2c 20 70 53 72 63 2c  nlarge(db, pSrc,
1ea20 20 6e 53 75 62 53 72 63 2d 31 2c 69 46 72 6f 6d   nSubSrc-1,iFrom
1ea30 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64  +1);.      if( d
1ea40 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1ea50 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
1ea60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1ea70 0a 20 20 20 20 2f 2a 20 54 72 61 6e 73 66 65 72  .    /* Transfer
1ea80 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1ea90 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20   terms from the 
1eaa0 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68  subquery into th
1eab0 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71  e.    ** outer q
1eac0 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  uery..    */.   
1ead0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62   for(i=0; i<nSub
1eae0 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
1eaf0 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
1eb00 6c 65 74 65 28 64 62 2c 20 70 53 72 63 2d 3e 61  lete(db, pSrc->a
1eb10 5b 69 2b 69 46 72 6f 6d 5d 2e 70 55 73 69 6e 67  [i+iFrom].pUsing
1eb20 29 3b 0a 20 20 20 20 20 20 70 53 72 63 2d 3e 61  );.      pSrc->a
1eb30 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70 53 75 62  [i+iFrom] = pSub
1eb40 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20  Src->a[i];.     
1eb50 20 6d 65 6d 73 65 74 28 26 70 53 75 62 53 72 63   memset(&pSubSrc
1eb60 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f  ->a[i], 0, sizeo
1eb70 66 28 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29  f(pSubSrc->a[i])
1eb80 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72  );.    }.    pSr
1eb90 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 6a 6f 69 6e  c->a[iFrom].join
1eba0 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70 65 3b  type = jointype;
1ebb0 0a 20 20 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 62  .  .    /* Now b
1ebc0 65 67 69 6e 20 73 75 62 73 74 69 74 75 74 69 6e  egin substitutin
1ebd0 67 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c  g subquery resul
1ebe0 74 20 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e  t set expression
1ebf0 73 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 72 65  s for .    ** re
1ec00 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
1ec10 69 50 61 72 65 6e 74 20 69 6e 20 74 68 65 20 6f  iParent in the o
1ec20 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 20 20  uter query..    
1ec30 2a 2a 20 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70  ** .    ** Examp
1ec40 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le:.    **.    *
1ec50 2a 20 20 20 53 45 4c 45 43 54 20 61 2b 35 2c 20  *   SELECT a+5, 
1ec60 62 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c 45 43  b*10 FROM (SELEC
1ec70 54 20 78 2a 33 20 41 53 20 61 2c 20 79 2b 31 30  T x*3 AS a, y+10
1ec80 20 41 53 20 62 20 46 52 4f 4d 20 74 31 29 20 57   AS b FROM t1) W
1ec90 48 45 52 45 20 61 3e 62 3b 0a 20 20 20 20 2a 2a  HERE a>b;.    **
1eca0 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20     \            
1ecb0 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f           \______
1ecc0 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79  _______ subquery
1ecd0 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20   __________/    
1ece0 20 20 20 20 20 20 2f 0a 20 20 20 20 2a 2a 20 20        /.    **  
1ecf0 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f    \_____________
1ed00 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71  ________ outer q
1ed10 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  uery ___________
1ed20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1ed30 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ___/.    **.    
1ed40 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65 76  ** We look at ev
1ed50 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ery expression i
1ed60 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
1ed70 79 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63  y and every plac
1ed80 65 20 77 65 20 73 65 65 0a 20 20 20 20 2a 2a 20  e we see.    ** 
1ed90 22 61 22 20 77 65 20 73 75 62 73 74 69 74 75 74  "a" we substitut
1eda0 65 20 22 78 2a 33 22 20 61 6e 64 20 65 76 65 72  e "x*3" and ever
1edb0 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 20 22  y place we see "
1edc0 62 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65  b" we substitute
1edd0 20 22 79 2b 31 30 22 2e 0a 20 20 20 20 2a 2f 0a   "y+10"..    */.
1ede0 20 20 20 20 70 4c 69 73 74 20 3d 20 70 50 61 72      pList = pPar
1edf0 65 6e 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20  ent->pEList;.   
1ee00 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
1ee10 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
1ee20 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d        if( pList-
1ee30 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 29  >a[i].zName==0 )
1ee40 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
1ee50 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
1ee60 62 53 74 72 44 75 70 28 64 62 2c 20 70 4c 69 73  bStrDup(db, pLis
1ee70 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 3b 0a  t->a[i].zSpan);.
1ee80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
1ee90 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20  equote(zName);. 
1eea0 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b         pList->a[
1eeb0 69 5d 2e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65  i].zName = zName
1eec0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1eed0 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73      substExprLis
1eee0 74 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70  t(db, pParent->p
1eef0 45 4c 69 73 74 2c 20 69 50 61 72 65 6e 74 2c 20  EList, iParent, 
1ef00 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
1ef10 20 20 20 69 66 28 20 69 73 41 67 67 20 29 7b 0a     if( isAgg ){.
1ef20 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72 4c        substExprL
1ef30 69 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74 2d  ist(db, pParent-
1ef40 3e 70 47 72 6f 75 70 42 79 2c 20 69 50 61 72 65  >pGroupBy, iPare
1ef50 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
1ef60 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  );.      pParent
1ef70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 75 62 73  ->pHaving = subs
1ef80 74 45 78 70 72 28 64 62 2c 20 70 50 61 72 65 6e  tExpr(db, pParen
1ef90 74 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72  t->pHaving, iPar
1efa0 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
1efb0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  t);.    }.    if
1efc0 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  ( pSub->pOrderBy
1efd0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
1efe0 28 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65  ( pParent->pOrde
1eff0 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  rBy==0 );.      
1f000 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42  pParent->pOrderB
1f010 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72 64 65 72  y = pSub->pOrder
1f020 42 79 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e  By;.      pSub->
1f030 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
1f040 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 72    }else if( pPar
1f050 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ent->pOrderBy ){
1f060 0a 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72  .      substExpr
1f070 4c 69 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74  List(db, pParent
1f080 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 50 61 72  ->pOrderBy, iPar
1f090 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
1f0a0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  t);.    }.    if
1f0b0 28 20 70 53 75 62 2d 3e 70 57 68 65 72 65 20 29  ( pSub->pWhere )
1f0c0 7b 0a 20 20 20 20 20 20 70 57 68 65 72 65 20 3d  {.      pWhere =
1f0d0 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
1f0e0 64 62 2c 20 70 53 75 62 2d 3e 70 57 68 65 72 65  db, pSub->pWhere
1f0f0 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
1f100 0a 20 20 20 20 20 20 70 57 68 65 72 65 20 3d 20  .      pWhere = 
1f110 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
1f120 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29   subqueryIsAgg )
1f130 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1f140 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67  pParent->pHaving
1f150 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61  ==0 );.      pPa
1f160 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20  rent->pHaving = 
1f170 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 3b  pParent->pWhere;
1f180 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
1f190 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b  pWhere = pWhere;
1f1a0 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
1f1b0 70 48 61 76 69 6e 67 20 3d 20 73 75 62 73 74 45  pHaving = substE
1f1c0 78 70 72 28 64 62 2c 20 70 50 61 72 65 6e 74 2d  xpr(db, pParent-
1f1d0 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e  >pHaving, iParen
1f1e0 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
1f1f0 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
1f200 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74  >pHaving = sqlit
1f210 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 50  e3ExprAnd(db, pP
1f220 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20  arent->pHaving, 
1f230 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f250 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75     sqlite3ExprDu
1f260 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 48 61 76  p(db, pSub->pHav
1f270 69 6e 67 2c 20 30 29 29 3b 0a 20 20 20 20 20 20  ing, 0));.      
1f280 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d  assert( pParent-
1f290 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a  >pGroupBy==0 );.
1f2a0 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
1f2b0 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65  GroupBy = sqlite
1f2c0 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
1f2d0 20 70 53 75 62 2d 3e 70 47 72 6f 75 70 42 79 2c   pSub->pGroupBy,
1f2e0 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
1f2f0 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
1f300 57 68 65 72 65 20 3d 20 73 75 62 73 74 45 78 70  Where = substExp
1f310 72 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70  r(db, pParent->p
1f320 57 68 65 72 65 2c 20 69 50 61 72 65 6e 74 2c 20  Where, iParent, 
1f330 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
1f340 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57       pParent->pW
1f350 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
1f360 70 72 41 6e 64 28 64 62 2c 20 70 50 61 72 65 6e  prAnd(db, pParen
1f370 74 2d 3e 70 57 68 65 72 65 2c 20 70 57 68 65 72  t->pWhere, pWher
1f380 65 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  e);.    }.  .   
1f390 20 2f 2a 20 54 68 65 20 66 6c 61 74 74 65 6e 65   /* The flattene
1f3a0 64 20 71 75 65 72 79 20 69 73 20 64 69 73 74 69  d query is disti
1f3b0 6e 63 74 20 69 66 20 65 69 74 68 65 72 20 74 68  nct if either th
1f3c0 65 20 69 6e 6e 65 72 20 6f 72 20 74 68 65 0a 20  e inner or the. 
1f3d0 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72     ** outer quer
1f3e0 79 20 69 73 20 64 69 73 74 69 6e 63 74 2e 20 0a  y is distinct. .
1f3f0 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 65      */.    pPare
1f400 6e 74 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20  nt->selFlags |= 
1f410 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSub->selFlags &
1f420 20 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20   SF_Distinct;.  
1f430 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53  .    /*.    ** S
1f440 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 28  ELECT ... FROM (
1f450 53 45 4c 45 43 54 20 2e 2e 2e 20 4c 49 4d 49 54  SELECT ... LIMIT
1f460 20 61 20 4f 46 46 53 45 54 20 62 29 20 4c 49 4d   a OFFSET b) LIM
1f470 49 54 20 78 20 4f 46 46 53 45 54 20 79 3b 0a 20  IT x OFFSET y;. 
1f480 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 65     **.    ** One
1f490 20 69 73 20 74 65 6d 70 74 65 64 20 74 6f 20 74   is tempted to t
1f4a0 72 79 20 74 6f 20 61 64 64 20 61 20 61 6e 64 20  ry to add a and 
1f4b0 62 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65  b to combine the
1f4c0 20 6c 69 6d 69 74 73 2e 20 20 42 75 74 20 74 68   limits.  But th
1f4d0 69 73 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e  is.    ** does n
1f4e0 6f 74 20 77 6f 72 6b 20 69 66 20 65 69 74 68 65  ot work if eithe
1f4f0 72 20 6c 69 6d 69 74 20 69 73 20 6e 65 67 61 74  r limit is negat
1f500 69 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ive..    */.    
1f510 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74  if( pSub->pLimit
1f520 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e   ){.      pParen
1f530 74 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 53 75 62  t->pLimit = pSub
1f540 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->pLimit;.      
1f550 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 3d 20 30  pSub->pLimit = 0
1f560 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
1f570 2a 20 46 69 6e 69 61 6c 6c 79 2c 20 64 65 6c 65  * Finially, dele
1f580 74 65 20 77 68 61 74 20 69 73 20 6c 65 66 74 20  te what is left 
1f590 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
1f5a0 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20  and return.  ** 
1f5b0 73 75 63 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  success..  */.  
1f5c0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
1f5d0 65 74 65 28 64 62 2c 20 70 53 75 62 31 29 3b 0a  ete(db, pSub1);.
1f5e0 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23  .  return 1;.}.#
1f5f0 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
1f600 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
1f610 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69  BQUERY) || !defi
1f620 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
1f630 56 49 45 57 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  VIEW) */../*.** 
1f640 42 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e  Based on the con
1f650 74 65 6e 74 73 20 6f 66 20 74 68 65 20 41 67 67  tents of the Agg
1f660 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  Info structure i
1f670 6e 64 69 63 61 74 65 64 20 62 79 20 74 68 65 20  ndicated by the 
1f680 66 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e  first.** argumen
1f690 74 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  t, this function
1f6a0 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 20 66   checks if the f
1f6b0 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75  ollowing are tru
1f6c0 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68  e:.**.**    * th
1f6d0 65 20 71 75 65 72 79 20 63 6f 6e 74 61 69 6e 73  e query contains
1f6e0 20 6a 75 73 74 20 61 20 73 69 6e 67 6c 65 20 61   just a single a
1f6f0 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
1f700 6e 2c 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 61  n,.**    * the a
1f710 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
1f720 6e 20 69 73 20 65 69 74 68 65 72 20 6d 69 6e 28  n is either min(
1f730 29 20 6f 72 20 6d 61 78 28 29 2c 20 61 6e 64 0a  ) or max(), and.
1f740 2a 2a 20 20 20 20 2a 20 74 68 65 20 61 72 67 75  **    * the argu
1f750 6d 65 6e 74 20 74 6f 20 74 68 65 20 61 67 67 72  ment to the aggr
1f760 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 69  egate function i
1f770 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  s a column value
1f780 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 6f  ..**.** If all o
1f790 66 20 74 68 65 20 61 62 6f 76 65 20 61 72 65 20  f the above are 
1f7a0 74 72 75 65 2c 20 74 68 65 6e 20 57 48 45 52 45  true, then WHERE
1f7b0 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20 6f 72 20  _ORDERBY_MIN or 
1f7c0 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41  WHERE_ORDERBY_MA
1f7d0 58 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  X.** is returned
1f7e0 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e   as appropriate.
1f7f0 20 41 6c 73 6f 2c 20 2a 70 70 4d 69 6e 4d 61 78   Also, *ppMinMax
1f800 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
1f810 20 74 6f 20 74 68 65 20 0a 2a 2a 20 6c 69 73 74   to the .** list
1f820 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 70 61   of arguments pa
1f830 73 73 65 64 20 74 6f 20 74 68 65 20 61 67 67 72  ssed to the aggr
1f840 65 67 61 74 65 20 62 65 66 6f 72 65 20 72 65 74  egate before ret
1f850 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 4f 72  urning..**.** Or
1f860 2c 20 69 66 20 74 68 65 20 63 6f 6e 64 69 74 69  , if the conditi
1f870 6f 6e 73 20 61 62 6f 76 65 20 61 72 65 20 6e 6f  ons above are no
1f880 74 20 6d 65 74 2c 20 2a 70 70 4d 69 6e 4d 61 78  t met, *ppMinMax
1f890 20 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64   is set to 0 and
1f8a0 0a 2a 2a 20 57 48 45 52 45 5f 4f 52 44 45 52 42  .** WHERE_ORDERB
1f8b0 59 5f 4e 4f 52 4d 41 4c 20 69 73 20 72 65 74 75  Y_NORMAL is retu
1f8c0 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
1f8d0 75 38 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 41  u8 minMaxQuery(A
1f8e0 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
1f8f0 2c 20 45 78 70 72 4c 69 73 74 20 2a 2a 70 70 4d  , ExprList **ppM
1f900 69 6e 4d 61 78 29 7b 0a 20 20 69 6e 74 20 65 52  inMax){.  int eR
1f910 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52  et = WHERE_ORDER
1f920 42 59 5f 4e 4f 52 4d 41 4c 3b 20 20 20 20 20 20  BY_NORMAL;      
1f930 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61      /* Return va
1f940 6c 75 65 20 2a 2f 0a 0a 20 20 2a 70 70 4d 69 6e  lue */..  *ppMin
1f950 4d 61 78 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  Max = 0;.  if( p
1f960 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d  AggInfo->nFunc==
1f970 31 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  1 ){.    Expr *p
1f980 45 78 70 72 20 3d 20 70 41 67 67 49 6e 66 6f 2d  Expr = pAggInfo-
1f990 3e 61 46 75 6e 63 5b 30 5d 2e 70 45 78 70 72 3b  >aFunc[0].pExpr;
1f9a0 20 2f 2a 20 41 67 67 72 65 67 61 74 65 20 66 75   /* Aggregate fu
1f9b0 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 45 78  nction */.    Ex
1f9c0 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d  prList *pEList =
1f9d0 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
1f9e0 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e        /* Argumen
1f9f0 74 73 20 74 6f 20 61 67 67 20 66 75 6e 63 74 69  ts to agg functi
1fa00 6f 6e 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72  on */..    asser
1fa10 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  t( pExpr->op==TK
1fa20 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b  _AGG_FUNCTION );
1fa30 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 20  .    if( pEList 
1fa40 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  && pEList->nExpr
1fa50 3d 3d 31 20 26 26 20 70 45 4c 69 73 74 2d 3e 61  ==1 && pEList->a
1fa60 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  [0].pExpr->op==T
1fa70 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  K_AGG_COLUMN ){.
1fa80 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
1fa90 20 2a 7a 46 75 6e 63 20 3d 20 70 45 78 70 72 2d   *zFunc = pExpr-
1faa0 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20  >u.zToken;.     
1fab0 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
1fac0 43 6d 70 28 7a 46 75 6e 63 2c 20 22 6d 69 6e 22  Cmp(zFunc, "min"
1fad0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
1fae0 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44  eRet = WHERE_ORD
1faf0 45 52 42 59 5f 4d 49 4e 3b 0a 20 20 20 20 20 20  ERBY_MIN;.      
1fb00 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 70 45    *ppMinMax = pE
1fb10 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  List;.      }els
1fb20 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72  e if( sqlite3Str
1fb30 49 43 6d 70 28 7a 46 75 6e 63 2c 20 22 6d 61 78  ICmp(zFunc, "max
1fb40 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
1fb50 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52   eRet = WHERE_OR
1fb60 44 45 52 42 59 5f 4d 41 58 3b 0a 20 20 20 20 20  DERBY_MAX;.     
1fb70 20 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 70     *ppMinMax = p
1fb80 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20  EList;.      }. 
1fb90 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65     }.  }..  asse
1fba0 72 74 28 20 2a 70 70 4d 69 6e 4d 61 78 3d 3d 30  rt( *ppMinMax==0
1fbb0 20 7c 7c 20 28 2a 70 70 4d 69 6e 4d 61 78 29 2d   || (*ppMinMax)-
1fbc0 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20 72  >nExpr==1 );.  r
1fbd0 65 74 75 72 6e 20 65 52 65 74 3b 0a 7d 0a 0a 2f  eturn eRet;.}../
1fbe0 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63 74 20  *.** The select 
1fbf0 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64  statement passed
1fc00 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
1fc10 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 61 67 67  gument is an agg
1fc20 72 65 67 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a  regate query..**
1fc30 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 6d   The second argm
1fc40 65 6e 74 20 69 73 20 74 68 65 20 61 73 73 6f 63  ent is the assoc
1fc50 69 61 74 65 64 20 61 67 67 72 65 67 61 74 65 2d  iated aggregate-
1fc60 69 6e 66 6f 20 6f 62 6a 65 63 74 2e 20 54 68 69  info object. Thi
1fc70 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74  s .** function t
1fc80 65 73 74 73 20 69 66 20 74 68 65 20 53 45 4c 45  ests if the SELE
1fc90 43 54 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  CT is of the for
1fca0 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43  m:.**.**   SELEC
1fcb0 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
1fcc0 3c 74 62 6c 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72  <tbl>.**.** wher
1fcd0 65 20 74 61 62 6c 65 20 69 73 20 61 20 64 61 74  e table is a dat
1fce0 61 62 61 73 65 20 74 61 62 6c 65 2c 20 6e 6f 74  abase table, not
1fcf0 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72   a sub-select or
1fd00 20 76 69 65 77 2e 20 49 66 20 74 68 65 20 71 75   view. If the qu
1fd10 65 72 79 0a 2a 2a 20 64 6f 65 73 20 6d 61 74 63  ery.** does matc
1fd20 68 20 74 68 69 73 20 70 61 74 74 65 72 6e 2c 20  h this pattern, 
1fd30 74 68 65 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  then a pointer t
1fd40 6f 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65  o the Table obje
1fd50 63 74 20 72 65 70 72 65 73 65 6e 74 69 6e 67 0a  ct representing.
1fd60 2a 2a 20 3c 74 62 6c 3e 20 69 73 20 72 65 74 75  ** <tbl> is retu
1fd70 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
1fd80 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a   0 is returned..
1fd90 2a 2f 0a 73 74 61 74 69 63 20 54 61 62 6c 65 20  */.static Table 
1fda0 2a 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 53  *isSimpleCount(S
1fdb0 65 6c 65 63 74 20 2a 70 2c 20 41 67 67 49 6e 66  elect *p, AggInf
1fdc0 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20  o *pAggInfo){.  
1fdd0 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 45  Table *pTab;.  E
1fde0 78 70 72 20 2a 70 45 78 70 72 3b 0a 0a 20 20 61  xpr *pExpr;..  a
1fdf0 73 73 65 72 74 28 20 21 70 2d 3e 70 47 72 6f 75  ssert( !p->pGrou
1fe00 70 42 79 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d  pBy );..  if( p-
1fe10 3e 70 57 68 65 72 65 20 7c 7c 20 70 2d 3e 70 45  >pWhere || p->pE
1fe20 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 0a  List->nExpr!=1 .
1fe30 20 20 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 6e     || p->pSrc->n
1fe40 53 72 63 21 3d 31 20 7c 7c 20 70 2d 3e 70 53 72  Src!=1 || p->pSr
1fe50 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 0a  c->a[0].pSelect.
1fe60 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
1fe70 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d 20  0;.  }.  pTab = 
1fe80 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54  p->pSrc->a[0].pT
1fe90 61 62 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 2d  ab;.  pExpr = p-
1fea0 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  >pEList->a[0].pE
1feb0 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70  xpr;.  assert( p
1fec0 54 61 62 20 26 26 20 21 70 54 61 62 2d 3e 70 53  Tab && !pTab->pS
1fed0 65 6c 65 63 74 20 26 26 20 70 45 78 70 72 20 29  elect && pExpr )
1fee0 3b 0a 0a 20 20 69 66 28 20 49 73 56 69 72 74 75  ;..  if( IsVirtu
1fef0 61 6c 28 70 54 61 62 29 20 29 20 72 65 74 75 72  al(pTab) ) retur
1ff00 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72  n 0;.  if( pExpr
1ff10 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e  ->op!=TK_AGG_FUN
1ff20 43 54 49 4f 4e 20 29 20 72 65 74 75 72 6e 20 30  CTION ) return 0
1ff30 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 41  ;.  if( NEVER(pA
1ff40 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d 30  ggInfo->nFunc==0
1ff50 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
1ff60 69 66 28 20 28 70 41 67 67 49 6e 66 6f 2d 3e 61  if( (pAggInfo->a
1ff70 46 75 6e 63 5b 30 5d 2e 70 46 75 6e 63 2d 3e 66  Func[0].pFunc->f
1ff80 75 6e 63 46 6c 61 67 73 26 53 51 4c 49 54 45 5f  uncFlags&SQLITE_
1ff90 46 55 4e 43 5f 43 4f 55 4e 54 29 3d 3d 30 20 29  FUNC_COUNT)==0 )
1ffa0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
1ffb0 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 26 45 50   pExpr->flags&EP
1ffc0 5f 44 69 73 74 69 6e 63 74 20 29 20 72 65 74 75  _Distinct ) retu
1ffd0 72 6e 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20  rn 0;..  return 
1ffe0 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  pTab;.}../*.** I
1fff0 66 20 74 68 65 20 73 6f 75 72 63 65 2d 6c 69 73  f the source-lis
20000 74 20 69 74 65 6d 20 70 61 73 73 65 64 20 61 73  t item passed as
20010 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 77 61 73   an argument was
20020 20 61 75 67 6d 65 6e 74 65 64 20 77 69 74 68 20   augmented with 
20030 61 6e 0a 2a 2a 20 49 4e 44 45 58 45 44 20 42 59  an.** INDEXED BY
20040 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 72   clause, then tr
20050 79 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20  y to locate the 
20060 73 70 65 63 69 66 69 65 64 20 69 6e 64 65 78 2e  specified index.
20070 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 77 61 73   If there.** was
20080 20 73 75 63 68 20 61 20 63 6c 61 75 73 65 20 61   such a clause a
20090 6e 64 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64  nd the named ind
200a0 65 78 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75  ex cannot be fou
200b0 6e 64 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53  nd, return .** S
200c0 51 4c 49 54 45 5f 45 52 52 4f 52 20 61 6e 64 20  QLITE_ERROR and 
200d0 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69  leave an error i
200e0 6e 20 70 50 61 72 73 65 2e 20 4f 74 68 65 72 77  n pParse. Otherw
200f0 69 73 65 2c 20 70 6f 70 75 6c 61 74 65 20 0a 2a  ise, populate .*
20100 2a 20 70 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20  * pFrom->pIndex 
20110 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
20120 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  E_OK..*/.int sql
20130 69 74 65 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f  ite3IndexedByLoo
20140 6b 75 70 28 50 61 72 73 65 20 2a 70 50 61 72 73  kup(Parse *pPars
20150 65 2c 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  e, struct SrcLis
20160 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a  t_item *pFrom){.
20170 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61    if( pFrom->pTa
20180 62 20 26 26 20 70 46 72 6f 6d 2d 3e 7a 49 6e 64  b && pFrom->zInd
20190 65 78 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  ex ){.    Table 
201a0 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pTab = pFrom->p
201b0 54 61 62 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  Tab;.    char *z
201c0 49 6e 64 65 78 20 3d 20 70 46 72 6f 6d 2d 3e 7a  Index = pFrom->z
201d0 49 6e 64 65 78 3b 0a 20 20 20 20 49 6e 64 65 78  Index;.    Index
201e0 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28   *pIdx;.    for(
201f0 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
20200 78 3b 20 0a 20 20 20 20 20 20 20 20 70 49 64 78  x; .        pIdx
20210 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
20220 6d 70 28 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20  mp(pIdx->zName, 
20230 7a 49 6e 64 65 78 29 3b 20 0a 20 20 20 20 20 20  zIndex); .      
20240 20 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65    pIdx=pIdx->pNe
20250 78 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  xt.    );.    if
20260 28 20 21 70 49 64 78 20 29 7b 0a 20 20 20 20 20  ( !pIdx ){.     
20270 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
20280 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63  (pParse, "no suc
20290 68 20 69 6e 64 65 78 3a 20 25 73 22 2c 20 7a 49  h index: %s", zI
202a0 6e 64 65 78 2c 20 30 29 3b 0a 20 20 20 20 20 20  ndex, 0);.      
202b0 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68  pParse->checkSch
202c0 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 20 20 72  ema = 1;.      r
202d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
202e0 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46  OR;.    }.    pF
202f0 72 6f 6d 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49  rom->pIndex = pI
20300 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  dx;.  }.  return
20310 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a   SQLITE_OK;.}./*
20320 0a 2a 2a 20 44 65 74 65 63 74 20 63 6f 6d 70 6f  .** Detect compo
20330 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74 65  und SELECT state
20340 6d 65 6e 74 73 20 74 68 61 74 20 75 73 65 20 61  ments that use a
20350 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
20360 65 20 77 69 74 68 20 0a 2a 2a 20 61 6e 20 61 6c  e with .** an al
20370 74 65 72 6e 61 74 69 76 65 20 63 6f 6c 6c 61 74  ternative collat
20380 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a  ing sequence..**
20390 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2e 2e  .**    SELECT ..
203a0 2e 20 46 52 4f 4d 20 74 31 20 45 58 43 45 50 54  . FROM t1 EXCEPT
203b0 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d   SELECT ... FROM
203c0 20 74 32 20 4f 52 44 45 52 20 42 59 20 2e 2e 20   t2 ORDER BY .. 
203d0 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a  COLLATE ....**.*
203e0 2a 20 54 68 65 73 65 20 61 72 65 20 72 65 77 72  * These are rewr
203f0 69 74 74 65 6e 20 61 73 20 61 20 73 75 62 71 75  itten as a subqu
20400 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45  ery:.**.**    SE
20410 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c  LECT * FROM (SEL
20420 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20  ECT ... FROM t1 
20430 45 58 43 45 50 54 20 53 45 4c 45 43 54 20 2e 2e  EXCEPT SELECT ..
20440 2e 20 46 52 4f 4d 20 74 32 29 0a 2a 2a 20 20 20  . FROM t2).**   
20450 20 20 4f 52 44 45 52 20 42 59 20 2e 2e 2e 20 43    ORDER BY ... C
20460 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a  OLLATE ....**.**
20470 20 54 68 69 73 20 74 72 61 6e 73 66 6f 72 6d 61   This transforma
20480 74 69 6f 6e 20 69 73 20 6e 65 63 65 73 73 61 72  tion is necessar
20490 79 20 62 65 63 61 75 73 65 20 74 68 65 20 6d 75  y because the mu
204a0 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79  ltiSelectOrderBy
204b0 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 62  () routine.** ab
204c0 6f 76 65 20 74 68 61 74 20 67 65 6e 65 72 61 74  ove that generat
204d0 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20  es the code for 
204e0 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  a compound SELEC
204f0 54 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20  T with an ORDER 
20500 42 59 20 63 6c 61 75 73 65 0a 2a 2a 20 75 73 65  BY clause.** use
20510 73 20 61 20 6d 65 72 67 65 20 61 6c 67 6f 72 69  s a merge algori
20520 74 68 6d 20 74 68 61 74 20 72 65 71 75 69 72 65  thm that require
20530 73 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 6c 61  s the same colla
20540 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 6e  ting sequence on
20550 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20 63   the.** result c
20560 6f 6c 75 6d 6e 73 20 61 73 20 6f 6e 20 74 68 65  olumns as on the
20570 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
20580 2e 20 20 53 65 65 20 74 69 63 6b 65 74 0a 2a 2a  .  See ticket.**
20590 20 68 74 74 70 3a 2f 2f 77 77 77 2e 73 71 6c 69   http://www.sqli
205a0 74 65 2e 6f 72 67 2f 73 72 63 2f 69 6e 66 6f 2f  te.org/src/info/
205b0 36 37 30 39 35 37 34 64 32 61 0a 2a 2a 0a 2a 2a  6709574d2a.**.**
205c0 20 54 68 69 73 20 74 72 61 6e 73 66 6f 72 6d 61   This transforma
205d0 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 6e 65 65  tion is only nee
205e0 64 65 64 20 66 6f 72 20 45 58 43 45 50 54 2c 20  ded for EXCEPT, 
205f0 49 4e 54 45 52 53 45 43 54 2c 20 61 6e 64 20 55  INTERSECT, and U
20600 4e 49 4f 4e 2e 0a 2a 2a 20 54 68 65 20 55 4e 49  NION..** The UNI
20610 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20  ON ALL operator 
20620 77 6f 72 6b 73 20 66 69 6e 65 20 77 69 74 68 20  works fine with 
20630 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72  multiSelectOrder
20640 42 79 28 29 20 65 76 65 6e 20 77 68 65 6e 0a 2a  By() even when.*
20650 2a 20 74 68 65 72 65 20 61 72 65 20 43 4f 4c 4c  * there are COLL
20660 41 54 45 20 74 65 72 6d 73 20 69 6e 20 74 68 65  ATE terms in the
20670 20 4f 52 44 45 52 20 42 59 2e 0a 2a 2f 0a 73 74   ORDER BY..*/.st
20680 61 74 69 63 20 69 6e 74 20 63 6f 6e 76 65 72 74  atic int convert
20690 43 6f 6d 70 6f 75 6e 64 53 65 6c 65 63 74 54 6f  CompoundSelectTo
206a0 53 75 62 71 75 65 72 79 28 57 61 6c 6b 65 72 20  Subquery(Walker 
206b0 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74  *pWalker, Select
206c0 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
206d0 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20   Select *pNew;. 
206e0 20 53 65 6c 65 63 74 20 2a 70 58 3b 0a 20 20 73   Select *pX;.  s
206f0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 73 74  qlite3 *db;.  st
20700 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
20710 65 6d 20 2a 61 3b 0a 20 20 53 72 63 4c 69 73 74  em *a;.  SrcList
20720 20 2a 70 4e 65 77 53 72 63 3b 0a 20 20 50 61 72   *pNewSrc;.  Par
20730 73 65 20 2a 70 50 61 72 73 65 3b 0a 20 20 54 6f  se *pParse;.  To
20740 6b 65 6e 20 64 75 6d 6d 79 3b 0a 0a 20 20 69 66  ken dummy;..  if
20750 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  ( p->pPrior==0 )
20760 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
20770 69 6e 75 65 3b 0a 20 20 69 66 28 20 70 2d 3e 70  inue;.  if( p->p
20780 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74  OrderBy==0 ) ret
20790 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
207a0 3b 0a 20 20 66 6f 72 28 70 58 3d 70 3b 20 70 58  ;.  for(pX=p; pX
207b0 20 26 26 20 28 70 58 2d 3e 6f 70 3d 3d 54 4b 5f   && (pX->op==TK_
207c0 41 4c 4c 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54  ALL || pX->op==T
207d0 4b 5f 53 45 4c 45 43 54 29 3b 20 70 58 3d 70 58  K_SELECT); pX=pX
207e0 2d 3e 70 50 72 69 6f 72 29 7b 7d 0a 20 20 69 66  ->pPrior){}.  if
207f0 28 20 70 58 3d 3d 30 20 29 20 72 65 74 75 72 6e  ( pX==0 ) return
20800 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20   WRC_Continue;. 
20810 20 61 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79   a = p->pOrderBy
20820 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 70 2d 3e  ->a;.  for(i=p->
20830 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2d  pOrderBy->nExpr-
20840 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
20850 20 20 20 69 66 28 20 61 5b 69 5d 2e 70 45 78 70     if( a[i].pExp
20860 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f  r->flags & EP_Co
20870 6c 6c 61 74 65 20 29 20 62 72 65 61 6b 3b 0a 20  llate ) break;. 
20880 20 7d 0a 20 20 69 66 28 20 69 3c 30 20 29 20 72   }.  if( i<0 ) r
20890 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
208a0 75 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20  ue;..  /* If we 
208b0 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
208c0 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65  , that means the
208d0 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20   transformation 
208e0 69 73 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a  is required. */.
208f0 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 61 6c  .  pParse = pWal
20900 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64  ker->pParse;.  d
20910 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
20920 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
20930 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
20940 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29   sizeof(*pNew) )
20950 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
20960 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
20970 72 74 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 75  rt;.  memset(&du
20980 6d 6d 79 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64  mmy, 0, sizeof(d
20990 75 6d 6d 79 29 29 3b 0a 20 20 70 4e 65 77 53 72  ummy));.  pNewSr
209a0 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  c = sqlite3SrcLi
209b0 73 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d  stAppendFromTerm
209c0 28 70 50 61 72 73 65 2c 30 2c 30 2c 30 2c 26 64  (pParse,0,0,0,&d
209d0 75 6d 6d 79 2c 70 4e 65 77 2c 30 2c 30 29 3b 0a  ummy,pNew,0,0);.
209e0 20 20 69 66 28 20 70 4e 65 77 53 72 63 3d 3d 30    if( pNewSrc==0
209f0 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
20a00 6f 72 74 3b 0a 20 20 2a 70 4e 65 77 20 3d 20 2a  ort;.  *pNew = *
20a10 70 3b 0a 20 20 70 2d 3e 70 53 72 63 20 3d 20 70  p;.  p->pSrc = p
20a20 4e 65 77 53 72 63 3b 0a 20 20 70 2d 3e 70 45 4c  NewSrc;.  p->pEL
20a30 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
20a40 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
20a50 73 65 2c 20 30 2c 20 73 71 6c 69 74 65 33 45 78  se, 0, sqlite3Ex
20a60 70 72 28 64 62 2c 20 54 4b 5f 41 4c 4c 2c 20 30  pr(db, TK_ALL, 0
20a70 29 29 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20 54 4b  ));.  p->op = TK
20a80 5f 53 45 4c 45 43 54 3b 0a 20 20 70 2d 3e 70 57  _SELECT;.  p->pW
20a90 68 65 72 65 20 3d 20 30 3b 0a 20 20 70 4e 65 77  here = 0;.  pNew
20aa0 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 30 3b 0a  ->pGroupBy = 0;.
20ab0 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20    pNew->pHaving 
20ac0 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72  = 0;.  pNew->pOr
20ad0 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 70 2d 3e  derBy = 0;.  p->
20ae0 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70 2d  pPrior = 0;.  p-
20af0 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70 2d  >pNext = 0;.  p-
20b00 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46  >selFlags &= ~SF
20b10 5f 43 6f 6d 70 6f 75 6e 64 3b 0a 20 20 61 73 73  _Compound;.  ass
20b20 65 72 74 28 20 70 4e 65 77 2d 3e 70 50 72 69 6f  ert( pNew->pPrio
20b30 72 21 3d 30 20 29 3b 0a 20 20 70 4e 65 77 2d 3e  r!=0 );.  pNew->
20b40 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20  pPrior->pNext = 
20b50 70 4e 65 77 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c  pNew;.  pNew->pL
20b60 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77  imit = 0;.  pNew
20b70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->pOffset = 0;. 
20b80 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
20b90 69 6e 75 65 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  inue;.}..#ifndef
20ba0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45   SQLITE_OMIT_CTE
20bb0 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  ./*.** Argument 
20bc0 70 57 69 74 68 20 28 77 68 69 63 68 20 6d 61 79  pWith (which may
20bd0 20 62 65 20 4e 55 4c 4c 29 20 70 6f 69 6e 74 73   be NULL) points
20be0 20 74 6f 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73   to a linked lis
20bf0 74 20 6f 66 20 6e 65 73 74 65 64 20 0a 2a 2a 20  t of nested .** 
20c00 57 49 54 48 20 63 6f 6e 74 65 78 74 73 2c 20 66  WITH contexts, f
20c10 72 6f 6d 20 69 6e 6e 65 72 20 74 6f 20 6f 75 74  rom inner to out
20c20 65 72 6d 6f 73 74 2e 20 49 66 20 74 68 65 20 74  ermost. If the t
20c30 61 62 6c 65 20 69 64 65 6e 74 69 66 69 65 64 20  able identified 
20c40 62 79 20 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75  by .** FROM clau
20c50 73 65 20 65 6c 65 6d 65 6e 74 20 70 49 74 65 6d  se element pItem
20c60 20 69 73 20 72 65 61 6c 6c 79 20 61 20 63 6f 6d   is really a com
20c70 6d 6f 6e 2d 74 61 62 6c 65 2d 65 78 70 72 65 73  mon-table-expres
20c80 73 69 6f 6e 20 28 43 54 45 29 20 0a 2a 2a 20 74  sion (CTE) .** t
20c90 68 65 6e 20 72 65 74 75 72 6e 20 61 20 70 6f 69  hen return a poi
20ca0 6e 74 65 72 20 74 6f 20 74 68 65 20 43 54 45 20  nter to the CTE 
20cb0 64 65 66 69 6e 69 74 69 6f 6e 20 66 6f 72 20 74  definition for t
20cc0 68 61 74 20 74 61 62 6c 65 2e 20 4f 74 68 65 72  hat table. Other
20cd0 77 69 73 65 0a 2a 2a 20 72 65 74 75 72 6e 20 4e  wise.** return N
20ce0 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ULL..**.** If a 
20cf0 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69  non-NULL value i
20d00 73 20 72 65 74 75 72 6e 65 64 2c 20 73 65 74 20  s returned, set 
20d10 2a 70 70 43 6f 6e 74 65 78 74 20 74 6f 20 70 6f  *ppContext to po
20d20 69 6e 74 20 74 6f 20 74 68 65 20 57 69 74 68 0a  int to the With.
20d30 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20 74  ** object that t
20d40 68 65 20 72 65 74 75 72 6e 65 64 20 43 54 45 20  he returned CTE 
20d50 62 65 6c 6f 6e 67 73 20 74 6f 2e 0a 2a 2f 0a 73  belongs to..*/.s
20d60 74 61 74 69 63 20 73 74 72 75 63 74 20 43 74 65  tatic struct Cte
20d70 20 2a 73 65 61 72 63 68 57 69 74 68 28 0a 20 20   *searchWith(.  
20d80 57 69 74 68 20 2a 70 57 69 74 68 2c 20 20 20 20  With *pWith,    
20d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20da0 2f 2a 20 43 75 72 72 65 6e 74 20 6f 75 74 65 72  /* Current outer
20db0 6d 6f 73 74 20 57 49 54 48 20 63 6c 61 75 73 65  most WITH clause
20dc0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
20dd0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
20de0 2c 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c  ,     /* FROM cl
20df0 61 75 73 65 20 65 6c 65 6d 65 6e 74 20 74 6f 20  ause element to 
20e00 72 65 73 6f 6c 76 65 20 2a 2f 0a 20 20 57 69 74  resolve */.  Wit
20e10 68 20 2a 2a 70 70 43 6f 6e 74 65 78 74 20 20 20  h **ppContext   
20e20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20e30 4f 55 54 3a 20 57 49 54 48 20 63 6c 61 75 73 65  OUT: WITH clause
20e40 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 62 65   return value be
20e50 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 29 7b 0a 20  longs to */.){. 
20e60 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
20e70 6d 65 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 2d  me;.  if( pItem-
20e80 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30 20 26 26  >zDatabase==0 &&
20e90 20 28 7a 4e 61 6d 65 20 3d 20 70 49 74 65 6d 2d   (zName = pItem-
20ea0 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20  >zName)!=0 ){.  
20eb0 20 20 57 69 74 68 20 2a 70 3b 0a 20 20 20 20 66    With *p;.    f
20ec0 6f 72 28 70 3d 70 57 69 74 68 3b 20 70 3b 20 70  or(p=pWith; p; p
20ed0 3d 70 2d 3e 70 4f 75 74 65 72 29 7b 0a 20 20 20  =p->pOuter){.   
20ee0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
20ef0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
20f00 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  te; i++){.      
20f10 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
20f20 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 70 2d 3e 61  ICmp(zName, p->a
20f30 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  [i].zName)==0 ){
20f40 0a 20 20 20 20 20 20 20 20 20 20 2a 70 70 43 6f  .          *ppCo
20f50 6e 74 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20  ntext = p;.     
20f60 20 20 20 20 20 72 65 74 75 72 6e 20 26 70 2d 3e       return &p->
20f70 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  a[i];.        }.
20f80 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
20f90 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
20fa0 0a 2f 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e  ./* The code gen
20fb0 65 72 61 74 6f 72 20 6d 61 69 6e 74 61 69 6e 73  erator maintains
20fc0 20 61 20 73 74 61 63 6b 20 6f 66 20 61 63 74 69   a stack of acti
20fd0 76 65 20 57 49 54 48 20 63 6c 61 75 73 65 73 0a  ve WITH clauses.
20fe0 2a 2a 20 77 69 74 68 20 74 68 65 20 69 6e 6e 65  ** with the inne
20ff0 72 2d 6d 6f 73 74 20 57 49 54 48 20 63 6c 61 75  r-most WITH clau
21000 73 65 20 62 65 69 6e 67 20 61 74 20 74 68 65 20  se being at the 
21010 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b  top of the stack
21020 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
21030 74 69 6e 65 20 70 75 73 68 65 73 20 74 68 65 20  tine pushes the 
21040 57 49 54 48 20 63 6c 61 75 73 65 20 70 61 73 73  WITH clause pass
21050 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
21060 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 6f 6e 74   argument.** ont
21070 6f 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65  o the top of the
21080 20 73 74 61 63 6b 2e 20 49 66 20 61 72 67 75 6d   stack. If argum
21090 65 6e 74 20 62 46 72 65 65 20 69 73 20 74 72 75  ent bFree is tru
210a0 65 2c 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20  e, then this.** 
210b0 57 49 54 48 20 63 6c 61 75 73 65 20 77 69 6c 6c  WITH clause will
210c0 20 6e 65 76 65 72 20 62 65 20 70 6f 70 70 65 64   never be popped
210d0 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e   from the stack.
210e0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 74   In this case it
210f0 0a 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 66 72  .** should be fr
21100 65 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74  eed along with t
21110 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 2e  he Parse object.
21120 20 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73 2c   In other cases,
21130 20 77 68 65 6e 0a 2a 2a 20 62 46 72 65 65 3d 3d   when.** bFree==
21140 30 2c 20 74 68 65 20 57 69 74 68 20 6f 62 6a 65  0, the With obje
21150 63 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64  ct will be freed
21160 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20   along with the 
21170 53 45 4c 45 43 54 20 0a 2a 2a 20 73 74 61 74 65  SELECT .** state
21180 6d 65 6e 74 20 77 69 74 68 20 77 68 69 63 68 20  ment with which 
21190 69 74 20 69 73 20 61 73 73 6f 63 69 61 74 65 64  it is associated
211a0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
211b0 33 57 69 74 68 50 75 73 68 28 50 61 72 73 65 20  3WithPush(Parse 
211c0 2a 70 50 61 72 73 65 2c 20 57 69 74 68 20 2a 70  *pParse, With *p
211d0 57 69 74 68 2c 20 75 38 20 62 46 72 65 65 29 7b  With, u8 bFree){
211e0 0a 20 20 61 73 73 65 72 74 28 20 62 46 72 65 65  .  assert( bFree
211f0 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 70  ==0 || pParse->p
21200 57 69 74 68 3d 3d 30 20 29 3b 0a 20 20 69 66 28  With==0 );.  if(
21210 20 70 57 69 74 68 20 29 7b 0a 20 20 20 20 70 57   pWith ){.    pW
21220 69 74 68 2d 3e 70 4f 75 74 65 72 20 3d 20 70 50  ith->pOuter = pP
21230 61 72 73 65 2d 3e 70 57 69 74 68 3b 0a 20 20 20  arse->pWith;.   
21240 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d   pParse->pWith =
21250 20 70 57 69 74 68 3b 0a 20 20 20 20 70 50 61 72   pWith;.    pPar
21260 73 65 2d 3e 62 46 72 65 65 57 69 74 68 20 3d 20  se->bFreeWith = 
21270 62 46 72 65 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  bFree;.  }.}../*
21280 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
21290 6e 20 63 68 65 63 6b 73 20 69 66 20 61 72 67 75  n checks if argu
212a0 6d 65 6e 74 20 70 46 72 6f 6d 20 72 65 66 65 72  ment pFrom refer
212b0 73 20 74 6f 20 61 20 43 54 45 20 64 65 63 6c 61  s to a CTE decla
212c0 72 65 64 20 62 79 20 0a 2a 2a 20 61 20 57 49 54  red by .** a WIT
212d0 48 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20  H clause on the 
212e0 73 74 61 63 6b 20 63 75 72 72 65 6e 74 6c 79 20  stack currently 
212f0 6d 61 69 6e 74 61 69 6e 65 64 20 62 79 20 74 68  maintained by th
21300 65 20 70 61 72 73 65 72 2e 20 41 6e 64 2c 0a 2a  e parser. And,.*
21310 2a 20 69 66 20 63 75 72 72 65 6e 74 6c 79 20 70  * if currently p
21320 72 6f 63 65 73 73 69 6e 67 20 61 20 43 54 45 20  rocessing a CTE 
21330 65 78 70 72 65 73 73 69 6f 6e 2c 20 69 66 20 69  expression, if i
21340 74 20 69 73 20 61 20 72 65 63 75 72 73 69 76 65  t is a recursive
21350 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74 6f  .** reference to
21360 20 74 68 65 20 63 75 72 72 65 6e 74 20 43 54 45   the current CTE
21370 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46 72 6f 6d  ..**.** If pFrom
21380 20 66 61 6c 6c 73 20 69 6e 74 6f 20 65 69 74 68   falls into eith
21390 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 63 61  er of the two ca
213a0 74 65 67 6f 72 69 65 73 20 61 62 6f 76 65 2c 20  tegories above, 
213b0 70 46 72 6f 6d 2d 3e 70 54 61 62 0a 2a 2a 20 61  pFrom->pTab.** a
213c0 6e 64 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20  nd other fields 
213d0 61 72 65 20 70 6f 70 75 6c 61 74 65 64 20 61 63  are populated ac
213e0 63 6f 72 64 69 6e 67 6c 79 2e 20 54 68 65 20 63  cordingly. The c
213f0 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 63 68 65  aller should che
21400 63 6b 0a 2a 2a 20 28 70 46 72 6f 6d 2d 3e 70 54  ck.** (pFrom->pT
21410 61 62 21 3d 30 29 20 74 6f 20 64 65 74 65 72 6d  ab!=0) to determ
21420 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
21430 6f 74 20 61 20 73 75 63 63 65 73 73 66 75 6c 20  ot a successful 
21440 6d 61 74 63 68 0a 2a 2a 20 77 61 73 20 66 6f 75  match.** was fou
21450 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65  nd..**.** Whethe
21460 72 20 6f 72 20 6e 6f 74 20 61 20 6d 61 74 63 68  r or not a match
21470 20 69 73 20 66 6f 75 6e 64 2c 20 53 51 4c 49 54   is found, SQLIT
21480 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
21490 20 69 66 20 6e 6f 20 65 72 72 6f 72 0a 2a 2a 20   if no error.** 
214a0 6f 63 63 75 72 73 2e 20 49 66 20 61 6e 20 65 72  occurs. If an er
214b0 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20  ror does occur, 
214c0 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
214d0 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68   is stored in th
214e0 65 0a 2a 2a 20 70 61 72 73 65 72 20 61 6e 64 20  e.** parser and 
214f0 73 6f 6d 65 20 65 72 72 6f 72 20 63 6f 64 65 20  some error code 
21500 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
21510 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
21520 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 74  /.static int wit
21530 68 45 78 70 61 6e 64 28 0a 20 20 57 61 6c 6b 65  hExpand(.  Walke
21540 72 20 2a 70 57 61 6c 6b 65 72 2c 20 0a 20 20 73  r *pWalker, .  s
21550 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
21560 65 6d 20 2a 70 46 72 6f 6d 0a 29 7b 0a 20 20 50  em *pFrom.){.  P
21570 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
21580 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a  Walker->pParse;.
21590 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
215a0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 73 74  pParse->db;.  st
215b0 72 75 63 74 20 43 74 65 20 2a 70 43 74 65 3b 20  ruct Cte *pCte; 
215c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
215d0 20 4d 61 74 63 68 65 64 20 43 54 45 20 28 6f 72   Matched CTE (or
215e0 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 6d 61 74 63   NULL if no matc
215f0 68 29 20 2a 2f 0a 20 20 57 69 74 68 20 2a 70 57  h) */.  With *pW
21600 69 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  ith;            
21610 20 20 20 20 20 20 20 20 2f 2a 20 57 49 54 48 20          /* WITH 
21620 63 6c 61 75 73 65 20 74 68 61 74 20 70 43 74 65  clause that pCte
21630 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a   belongs to */..
21640 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
21650 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 0a 20 20 70  >pTab==0 );..  p
21660 43 74 65 20 3d 20 73 65 61 72 63 68 57 69 74 68  Cte = searchWith
21670 28 70 50 61 72 73 65 2d 3e 70 57 69 74 68 2c 20  (pParse->pWith, 
21680 70 46 72 6f 6d 2c 20 26 70 57 69 74 68 29 3b 0a  pFrom, &pWith);.
21690 20 20 69 66 28 20 70 43 74 65 20 29 7b 0a 20 20    if( pCte ){.  
216a0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
216b0 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c     ExprList *pEL
216c0 69 73 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20  ist;.    Select 
216d0 2a 70 53 65 6c 3b 0a 20 20 20 20 53 65 6c 65 63  *pSel;.    Selec
216e0 74 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 20  t *pLeft;       
216f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74           /* Left
21700 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61  -most SELECT sta
21710 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e  tement */.    in
21720 74 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 3b  t bMayRecursive;
21730 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
21740 72 75 65 20 69 66 20 63 6f 6d 70 6f 75 6e 64 20  rue if compound 
21750 6a 6f 69 6e 65 64 20 62 79 20 55 4e 49 4f 4e 20  joined by UNION 
21760 5b 41 4c 4c 5d 20 2a 2f 0a 20 20 20 20 57 69 74  [ALL] */.    Wit
21770 68 20 2a 70 53 61 76 65 64 57 69 74 68 3b 20 20  h *pSavedWith;  
21780 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
21790 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 70  itial value of p
217a0 50 61 72 73 65 2d 3e 70 57 69 74 68 20 2a 2f 0a  Parse->pWith */.
217b0 0a 20 20 20 20 2f 2a 20 49 66 20 70 43 74 65 2d  .    /* If pCte-
217c0 3e 7a 45 72 72 20 69 73 20 6e 6f 6e 2d 4e 55 4c  >zErr is non-NUL
217d0 4c 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  L at this point,
217e0 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 61 6e   then this is an
217f0 20 69 6c 6c 65 67 61 6c 0a 20 20 20 20 2a 2a 20   illegal.    ** 
21800 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65  recursive refere
21810 6e 63 65 20 74 6f 20 43 54 45 20 70 43 74 65 2e  nce to CTE pCte.
21820 20 4c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   Leave an error 
21830 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65  in pParse and re
21840 74 75 72 6e 0a 20 20 20 20 2a 2a 20 65 61 72 6c  turn.    ** earl
21850 79 2e 20 49 66 20 70 43 74 65 2d 3e 7a 45 72 72  y. If pCte->zErr
21860 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74   is NULL, then t
21870 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65 63  his is not a rec
21880 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63 65  ursive reference
21890 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73  ..    ** In this
218a0 20 63 61 73 65 2c 20 70 72 6f 63 65 65 64 2e 20   case, proceed. 
218b0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 74 65   */.    if( pCte
218c0 2d 3e 7a 45 72 72 20 29 7b 0a 20 20 20 20 20 20  ->zErr ){.      
218d0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
218e0 70 50 61 72 73 65 2c 20 70 43 74 65 2d 3e 7a 45  pParse, pCte->zE
218f0 72 72 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29  rr, pCte->zName)
21900 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
21910 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
21920 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20   }..    assert( 
21930 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29  pFrom->pTab==0 )
21940 3b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61  ;.    pFrom->pTa
21950 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74  b = pTab = sqlit
21960 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
21970 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29  b, sizeof(Table)
21980 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 3d  );.    if( pTab=
21990 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
219a0 41 62 6f 72 74 3b 0a 20 20 20 20 70 54 61 62 2d  Abort;.    pTab-
219b0 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70  >nRef = 1;.    p
219c0 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  Tab->zName = sql
219d0 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
219e0 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pCte->zName);. 
219f0 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d     pTab->iPKey =
21a00 20 2d 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6e   -1;.    pTab->n
21a10 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b  RowLogEst = 200;
21a20 20 61 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71   assert( 200==sq
21a30 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38  lite3LogEst(1048
21a40 35 37 36 29 20 29 3b 0a 20 20 20 20 70 54 61 62  576) );.    pTab
21a50 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46  ->tabFlags |= TF
21a60 5f 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20  _Ephemeral;.    
21a70 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d  pFrom->pSelect =
21a80 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
21a90 70 28 64 62 2c 20 70 43 74 65 2d 3e 70 53 65 6c  p(db, pCte->pSel
21aa0 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ect, 0);.    if(
21ab0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
21ac0 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  d ) return SQLIT
21ad0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 61 73 73  E_NOMEM;.    ass
21ae0 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  ert( pFrom->pSel
21af0 65 63 74 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  ect );..    /* C
21b00 68 65 63 6b 20 69 66 20 74 68 69 73 20 69 73 20  heck if this is 
21b10 61 20 72 65 63 75 72 73 69 76 65 20 43 54 45 2e  a recursive CTE.
21b20 20 2a 2f 0a 20 20 20 20 70 53 65 6c 20 3d 20 70   */.    pSel = p
21b30 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  From->pSelect;. 
21b40 20 20 20 62 4d 61 79 52 65 63 75 72 73 69 76 65     bMayRecursive
21b50 20 3d 20 28 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54   = ( pSel->op==T
21b60 4b 5f 41 4c 4c 20 7c 7c 20 70 53 65 6c 2d 3e 6f  K_ALL || pSel->o
21b70 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20  p==TK_UNION );. 
21b80 20 20 20 69 66 28 20 62 4d 61 79 52 65 63 75 72     if( bMayRecur
21b90 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 69 6e  sive ){.      in
21ba0 74 20 69 3b 0a 20 20 20 20 20 20 53 72 63 4c 69  t i;.      SrcLi
21bb0 73 74 20 2a 70 53 72 63 20 3d 20 70 46 72 6f 6d  st *pSrc = pFrom
21bc0 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b  ->pSelect->pSrc;
21bd0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
21be0 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b  i<pSrc->nSrc; i+
21bf0 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75  +){.        stru
21c00 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
21c10 2a 70 49 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e  *pItem = &pSrc->
21c20 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  a[i];.        if
21c30 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  ( pItem->zDataba
21c40 73 65 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20  se==0 .         
21c50 26 26 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 21  && pItem->zName!
21c60 3d 30 20 0a 20 20 20 20 20 20 20 20 20 26 26 20  =0 .         && 
21c70 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d  0==sqlite3StrICm
21c80 70 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20  p(pItem->zName, 
21c90 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 0a 20 20 20  pCte->zName).   
21ca0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
21cb0 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 20      pItem->pTab 
21cc0 3d 20 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  = pTab;.        
21cd0 20 20 70 49 74 65 6d 2d 3e 69 73 52 65 63 75 72    pItem->isRecur
21ce0 73 69 76 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  sive = 1;.      
21cf0 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b      pTab->nRef++
21d00 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 65 6c  ;.          pSel
21d10 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
21d20 5f 52 65 63 75 72 73 69 76 65 3b 0a 20 20 20 20  _Recursive;.    
21d30 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
21d40 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79    }..    /* Only
21d50 20 6f 6e 65 20 72 65 63 75 72 73 69 76 65 20 72   one recursive r
21d60 65 66 65 72 65 6e 63 65 20 69 73 20 70 65 72 6d  eference is perm
21d70 69 74 74 65 64 2e 20 2a 2f 20 0a 20 20 20 20 69  itted. */ .    i
21d80 66 28 20 70 54 61 62 2d 3e 6e 52 65 66 3e 32 20  f( pTab->nRef>2 
21d90 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
21da0 45 72 72 6f 72 4d 73 67 28 0a 20 20 20 20 20 20  ErrorMsg(.      
21db0 20 20 20 20 70 50 61 72 73 65 2c 20 22 6d 75 6c      pParse, "mul
21dc0 74 69 70 6c 65 20 72 65 66 65 72 65 6e 63 65 73  tiple references
21dd0 20 74 6f 20 72 65 63 75 72 73 69 76 65 20 74 61   to recursive ta
21de0 62 6c 65 3a 20 25 73 22 2c 20 70 43 74 65 2d 3e  ble: %s", pCte->
21df0 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20  zName.      );. 
21e00 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
21e10 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  TE_ERROR;.    }.
21e20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
21e30 2d 3e 6e 52 65 66 3d 3d 31 20 7c 7c 20 28 28 70  ->nRef==1 || ((p
21e40 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 26 53 46  Sel->selFlags&SF
21e50 5f 52 65 63 75 72 73 69 76 65 29 20 26 26 20 70  _Recursive) && p
21e60 54 61 62 2d 3e 6e 52 65 66 3d 3d 32 20 29 29 3b  Tab->nRef==2 ));
21e70 0a 0a 20 20 20 20 70 43 74 65 2d 3e 7a 45 72 72  ..    pCte->zErr
21e80 20 3d 20 22 63 69 72 63 75 6c 61 72 20 72 65 66   = "circular ref
21e90 65 72 65 6e 63 65 3a 20 25 73 22 3b 0a 20 20 20  erence: %s";.   
21ea0 20 70 53 61 76 65 64 57 69 74 68 20 3d 20 70 50   pSavedWith = pP
21eb0 61 72 73 65 2d 3e 70 57 69 74 68 3b 0a 20 20 20  arse->pWith;.   
21ec0 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d   pParse->pWith =
21ed0 20 70 57 69 74 68 3b 0a 20 20 20 20 73 71 6c 69   pWith;.    sqli
21ee0 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57  te3WalkSelect(pW
21ef0 61 6c 6b 65 72 2c 20 62 4d 61 79 52 65 63 75 72  alker, bMayRecur
21f00 73 69 76 65 20 3f 20 70 53 65 6c 2d 3e 70 50 72  sive ? pSel->pPr
21f10 69 6f 72 20 3a 20 70 53 65 6c 29 3b 0a 0a 20 20  ior : pSel);..  
21f20 20 20 66 6f 72 28 70 4c 65 66 74 3d 70 53 65 6c    for(pLeft=pSel
21f30 3b 20 70 4c 65 66 74 2d 3e 70 50 72 69 6f 72 3b  ; pLeft->pPrior;
21f40 20 70 4c 65 66 74 3d 70 4c 65 66 74 2d 3e 70 50   pLeft=pLeft->pP
21f50 72 69 6f 72 29 3b 0a 20 20 20 20 70 45 4c 69 73  rior);.    pELis
21f60 74 20 3d 20 70 4c 65 66 74 2d 3e 70 45 4c 69 73  t = pLeft->pELis
21f70 74 3b 0a 20 20 20 20 69 66 28 20 70 43 74 65 2d  t;.    if( pCte-
21f80 3e 70 43 6f 6c 73 20 29 7b 0a 20 20 20 20 20 20  >pCols ){.      
21f90 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  if( pEList->nExp
21fa0 72 21 3d 70 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e  r!=pCte->pCols->
21fb0 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  nExpr ){.       
21fc0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
21fd0 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
21fe0 25 73 20 68 61 73 20 25 64 20 76 61 6c 75 65 73  %s has %d values
21ff0 20 66 6f 72 20 25 64 20 63 6f 6c 75 6d 6e 73 22   for %d columns"
22000 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  ,.            pC
22010 74 65 2d 3e 7a 4e 61 6d 65 2c 20 70 45 4c 69 73  te->zName, pELis
22020 74 2d 3e 6e 45 78 70 72 2c 20 70 43 74 65 2d 3e  t->nExpr, pCte->
22030 70 43 6f 6c 73 2d 3e 6e 45 78 70 72 0a 20 20 20  pCols->nExpr.   
22040 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
22050 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20  pParse->pWith = 
22060 70 53 61 76 65 64 57 69 74 68 3b 0a 20 20 20 20  pSavedWith;.    
22070 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
22080 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
22090 0a 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20  .      pEList = 
220a0 70 43 74 65 2d 3e 70 43 6f 6c 73 3b 0a 20 20 20  pCte->pCols;.   
220b0 20 7d 0a 0a 20 20 20 20 73 65 6c 65 63 74 43 6f   }..    selectCo
220c0 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73  lumnsFromExprLis
220d0 74 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74  t(pParse, pEList
220e0 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26  , &pTab->nCol, &
220f0 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20  pTab->aCol);.   
22100 20 69 66 28 20 62 4d 61 79 52 65 63 75 72 73 69   if( bMayRecursi
22110 76 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ve ){.      if( 
22120 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSel->selFlags &
22130 20 53 46 5f 52 65 63 75 72 73 69 76 65 20 29 7b   SF_Recursive ){
22140 0a 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a  .        pCte->z
22150 45 72 72 20 3d 20 22 6d 75 6c 74 69 70 6c 65 20  Err = "multiple 
22160 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65  recursive refere
22170 6e 63 65 73 3a 20 25 73 22 3b 0a 20 20 20 20 20  nces: %s";.     
22180 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
22190 70 43 74 65 2d 3e 7a 45 72 72 20 3d 20 22 72 65  pCte->zErr = "re
221a0 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63  cursive referenc
221b0 65 20 69 6e 20 61 20 73 75 62 71 75 65 72 79 3a  e in a subquery:
221c0 20 25 73 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20   %s";.      }.  
221d0 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53      sqlite3WalkS
221e0 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70  elect(pWalker, p
221f0 53 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Sel);.    }.    
22200 70 43 74 65 2d 3e 7a 45 72 72 20 3d 20 30 3b 0a  pCte->zErr = 0;.
22210 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74      pParse->pWit
22220 68 20 3d 20 70 53 61 76 65 64 57 69 74 68 3b 0a  h = pSavedWith;.
22230 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
22240 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
22250 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
22260 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a  E_OMIT_CTE./*.**
22270 20 49 66 20 74 68 65 20 53 45 4c 45 43 54 20 70   If the SELECT p
22280 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
22290 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 68 61 73  ond argument has
222a0 20 61 6e 20 61 73 73 6f 63 69 61 74 65 64 20 57   an associated W
222b0 49 54 48 20 0a 2a 2a 20 63 6c 61 75 73 65 2c 20  ITH .** clause, 
222c0 70 6f 70 20 69 74 20 66 72 6f 6d 20 74 68 65 20  pop it from the 
222d0 73 74 61 63 6b 20 73 74 6f 72 65 64 20 61 73 20  stack stored as 
222e0 70 61 72 74 20 6f 66 20 74 68 65 20 50 61 72 73  part of the Pars
222f0 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20  e object..**.** 
22300 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
22310 20 75 73 65 64 20 61 73 20 74 68 65 20 78 53 65   used as the xSe
22320 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 28 29 20  lectCallback2() 
22330 63 61 6c 6c 62 61 63 6b 20 62 79 0a 2a 2a 20 73  callback by.** s
22340 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61  qlite3SelectExpa
22350 6e 64 28 29 20 77 68 65 6e 20 77 61 6c 6b 69 6e  nd() when walkin
22360 67 20 61 20 53 45 4c 45 43 54 20 74 72 65 65 20  g a SELECT tree 
22370 74 6f 20 72 65 73 6f 6c 76 65 20 74 61 62 6c 65  to resolve table
22380 0a 2a 2a 20 6e 61 6d 65 73 20 61 6e 64 20 6f 74  .** names and ot
22390 68 65 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  her FROM clause 
223a0 65 6c 65 6d 65 6e 74 73 2e 20 0a 2a 2f 0a 73 74  elements. .*/.st
223b0 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74  atic void select
223c0 50 6f 70 57 69 74 68 28 57 61 6c 6b 65 72 20 2a  PopWith(Walker *
223d0 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20  pWalker, Select 
223e0 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  *p){.  Parse *pP
223f0 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  arse = pWalker->
22400 70 50 61 72 73 65 3b 0a 20 20 57 69 74 68 20 2a  pParse;.  With *
22410 70 57 69 74 68 20 3d 20 66 69 6e 64 52 69 67 68  pWith = findRigh
22420 74 6d 6f 73 74 28 70 29 2d 3e 70 57 69 74 68 3b  tmost(p)->pWith;
22430 0a 20 20 69 66 28 20 70 57 69 74 68 21 3d 30 20  .  if( pWith!=0 
22440 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
22450 50 61 72 73 65 2d 3e 70 57 69 74 68 3d 3d 70 57  Parse->pWith==pW
22460 69 74 68 20 29 3b 0a 20 20 20 20 70 50 61 72 73  ith );.    pPars
22470 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68  e->pWith = pWith
22480 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 7d 0a 7d 0a  ->pOuter;.  }.}.
22490 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 73 65  #else.#define se
224a0 6c 65 63 74 50 6f 70 57 69 74 68 20 30 0a 23 65  lectPopWith 0.#e
224b0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
224c0 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 57 61   routine is a Wa
224d0 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20 66 6f  lker callback fo
224e0 72 20 22 65 78 70 61 6e 64 69 6e 67 22 20 61 20  r "expanding" a 
224f0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
22500 2e 0a 2a 2a 20 22 45 78 70 61 6e 64 69 6e 67 22  ..** "Expanding"
22510 20 6d 65 61 6e 73 20 74 6f 20 64 6f 20 74 68 65   means to do the
22520 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
22530 2a 20 20 20 20 28 31 29 20 20 4d 61 6b 65 20 73  *    (1)  Make s
22540 75 72 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  ure VDBE cursor 
22550 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62 65 65  numbers have bee
22560 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65 76  n assigned to ev
22570 65 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 65  ery.**         e
22580 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 46 52  lement of the FR
22590 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  OM clause..**.**
225a0 20 20 20 20 28 32 29 20 20 46 69 6c 6c 20 69 6e      (2)  Fill in
225b0 20 74 68 65 20 70 54 61 62 4c 69 73 74 2d 3e 61   the pTabList->a
225c0 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64 73 20 69  [].pTab fields i
225d0 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20 74 68  n the SrcList th
225e0 61 74 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 64  at .**         d
225f0 65 66 69 6e 65 73 20 46 52 4f 4d 20 63 6c 61 75  efines FROM clau
22600 73 65 2e 20 20 57 68 65 6e 20 76 69 65 77 73 20  se.  When views 
22610 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 46 52  appear in the FR
22620 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a 2a 20 20 20  OM clause,.**   
22630 20 20 20 20 20 20 66 69 6c 6c 20 70 54 61 62 4c        fill pTabL
22640 69 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74  ist->a[].pSelect
22650 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20   with a copy of 
22660 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
22670 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  ment.**         
22680 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  that implements 
22690 74 68 65 20 76 69 65 77 2e 20 20 41 20 63 6f 70  the view.  A cop
226a0 79 20 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65  y is made of the
226b0 20 76 69 65 77 27 73 20 53 45 4c 45 43 54 0a 2a   view's SELECT.*
226c0 2a 20 20 20 20 20 20 20 20 20 73 74 61 74 65 6d  *         statem
226d0 65 6e 74 20 73 6f 20 74 68 61 74 20 77 65 20 63  ent so that we c
226e0 61 6e 20 66 72 65 65 6c 79 20 6d 6f 64 69 66 79  an freely modify
226f0 20 6f 72 20 64 65 6c 65 74 65 20 74 68 61 74 20   or delete that 
22700 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20  statement.**    
22710 20 20 20 20 20 77 69 74 68 6f 75 74 20 77 6f 72       without wor
22720 72 79 69 6e 67 20 61 62 6f 75 74 20 6d 65 73 73  rying about mess
22730 69 6e 67 20 75 70 20 74 68 65 20 70 72 65 73 69  ing up the presi
22740 73 74 65 6e 74 20 72 65 70 72 65 73 65 6e 74 61  stent representa
22750 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20  tion.**         
22760 6f 66 20 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a  of the view..**.
22770 2a 2a 20 20 20 20 28 33 29 20 20 41 64 64 20 74  **    (3)  Add t
22780 65 72 6d 73 20 74 6f 20 74 68 65 20 57 48 45 52  erms to the WHER
22790 45 20 63 6c 61 75 73 65 20 74 6f 20 61 63 63 6f  E clause to acco
227a0 6d 6f 64 61 74 65 20 74 68 65 20 4e 41 54 55 52  modate the NATUR
227b0 41 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a 20 20 20  AL keyword.**   
227c0 20 20 20 20 20 20 6f 6e 20 6a 6f 69 6e 73 20 61        on joins a
227d0 6e 64 20 74 68 65 20 4f 4e 20 61 6e 64 20 55 53  nd the ON and US
227e0 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 6a 6f  ING clause of jo
227f0 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34  ins..**.**    (4
22800 29 20 20 53 63 61 6e 20 74 68 65 20 6c 69 73 74  )  Scan the list
22810 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
22820 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 28 70  he result set (p
22830 45 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a  EList) looking.*
22840 2a 20 20 20 20 20 20 20 20 20 66 6f 72 20 69 6e  *         for in
22850 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20 22  stances of the "
22860 2a 22 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 74  *" operator or t
22870 68 65 20 54 41 42 4c 45 2e 2a 20 6f 70 65 72 61  he TABLE.* opera
22880 74 6f 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20  tor..**         
22890 49 66 20 66 6f 75 6e 64 2c 20 65 78 70 61 6e 64  If found, expand
228a0 20 65 61 63 68 20 22 2a 22 20 74 6f 20 62 65 20   each "*" to be 
228b0 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20  every column in 
228c0 65 76 65 72 79 20 74 61 62 6c 65 0a 2a 2a 20 20  every table.**  
228d0 20 20 20 20 20 20 20 61 6e 64 20 54 41 42 4c 45         and TABLE
228e0 2e 2a 20 74 6f 20 62 65 20 65 76 65 72 79 20 63  .* to be every c
228f0 6f 6c 75 6d 6e 20 69 6e 20 54 41 42 4c 45 2e 0a  olumn in TABLE..
22900 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  **.*/.static int
22910 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72 28   selectExpander(
22920 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
22930 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50   Select *p){.  P
22940 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
22950 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a  Walker->pParse;.
22960 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20    int i, j, k;. 
22970 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
22980 73 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  st;.  ExprList *
22990 70 45 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74  pEList;.  struct
229a0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
229b0 46 72 6f 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20  From;.  sqlite3 
229c0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
229d0 3b 0a 20 20 45 78 70 72 20 2a 70 45 2c 20 2a 70  ;.  Expr *pE, *p
229e0 52 69 67 68 74 2c 20 2a 70 45 78 70 72 3b 0a 20  Right, *pExpr;. 
229f0 20 75 31 36 20 73 65 6c 46 6c 61 67 73 20 3d 20   u16 selFlags = 
22a00 70 2d 3e 73 65 6c 46 6c 61 67 73 3b 0a 0a 20 20  p->selFlags;..  
22a10 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  p->selFlags |= S
22a20 46 5f 45 78 70 61 6e 64 65 64 3b 0a 20 20 69 66  F_Expanded;.  if
22a30 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
22a40 65 64 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ed  ){.    retur
22a50 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d  n WRC_Abort;.  }
22a60 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e  .  if( NEVER(p->
22a70 70 53 72 63 3d 3d 30 29 20 7c 7c 20 28 73 65 6c  pSrc==0) || (sel
22a80 46 6c 61 67 73 20 26 20 53 46 5f 45 78 70 61 6e  Flags & SF_Expan
22a90 64 65 64 29 21 3d 30 20 29 7b 0a 20 20 20 20 72  ded)!=0 ){.    r
22aa0 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
22ab0 0a 20 20 7d 0a 20 20 70 54 61 62 4c 69 73 74 20  .  }.  pTabList 
22ac0 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c  = p->pSrc;.  pEL
22ad0 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
22ae0 0a 20 20 73 71 6c 69 74 65 33 57 69 74 68 50 75  .  sqlite3WithPu
22af0 73 68 28 70 50 61 72 73 65 2c 20 66 69 6e 64 52  sh(pParse, findR
22b00 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e 70 57 69  ightmost(p)->pWi
22b10 74 68 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 4d 61  th, 0);..  /* Ma
22b20 6b 65 20 73 75 72 65 20 63 75 72 73 6f 72 20 6e  ke sure cursor n
22b30 75 6d 62 65 72 73 20 68 61 76 65 20 62 65 65 6e  umbers have been
22b40 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c   assigned to all
22b50 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a 2a   entries in.  **
22b60 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
22b70 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73   of the SELECT s
22b80 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20  tatement..  */. 
22b90 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
22ba0 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61  ssignCursors(pPa
22bb0 72 73 65 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a  rse, pTabList);.
22bc0 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76  .  /* Look up ev
22bd0 65 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 64 20  ery table named 
22be0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
22bf0 73 65 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  se of the select
22c00 2e 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e  .  If.  ** an en
22c10 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  try of the FROM 
22c20 63 6c 61 75 73 65 20 69 73 20 61 20 73 75 62 71  clause is a subq
22c30 75 65 72 79 20 69 6e 73 74 65 61 64 20 6f 66 20  uery instead of 
22c40 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2c  a table or view,
22c50 0a 20 20 2a 2a 20 74 68 65 6e 20 63 72 65 61 74  .  ** then creat
22c60 65 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61  e a transient ta
22c70 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 6f  ble structure to
22c80 20 64 65 73 63 72 69 62 65 20 74 68 65 20 73 75   describe the su
22c90 62 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66  bquery..  */.  f
22ca0 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54  or(i=0, pFrom=pT
22cb0 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61  abList->a; i<pTa
22cc0 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
22cd0 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20  , pFrom++){.    
22ce0 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
22cf0 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
22d00 69 73 52 65 63 75 72 73 69 76 65 3d 3d 30 20 7c  isRecursive==0 |
22d10 7c 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 29 3b  | pFrom->pTab );
22d20 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  .    if( pFrom->
22d30 69 73 52 65 63 75 72 73 69 76 65 20 29 20 63 6f  isRecursive ) co
22d40 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
22d50 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 20 29  pFrom->pTab!=0 )
22d60 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
22d70 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 61 6c  statement has al
22d80 72 65 61 64 79 20 62 65 65 6e 20 70 72 65 70 61  ready been prepa
22d90 72 65 64 2e 20 20 54 68 65 72 65 20 69 73 20 6e  red.  There is n
22da0 6f 20 6e 65 65 64 0a 20 20 20 20 20 20 2a 2a 20  o need.      ** 
22db0 74 6f 20 67 6f 20 66 75 72 74 68 65 72 2e 20 2a  to go further. *
22dc0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
22dd0 69 3d 3d 30 20 29 3b 0a 23 69 66 6e 64 65 66 20  i==0 );.#ifndef 
22de0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
22df0 20 20 20 20 20 20 73 65 6c 65 63 74 50 6f 70 57        selectPopW
22e00 69 74 68 28 70 57 61 6c 6b 65 72 2c 20 70 29 3b  ith(pWalker, p);
22e10 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 65  .#endif.      re
22e20 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a  turn WRC_Prune;.
22e30 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
22e40 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20  LITE_OMIT_CTE.  
22e50 20 20 69 66 28 20 77 69 74 68 45 78 70 61 6e 64    if( withExpand
22e60 28 70 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 29  (pWalker, pFrom)
22e70 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
22e80 6f 72 74 3b 0a 20 20 20 20 69 66 28 20 70 46 72  ort;.    if( pFr
22e90 6f 6d 2d 3e 70 54 61 62 20 29 20 7b 7d 20 65 6c  om->pTab ) {} el
22ea0 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66  se.#endif.    if
22eb0 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d  ( pFrom->zName==
22ec0 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  0 ){.#ifndef SQL
22ed0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
22ee0 59 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  Y.      Select *
22ef0 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53  pSel = pFrom->pS
22f00 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 2f 2a 20  elect;.      /* 
22f10 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74  A sub-query in t
22f20 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
22f30 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  f a SELECT */.  
22f40 20 20 20 20 61 73 73 65 72 74 28 20 70 53 65 6c      assert( pSel
22f50 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
22f60 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ert( pFrom->pTab
22f70 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
22f80 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70  ite3WalkSelect(p
22f90 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b 0a 20  Walker, pSel);. 
22fa0 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62       pFrom->pTab
22fb0 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65   = pTab = sqlite
22fc0 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
22fd0 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29  , sizeof(Table))
22fe0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ;.      if( pTab
22ff0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
23000 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 70 54  _Abort;.      pT
23010 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  ab->nRef = 1;.  
23020 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20      pTab->zName 
23030 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
23040 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 73 71 5f  (db, "sqlite_sq_
23050 25 70 22 2c 20 28 76 6f 69 64 2a 29 70 54 61 62  %p", (void*)pTab
23060 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  );.      while( 
23070 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29 7b 20  pSel->pPrior ){ 
23080 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72  pSel = pSel->pPr
23090 69 6f 72 3b 20 7d 0a 20 20 20 20 20 20 73 65 6c  ior; }.      sel
230a0 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78  ectColumnsFromEx
230b0 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
230c0 53 65 6c 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54  Sel->pEList, &pT
230d0 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d  ab->nCol, &pTab-
230e0 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 20 20 70 54  >aCol);.      pT
230f0 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a  ab->iPKey = -1;.
23100 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77        pTab->nRow
23110 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73  LogEst = 200; as
23120 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74  sert( 200==sqlit
23130 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36  e3LogEst(1048576
23140 29 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d  ) );.      pTab-
23150 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f  >tabFlags |= TF_
23160 45 70 68 65 6d 65 72 61 6c 3b 0a 23 65 6e 64 69  Ephemeral;.#endi
23170 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f.    }else{.   
23180 20 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72     /* An ordinar
23190 79 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  y table or view 
231a0 6e 61 6d 65 20 69 6e 20 74 68 65 20 46 52 4f 4d  name in the FROM
231b0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
231c0 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
231d0 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20  pTab==0 );.     
231e0 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70   pFrom->pTab = p
231f0 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63  Tab = sqlite3Loc
23200 61 74 65 54 61 62 6c 65 49 74 65 6d 28 70 50 61  ateTableItem(pPa
23210 72 73 65 2c 20 30 2c 20 70 46 72 6f 6d 29 3b 0a  rse, 0, pFrom);.
23220 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d        if( pTab==
23230 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41  0 ) return WRC_A
23240 62 6f 72 74 3b 0a 20 20 20 20 20 20 69 66 28 20  bort;.      if( 
23250 70 54 61 62 2d 3e 6e 52 65 66 3d 3d 30 78 66 66  pTab->nRef==0xff
23260 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ff ){.        sq
23270 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
23280 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  arse, "too many 
23290 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 5c 22  references to \"
232a0 25 73 5c 22 3a 20 6d 61 78 20 36 35 35 33 35 22  %s\": max 65535"
232b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 61  ,.           pTa
232c0 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b->zName);.     
232d0 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d     pFrom->pTab =
232e0 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   0;.        retu
232f0 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
23300 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 61 62      }.      pTab
23310 2d 3e 6e 52 65 66 2b 2b 3b 0a 23 69 66 20 21 64  ->nRef++;.#if !d
23320 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
23330 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66  IT_VIEW) || !def
23340 69 6e 65 64 20 28 53 51 4c 49 54 45 5f 4f 4d 49  ined (SQLITE_OMI
23350 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a  T_VIRTUALTABLE).
23360 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e        if( pTab->
23370 70 53 65 6c 65 63 74 20 7c 7c 20 49 73 56 69 72  pSelect || IsVir
23380 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20  tual(pTab) ){.  
23390 20 20 20 20 20 20 2f 2a 20 57 65 20 72 65 61 63        /* We reac
233a0 68 20 68 65 72 65 20 69 66 20 74 68 65 20 6e 61  h here if the na
233b0 6d 65 64 20 74 61 62 6c 65 20 69 73 20 61 20 72  med table is a r
233c0 65 61 6c 6c 79 20 61 20 76 69 65 77 20 2a 2f 0a  eally a view */.
233d0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
233e0 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e  te3ViewGetColumn
233f0 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54  Names(pParse, pT
23400 61 62 29 20 29 20 72 65 74 75 72 6e 20 57 52 43  ab) ) return WRC
23410 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 20 20  _Abort;.        
23420 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
23430 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a 20 20 20  Select==0 );.   
23440 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c       pFrom->pSel
23450 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
23460 65 63 74 44 75 70 28 64 62 2c 20 70 54 61 62 2d  ectDup(db, pTab-
23470 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20  >pSelect, 0);.  
23480 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c        sqlite3Wal
23490 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c  kSelect(pWalker,
234a0 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29   pFrom->pSelect)
234b0 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
234c0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c  .    }..    /* L
234d0 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78 20  ocate the index 
234e0 6e 61 6d 65 64 20 62 79 20 74 68 65 20 49 4e 44  named by the IND
234f0 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20  EXED BY clause, 
23500 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 69  if any. */.    i
23510 66 28 20 73 71 6c 69 74 65 33 49 6e 64 65 78 65  f( sqlite3Indexe
23520 64 42 79 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65  dByLookup(pParse
23530 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20  , pFrom) ){.    
23540 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
23550 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  rt;.    }.  }.. 
23560 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41 54 55   /* Process NATU
23570 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e  RAL keywords, an
23580 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  d ON and USING c
23590 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e  lauses of joins.
235a0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
235b0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
235c0 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69  sqliteProcessJoi
235d0 6e 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b 0a  n(pParse, p) ){.
235e0 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
235f0 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  bort;.  }..  /* 
23600 46 6f 72 20 65 76 65 72 79 20 22 2a 22 20 74 68  For every "*" th
23610 61 74 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65  at occurs in the
23620 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e   column list, in
23630 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 20 6f  sert the names o
23640 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d  f.  ** all colum
23650 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73  ns in all tables
23660 2e 20 20 41 6e 64 20 66 6f 72 20 65 76 65 72 79  .  And for every
23670 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20   TABLE.* insert 
23680 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f  the names.  ** o
23690 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e  f all columns in
236a0 20 54 41 42 4c 45 2e 20 20 54 68 65 20 70 61 72   TABLE.  The par
236b0 73 65 72 20 69 6e 73 65 72 74 65 64 20 61 20 73  ser inserted a s
236c0 70 65 63 69 61 6c 20 65 78 70 72 65 73 73 69 6f  pecial expressio
236d0 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20  n.  ** with the 
236e0 54 4b 5f 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20  TK_ALL operator 
236f0 66 6f 72 20 65 61 63 68 20 22 2a 22 20 74 68 61  for each "*" tha
23700 74 20 69 74 20 66 6f 75 6e 64 20 69 6e 20 74 68  t it found in th
23710 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a 20  e column list.. 
23720 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** The followin
23730 67 20 63 6f 64 65 20 6a 75 73 74 20 68 61 73 20  g code just has 
23740 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 54 4b  to locate the TK
23750 5f 41 4c 4c 20 65 78 70 72 65 73 73 69 6f 6e 73  _ALL expressions
23760 20 61 6e 64 20 65 78 70 61 6e 64 0a 20 20 2a 2a   and expand.  **
23770 20 65 61 63 68 20 6f 6e 65 20 74 6f 20 74 68 65   each one to the
23780 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c   list of all col
23790 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c  umns in all tabl
237a0 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  es..  **.  ** Th
237b0 65 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73  e first loop jus
237c0 74 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20  t checks to see 
237d0 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  if there are any
237e0 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a 20   "*" operators. 
237f0 20 2a 2a 20 74 68 61 74 20 6e 65 65 64 20 65 78   ** that need ex
23800 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20  panding..  */.  
23810 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73  for(k=0; k<pELis
23820 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a  t->nExpr; k++){.
23830 20 20 20 20 70 45 20 3d 20 70 45 4c 69 73 74 2d      pE = pEList-
23840 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[k].pExpr;.   
23850 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
23860 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ALL ) break;.   
23870 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21   assert( pE->op!
23880 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70  =TK_DOT || pE->p
23890 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20 20  Right!=0 );.    
238a0 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d  assert( pE->op!=
238b0 54 4b 5f 44 4f 54 20 7c 7c 20 28 70 45 2d 3e 70  TK_DOT || (pE->p
238c0 4c 65 66 74 21 3d 30 20 26 26 20 70 45 2d 3e 70  Left!=0 && pE->p
238d0 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 29  Left->op==TK_ID)
238e0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e   );.    if( pE->
238f0 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45  op==TK_DOT && pE
23900 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b  ->pRight->op==TK
23910 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20  _ALL ) break;.  
23920 7d 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69 73 74  }.  if( k<pEList
23930 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 2f  ->nExpr ){.    /
23940 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77 65 20 67  *.    ** If we g
23950 65 74 20 68 65 72 65 20 69 74 20 6d 65 61 6e 73  et here it means
23960 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
23970 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20  contains one or 
23980 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a 20  more "*".    ** 
23990 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 6e  operators that n
239a0 65 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64  eed to be expand
239b0 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75 67  ed.  Loop throug
239c0 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f  h each expressio
239d0 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20  n.    ** in the 
239e0 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20 65  result set and e
239f0 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20 62  xpand them one b
23a00 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  y one..    */.  
23a10 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
23a20 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c 69  t_item *a = pELi
23a30 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72 4c  st->a;.    ExprL
23a40 69 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20  ist *pNew = 0;. 
23a50 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70     int flags = p
23a60 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Parse->db->flags
23a70 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 6e 67 4e 61  ;.    int longNa
23a80 6d 65 73 20 3d 20 28 66 6c 61 67 73 20 26 20 53  mes = (flags & S
23a90 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d  QLITE_FullColNam
23aa0 65 73 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  es)!=0.         
23ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
23ac0 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
23ad0 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 3d 3d  ShortColNames)==
23ae0 30 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20  0;..    /* When 
23af0 70 72 6f 63 65 73 73 69 6e 67 20 46 52 4f 4d 2d  processing FROM-
23b00 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 69 65  clause subquerie
23b10 73 2c 20 69 74 20 69 73 20 61 6c 77 61 79 73 20  s, it is always 
23b20 74 68 65 20 63 61 73 65 0a 20 20 20 20 2a 2a 20  the case.    ** 
23b30 74 68 61 74 20 66 75 6c 6c 5f 63 6f 6c 75 6d 6e  that full_column
23b40 5f 6e 61 6d 65 73 3d 4f 46 46 20 61 6e 64 20 73  _names=OFF and s
23b50 68 6f 72 74 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65  hort_column_name
23b60 73 3d 4f 4e 2e 20 20 54 68 65 0a 20 20 20 20 2a  s=ON.  The.    *
23b70 2a 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53  * sqlite3ResultS
23b80 65 74 4f 66 53 65 6c 65 63 74 28 29 20 72 6f 75  etOfSelect() rou
23b90 74 69 6e 65 20 6d 61 6b 65 73 20 69 74 20 73 6f  tine makes it so
23ba0 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
23bb0 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
23bc0 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29 3d 3d  SF_NestedFrom)==
23bd0 30 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28  0.          || (
23be0 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
23bf0 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30  FullColNames)==0
23c00 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
23c10 20 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54    (flags & SQLIT
23c20 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29  E_ShortColNames)
23c30 21 3d 30 29 20 29 3b 0a 0a 20 20 20 20 66 6f 72  !=0) );..    for
23c40 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e  (k=0; k<pEList->
23c50 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20  nExpr; k++){.   
23c60 20 20 20 70 45 20 3d 20 61 5b 6b 5d 2e 70 45 78     pE = a[k].pEx
23c70 70 72 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74  pr;.      pRight
23c80 20 3d 20 70 45 2d 3e 70 52 69 67 68 74 3b 0a 20   = pE->pRight;. 
23c90 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d       assert( pE-
23ca0 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70  >op!=TK_DOT || p
23cb0 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20 20  Right!=0 );.    
23cc0 20 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d 54 4b    if( pE->op!=TK
23cd0 5f 41 4c 4c 20 26 26 20 28 70 45 2d 3e 6f 70 21  _ALL && (pE->op!
23ce0 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67 68  =TK_DOT || pRigh
23cf0 74 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 29  t->op!=TK_ALL) )
23d00 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
23d10 73 20 70 61 72 74 69 63 75 6c 61 72 20 65 78 70  s particular exp
23d20 72 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  ression does not
23d30 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70 61   need to be expa
23d40 6e 64 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f  nded..        */
23d50 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20  .        pNew = 
23d60 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
23d70 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e  ppend(pParse, pN
23d80 65 77 2c 20 61 5b 6b 5d 2e 70 45 78 70 72 29 3b  ew, a[k].pExpr);
23d90 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65  .        if( pNe
23da0 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  w ){.          p
23db0 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78  New->a[pNew->nEx
23dc0 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b  pr-1].zName = a[
23dd0 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  k].zName;.      
23de0 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77      pNew->a[pNew
23df0 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 53 70 61 6e  ->nExpr-1].zSpan
23e00 20 3d 20 61 5b 6b 5d 2e 7a 53 70 61 6e 3b 0a 20   = a[k].zSpan;. 
23e10 20 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e           a[k].zN
23e20 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ame = 0;.       
23e30 20 20 20 61 5b 6b 5d 2e 7a 53 70 61 6e 20 3d 20     a[k].zSpan = 
23e40 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
23e50 20 20 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72 20       a[k].pExpr 
23e60 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
23e70 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
23e80 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  s expression is 
23e90 61 20 22 2a 22 20 6f 72 20 61 20 22 54 41 42 4c  a "*" or a "TABL
23ea0 45 2e 2a 22 20 61 6e 64 20 6e 65 65 64 73 20 74  E.*" and needs t
23eb0 6f 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  o be.        ** 
23ec0 65 78 70 61 6e 64 65 64 2e 20 2a 2f 0a 20 20 20  expanded. */.   
23ed0 20 20 20 20 20 69 6e 74 20 74 61 62 6c 65 53 65       int tableSe
23ee0 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  en = 0;      /* 
23ef0 53 65 74 20 74 6f 20 31 20 77 68 65 6e 20 54 41  Set to 1 when TA
23f00 42 4c 45 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20  BLE matches */. 
23f10 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 4e         char *zTN
23f20 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ame = 0;       /
23f30 2a 20 74 65 78 74 20 6f 66 20 6e 61 6d 65 20 6f  * text of name o
23f40 66 20 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20 20  f TABLE */.     
23f50 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
23f60 4b 5f 44 4f 54 20 29 7b 0a 20 20 20 20 20 20 20  K_DOT ){.       
23f70 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 70     assert( pE->p
23f80 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 20 20 20  Left!=0 );.     
23f90 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
23fa0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
23fb0 2d 3e 70 4c 65 66 74 2c 20 45 50 5f 49 6e 74 56  ->pLeft, EP_IntV
23fc0 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20  alue) );.       
23fd0 20 20 20 7a 54 4e 61 6d 65 20 3d 20 70 45 2d 3e     zTName = pE->
23fe0 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b  pLeft->u.zToken;
23ff0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
24000 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f     for(i=0, pFro
24010 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69  m=pTabList->a; i
24020 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
24030 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a   i++, pFrom++){.
24040 20 20 20 20 20 20 20 20 20 20 54 61 62 6c 65 20            Table 
24050 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pTab = pFrom->p
24060 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 53  Tab;.          S
24070 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70 46  elect *pSub = pF
24080 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  rom->pSelect;.  
24090 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54          char *zT
240a0 61 62 4e 61 6d 65 20 3d 20 70 46 72 6f 6d 2d 3e  abName = pFrom->
240b0 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20  zAlias;.        
240c0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
240d0 63 68 65 6d 61 4e 61 6d 65 20 3d 20 30 3b 0a 20  chemaName = 0;. 
240e0 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62           int iDb
240f0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
24100 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20  zTabName==0 ){. 
24110 20 20 20 20 20 20 20 20 20 20 20 7a 54 61 62 4e             zTabN
24120 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d  ame = pTab->zNam
24130 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
24140 20 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d           if( db-
24150 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
24160 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
24170 20 69 66 28 20 70 53 75 62 3d 3d 30 20 7c 7c 20   if( pSub==0 || 
24180 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20  (pSub->selFlags 
24190 26 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29  & SF_NestedFrom)
241a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
241b0 20 20 20 70 53 75 62 20 3d 20 30 3b 0a 20 20 20     pSub = 0;.   
241c0 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e           if( zTN
241d0 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33 53 74  ame && sqlite3St
241e0 72 49 43 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a 54  rICmp(zTName, zT
241f0 61 62 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20  abName)!=0 ){.  
24200 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
24210 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
24220 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
24230 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
24240 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
24250 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
24260 20 20 20 20 20 20 20 20 20 20 20 7a 53 63 68 65             zSche
24270 6d 61 4e 61 6d 65 20 3d 20 69 44 62 3e 3d 30 20  maName = iDb>=0 
24280 3f 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  ? db->aDb[iDb].z
24290 4e 61 6d 65 20 3a 20 22 2a 22 3b 0a 20 20 20 20  Name : "*";.    
242a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
242b0 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61    for(j=0; j<pTa
242c0 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20  b->nCol; j++){. 
242d0 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20             char 
242e0 2a 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61  *zName = pTab->a
242f0 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  Col[j].zName;.  
24300 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
24310 7a 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 54 68  zColname;  /* Th
24320 65 20 63 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d  e computed colum
24330 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  n name */.      
24340 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 6f 46        char *zToF
24350 72 65 65 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63  ree;   /* Malloc
24360 65 64 20 73 74 72 69 6e 67 20 74 68 61 74 20 6e  ed string that n
24370 65 65 64 73 20 74 6f 20 62 65 20 66 72 65 65 64  eeds to be freed
24380 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
24390 54 6f 6b 65 6e 20 73 43 6f 6c 6e 61 6d 65 3b 20  Token sColname; 
243a0 20 2f 2a 20 43 6f 6d 70 75 74 65 64 20 63 6f 6c   /* Computed col
243b0 75 6d 6e 20 6e 61 6d 65 20 61 73 20 61 20 74 6f  umn name as a to
243c0 6b 65 6e 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  ken */..        
243d0 20 20 20 20 61 73 73 65 72 74 28 20 7a 4e 61 6d      assert( zNam
243e0 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  e );.           
243f0 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 70   if( zTName && p
24400 53 75 62 0a 20 20 20 20 20 20 20 20 20 20 20 20  Sub.            
24410 20 26 26 20 73 71 6c 69 74 65 33 4d 61 74 63 68   && sqlite3Match
24420 53 70 61 6e 4e 61 6d 65 28 70 53 75 62 2d 3e 70  SpanName(pSub->p
24430 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61  EList->a[j].zSpa
24440 6e 2c 20 30 2c 20 7a 54 4e 61 6d 65 2c 20 30 29  n, 0, zTName, 0)
24450 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  ==0.            
24460 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
24470 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
24480 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
24490 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 63 6f        /* If a co
244a0 6c 75 6d 6e 20 69 73 20 6d 61 72 6b 65 64 20 61  lumn is marked a
244b0 73 20 27 68 69 64 64 65 6e 27 20 28 63 75 72 72  s 'hidden' (curr
244c0 65 6e 74 6c 79 20 6f 6e 6c 79 20 70 6f 73 73 69  ently only possi
244d0 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  ble.            
244e0 2a 2a 20 66 6f 72 20 76 69 72 74 75 61 6c 20 74  ** for virtual t
244f0 61 62 6c 65 73 29 2c 20 64 6f 20 6e 6f 74 20 69  ables), do not i
24500 6e 63 6c 75 64 65 20 69 74 20 69 6e 20 74 68 65  nclude it in the
24510 20 65 78 70 61 6e 64 65 64 0a 20 20 20 20 20 20   expanded.      
24520 20 20 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 2d        ** result-
24530 73 65 74 20 6c 69 73 74 2e 0a 20 20 20 20 20 20  set list..      
24540 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
24550 20 20 20 20 20 69 66 28 20 49 73 48 69 64 64 65       if( IsHidde
24560 6e 43 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e 61  nColumn(&pTab->a
24570 43 6f 6c 5b 6a 5d 29 20 29 7b 0a 20 20 20 20 20  Col[j]) ){.     
24580 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
24590 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 29  IsVirtual(pTab))
245a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
245b0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
245c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
245d0 20 20 20 20 74 61 62 6c 65 53 65 65 6e 20 3d 20      tableSeen = 
245e0 31 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20  1;..            
245f0 69 66 28 20 69 3e 30 20 26 26 20 7a 54 4e 61 6d  if( i>0 && zTNam
24600 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
24610 20 20 20 20 20 20 69 66 28 20 28 70 46 72 6f 6d        if( (pFrom
24620 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  ->jointype & JT_
24630 4e 41 54 55 52 41 4c 29 21 3d 30 0a 20 20 20 20  NATURAL)!=0.    
24640 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 74              && t
24650 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64  ableAndColumnInd
24660 65 78 28 70 54 61 62 4c 69 73 74 2c 20 69 2c 20  ex(pTabList, i, 
24670 7a 4e 61 6d 65 2c 20 30 2c 20 30 29 0a 20 20 20  zName, 0, 0).   
24680 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20             ){.  
24690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
246a0 20 49 6e 20 61 20 4e 41 54 55 52 41 4c 20 6a 6f   In a NATURAL jo
246b0 69 6e 2c 20 6f 6d 69 74 20 74 68 65 20 6a 6f 69  in, omit the joi
246c0 6e 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74  n columns from t
246d0 68 65 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  he .            
246e0 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 74 6f 20      ** table to 
246f0 74 68 65 20 72 69 67 68 74 20 6f 66 20 74 68 65  the right of the
24700 20 6a 6f 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20   join */.       
24710 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
24720 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
24730 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
24740 20 69 66 28 20 73 71 6c 69 74 65 33 49 64 4c 69   if( sqlite3IdLi
24750 73 74 49 6e 64 65 78 28 70 46 72 6f 6d 2d 3e 70  stIndex(pFrom->p
24760 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30  Using, zName)>=0
24770 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
24780 20 20 20 20 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e      /* In a join
24790 20 77 69 74 68 20 61 20 55 53 49 4e 47 20 63 6c   with a USING cl
247a0 61 75 73 65 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d  ause, omit colum
247b0 6e 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20  ns in the.      
247c0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 69            ** usi
247d0 6e 67 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74  ng clause from t
247e0 68 65 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20  he table on the 
247f0 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20  right. */.      
24800 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
24810 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
24820 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
24830 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 52  }.            pR
24840 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78  ight = sqlite3Ex
24850 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 4e  pr(db, TK_ID, zN
24860 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
24870 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 7a 4e 61    zColname = zNa
24880 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  me;.            
24890 7a 54 6f 46 72 65 65 20 3d 20 30 3b 0a 20 20 20  zToFree = 0;.   
248a0 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e           if( lon
248b0 67 4e 61 6d 65 73 20 7c 7c 20 70 54 61 62 4c 69  gNames || pTabLi
248c0 73 74 2d 3e 6e 53 72 63 3e 31 20 29 7b 0a 20 20  st->nSrc>1 ){.  
248d0 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
248e0 20 2a 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 20   *pLeft;.       
248f0 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 73         pLeft = s
24900 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54  qlite3Expr(db, T
24910 4b 5f 49 44 2c 20 7a 54 61 62 4e 61 6d 65 29 3b  K_ID, zTabName);
24920 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
24930 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45  Expr = sqlite3PE
24940 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44  xpr(pParse, TK_D
24950 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  OT, pLeft, pRigh
24960 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  t, 0);.         
24970 20 20 20 20 20 69 66 28 20 7a 53 63 68 65 6d 61       if( zSchema
24980 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Name ){.        
24990 20 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20          pLeft = 
249a0 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20  sqlite3Expr(db, 
249b0 54 4b 5f 49 44 2c 20 7a 53 63 68 65 6d 61 4e 61  TK_ID, zSchemaNa
249c0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
249d0 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c       pExpr = sql
249e0 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
249f0 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c  , TK_DOT, pLeft,
24a00 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20   pExpr, 0);.    
24a10 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
24a20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f            if( lo
24a30 6e 67 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20  ngNames ){.     
24a40 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e             zColn
24a50 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
24a60 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73 22  intf(db, "%s.%s"
24a70 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e 61 6d  , zTabName, zNam
24a80 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
24a90 20 20 20 20 7a 54 6f 46 72 65 65 20 3d 20 7a 43      zToFree = zC
24aa0 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  olname;.        
24ab0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
24ac0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
24ad0 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d           pExpr =
24ae0 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20   pRight;.       
24af0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
24b00 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
24b10 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
24b20 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 70 45  pParse, pNew, pE
24b30 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  xpr);.          
24b40 20 20 73 43 6f 6c 6e 61 6d 65 2e 7a 20 3d 20 7a    sColname.z = z
24b50 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20  Colname;.       
24b60 20 20 20 20 20 73 43 6f 6c 6e 61 6d 65 2e 6e 20       sColname.n 
24b70 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
24b80 30 28 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20  0(zColname);.   
24b90 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
24ba0 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28  ExprListSetName(
24bb0 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 26 73  pParse, pNew, &s
24bc0 43 6f 6c 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  Colname, 0);.   
24bd0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65           if( pNe
24be0 77 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67  w && (p->selFlag
24bf0 73 20 26 20 53 46 5f 4e 65 73 74 65 64 46 72 6f  s & SF_NestedFro
24c00 6d 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  m)!=0 ){.       
24c10 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78         struct Ex
24c20 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 58 20  prList_item *pX 
24c30 3d 20 26 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d  = &pNew->a[pNew-
24c40 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20  >nExpr-1];.     
24c50 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75           if( pSu
24c60 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  b ){.           
24c70 20 20 20 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d       pX->zSpan =
24c80 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
24c90 28 64 62 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  (db, pSub->pELis
24ca0 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 29 3b 0a  t->a[j].zSpan);.
24cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24cc0 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e 7a 53  testcase( pX->zS
24cd0 70 61 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  pan==0 );.      
24ce0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
24cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
24d00 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74  X->zSpan = sqlit
24d10 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
24d20 73 2e 25 73 2e 25 73 22 2c 0a 20 20 20 20 20 20  s.%s.%s",.      
24d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d50 20 20 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65       zSchemaName
24d60 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 43 6f 6c  , zTabName, zCol
24d70 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  name);.         
24d80 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
24d90 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b   pX->zSpan==0 );
24da0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
24db0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
24dc0 58 2d 3e 62 53 70 61 6e 49 73 54 61 62 20 3d 20  X->bSpanIsTab = 
24dd0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  1;.            }
24de0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
24df0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
24e00 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 20 20 20  ToFree);.       
24e10 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
24e20 20 20 20 20 20 20 20 69 66 28 20 21 74 61 62 6c         if( !tabl
24e30 65 53 65 65 6e 20 29 7b 0a 20 20 20 20 20 20 20  eSeen ){.       
24e40 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b     if( zTName ){
24e50 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
24e60 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
24e70 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61  rse, "no such ta
24e80 62 6c 65 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65  ble: %s", zTName
24e90 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
24ea0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
24eb0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
24ec0 70 50 61 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c  pParse, "no tabl
24ed0 65 73 20 73 70 65 63 69 66 69 65 64 22 29 3b 0a  es specified");.
24ee0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
24ef0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
24f00 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
24f10 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
24f20 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70  , pEList);.    p
24f30 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b  ->pEList = pNew;
24f40 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f  .  }.#if SQLITE_
24f50 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28  MAX_COLUMN.  if(
24f60 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 2d   p->pEList && p-
24f70 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 64  >pEList->nExpr>d
24f80 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
24f90 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29  _LIMIT_COLUMN] )
24fa0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
24fb0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
24fc0 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20  oo many columns 
24fd0 69 6e 20 72 65 73 75 6c 74 20 73 65 74 22 29 3b  in result set");
24fe0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
24ff0 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
25000 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f  e;.}../*.** No-o
25010 70 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 74 68  p routine for th
25020 65 20 70 61 72 73 65 2d 74 72 65 65 20 77 61 6c  e parse-tree wal
25030 6b 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ker..**.** When 
25040 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
25050 74 68 65 20 57 61 6c 6b 65 72 2e 78 45 78 70 72  the Walker.xExpr
25060 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20 65 78  Callback then ex
25070 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73 0a 2a  pression trees.*
25080 2a 20 61 72 65 20 77 61 6c 6b 65 64 20 77 69 74  * are walked wit
25090 68 6f 75 74 20 61 6e 79 20 61 63 74 69 6f 6e 73  hout any actions
250a0 20 62 65 69 6e 67 20 74 61 6b 65 6e 20 61 74 20   being taken at 
250b0 65 61 63 68 20 6e 6f 64 65 2e 20 20 50 72 65 73  each node.  Pres
250c0 75 6d 61 62 6c 79 2c 0a 2a 2a 20 77 68 65 6e 20  umably,.** when 
250d0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
250e0 75 73 65 64 20 66 6f 72 20 57 61 6c 6b 65 72 2e  used for Walker.
250f0 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 74 68  xExprCallback th
25100 65 6e 20 0a 2a 2a 20 57 61 6c 6b 65 72 2e 78 53  en .** Walker.xS
25110 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 69 73  electCallback is
25120 20 73 65 74 20 74 6f 20 64 6f 20 73 6f 6d 65 74   set to do somet
25130 68 69 6e 67 20 75 73 65 66 75 6c 20 66 6f 72 20  hing useful for 
25140 65 76 65 72 79 20 0a 2a 2a 20 73 75 62 71 75 65  every .** subque
25150 72 79 20 69 6e 20 74 68 65 20 70 61 72 73 65 72  ry in the parser
25160 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   tree..*/.static
25170 20 69 6e 74 20 65 78 70 72 57 61 6c 6b 4e 6f 6f   int exprWalkNoo
25180 70 28 57 61 6c 6b 65 72 20 2a 4e 6f 74 55 73 65  p(Walker *NotUse
25190 64 2c 20 45 78 70 72 20 2a 4e 6f 74 55 73 65 64  d, Expr *NotUsed
251a0 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  2){.  UNUSED_PAR
251b0 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c  AMETER2(NotUsed,
251c0 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65   NotUsed2);.  re
251d0 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
251e0 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  e;.}../*.** This
251f0 20 72 6f 75 74 69 6e 65 20 22 65 78 70 61 6e 64   routine "expand
25200 73 22 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  s" a SELECT stat
25210 65 6d 65 6e 74 20 61 6e 64 20 61 6c 6c 20 6f 66  ement and all of
25220 20 69 74 73 20 73 75 62 71 75 65 72 69 65 73 2e   its subqueries.
25230 0a 2a 2a 20 46 6f 72 20 61 64 64 69 74 69 6f 6e  .** For addition
25240 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f  al information o
25250 6e 20 77 68 61 74 20 69 74 20 6d 65 61 6e 73 20  n what it means 
25260 74 6f 20 22 65 78 70 61 6e 64 22 20 61 20 53 45  to "expand" a SE
25270 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  LECT.** statemen
25280 74 2c 20 73 65 65 20 74 68 65 20 63 6f 6d 6d 65  t, see the comme
25290 6e 74 20 6f 6e 20 74 68 65 20 73 65 6c 65 63 74  nt on the select
252a0 45 78 70 61 6e 64 20 77 6f 72 6b 65 72 20 63 61  Expand worker ca
252b0 6c 6c 62 61 63 6b 20 61 62 6f 76 65 2e 0a 2a 2a  llback above..**
252c0 0a 2a 2a 20 45 78 70 61 6e 64 69 6e 67 20 61 20  .** Expanding a 
252d0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
252e0 20 69 73 20 74 68 65 20 66 69 72 73 74 20 73 74   is the first st
252f0 65 70 20 69 6e 20 70 72 6f 63 65 73 73 69 6e 67  ep in processing
25300 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61   a.** SELECT sta
25310 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 53 45 4c  tement.  The SEL
25320 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6d 75  ECT statement mu
25330 73 74 20 62 65 20 65 78 70 61 6e 64 65 64 20 62  st be expanded b
25340 65 66 6f 72 65 0a 2a 2a 20 6e 61 6d 65 20 72 65  efore.** name re
25350 73 6f 6c 75 74 69 6f 6e 20 69 73 20 70 65 72 66  solution is perf
25360 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ormed..**.** If 
25370 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72  anything goes wr
25380 6f 6e 67 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65  ong, an error me
25390 73 73 61 67 65 20 69 73 20 77 72 69 74 74 65 6e  ssage is written
253a0 20 69 6e 74 6f 20 70 50 61 72 73 65 2e 0a 2a 2a   into pParse..**
253b0 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   The calling fun
253c0 63 74 69 6f 6e 20 63 61 6e 20 64 65 74 65 63 74  ction can detect
253d0 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 62 79 20   the problem by 
253e0 6c 6f 6f 6b 69 6e 67 20 61 74 20 70 50 61 72 73  looking at pPars
253f0 65 2d 3e 6e 45 72 72 0a 2a 2a 20 61 6e 64 2f 6f  e->nErr.** and/o
25400 72 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  r pParse->db->ma
25410 6c 6c 6f 63 46 61 69 6c 65 64 2e 0a 2a 2f 0a 73  llocFailed..*/.s
25420 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
25430 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28 50  e3SelectExpand(P
25440 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
25450 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a  lect *pSelect){.
25460 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65    Walker w;.  me
25470 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65  mset(&w, 0, size
25480 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78 45 78 70  of(w));.  w.xExp
25490 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72  rCallback = expr
254a0 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50  WalkNoop;.  w.pP
254b0 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
254c0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 68 61 73   if( pParse->has
254d0 43 6f 6d 70 6f 75 6e 64 20 29 7b 0a 20 20 20 20  Compound ){.    
254e0 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
254f0 6b 20 3d 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f  k = convertCompo
25500 75 6e 64 53 65 6c 65 63 74 54 6f 53 75 62 71 75  undSelectToSubqu
25510 65 72 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ery;.    sqlite3
25520 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70  WalkSelect(&w, p
25530 53 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 20 20 77  Select);.  }.  w
25540 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
25550 20 3d 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65   = selectExpande
25560 72 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  r;.  w.xSelectCa
25570 6c 6c 62 61 63 6b 32 20 3d 20 73 65 6c 65 63 74  llback2 = select
25580 50 6f 70 57 69 74 68 3b 0a 20 20 73 71 6c 69 74  PopWith;.  sqlit
25590 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c  e3WalkSelect(&w,
255a0 20 70 53 65 6c 65 63 74 29 3b 0a 7d 0a 0a 0a 23   pSelect);.}...#
255b0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
255c0 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a  IT_SUBQUERY./*.*
255d0 2a 20 54 68 69 73 20 69 73 20 61 20 57 61 6c 6b  * This is a Walk
255e0 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61  er.xSelectCallba
255f0 63 6b 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20  ck callback for 
25600 74 68 65 20 73 71 6c 69 74 65 33 53 65 6c 65 63  the sqlite3Selec
25610 74 54 79 70 65 49 6e 66 6f 28 29 0a 2a 2a 20 69  tTypeInfo().** i
25620 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20  nterface..**.** 
25630 46 6f 72 20 65 61 63 68 20 46 52 4f 4d 2d 63 6c  For each FROM-cl
25640 61 75 73 65 20 73 75 62 71 75 65 72 79 2c 20 61  ause subquery, a
25650 64 64 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 20  dd Column.zType 
25660 61 6e 64 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c  and Column.zColl
25670 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  .** information 
25680 74 6f 20 74 68 65 20 54 61 62 6c 65 20 73 74 72  to the Table str
25690 75 63 74 75 72 65 20 74 68 61 74 20 72 65 70 72  ucture that repr
256a0 65 73 65 6e 74 73 20 74 68 65 20 72 65 73 75 6c  esents the resul
256b0 74 20 73 65 74 0a 2a 2a 20 6f 66 20 74 68 61 74  t set.** of that
256c0 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a   subquery..**.**
256d0 20 54 68 65 20 54 61 62 6c 65 20 73 74 72 75 63   The Table struc
256e0 74 75 72 65 20 74 68 61 74 20 72 65 70 72 65 73  ture that repres
256f0 65 6e 74 73 20 74 68 65 20 72 65 73 75 6c 74 20  ents the result 
25700 73 65 74 20 77 61 73 20 63 6f 6e 73 74 72 75 63  set was construc
25710 74 65 64 0a 2a 2a 20 62 79 20 73 65 6c 65 63 74  ted.** by select
25720 45 78 70 61 6e 64 65 72 28 29 20 62 75 74 20 74  Expander() but t
25730 68 65 20 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c  he type and coll
25740 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f  ation informatio
25750 6e 20 77 61 73 20 6f 6d 69 74 74 65 64 0a 2a 2a  n was omitted.**
25760 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20 62   at that point b
25770 65 63 61 75 73 65 20 69 64 65 6e 74 69 66 69 65  ecause identifie
25780 72 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20 62  rs had not yet b
25790 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 20 54  een resolved.  T
257a0 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69  his.** routine i
257b0 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 69  s called after i
257c0 64 65 6e 74 69 66 69 65 72 20 72 65 73 6f 6c 75  dentifier resolu
257d0 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
257e0 76 6f 69 64 20 73 65 6c 65 63 74 41 64 64 53 75  void selectAddSu
257f0 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f 28 57  bqueryTypeInfo(W
25800 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
25810 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61  Select *p){.  Pa
25820 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 20 20 69  rse *pParse;.  i
25830 6e 74 20 69 3b 0a 20 20 53 72 63 4c 69 73 74 20  nt i;.  SrcList 
25840 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74 72  *pTabList;.  str
25850 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
25860 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20 61 73 73 65   *pFrom;..  asse
25870 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  rt( p->selFlags 
25880 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 20 29 3b  & SF_Resolved );
25890 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c  .  if( (p->selFl
258a0 61 67 73 20 26 20 53 46 5f 48 61 73 54 79 70 65  ags & SF_HasType
258b0 49 6e 66 6f 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Info)==0 ){.    
258c0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  p->selFlags |= S
258d0 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 3b 0a 20  F_HasTypeInfo;. 
258e0 20 20 20 70 50 61 72 73 65 20 3d 20 70 57 61 6c     pParse = pWal
258f0 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20  ker->pParse;.   
25900 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70   pTabList = p->p
25910 53 72 63 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  Src;.    for(i=0
25920 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74  , pFrom=pTabList
25930 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  ->a; i<pTabList-
25940 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f  >nSrc; i++, pFro
25950 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 54 61 62 6c  m++){.      Tabl
25960 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d  e *pTab = pFrom-
25970 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28  >pTab;.      if(
25980 20 41 4c 57 41 59 53 28 70 54 61 62 21 3d 30 29   ALWAYS(pTab!=0)
25990 20 26 26 20 28 70 54 61 62 2d 3e 74 61 62 46 6c   && (pTab->tabFl
259a0 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72  ags & TF_Ephemer
259b0 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  al)!=0 ){.      
259c0 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79    /* A sub-query
259d0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
259e0 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20  use of a SELECT 
259f0 2a 2f 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63  */.        Selec
25a00 74 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d  t *pSel = pFrom-
25a10 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  >pSelect;.      
25a20 20 20 69 66 28 20 70 53 65 6c 20 29 7b 0a 20 20    if( pSel ){.  
25a30 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
25a40 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29 20 70 53  Sel->pPrior ) pS
25a50 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f  el = pSel->pPrio
25a60 72 3b 0a 20 20 20 20 20 20 20 20 20 20 73 65 6c  r;.          sel
25a70 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65  ectAddColumnType
25a80 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61  AndCollation(pPa
25a90 72 73 65 2c 20 70 54 61 62 2c 20 70 53 65 6c 29  rse, pTab, pSel)
25aa0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
25ab0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
25ac0 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54  #endif.../*.** T
25ad0 68 69 73 20 72 6f 75 74 69 6e 65 20 61 64 64 73  his routine adds
25ae0 20 64 61 74 61 74 79 70 65 20 61 6e 64 20 63 6f   datatype and co
25af0 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
25b00 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 0a   information to.
25b10 2a 2a 20 74 68 65 20 54 61 62 6c 65 20 73 74 72  ** the Table str
25b20 75 63 74 75 72 65 73 20 6f 66 20 61 6c 6c 20 46  uctures of all F
25b30 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75  ROM-clause subqu
25b40 65 72 69 65 73 20 69 6e 20 61 0a 2a 2a 20 53 45  eries in a.** SE
25b50 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
25b60 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 69 73 20 72  **.** Use this r
25b70 6f 75 74 69 6e 65 20 61 66 74 65 72 20 6e 61 6d  outine after nam
25b80 65 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f  e resolution..*/
25b90 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
25ba0 69 74 65 33 53 65 6c 65 63 74 41 64 64 54 79 70  ite3SelectAddTyp
25bb0 65 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61  eInfo(Parse *pPa
25bc0 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  rse, Select *pSe
25bd0 6c 65 63 74 29 7b 0a 23 69 66 6e 64 65 66 20 53  lect){.#ifndef S
25be0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
25bf0 45 52 59 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  ERY.  Walker w;.
25c00 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20    memset(&w, 0, 
25c10 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e  sizeof(w));.  w.
25c20 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32  xSelectCallback2
25c30 20 3d 20 73 65 6c 65 63 74 41 64 64 53 75 62 71   = selectAddSubq
25c40 75 65 72 79 54 79 70 65 49 6e 66 6f 3b 0a 20 20  ueryTypeInfo;.  
25c50 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  w.xExprCallback 
25c60 3d 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a  = exprWalkNoop;.
25c70 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61    w.pParse = pPa
25c80 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 57 61  rse;.  sqlite3Wa
25c90 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65  lkSelect(&w, pSe
25ca0 6c 65 63 74 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a  lect);.#endif.}.
25cb0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
25cc0 74 69 6e 65 20 73 65 74 73 20 75 70 20 61 20 53  tine sets up a S
25cd0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
25ce0 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 2e 20  for processing. 
25cf0 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e   The.** followin
25d00 67 20 69 73 20 61 63 63 6f 6d 70 6c 69 73 68 65  g is accomplishe
25d10 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 20  d:.**.**     *  
25d20 56 44 42 45 20 43 75 72 73 6f 72 20 6e 75 6d 62  VDBE Cursor numb
25d30 65 72 73 20 61 72 65 20 61 73 73 69 67 6e 65 64  ers are assigned
25d40 20 74 6f 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61   to all FROM-cla
25d50 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 20 20 20  use terms..**   
25d60 20 20 2a 20 20 45 70 68 65 6d 65 72 61 6c 20 54    *  Ephemeral T
25d70 61 62 6c 65 20 6f 62 6a 65 63 74 73 20 61 72 65  able objects are
25d80 20 63 72 65 61 74 65 64 20 66 6f 72 20 61 6c 6c   created for all
25d90 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62   FROM-clause sub
25da0 71 75 65 72 69 65 73 2e 0a 2a 2a 20 20 20 20 20  queries..**     
25db0 2a 20 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  *  ON and USING 
25dc0 63 6c 61 75 73 65 73 20 61 72 65 20 73 68 69 66  clauses are shif
25dd0 74 65 64 20 69 6e 74 6f 20 57 48 45 52 45 20 73  ted into WHERE s
25de0 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 20 20 20  tatements.**    
25df0 20 2a 20 20 57 69 6c 64 63 61 72 64 73 20 22 2a   *  Wildcards "*
25e00 22 20 61 6e 64 20 22 54 41 42 4c 45 2e 2a 22 20  " and "TABLE.*" 
25e10 69 6e 20 72 65 73 75 6c 74 20 73 65 74 73 20 61  in result sets a
25e20 72 65 20 65 78 70 61 6e 64 65 64 2e 0a 2a 2a 20  re expanded..** 
25e30 20 20 20 20 2a 20 20 49 64 65 6e 74 69 66 69 65      *  Identifie
25e40 72 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e  rs in expression
25e50 20 61 72 65 20 6d 61 74 63 68 65 64 20 74 6f 20   are matched to 
25e60 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  tables..**.** Th
25e70 69 73 20 72 6f 75 74 69 6e 65 20 61 63 74 73 20  is routine acts 
25e80 72 65 63 75 72 73 69 76 65 6c 79 20 6f 6e 20 61  recursively on a
25e90 6c 6c 20 73 75 62 71 75 65 72 69 65 73 20 77 69  ll subqueries wi
25ea0 74 68 69 6e 20 74 68 65 20 53 45 4c 45 43 54 2e  thin the SELECT.
25eb0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
25ec0 53 65 6c 65 63 74 50 72 65 70 28 0a 20 20 50 61  SelectPrep(.  Pa
25ed0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
25ee0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
25ef0 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
25f00 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
25f10 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45         /* The SE
25f20 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62  LECT statement b
25f30 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20  eing coded. */. 
25f40 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4f   NameContext *pO
25f50 75 74 65 72 4e 43 20 20 2f 2a 20 4e 61 6d 65 20  uterNC  /* Name 
25f60 63 6f 6e 74 65 78 74 20 66 6f 72 20 63 6f 6e 74  context for cont
25f70 61 69 6e 65 72 20 2a 2f 0a 29 7b 0a 20 20 73 71  ainer */.){.  sq
25f80 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28  lite3 *db;.  if(
25f90 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20 72   NEVER(p==0) ) r
25fa0 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70 50  eturn;.  db = pP
25fb0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20  arse->db;.  if( 
25fc0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
25fd0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
25fe0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
25ff0 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 20 29 20  F_HasTypeInfo ) 
26000 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65  return;.  sqlite
26010 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28 70 50  3SelectExpand(pP
26020 61 72 73 65 2c 20 70 29 3b 0a 20 20 69 66 28 20  arse, p);.  if( 
26030 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
26040 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
26050 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c   ) return;.  sql
26060 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 65 63  ite3ResolveSelec
26070 74 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  tNames(pParse, p
26080 2c 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20 20 69  , pOuterNC);.  i
26090 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
260a0 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
260b0 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
260c0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64  sqlite3SelectAdd
260d0 54 79 70 65 49 6e 66 6f 28 70 50 61 72 73 65 2c  TypeInfo(pParse,
260e0 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   p);.}../*.** Re
260f0 73 65 74 20 74 68 65 20 61 67 67 72 65 67 61 74  set the aggregat
26100 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a  e accumulator..*
26110 2a 0a 2a 2a 20 54 68 65 20 61 67 67 72 65 67 61  *.** The aggrega
26120 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 69  te accumulator i
26130 73 20 61 20 73 65 74 20 6f 66 20 6d 65 6d 6f 72  s a set of memor
26140 79 20 63 65 6c 6c 73 20 74 68 61 74 20 68 6f 6c  y cells that hol
26150 64 0a 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74  d.** intermediat
26160 65 20 72 65 73 75 6c 74 73 20 77 68 69 6c 65 20  e results while 
26170 63 61 6c 63 75 6c 61 74 69 6e 67 20 61 6e 20 61  calculating an a
26180 67 67 72 65 67 61 74 65 2e 20 20 54 68 69 73 0a  ggregate.  This.
26190 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  ** routine gener
261a0 61 74 65 73 20 63 6f 64 65 20 74 68 61 74 20 73  ates code that s
261b0 74 6f 72 65 73 20 4e 55 4c 4c 73 20 69 6e 20 61  tores NULLs in a
261c0 6c 6c 20 6f 66 20 74 68 6f 73 65 20 6d 65 6d 6f  ll of those memo
261d0 72 79 0a 2a 2a 20 63 65 6c 6c 73 2e 0a 2a 2f 0a  ry.** cells..*/.
261e0 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 65  static void rese
261f0 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72  tAccumulator(Par
26200 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49  se *pParse, AggI
26210 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a  nfo *pAggInfo){.
26220 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
26230 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
26240 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67   i;.  struct Agg
26250 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 75 6e 63  Info_func *pFunc
26260 3b 0a 20 20 69 6e 74 20 6e 52 65 67 20 3d 20 70  ;.  int nReg = p
26270 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 2b  AggInfo->nFunc +
26280 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75   pAggInfo->nColu
26290 6d 6e 3b 0a 20 20 69 66 28 20 6e 52 65 67 3d 3d  mn;.  if( nReg==
262a0 30 20 29 20 72 65 74 75 72 6e 3b 0a 23 69 66 64  0 ) return;.#ifd
262b0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
262c0 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74    /* Verify that
262d0 20 61 6c 6c 20 41 67 67 49 6e 66 6f 20 72 65 67   all AggInfo reg
262e0 69 73 74 65 72 73 20 61 72 65 20 77 69 74 68 69  isters are withi
262f0 6e 20 74 68 65 20 72 61 6e 67 65 20 73 70 65 63  n the range spec
26300 69 66 69 65 64 20 62 79 0a 20 20 2a 2a 20 41 67  ified by.  ** Ag
26310 67 49 6e 66 6f 2e 6d 6e 52 65 67 2e 2e 41 67 67  gInfo.mnReg..Agg
26320 49 6e 66 6f 2e 6d 78 52 65 67 20 2a 2f 0a 20 20  Info.mxReg */.  
26330 61 73 73 65 72 74 28 20 6e 52 65 67 3d 3d 70 41  assert( nReg==pA
26340 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 2d 70 41  ggInfo->mxReg-pA
26350 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2b 31 20  ggInfo->mnReg+1 
26360 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
26370 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d  pAggInfo->nColum
26380 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73  n; i++){.    ass
26390 65 72 74 28 20 70 41 67 67 49 6e 66 6f 2d 3e 61  ert( pAggInfo->a
263a0 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41 67  Col[i].iMem>=pAg
263b0 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20 20  gInfo->mnReg.   
263c0 20 20 20 20 20 20 26 26 20 70 41 67 67 49 6e 66        && pAggInf
263d0 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3c  o->aCol[i].iMem<
263e0 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67  =pAggInfo->mxReg
263f0 20 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d   );.  }.  for(i=
26400 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  0; i<pAggInfo->n
26410 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Func; i++){.    
26420 61 73 73 65 72 74 28 20 70 41 67 67 49 6e 66 6f  assert( pAggInfo
26430 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d 3e  ->aFunc[i].iMem>
26440 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67  =pAggInfo->mnReg
26450 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 41 67  .         && pAg
26460 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e  gInfo->aFunc[i].
26470 69 4d 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e  iMem<=pAggInfo->
26480 6d 78 52 65 67 20 29 3b 0a 20 20 7d 0a 23 65 6e  mxReg );.  }.#en
26490 64 69 66 0a 20 20 73 71 6c 69 74 65 33 56 64 62  dif.  sqlite3Vdb
264a0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75  eAddOp3(v, OP_Nu
264b0 6c 6c 2c 20 30 2c 20 70 41 67 67 49 6e 66 6f 2d  ll, 0, pAggInfo-
264c0 3e 6d 6e 52 65 67 2c 20 70 41 67 67 49 6e 66 6f  >mnReg, pAggInfo
264d0 2d 3e 6d 78 52 65 67 29 3b 0a 20 20 66 6f 72 28  ->mxReg);.  for(
264e0 70 46 75 6e 63 3d 70 41 67 67 49 6e 66 6f 2d 3e  pFunc=pAggInfo->
264f0 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69 3c 70 41  aFunc, i=0; i<pA
26500 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
26510 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a 20 20  ++, pFunc++){.  
26520 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 69 44 69    if( pFunc->iDi
26530 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20  stinct>=0 ){.   
26540 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 46     Expr *pE = pF
26550 75 6e 63 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  unc->pExpr;.    
26560 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
26570 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45  asProperty(pE, E
26580 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
26590 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 78 2e        if( pE->x.
265a0 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e  pList==0 || pE->
265b0 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  x.pList->nExpr!=
265c0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  1 ){.        sql
265d0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
265e0 72 73 65 2c 20 22 44 49 53 54 49 4e 43 54 20 61  rse, "DISTINCT a
265f0 67 67 72 65 67 61 74 65 73 20 6d 75 73 74 20 68  ggregates must h
26600 61 76 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20  ave exactly one 
26610 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 61 72  ".           "ar
26620 67 75 6d 65 6e 74 22 29 3b 0a 20 20 20 20 20 20  gument");.      
26630 20 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e    pFunc->iDistin
26640 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  ct = -1;.      }
26650 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 4b 65  else{.        Ke
26660 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
26670 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  = keyInfoFromExp
26680 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 45  rList(pParse, pE
26690 2d 3e 78 2e 70 4c 69 73 74 2c 20 30 2c 20 30 29  ->x.pList, 0, 0)
266a0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
266b0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
266c0 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
266d0 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63   pFunc->iDistinc
266e0 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20  t, 0, 0,.       
266f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26700 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e     (char*)pKeyIn
26710 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
26720 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
26730 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f   }.}../*.** Invo
26740 6b 65 20 74 68 65 20 4f 50 5f 41 67 67 46 69 6e  ke the OP_AggFin
26750 61 6c 69 7a 65 20 6f 70 63 6f 64 65 20 66 6f 72  alize opcode for
26760 20 65 76 65 72 79 20 61 67 67 72 65 67 61 74 65   every aggregate
26770 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20   function.** in 
26780 74 68 65 20 41 67 67 49 6e 66 6f 20 73 74 72 75  the AggInfo stru
26790 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  cture..*/.static
267a0 20 76 6f 69 64 20 66 69 6e 61 6c 69 7a 65 41 67   void finalizeAg
267b0 67 46 75 6e 63 74 69 6f 6e 73 28 50 61 72 73 65  gFunctions(Parse
267c0 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66   *pParse, AggInf
267d0 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20  o *pAggInfo){.  
267e0 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
267f0 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
26800 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e  ;.  struct AggIn
26810 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 66  fo_func *pF;.  f
26820 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49  or(i=0, pF=pAggI
26830 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41  nfo->aFunc; i<pA
26840 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
26850 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 45  ++, pF++){.    E
26860 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
26870 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c   pF->pExpr->x.pL
26880 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ist;.    assert(
26890 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
268a0 79 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f  y(pF->pExpr, EP_
268b0 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
268c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
268d0 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67 46 69 6e  Op4(v, OP_AggFin
268e0 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 70 4c  al, pF->iMem, pL
268f0 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78  ist ? pList->nEx
26900 70 72 20 3a 20 30 2c 20 30 2c 0a 20 20 20 20 20  pr : 0, 0,.     
26910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26920 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e   (void*)pF->pFun
26930 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a  c, P4_FUNCDEF);.
26940 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64    }.}../*.** Upd
26950 61 74 65 20 74 68 65 20 61 63 63 75 6d 75 6c 61  ate the accumula
26960 74 6f 72 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73  tor memory cells
26970 20 66 6f 72 20 61 6e 20 61 67 67 72 65 67 61 74   for an aggregat
26980 65 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68  e based on.** th
26990 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
269a0 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   position..*/.st
269b0 61 74 69 63 20 76 6f 69 64 20 75 70 64 61 74 65  atic void update
269c0 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73  Accumulator(Pars
269d0 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e  e *pParse, AggIn
269e0 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20  fo *pAggInfo){. 
269f0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
26a00 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
26a10 69 3b 0a 20 20 69 6e 74 20 72 65 67 48 69 74 20  i;.  int regHit 
26a20 3d 20 30 3b 0a 20 20 69 6e 74 20 61 64 64 72 48  = 0;.  int addrH
26a30 69 74 54 65 73 74 20 3d 20 30 3b 0a 20 20 73 74  itTest = 0;.  st
26a40 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e  ruct AggInfo_fun
26a50 63 20 2a 70 46 3b 0a 20 20 73 74 72 75 63 74 20  c *pF;.  struct 
26a60 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b  AggInfo_col *pC;
26a70 0a 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69  ..  pAggInfo->di
26a80 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20  rectMode = 1;.  
26a90 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67  for(i=0, pF=pAgg
26aa0 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70  Info->aFunc; i<p
26ab0 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20  AggInfo->nFunc; 
26ac0 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20  i++, pF++){.    
26ad0 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20 69 6e  int nArg;.    in
26ae0 74 20 61 64 64 72 4e 65 78 74 20 3d 20 30 3b 0a  t addrNext = 0;.
26af0 20 20 20 20 69 6e 74 20 72 65 67 41 67 67 3b 0a      int regAgg;.
26b00 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
26b10 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d  ist = pF->pExpr-
26b20 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73  >x.pList;.    as
26b30 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
26b40 6f 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72  operty(pF->pExpr
26b50 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
26b60 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
26b70 20 29 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d   ){.      nArg =
26b80 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20   pList->nExpr;. 
26b90 20 20 20 20 20 72 65 67 41 67 67 20 3d 20 73 71       regAgg = sq
26ba0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
26bb0 65 28 70 50 61 72 73 65 2c 20 6e 41 72 67 29 3b  e(pParse, nArg);
26bc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
26bd0 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70  prCodeExprList(p
26be0 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 72 65  Parse, pList, re
26bf0 67 41 67 67 2c 20 53 51 4c 49 54 45 5f 45 43 45  gAgg, SQLITE_ECE
26c00 4c 5f 44 55 50 29 3b 0a 20 20 20 20 7d 65 6c 73  L_DUP);.    }els
26c10 65 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20  e{.      nArg = 
26c20 30 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67 20  0;.      regAgg 
26c30 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 0;.    }.    i
26c40 66 28 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74  f( pF->iDistinct
26c50 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 64 64  >=0 ){.      add
26c60 72 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33 56  rNext = sqlite3V
26c70 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
26c80 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
26c90 41 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  Arg==1 );.      
26ca0 63 6f 64 65 44 69 73 74 69 6e 63 74 28 70 50 61  codeDistinct(pPa
26cb0 72 73 65 2c 20 70 46 2d 3e 69 44 69 73 74 69 6e  rse, pF->iDistin
26cc0 63 74 2c 20 61 64 64 72 4e 65 78 74 2c 20 31 2c  ct, addrNext, 1,
26cd0 20 72 65 67 41 67 67 29 3b 0a 20 20 20 20 7d 0a   regAgg);.    }.
26ce0 20 20 20 20 69 66 28 20 70 46 2d 3e 70 46 75 6e      if( pF->pFun
26cf0 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  c->funcFlags & S
26d00 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43  QLITE_FUNC_NEEDC
26d10 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c  OLL ){.      Col
26d20 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b  lSeq *pColl = 0;
26d30 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
26d40 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
26d50 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  em;.      int j;
26d60 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
26d70 4c 69 73 74 21 3d 30 20 29 3b 20 20 2f 2a 20 70  List!=0 );  /* p
26d80 4c 69 73 74 21 3d 30 20 69 66 20 70 46 2d 3e 70  List!=0 if pF->p
26d90 46 75 6e 63 20 68 61 73 20 4e 45 45 44 43 4f 4c  Func has NEEDCOL
26da0 4c 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 6a  L */.      for(j
26db0 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d  =0, pItem=pList-
26dc0 3e 61 3b 20 21 70 43 6f 6c 6c 20 26 26 20 6a 3c  >a; !pColl && j<
26dd0 6e 41 72 67 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d  nArg; j++, pItem
26de0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  ++){.        pCo
26df0 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
26e00 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
26e10 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20  pItem->pExpr);. 
26e20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
26e30 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20   !pColl ){.     
26e40 20 20 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73     pColl = pPars
26e50 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c  e->db->pDfltColl
26e60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
26e70 69 66 28 20 72 65 67 48 69 74 3d 3d 30 20 26 26  if( regHit==0 &&
26e80 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75   pAggInfo->nAccu
26e90 6d 75 6c 61 74 6f 72 20 29 20 72 65 67 48 69 74  mulator ) regHit
26ea0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
26eb0 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  m;.      sqlite3
26ec0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
26ed0 5f 43 6f 6c 6c 53 65 71 2c 20 72 65 67 48 69 74  _CollSeq, regHit
26ee0 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29  , 0, 0, (char *)
26ef0 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45  pColl, P4_COLLSE
26f00 51 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  Q);.    }.    sq
26f10 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
26f20 76 2c 20 4f 50 5f 41 67 67 53 74 65 70 2c 20 30  v, OP_AggStep, 0
26f30 2c 20 72 65 67 41 67 67 2c 20 70 46 2d 3e 69 4d  , regAgg, pF->iM
26f40 65 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  em,.            
26f50 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a            (void*
26f60 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46  )pF->pFunc, P4_F
26f70 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 73 71 6c  UNCDEF);.    sql
26f80 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
26f90 28 76 2c 20 28 75 38 29 6e 41 72 67 29 3b 0a 20  (v, (u8)nArg);. 
26fa0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
26fb0 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
26fc0 65 28 70 50 61 72 73 65 2c 20 72 65 67 41 67 67  e(pParse, regAgg
26fd0 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 73 71 6c  , nArg);.    sql
26fe0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
26ff0 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67  ange(pParse, reg
27000 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20  Agg, nArg);.    
27010 69 66 28 20 61 64 64 72 4e 65 78 74 20 29 7b 0a  if( addrNext ){.
27020 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
27030 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
27040 20 61 64 64 72 4e 65 78 74 29 3b 0a 20 20 20 20   addrNext);.    
27050 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
27060 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
27070 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
27080 20 42 65 66 6f 72 65 20 70 6f 70 75 6c 61 74 69   Before populati
27090 6e 67 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74  ng the accumulat
270a0 6f 72 20 72 65 67 69 73 74 65 72 73 2c 20 63 6c  or registers, cl
270b0 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  ear the column c
270c0 61 63 68 65 2e 0a 20 20 2a 2a 20 4f 74 68 65 72  ache..  ** Other
270d0 77 69 73 65 2c 20 69 66 20 61 6e 79 20 6f 66 20  wise, if any of 
270e0 74 68 65 20 72 65 71 75 69 72 65 64 20 63 6f 6c  the required col
270f0 75 6d 6e 20 76 61 6c 75 65 73 20 61 72 65 20 61  umn values are a
27100 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74 20 0a  lready present .
27110 20 20 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72    ** in register
27120 73 2c 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  s, sqlite3ExprCo
27130 64 65 28 29 20 6d 61 79 20 75 73 65 20 4f 50 5f  de() may use OP_
27140 53 43 6f 70 79 20 74 6f 20 63 6f 70 79 20 74 68  SCopy to copy th
27150 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20 74 6f 20  e value.  ** to 
27160 70 43 2d 3e 69 4d 65 6d 2e 20 42 75 74 20 62 79  pC->iMem. But by
27170 20 74 68 65 20 74 69 6d 65 20 74 68 65 20 76 61   the time the va
27180 6c 75 65 20 69 73 20 75 73 65 64 2c 20 74 68 65  lue is used, the
27190 20 6f 72 69 67 69 6e 61 6c 20 72 65 67 69 73 74   original regist
271a0 65 72 0a 20 20 2a 2a 20 6d 61 79 20 68 61 76 65  er.  ** may have
271b0 20 62 65 65 6e 20 75 73 65 64 2c 20 69 6e 76 61   been used, inva
271c0 6c 69 64 61 74 69 6e 67 20 74 68 65 20 75 6e 64  lidating the und
271d0 65 72 6c 79 69 6e 67 20 62 75 66 66 65 72 20 68  erlying buffer h
271e0 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20  olding the.  ** 
271f0 74 65 78 74 20 6f 72 20 62 6c 6f 62 20 76 61 6c  text or blob val
27200 75 65 2e 20 53 65 65 20 74 69 63 6b 65 74 20 5b  ue. See ticket [
27210 38 38 33 30 33 34 64 63 62 35 5d 2e 0a 20 20 2a  883034dcb5]..  *
27220 2a 0a 20 20 2a 2a 20 41 6e 6f 74 68 65 72 20 73  *.  ** Another s
27230 6f 6c 75 74 69 6f 6e 20 77 6f 75 6c 64 20 62 65  olution would be
27240 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 4f   to change the O
27250 50 5f 53 43 6f 70 79 20 75 73 65 64 20 74 6f 20  P_SCopy used to 
27260 63 6f 70 79 20 63 61 63 68 65 64 0a 20 20 2a 2a  copy cached.  **
27270 20 76 61 6c 75 65 73 20 74 6f 20 61 6e 20 4f 50   values to an OP
27280 5f 43 6f 70 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  _Copy..  */.  if
27290 28 20 72 65 67 48 69 74 20 29 7b 0a 20 20 20 20  ( regHit ){.    
272a0 61 64 64 72 48 69 74 54 65 73 74 20 3d 20 73 71  addrHitTest = sq
272b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
272c0 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 48 69 74  v, OP_If, regHit
272d0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
272e0 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  v);.  }.  sqlite
272f0 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
27300 70 50 61 72 73 65 29 3b 0a 20 20 66 6f 72 28 69  pParse);.  for(i
27310 3d 30 2c 20 70 43 3d 70 41 67 67 49 6e 66 6f 2d  =0, pC=pAggInfo-
27320 3e 61 43 6f 6c 3b 20 69 3c 70 41 67 67 49 6e 66  >aCol; i<pAggInf
27330 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 3b  o->nAccumulator;
27340 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20 20   i++, pC++){.   
27350 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
27360 28 70 50 61 72 73 65 2c 20 70 43 2d 3e 70 45 78  (pParse, pC->pEx
27370 70 72 2c 20 70 43 2d 3e 69 4d 65 6d 29 3b 0a 20  pr, pC->iMem);. 
27380 20 7d 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64   }.  pAggInfo->d
27390 69 72 65 63 74 4d 6f 64 65 20 3d 20 30 3b 0a 20  irectMode = 0;. 
273a0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
273b0 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
273c0 20 20 69 66 28 20 61 64 64 72 48 69 74 54 65 73    if( addrHitTes
273d0 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
273e0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
273f0 61 64 64 72 48 69 74 54 65 73 74 29 3b 0a 20 20  addrHitTest);.  
27400 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  }.}../*.** Add a
27410 20 73 69 6e 67 6c 65 20 4f 50 5f 45 78 70 6c 61   single OP_Expla
27420 69 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  in instruction t
27430 6f 20 74 68 65 20 56 44 42 45 20 74 6f 20 65 78  o the VDBE to ex
27440 70 6c 61 69 6e 20 61 20 73 69 6d 70 6c 65 0a 2a  plain a simple.*
27450 2a 20 63 6f 75 6e 74 28 2a 29 20 71 75 65 72 79  * count(*) query
27460 20 28 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28   ("SELECT count(
27470 2a 29 20 46 52 4f 4d 20 70 54 61 62 22 29 2e 0a  *) FROM pTab")..
27480 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
27490 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 73  E_OMIT_EXPLAIN.s
274a0 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61  tatic void expla
274b0 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 0a 20  inSimpleCount(. 
274c0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
274d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
274e0 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78   /* Parse contex
274f0 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  t */.  Table *pT
27500 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ab,             
27510 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
27520 62 65 69 6e 67 20 71 75 65 72 69 65 64 20 2a 2f  being queried */
27530 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20  .  Index *pIdx  
27540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27550 20 20 20 2f 2a 20 49 6e 64 65 78 20 75 73 65 64     /* Index used
27560 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 73 63 61   to optimize sca
27570 6e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  n, or NULL */.){
27580 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65  .  if( pParse->e
27590 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20  xplain==2 ){.   
275a0 20 63 68 61 72 20 2a 7a 45 71 70 20 3d 20 73 71   char *zEqp = sq
275b0 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61  lite3MPrintf(pPa
275c0 72 73 65 2d 3e 64 62 2c 20 22 53 43 41 4e 20 54  rse->db, "SCAN T
275d0 41 42 4c 45 20 25 73 25 73 25 73 22 2c 0a 20 20  ABLE %s%s%s",.  
275e0 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d        pTab->zNam
275f0 65 2c 20 0a 20 20 20 20 20 20 20 20 70 49 64 78  e, .        pIdx
27600 20 3f 20 22 20 55 53 49 4e 47 20 43 4f 56 45 52   ? " USING COVER
27610 49 4e 47 20 49 4e 44 45 58 20 22 20 3a 20 22 22  ING INDEX " : ""
27620 2c 0a 20 20 20 20 20 20 20 20 70 49 64 78 20 3f  ,.        pIdx ?
27630 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22   pIdx->zName : "
27640 22 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c  ".    );.    sql
27650 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 0a  ite3VdbeAddOp4(.
27660 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
27670 70 56 64 62 65 2c 20 4f 50 5f 45 78 70 6c 61 69  pVdbe, OP_Explai
27680 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65  n, pParse->iSele
27690 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 45 71 70  ctId, 0, 0, zEqp
276a0 2c 20 50 34 5f 44 59 4e 41 4d 49 43 0a 20 20 20  , P4_DYNAMIC.   
276b0 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a   );.  }.}.#else.
276c0 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e  # define explain
276d0 53 69 6d 70 6c 65 43 6f 75 6e 74 28 61 2c 62 2c  SimpleCount(a,b,
276e0 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  c).#endif../*.**
276f0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
27700 6f 72 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  or the SELECT st
27710 61 74 65 6d 65 6e 74 20 67 69 76 65 6e 20 69 6e  atement given in
27720 20 74 68 65 20 70 20 61 72 67 75 6d 65 6e 74 2e   the p argument.
27730 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73    .**.** The res
27740 75 6c 74 73 20 61 72 65 20 72 65 74 75 72 6e 65  ults are returne
27750 64 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  d according to t
27760 68 65 20 53 65 6c 65 63 74 44 65 73 74 20 73 74  he SelectDest st
27770 72 75 63 74 75 72 65 2e 0a 2a 2a 20 53 65 65 20  ructure..** See 
27780 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 73 71 6c 69  comments in sqli
27790 74 65 49 6e 74 2e 68 20 66 6f 72 20 66 75 72 74  teInt.h for furt
277a0 68 65 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  her information.
277b0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
277c0 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20  ine returns the 
277d0 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
277e0 2e 20 20 49 66 20 61 6e 79 20 65 72 72 6f 72 73  .  If any errors
277f0 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65   are.** encounte
27800 72 65 64 2c 20 74 68 65 6e 20 61 6e 20 61 70 70  red, then an app
27810 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 6d  ropriate error m
27820 65 73 73 61 67 65 20 69 73 20 6c 65 66 74 20 69  essage is left i
27830 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72  n.** pParse->zEr
27840 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rMsg..**.** This
27850 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f   routine does NO
27860 54 20 66 72 65 65 20 74 68 65 20 53 65 6c 65 63  T free the Selec
27870 74 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73  t structure pass
27880 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a 2a 20 63  ed in.  The.** c
27890 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
278a0 6e 65 65 64 73 20 74 6f 20 64 6f 20 74 68 61 74  needs to do that
278b0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
278c0 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20  Select(.  Parse 
278d0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
278e0 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
278f0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
27900 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
27910 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
27920 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
27930 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 53 65 6c   coded. */.  Sel
27940 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20  ectDest *pDest  
27950 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
27960 6f 20 77 69 74 68 20 74 68 65 20 71 75 65 72 79  o with the query
27970 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20   results */.){. 
27980 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
27990 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
279a0 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68  counters */.  Wh
279b0 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b  ereInfo *pWInfo;
279c0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 66       /* Return f
279d0 72 6f 6d 20 73 71 6c 69 74 65 33 57 68 65 72 65  rom sqlite3Where
279e0 42 65 67 69 6e 28 29 20 2a 2f 0a 20 20 56 64 62  Begin() */.  Vdb
279f0 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
27a00 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75      /* The virtu
27a10 61 6c 20 6d 61 63 68 69 6e 65 20 75 6e 64 65 72  al machine under
27a20 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
27a30 0a 20 20 69 6e 74 20 69 73 41 67 67 3b 20 20 20  .  int isAgg;   
27a40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
27a50 65 20 66 6f 72 20 73 65 6c 65 63 74 20 6c 69 73  e for select lis
27a60 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a  ts like "count(*
27a70 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  )" */.  ExprList
27a80 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20 2f   *pEList;      /
27a90 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  * List of column
27aa0 73 20 74 6f 20 65 78 74 72 61 63 74 2e 20 2a 2f  s to extract. */
27ab0 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
27ac0 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73  List;     /* Lis
27ad0 74 20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20 73  t of tables to s
27ae0 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20  elect from */.  
27af0 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20  Expr *pWhere;   
27b00 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
27b10 45 52 45 20 63 6c 61 75 73 65 2e 20 20 4d 61 79  ERE clause.  May
27b20 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78   be NULL */.  Ex
27b30 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79  prList *pGroupBy
27b40 3b 20 20 20 20 2f 2a 20 54 68 65 20 47 52 4f 55  ;    /* The GROU
27b50 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61  P BY clause.  Ma
27b60 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45  y be NULL */.  E
27b70 78 70 72 20 2a 70 48 61 76 69 6e 67 3b 20 20 20  xpr *pHaving;   
27b80 20 20 20 20 20 20 2f 2a 20 54 68 65 20 48 41 56        /* The HAV
27b90 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 4d 61 79  ING clause.  May
27ba0 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e   be NULL */.  in
27bb0 74 20 72 63 20 3d 20 31 3b 20 20 20 20 20 20 20  t rc = 1;       
27bc0 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f       /* Value to
27bd0 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 74 68 69   return from thi
27be0 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  s function */.  
27bf0 44 69 73 74 69 6e 63 74 43 74 78 20 73 44 69 73  DistinctCtx sDis
27c00 74 69 6e 63 74 3b 20 2f 2a 20 49 6e 66 6f 20 6f  tinct; /* Info o
27c10 6e 20 68 6f 77 20 74 6f 20 63 6f 64 65 20 74 68  n how to code th
27c20 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f  e DISTINCT keywo
27c30 72 64 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20  rd */.  SortCtx 
27c40 73 53 6f 72 74 3b 20 20 20 20 20 20 20 20 20 2f  sSort;         /
27c50 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f  * Info on how to
27c60 20 63 6f 64 65 20 74 68 65 20 4f 52 44 45 52 20   code the ORDER 
27c70 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 41  BY clause */.  A
27c80 67 67 49 6e 66 6f 20 73 41 67 67 49 6e 66 6f 3b  ggInfo sAggInfo;
27c90 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61        /* Informa
27ca0 74 69 6f 6e 20 75 73 65 64 20 62 79 20 61 67 67  tion used by agg
27cb0 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20 2a  regate queries *
27cc0 2f 0a 20 20 69 6e 74 20 69 45 6e 64 3b 20 20 20  /.  int iEnd;   
27cd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
27ce0 64 72 65 73 73 20 6f 66 20 74 68 65 20 65 6e 64  dress of the end
27cf0 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 2a 2f   of the query */
27d00 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
27d10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
27d20 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
27d30 74 69 6f 6e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  tion */..#ifndef
27d40 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
27d50 4c 41 49 4e 0a 20 20 69 6e 74 20 69 52 65 73 74  LAIN.  int iRest
27d60 6f 72 65 53 65 6c 65 63 74 49 64 20 3d 20 70 50  oreSelectId = pP
27d70 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 3b  arse->iSelectId;
27d80 0a 20 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65  .  pParse->iSele
27d90 63 74 49 64 20 3d 20 70 50 61 72 73 65 2d 3e 69  ctId = pParse->i
27da0 4e 65 78 74 53 65 6c 65 63 74 49 64 2b 2b 3b 0a  NextSelectId++;.
27db0 23 65 6e 64 69 66 0a 0a 20 20 64 62 20 3d 20 70  #endif..  db = p
27dc0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
27dd0 20 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c   p==0 || db->mal
27de0 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61  locFailed || pPa
27df0 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20  rse->nErr ){.   
27e00 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
27e10 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
27e20 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
27e30 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20  LITE_SELECT, 0, 
27e40 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 20 31  0, 0) ) return 1
27e50 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 41 67 67  ;.  memset(&sAgg
27e60 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Info, 0, sizeof(
27e70 73 41 67 67 49 6e 66 6f 29 29 3b 0a 0a 20 20 61  sAggInfo));..  a
27e80 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
27e90 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e  By==0 || pDest->
27ea0 65 44 65 73 74 21 3d 53 52 54 5f 44 69 73 74 46  eDest!=SRT_DistF
27eb0 69 66 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ifo );.  assert(
27ec0 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20   p->pOrderBy==0 
27ed0 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21  || pDest->eDest!
27ee0 3d 53 52 54 5f 46 69 66 6f 20 29 3b 0a 20 20 61  =SRT_Fifo );.  a
27ef0 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
27f00 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e  By==0 || pDest->
27f10 65 44 65 73 74 21 3d 53 52 54 5f 44 69 73 74 51  eDest!=SRT_DistQ
27f20 75 65 75 65 20 29 3b 0a 20 20 61 73 73 65 72 74  ueue );.  assert
27f30 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
27f40 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74   || pDest->eDest
27f50 21 3d 53 52 54 5f 51 75 65 75 65 20 29 3b 0a 20  !=SRT_Queue );. 
27f60 20 69 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72   if( IgnorableOr
27f70 64 65 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a  derby(pDest) ){.
27f80 20 20 20 20 61 73 73 65 72 74 28 70 44 65 73 74      assert(pDest
27f90 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 69  ->eDest==SRT_Exi
27fa0 73 74 73 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44  sts || pDest->eD
27fb0 65 73 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20 7c  est==SRT_Union |
27fc0 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 70 44  | .           pD
27fd0 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
27fe0 45 78 63 65 70 74 20 7c 7c 20 70 44 65 73 74 2d  Except || pDest-
27ff0 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63  >eDest==SRT_Disc
28000 61 72 64 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ard ||.         
28010 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d    pDest->eDest==
28020 53 52 54 5f 51 75 65 75 65 20 20 7c 7c 20 70 44  SRT_Queue  || pD
28030 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
28040 44 69 73 74 46 69 66 6f 20 7c 7c 0a 20 20 20 20  DistFifo ||.    
28050 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44         pDest->eD
28060 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 51 75 65  est==SRT_DistQue
28070 75 65 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65  ue || pDest->eDe
28080 73 74 3d 3d 53 52 54 5f 46 69 66 6f 29 3b 0a 20  st==SRT_Fifo);. 
28090 20 20 20 2f 2a 20 49 66 20 4f 52 44 45 52 20 42     /* If ORDER B
280a0 59 20 6d 61 6b 65 73 20 6e 6f 20 64 69 66 66 65  Y makes no diffe
280b0 72 65 6e 63 65 20 69 6e 20 74 68 65 20 6f 75 74  rence in the out
280c0 70 75 74 20 74 68 65 6e 20 6e 65 69 74 68 65 72  put then neither
280d0 20 64 6f 65 73 0a 20 20 20 20 2a 2a 20 44 49 53   does.    ** DIS
280e0 54 49 4e 43 54 20 73 6f 20 69 74 20 63 61 6e 20  TINCT so it can 
280f0 62 65 20 72 65 6d 6f 76 65 64 20 74 6f 6f 2e 20  be removed too. 
28100 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  */.    sqlite3Ex
28110 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
28120 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20   p->pOrderBy);. 
28130 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
28140 20 30 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c   0;.    p->selFl
28150 61 67 73 20 26 3d 20 7e 53 46 5f 44 69 73 74 69  ags &= ~SF_Disti
28160 6e 63 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  nct;.  }.  sqlit
28170 65 33 53 65 6c 65 63 74 50 72 65 70 28 70 50 61  e3SelectPrep(pPa
28180 72 73 65 2c 20 70 2c 20 30 29 3b 0a 20 20 6d 65  rse, p, 0);.  me
28190 6d 73 65 74 28 26 73 53 6f 72 74 2c 20 30 2c 20  mset(&sSort, 0, 
281a0 73 69 7a 65 6f 66 28 73 53 6f 72 74 29 29 3b 0a  sizeof(sSort));.
281b0 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79    sSort.pOrderBy
281c0 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
281d0 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
281e0 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d  pSrc;.  pEList =
281f0 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66   p->pEList;.  if
28200 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
28210 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
28220 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73  ed ){.    goto s
28230 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20  elect_end;.  }. 
28240 20 69 73 41 67 67 20 3d 20 28 70 2d 3e 73 65 6c   isAgg = (p->sel
28250 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65  Flags & SF_Aggre
28260 67 61 74 65 29 21 3d 30 3b 0a 20 20 61 73 73 65  gate)!=0;.  asse
28270 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b  rt( pEList!=0 );
28280 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e  ..  /* Begin gen
28290 65 72 61 74 69 6e 67 20 63 6f 64 65 2e 0a 20 20  erating code..  
282a0 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  */.  v = sqlite3
282b0 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
282c0 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f  .  if( v==0 ) go
282d0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a  to select_end;..
282e0 20 20 2f 2a 20 49 66 20 77 72 69 74 69 6e 67 20    /* If writing 
282f0 74 6f 20 6d 65 6d 6f 72 79 20 6f 72 20 67 65 6e  to memory or gen
28300 65 72 61 74 69 6e 67 20 61 20 73 65 74 0a 20 20  erating a set.  
28310 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  ** only a single
28320 20 63 6f 6c 75 6d 6e 20 6d 61 79 20 62 65 20 6f   column may be o
28330 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e  utput..  */.#ifn
28340 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
28350 53 55 42 51 55 45 52 59 0a 20 20 69 66 28 20 63  SUBQUERY.  if( c
28360 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75  heckForMultiColu
28370 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72 28 70 50  mnSelectError(pP
28380 61 72 73 65 2c 20 70 44 65 73 74 2c 20 70 45 4c  arse, pDest, pEL
28390 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20  ist->nExpr) ){. 
283a0 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
283b0 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  nd;.  }.#endif..
283c0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
283d0 64 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71  de for all sub-q
283e0 75 65 72 69 65 73 20 69 6e 20 74 68 65 20 46 52  ueries in the FR
283f0 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 23  OM clause.  */.#
28400 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
28410 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
28420 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
28430 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a  LITE_OMIT_VIEW).
28440 20 20 66 6f 72 28 69 3d 30 3b 20 21 70 2d 3e 70    for(i=0; !p->p
28450 50 72 69 6f 72 20 26 26 20 69 3c 70 54 61 62 4c  Prior && i<pTabL
28460 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  ist->nSrc; i++){
28470 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
28480 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
28490 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  = &pTabList->a[i
284a0 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74 44 65 73  ];.    SelectDes
284b0 74 20 64 65 73 74 3b 0a 20 20 20 20 53 65 6c 65  t dest;.    Sele
284c0 63 74 20 2a 70 53 75 62 20 3d 20 70 49 74 65 6d  ct *pSub = pItem
284d0 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 69  ->pSelect;.    i
284e0 6e 74 20 69 73 41 67 67 53 75 62 3b 0a 0a 20 20  nt isAggSub;..  
284f0 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20 29 20    if( pSub==0 ) 
28500 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f  continue;..    /
28510 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74 68 65 20  * Sometimes the 
28520 63 6f 64 65 20 66 6f 72 20 61 20 73 75 62 71 75  code for a subqu
28530 65 72 79 20 77 69 6c 6c 20 62 65 20 67 65 6e 65  ery will be gene
28540 72 61 74 65 64 20 6d 6f 72 65 20 74 68 61 6e 0a  rated more than.
28550 20 20 20 20 2a 2a 20 6f 6e 63 65 2c 20 69 66 20      ** once, if 
28560 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
28570 70 61 72 74 20 6f 66 20 74 68 65 20 57 48 45 52  part of the WHER
28580 45 20 63 6c 61 75 73 65 20 69 6e 20 61 20 4c 45  E clause in a LE
28590 46 54 20 4a 4f 49 4e 2c 0a 20 20 20 20 2a 2a 20  FT JOIN,.    ** 
285a0 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20 20 49 6e  for example.  In
285b0 20 74 68 61 74 20 63 61 73 65 2c 20 64 6f 20 6e   that case, do n
285c0 6f 74 20 72 65 67 65 6e 65 72 61 74 65 20 74 68  ot regenerate th
285d0 65 20 63 6f 64 65 20 74 6f 20 6d 61 6e 69 66 65  e code to manife
285e0 73 74 0a 20 20 20 20 2a 2a 20 61 20 76 69 65 77  st.    ** a view
285f0 20 6f 72 20 74 68 65 20 63 6f 2d 72 6f 75 74 69   or the co-routi
28600 6e 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ne to implement 
28610 61 20 76 69 65 77 2e 20 20 54 68 65 20 66 69 72  a view.  The fir
28620 73 74 20 69 6e 73 74 61 6e 63 65 0a 20 20 20 20  st instance.    
28630 2a 2a 20 69 73 20 73 75 66 66 69 63 69 65 6e 74  ** is sufficient
28640 2c 20 74 68 6f 75 67 68 20 74 68 65 20 73 75 62  , though the sub
28650 72 6f 75 74 69 6e 65 20 74 6f 20 6d 61 6e 69 66  routine to manif
28660 65 73 74 20 74 68 65 20 76 69 65 77 20 64 6f 65  est the view doe
28670 73 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f  s need.    ** to
28680 20 62 65 20 69 6e 76 6f 6b 65 64 20 61 67 61 69   be invoked agai
28690 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 49  n. */.    if( pI
286a0 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
286b0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49   ){.      if( pI
286c0 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e  tem->viaCoroutin
286d0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
286e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
286f0 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70  2(v, OP_Gosub, p
28700 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 2c  Item->regReturn,
28710 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c   pItem->addrFill
28720 53 75 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Sub);.      }.  
28730 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
28740 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72    }..    /* Incr
28750 65 6d 65 6e 74 20 50 61 72 73 65 2e 6e 48 65 69  ement Parse.nHei
28760 67 68 74 20 62 79 20 74 68 65 20 68 65 69 67 68  ght by the heigh
28770 74 20 6f 66 20 74 68 65 20 6c 61 72 67 65 73 74  t of the largest
28780 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20   expression.    
28790 2a 2a 20 74 72 65 65 20 72 65 66 65 72 72 65 64  ** tree referred
287a0 20 74 6f 20 62 79 20 74 68 69 73 2c 20 74 68 65   to by this, the
287b0 20 70 61 72 65 6e 74 20 73 65 6c 65 63 74 2e 20   parent select. 
287c0 54 68 65 20 63 68 69 6c 64 20 73 65 6c 65 63 74  The child select
287d0 0a 20 20 20 20 2a 2a 20 6d 61 79 20 63 6f 6e 74  .    ** may cont
287e0 61 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74  ain expression t
287f0 72 65 65 73 20 6f 66 20 61 74 20 6d 6f 73 74 0a  rees of at most.
28800 20 20 20 20 2a 2a 20 28 53 51 4c 49 54 45 5f 4d      ** (SQLITE_M
28810 41 58 5f 45 58 50 52 5f 44 45 50 54 48 2d 50 61  AX_EXPR_DEPTH-Pa
28820 72 73 65 2e 6e 48 65 69 67 68 74 29 20 68 65 69  rse.nHeight) hei
28830 67 68 74 2e 20 54 68 69 73 20 69 73 20 61 20 62  ght. This is a b
28840 69 74 0a 20 20 20 20 2a 2a 20 6d 6f 72 65 20 63  it.    ** more c
28850 6f 6e 73 65 72 76 61 74 69 76 65 20 74 68 61 6e  onservative than
28860 20 6e 65 63 65 73 73 61 72 79 2c 20 62 75 74 20   necessary, but 
28870 6d 75 63 68 20 65 61 73 69 65 72 20 74 68 61 6e  much easier than
28880 20 65 6e 66 6f 72 63 69 6e 67 0a 20 20 20 20 2a   enforcing.    *
28890 2a 20 61 6e 20 65 78 61 63 74 20 6c 69 6d 69 74  * an exact limit
288a0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61  ..    */.    pPa
288b0 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20  rse->nHeight += 
288c0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70  sqlite3SelectExp
288d0 72 48 65 69 67 68 74 28 70 29 3b 0a 0a 20 20 20  rHeight(p);..   
288e0 20 69 73 41 67 67 53 75 62 20 3d 20 28 70 53 75   isAggSub = (pSu
288f0 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  b->selFlags & SF
28900 5f 41 67 67 72 65 67 61 74 65 29 21 3d 30 3b 0a  _Aggregate)!=0;.
28910 20 20 20 20 69 66 28 20 66 6c 61 74 74 65 6e 53      if( flattenS
28920 75 62 71 75 65 72 79 28 70 50 61 72 73 65 2c 20  ubquery(pParse, 
28930 70 2c 20 69 2c 20 69 73 41 67 67 2c 20 69 73 41  p, i, isAgg, isA
28940 67 67 53 75 62 29 20 29 7b 0a 20 20 20 20 20 20  ggSub) ){.      
28950 2f 2a 20 54 68 69 73 20 73 75 62 71 75 65 72 79  /* This subquery
28960 20 63 61 6e 20 62 65 20 61 62 73 6f 72 62 65 64   can be absorbed
28970 20 69 6e 74 6f 20 69 74 73 20 70 61 72 65 6e 74   into its parent
28980 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69  . */.      if( i
28990 73 41 67 67 53 75 62 20 29 7b 0a 20 20 20 20 20  sAggSub ){.     
289a0 20 20 20 69 73 41 67 67 20 3d 20 31 3b 0a 20 20     isAgg = 1;.  
289b0 20 20 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67        p->selFlag
289c0 73 20 7c 3d 20 53 46 5f 41 67 67 72 65 67 61 74  s |= SF_Aggregat
289d0 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
289e0 20 69 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c   i = -1;.    }el
289f0 73 65 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d  se if( pTabList-
28a00 3e 6e 53 72 63 3d 3d 31 0a 20 20 20 20 20 20 20  >nSrc==1.       
28a10 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74      && Optimizat
28a20 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53  ionEnabled(db, S
28a30 51 4c 49 54 45 5f 53 75 62 71 43 6f 72 6f 75 74  QLITE_SubqCorout
28a40 69 6e 65 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  ine).    ){.    
28a50 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61    /* Implement a
28a60 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74 68 61 74   co-routine that
28a70 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 73   will return a s
28a80 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65  ingle row of the
28a90 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a   result.      **
28aa0 20 73 65 74 20 6f 6e 20 65 61 63 68 20 69 6e 76   set on each inv
28ab0 6f 63 61 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  ocation..      *
28ac0 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
28ad0 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Top = sqlite3Vdb
28ae0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
28af0 31 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  1;.      pItem->
28b00 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50  regReturn = ++pP
28b10 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
28b20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
28b30 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f  Op3(v, OP_InitCo
28b40 72 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e  routine, pItem->
28b50 72 65 67 52 65 74 75 72 6e 2c 20 30 2c 20 61 64  regReturn, 0, ad
28b60 64 72 54 6f 70 29 3b 0a 20 20 20 20 20 20 56 64  drTop);.      Vd
28b70 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
28b80 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d  s", pItem->pTab-
28b90 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  >zName));.      
28ba0 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
28bb0 75 62 20 3d 20 61 64 64 72 54 6f 70 3b 0a 20 20  ub = addrTop;.  
28bc0 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
28bd0 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c  tDestInit(&dest,
28be0 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20   SRT_Coroutine, 
28bf0 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
28c00 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e  );.      explain
28c10 53 65 74 49 6e 74 65 67 65 72 28 70 49 74 65 6d  SetInteger(pItem
28c20 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 28 75 38  ->iSelectId, (u8
28c30 29 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65  )pParse->iNextSe
28c40 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 73  lectId);.      s
28c50 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
28c60 72 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74  rse, pSub, &dest
28c70 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  );.      pItem->
28c80 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74  pTab->nRowLogEst
28c90 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
28ca0 28 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f  (pSub->nSelectRo
28cb0 77 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d  w);.      pItem-
28cc0 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 3d 20  >viaCoroutine = 
28cd0 31 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  1;.      pItem->
28ce0 72 65 67 52 65 73 75 6c 74 20 3d 20 64 65 73 74  regResult = dest
28cf0 2e 69 53 64 73 74 3b 0a 20 20 20 20 20 20 73 71  .iSdst;.      sq
28d00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
28d10 76 2c 20 4f 50 5f 45 6e 64 43 6f 72 6f 75 74 69  v, OP_EndCorouti
28d20 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65  ne, pItem->regRe
28d30 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  turn);.      sql
28d40 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
28d50 28 76 2c 20 61 64 64 72 54 6f 70 2d 31 29 3b 0a  (v, addrTop-1);.
28d60 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65        sqlite3Cle
28d70 61 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 70  arTempRegCache(p
28d80 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 65 6c 73  Parse);.    }els
28d90 65 7b 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  e{.      /* Gene
28da0 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e  rate a subroutin
28db0 65 20 74 68 61 74 20 77 69 6c 6c 20 66 69 6c 6c  e that will fill
28dc0 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61   an ephemeral ta
28dd0 62 6c 65 20 77 69 74 68 0a 20 20 20 20 20 20 2a  ble with.      *
28de0 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  * the content of
28df0 20 74 68 69 73 20 73 75 62 71 75 65 72 79 2e 20   this subquery. 
28e00 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c   pItem->addrFill
28e10 53 75 62 20 77 69 6c 6c 20 70 6f 69 6e 74 0a 20  Sub will point. 
28e20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 61       ** to the a
28e30 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 67 65  ddress of the ge
28e40 6e 65 72 61 74 65 64 20 73 75 62 72 6f 75 74 69  nerated subrouti
28e50 6e 65 2e 20 20 70 49 74 65 6d 2d 3e 72 65 67 52  ne.  pItem->regR
28e60 65 74 75 72 6e 0a 20 20 20 20 20 20 2a 2a 20 69  eturn.      ** i
28e70 73 20 61 20 72 65 67 69 73 74 65 72 20 61 6c 6c  s a register all
28e80 6f 63 61 74 65 64 20 74 6f 20 68 6f 6c 64 20 74  ocated to hold t
28e90 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 72 65  he subroutine re
28ea0 74 75 72 6e 20 61 64 64 72 65 73 73 0a 20 20 20  turn address.   
28eb0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20     */.      int 
28ec0 74 6f 70 41 64 64 72 3b 0a 20 20 20 20 20 20 69  topAddr;.      i
28ed0 6e 74 20 6f 6e 63 65 41 64 64 72 20 3d 20 30 3b  nt onceAddr = 0;
28ee0 0a 20 20 20 20 20 20 69 6e 74 20 72 65 74 41 64  .      int retAd
28ef0 64 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  dr;.      assert
28f00 28 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c  ( pItem->addrFil
28f10 6c 53 75 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20  lSub==0 );.     
28f20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72   pItem->regRetur
28f30 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  n = ++pParse->nM
28f40 65 6d 3b 0a 20 20 20 20 20 20 74 6f 70 41 64 64  em;.      topAdd
28f50 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
28f60 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
28f70 67 65 72 2c 20 30 2c 20 70 49 74 65 6d 2d 3e 72  ger, 0, pItem->r
28f80 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20  egReturn);.     
28f90 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c   pItem->addrFill
28fa0 53 75 62 20 3d 20 74 6f 70 41 64 64 72 2b 31 3b  Sub = topAddr+1;
28fb0 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
28fc0 2d 3e 69 73 43 6f 72 72 65 6c 61 74 65 64 3d 3d  ->isCorrelated==
28fd0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
28fe0 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
28ff0 69 73 20 6e 6f 74 20 63 6f 72 72 65 6c 61 74 65  is not correlate
29000 64 20 61 6e 64 20 69 66 20 77 65 20 61 72 65 20  d and if we are 
29010 6e 6f 74 20 69 6e 73 69 64 65 20 6f 66 0a 20 20  not inside of.  
29020 20 20 20 20 20 20 2a 2a 20 61 20 74 72 69 67 67        ** a trigg
29030 65 72 2c 20 74 68 65 6e 20 77 65 20 6f 6e 6c 79  er, then we only
29040 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65   need to compute
29050 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
29060 65 20 73 75 62 71 75 65 72 79 0a 20 20 20 20 20  e subquery.     
29070 20 20 20 2a 2a 20 6f 6e 63 65 2e 20 2a 2f 0a 20     ** once. */. 
29080 20 20 20 20 20 20 20 6f 6e 63 65 41 64 64 72 20         onceAddr 
29090 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63  = sqlite3CodeOnc
290a0 65 28 70 50 61 72 73 65 29 3b 20 56 64 62 65 43  e(pParse); VdbeC
290b0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
290c0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
290d0 28 76 2c 20 22 6d 61 74 65 72 69 61 6c 69 7a 65  (v, "materialize
290e0 20 5c 22 25 73 5c 22 22 2c 20 70 49 74 65 6d 2d   \"%s\"", pItem-
290f0 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  >pTab->zName));.
29100 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
29110 20 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d       VdbeNoopCom
29120 6d 65 6e 74 28 28 76 2c 20 22 6d 61 74 65 72 69  ment((v, "materi
29130 61 6c 69 7a 65 20 5c 22 25 73 5c 22 22 2c 20 70  alize \"%s\"", p
29140 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  Item->pTab->zNam
29150 65 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  e));.      }.   
29160 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
29170 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20  DestInit(&dest, 
29180 53 52 54 5f 45 70 68 65 6d 54 61 62 2c 20 70 49  SRT_EphemTab, pI
29190 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  tem->iCursor);. 
291a0 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49       explainSetI
291b0 6e 74 65 67 65 72 28 70 49 74 65 6d 2d 3e 69 53  nteger(pItem->iS
291c0 65 6c 65 63 74 49 64 2c 20 28 75 38 29 70 50 61  electId, (u8)pPa
291d0 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
291e0 49 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Id);.      sqlit
291f0 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
29200 20 70 53 75 62 2c 20 26 64 65 73 74 29 3b 0a 20   pSub, &dest);. 
29210 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62       pItem->pTab
29220 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 73  ->nRowLogEst = s
29230 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 53 75  qlite3LogEst(pSu
29240 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a  b->nSelectRow);.
29250 20 20 20 20 20 20 69 66 28 20 6f 6e 63 65 41 64        if( onceAd
29260 64 72 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  dr ) sqlite3Vdbe
29270 4a 75 6d 70 48 65 72 65 28 76 2c 20 6f 6e 63 65  JumpHere(v, once
29280 41 64 64 72 29 3b 0a 20 20 20 20 20 20 72 65 74  Addr);.      ret
29290 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  Addr = sqlite3Vd
292a0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
292b0 65 74 75 72 6e 2c 20 70 49 74 65 6d 2d 3e 72 65  eturn, pItem->re
292c0 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20  gReturn);.      
292d0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
292e0 22 65 6e 64 20 25 73 22 2c 20 70 49 74 65 6d 2d  "end %s", pItem-
292f0 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  >pTab->zName));.
29300 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
29310 65 43 68 61 6e 67 65 50 31 28 76 2c 20 74 6f 70  eChangeP1(v, top
29320 41 64 64 72 2c 20 72 65 74 41 64 64 72 29 3b 0a  Addr, retAddr);.
29330 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65        sqlite3Cle
29340 61 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 70  arTempRegCache(p
29350 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Parse);.    }.  
29360 20 20 69 66 28 20 2f 2a 70 50 61 72 73 65 2d 3e    if( /*pParse->
29370 6e 45 72 72 20 7c 7c 2a 2f 20 64 62 2d 3e 6d 61  nErr ||*/ db->ma
29380 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
29390 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
293a0 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  end;.    }.    p
293b0 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2d  Parse->nHeight -
293c0 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45  = sqlite3SelectE
293d0 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a 20 20  xprHeight(p);.  
293e0 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
293f0 70 53 72 63 3b 0a 20 20 20 20 69 66 28 20 21 49  pSrc;.    if( !I
29400 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28  gnorableOrderby(
29410 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20  pDest) ){.      
29420 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d  sSort.pOrderBy =
29430 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
29440 20 20 7d 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74    }.  }.  pEList
29450 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 23 65   = p->pEList;.#e
29460 6e 64 69 66 0a 20 20 70 57 68 65 72 65 20 3d 20  ndif.  pWhere = 
29470 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 47 72  p->pWhere;.  pGr
29480 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75  oupBy = p->pGrou
29490 70 42 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d  pBy;.  pHaving =
294a0 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 73   p->pHaving;.  s
294b0 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20  Distinct.isTnct 
294c0 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  = (p->selFlags &
294d0 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30   SF_Distinct)!=0
294e0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
294f0 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
29500 53 45 4c 45 43 54 0a 20 20 2f 2a 20 49 66 20 74  SELECT.  /* If t
29510 68 65 72 65 20 69 73 20 61 72 65 20 61 20 73 65  here is are a se
29520 71 75 65 6e 63 65 20 6f 66 20 71 75 65 72 69 65  quence of querie
29530 73 2c 20 64 6f 20 74 68 65 20 65 61 72 6c 69 65  s, do the earlie
29540 72 20 6f 6e 65 73 20 66 69 72 73 74 2e 0a 20 20  r ones first..  
29550 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  */.  if( p->pPri
29560 6f 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d  or ){.    rc = m
29570 75 6c 74 69 53 65 6c 65 63 74 28 70 50 61 72 73  ultiSelect(pPars
29580 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20  e, p, pDest);.  
29590 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
295a0 67 65 72 28 70 50 61 72 73 65 2d 3e 69 53 65 6c  ger(pParse->iSel
295b0 65 63 74 49 64 2c 20 69 52 65 73 74 6f 72 65 53  ectId, iRestoreS
295c0 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 72 65  electId);.    re
295d0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e  turn rc;.  }.#en
295e0 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  dif..  /* If the
295f0 20 71 75 65 72 79 20 69 73 20 44 49 53 54 49 4e   query is DISTIN
29600 43 54 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52  CT with an ORDER
29610 20 42 59 20 62 75 74 20 69 73 20 6e 6f 74 20 61   BY but is not a
29620 6e 20 61 67 67 72 65 67 61 74 65 2c 20 61 6e 64  n aggregate, and
29630 20 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 73 65   .  ** if the se
29640 6c 65 63 74 2d 6c 69 73 74 20 69 73 20 74 68 65  lect-list is the
29650 20 73 61 6d 65 20 61 73 20 74 68 65 20 4f 52 44   same as the ORD
29660 45 52 20 42 59 20 6c 69 73 74 2c 20 74 68 65 6e  ER BY list, then
29670 20 74 68 69 73 20 71 75 65 72 79 0a 20 20 2a 2a   this query.  **
29680 20 63 61 6e 20 62 65 20 72 65 77 72 69 74 74 65   can be rewritte
29690 6e 20 61 73 20 61 20 47 52 4f 55 50 20 42 59 2e  n as a GROUP BY.
296a0 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
296b0 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   this:.  **.  **
296c0 20 20 20 20 20 53 45 4c 45 43 54 20 44 49 53 54       SELECT DIST
296d0 49 4e 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e  INCT xyz FROM ..
296e0 2e 20 4f 52 44 45 52 20 42 59 20 78 79 7a 0a 20  . ORDER BY xyz. 
296f0 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 74 72 61 6e   **.  ** is tran
29700 73 66 6f 72 6d 65 64 20 74 6f 3a 0a 20 20 2a 2a  sformed to:.  **
29710 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
29720 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20 47 52   xyz FROM ... GR
29730 4f 55 50 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a  OUP BY xyz.  **.
29740 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20    ** The second 
29750 66 6f 72 6d 20 69 73 20 70 72 65 66 65 72 72 65  form is preferre
29760 64 20 61 73 20 61 20 73 69 6e 67 6c 65 20 69 6e  d as a single in
29770 64 65 78 20 28 6f 72 20 74 65 6d 70 2d 74 61 62  dex (or temp-tab
29780 6c 65 29 20 6d 61 79 20 62 65 20 0a 20 20 2a 2a  le) may be .  **
29790 20 75 73 65 64 20 66 6f 72 20 62 6f 74 68 20 74   used for both t
297a0 68 65 20 4f 52 44 45 52 20 42 59 20 61 6e 64 20  he ORDER BY and 
297b0 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73 73  DISTINCT process
297c0 69 6e 67 2e 20 41 73 20 6f 72 69 67 69 6e 61 6c  ing. As original
297d0 6c 79 20 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e  ly .  ** written
297e0 20 74 68 65 20 71 75 65 72 79 20 6d 75 73 74 20   the query must 
297f0 75 73 65 20 61 20 74 65 6d 70 2d 74 61 62 6c 65  use a temp-table
29800 20 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6f 6e   for at least on
29810 65 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 0a  e of the ORDER .
29820 20 20 2a 2a 20 42 59 20 61 6e 64 20 44 49 53 54    ** BY and DIST
29830 49 4e 43 54 2c 20 61 6e 64 20 61 6e 20 69 6e 64  INCT, and an ind
29840 65 78 20 6f 72 20 73 65 70 61 72 61 74 65 20 74  ex or separate t
29850 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20 74 68  emp-table for th
29860 65 20 6f 74 68 65 72 2e 0a 20 20 2a 2f 0a 20 20  e other..  */.  
29870 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  if( (p->selFlags
29880 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c   & (SF_Distinct|
29890 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d  SF_Aggregate))==
298a0 53 46 5f 44 69 73 74 69 6e 63 74 20 0a 20 20 20  SF_Distinct .   
298b0 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  && sqlite3ExprLi
298c0 73 74 43 6f 6d 70 61 72 65 28 73 53 6f 72 74 2e  stCompare(sSort.
298d0 70 4f 72 64 65 72 42 79 2c 20 70 2d 3e 70 45 4c  pOrderBy, p->pEL
298e0 69 73 74 2c 20 2d 31 29 3d 3d 30 0a 20 20 29 7b  ist, -1)==0.  ){
298f0 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73  .    p->selFlags
29900 20 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74   &= ~SF_Distinct
29910 3b 0a 20 20 20 20 70 2d 3e 70 47 72 6f 75 70 42  ;.    p->pGroupB
29920 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
29930 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45  istDup(db, p->pE
29940 4c 69 73 74 2c 20 30 29 3b 0a 20 20 20 20 70 47  List, 0);.    pG
29950 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f  roupBy = p->pGro
29960 75 70 42 79 3b 0a 20 20 20 20 73 53 6f 72 74 2e  upBy;.    sSort.
29970 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
29980 20 20 2f 2a 20 4e 6f 74 69 63 65 20 74 68 61 74    /* Notice that
29990 20 65 76 65 6e 20 74 68 6f 75 67 68 74 20 53 46   even thought SF
299a0 5f 44 69 73 74 69 6e 63 74 20 68 61 73 20 62 65  _Distinct has be
299b0 65 6e 20 63 6c 65 61 72 65 64 20 66 72 6f 6d 20  en cleared from 
299c0 70 2d 3e 73 65 6c 46 6c 61 67 73 2c 0a 20 20 20  p->selFlags,.   
299d0 20 2a 2a 20 74 68 65 20 73 44 69 73 74 69 6e 63   ** the sDistinc
299e0 74 2e 69 73 54 6e 63 74 20 69 73 20 73 74 69 6c  t.isTnct is stil
299f0 6c 20 73 65 74 2e 20 20 48 65 6e 63 65 2c 20 69  l set.  Hence, i
29a00 73 54 6e 63 74 20 72 65 70 72 65 73 65 6e 74 73  sTnct represents
29a10 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 72 69 67   the.    ** orig
29a20 69 6e 61 6c 20 73 65 74 74 69 6e 67 20 6f 66 20  inal setting of 
29a30 74 68 65 20 53 46 5f 44 69 73 74 69 6e 63 74 20  the SF_Distinct 
29a40 66 6c 61 67 2c 20 6e 6f 74 20 74 68 65 20 63 75  flag, not the cu
29a50 72 72 65 6e 74 20 73 65 74 74 69 6e 67 20 2a 2f  rrent setting */
29a60 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 44 69  .    assert( sDi
29a70 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 29 3b  stinct.isTnct );
29a80 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
29a90 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ere is an ORDER 
29aa0 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20  BY clause, then 
29ab0 74 68 69 73 20 73 6f 72 74 69 6e 67 0a 20 20 2a  this sorting.  *
29ac0 2a 20 69 6e 64 65 78 20 6d 69 67 68 74 20 65 6e  * index might en
29ad0 64 20 75 70 20 62 65 69 6e 67 20 75 6e 75 73 65  d up being unuse
29ae0 64 20 69 66 20 74 68 65 20 64 61 74 61 20 63 61  d if the data ca
29af0 6e 20 62 65 20 0a 20 20 2a 2a 20 65 78 74 72 61  n be .  ** extra
29b00 63 74 65 64 20 69 6e 20 70 72 65 2d 73 6f 72 74  cted in pre-sort
29b10 65 64 20 6f 72 64 65 72 2e 20 20 49 66 20 74 68  ed order.  If th
29b20 61 74 20 69 73 20 74 68 65 20 63 61 73 65 2c 20  at is the case, 
29b30 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 4f 50  then the.  ** OP
29b40 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69  _OpenEphemeral i
29b50 6e 73 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20  nstruction will 
29b60 62 65 20 63 68 61 6e 67 65 64 20 74 6f 20 61 6e  be changed to an
29b70 20 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65 0a 20 20   OP_Noop once.  
29b80 2a 2a 20 77 65 20 66 69 67 75 72 65 20 6f 75 74  ** we figure out
29b90 20 74 68 61 74 20 74 68 65 20 73 6f 72 74 69 6e   that the sortin
29ba0 67 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 6e  g index is not n
29bb0 65 65 64 65 64 2e 20 20 54 68 65 20 61 64 64 72  eeded.  The addr
29bc0 53 6f 72 74 49 6e 64 65 78 0a 20 20 2a 2a 20 76  SortIndex.  ** v
29bd0 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64 20  ariable is used 
29be0 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20 74 68  to facilitate th
29bf0 61 74 20 63 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a  at change..  */.
29c00 20 20 69 66 28 20 73 53 6f 72 74 2e 70 4f 72 64    if( sSort.pOrd
29c10 65 72 42 79 20 29 7b 0a 20 20 20 20 4b 65 79 49  erBy ){.    KeyI
29c20 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20  nfo *pKeyInfo;. 
29c30 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65     pKeyInfo = ke
29c40 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
29c50 74 28 70 50 61 72 73 65 2c 20 73 53 6f 72 74 2e  t(pParse, sSort.
29c60 70 4f 72 64 65 72 42 79 2c 20 30 2c 20 30 29 3b  pOrderBy, 0, 0);
29c70 0a 20 20 20 20 73 53 6f 72 74 2e 69 45 43 75 72  .    sSort.iECur
29c80 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  sor = pParse->nT
29c90 61 62 2b 2b 3b 0a 20 20 20 20 73 53 6f 72 74 2e  ab++;.    sSort.
29ca0 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 0a  addrSortIndex =.
29cb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
29cc0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
29cd0 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20  enEphemeral,.   
29ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29cf0 20 20 20 20 20 20 20 20 73 53 6f 72 74 2e 69 45          sSort.iE
29d00 43 75 72 73 6f 72 2c 20 73 53 6f 72 74 2e 70 4f  Cursor, sSort.pO
29d10 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 32 2c  rderBy->nExpr+2,
29d20 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
29d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
29d40 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
29d50 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 7d  P4_KEYINFO);.  }
29d60 65 6c 73 65 7b 0a 20 20 20 20 73 53 6f 72 74 2e  else{.    sSort.
29d70 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 20  addrSortIndex = 
29d80 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  -1;.  }..  /* If
29d90 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 64   the output is d
29da0 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20 74 65  estined for a te
29db0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 6f  mporary table, o
29dc0 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65 2e 0a  pen that table..
29dd0 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65 73 74    */.  if( pDest
29de0 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68  ->eDest==SRT_Eph
29df0 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c  emTab ){.    sql
29e00 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
29e10 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
29e20 61 6c 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61  al, pDest->iSDPa
29e30 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  rm, pEList->nExp
29e40 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  r);.  }..  /* Se
29e50 74 20 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a 20  t the limiter.. 
29e60 20 2a 2f 0a 20 20 69 45 6e 64 20 3d 20 73 71 6c   */.  iEnd = sql
29e70 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
29e80 6c 28 76 29 3b 0a 20 20 70 2d 3e 6e 53 65 6c 65  l(v);.  p->nSele
29e90 63 74 52 6f 77 20 3d 20 4c 41 52 47 45 53 54 5f  ctRow = LARGEST_
29ea0 49 4e 54 36 34 3b 0a 20 20 63 6f 6d 70 75 74 65  INT64;.  compute
29eb0 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70  LimitRegisters(p
29ec0 50 61 72 73 65 2c 20 70 2c 20 69 45 6e 64 29 3b  Parse, p, iEnd);
29ed0 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74  .  if( p->iLimit
29ee0 3d 3d 30 20 26 26 20 73 53 6f 72 74 2e 61 64 64  ==0 && sSort.add
29ef0 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 29 7b  rSortIndex>=0 ){
29f00 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
29f10 47 65 74 4f 70 28 76 2c 20 73 53 6f 72 74 2e 61  GetOp(v, sSort.a
29f20 64 64 72 53 6f 72 74 49 6e 64 65 78 29 2d 3e 6f  ddrSortIndex)->o
29f30 70 63 6f 64 65 20 3d 20 4f 50 5f 53 6f 72 74 65  pcode = OP_Sorte
29f40 72 4f 70 65 6e 3b 0a 20 20 20 20 73 53 6f 72 74  rOpen;.    sSort
29f50 2e 73 6f 72 74 46 6c 61 67 73 20 7c 3d 20 53 4f  .sortFlags |= SO
29f60 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72  RTFLAG_UseSorter
29f70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e  ;.  }..  /* Open
29f80 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78   a virtual index
29f90 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20   to use for the 
29fa0 64 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20 20  distinct set..  
29fb0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  */.  if( p->selF
29fc0 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
29fd0 63 74 20 29 7b 0a 20 20 20 20 73 44 69 73 74 69  ct ){.    sDisti
29fe0 6e 63 74 2e 74 61 62 54 6e 63 74 20 3d 20 70 50  nct.tabTnct = pP
29ff0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
2a000 20 20 73 44 69 73 74 69 6e 63 74 2e 61 64 64 72    sDistinct.addr
2a010 54 6e 63 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Tnct = sqlite3Vd
2a020 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f  beAddOp4(v, OP_O
2a030 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20  penEphemeral,.  
2a040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 44                sD
2a060 69 73 74 69 6e 63 74 2e 74 61 62 54 6e 63 74 2c  istinct.tabTnct,
2a070 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20   0, 0,.         
2a080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a090 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 6b 65         (char*)ke
2a0a0 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
2a0b0 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c  t(pParse, p->pEL
2a0c0 69 73 74 2c 30 2c 30 29 2c 0a 20 20 20 20 20 20  ist,0,0),.      
2a0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a0e0 20 20 20 20 20 20 20 20 20 20 50 34 5f 4b 45 59            P4_KEY
2a0f0 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74  INFO);.    sqlit
2a100 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
2a110 2c 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45  , BTREE_UNORDERE
2a120 44 29 3b 0a 20 20 20 20 73 44 69 73 74 69 6e 63  D);.    sDistinc
2a130 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 57 48  t.eTnctType = WH
2a140 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f  ERE_DISTINCT_UNO
2a150 52 44 45 52 45 44 3b 0a 20 20 7d 65 6c 73 65 7b  RDERED;.  }else{
2a160 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 65  .    sDistinct.e
2a170 54 6e 63 74 54 79 70 65 20 3d 20 57 48 45 52 45  TnctType = WHERE
2a180 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a  _DISTINCT_NOOP;.
2a190 20 20 7d 0a 0a 20 20 69 66 28 20 21 69 73 41 67    }..  if( !isAg
2a1a0 67 20 26 26 20 70 47 72 6f 75 70 42 79 3d 3d 30  g && pGroupBy==0
2a1b0 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 61 67   ){.    /* No ag
2a1c0 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
2a1d0 73 20 61 6e 64 20 6e 6f 20 47 52 4f 55 50 20 42  s and no GROUP B
2a1e0 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  Y clause */.    
2a1f0 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 20 3d  u16 wctrlFlags =
2a200 20 28 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e   (sDistinct.isTn
2a210 63 74 20 3f 20 57 48 45 52 45 5f 57 41 4e 54 5f  ct ? WHERE_WANT_
2a220 44 49 53 54 49 4e 43 54 20 3a 20 30 29 3b 0a 0a  DISTINCT : 0);..
2a230 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 74 68 65      /* Begin the
2a240 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 2e 20   database scan. 
2a250 2a 2f 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20  */.    pWInfo = 
2a260 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
2a270 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  n(pParse, pTabLi
2a280 73 74 2c 20 70 57 68 65 72 65 2c 20 73 53 6f 72  st, pWhere, sSor
2a290 74 2e 70 4f 72 64 65 72 42 79 2c 0a 20 20 20 20  t.pOrderBy,.    
2a2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a2b0 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 45             p->pE
2a2c0 4c 69 73 74 2c 20 77 63 74 72 6c 46 6c 61 67 73  List, wctrlFlags
2a2d0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 57  , 0);.    if( pW
2a2e0 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73  Info==0 ) goto s
2a2f0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 69  elect_end;.    i
2a300 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f  f( sqlite3WhereO
2a310 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 70 57  utputRowCount(pW
2a320 49 6e 66 6f 29 20 3c 20 70 2d 3e 6e 53 65 6c 65  Info) < p->nSele
2a330 63 74 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 70  ctRow ){.      p
2a340 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73  ->nSelectRow = s
2a350 71 6c 69 74 65 33 57 68 65 72 65 4f 75 74 70 75  qlite3WhereOutpu
2a360 74 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66 6f  tRowCount(pWInfo
2a370 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2a380 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63   sDistinct.isTnc
2a390 74 20 26 26 20 73 71 6c 69 74 65 33 57 68 65 72  t && sqlite3Wher
2a3a0 65 49 73 44 69 73 74 69 6e 63 74 28 70 57 49 6e  eIsDistinct(pWIn
2a3b0 66 6f 29 20 29 7b 0a 20 20 20 20 20 20 73 44 69  fo) ){.      sDi
2a3c0 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65  stinct.eTnctType
2a3d0 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 49   = sqlite3WhereI
2a3e0 73 44 69 73 74 69 6e 63 74 28 70 57 49 6e 66 6f  sDistinct(pWInfo
2a3f0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2a400 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20   sSort.pOrderBy 
2a410 29 7b 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 6e  ){.      sSort.n
2a420 4f 42 53 61 74 20 3d 20 73 71 6c 69 74 65 33 57  OBSat = sqlite3W
2a430 68 65 72 65 49 73 4f 72 64 65 72 65 64 28 70 57  hereIsOrdered(pW
2a440 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  Info);.      if(
2a450 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74 3d 3d 73   sSort.nOBSat==s
2a460 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2d 3e 6e  Sort.pOrderBy->n
2a470 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
2a480 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d  sSort.pOrderBy =
2a490 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
2a4a0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 6f 72  }..    /* If sor
2a4b0 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20  ting index that 
2a4c0 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61  was created by a
2a4d0 20 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 45 70   prior OP_OpenEp
2a4e0 68 65 6d 65 72 61 6c 20 0a 20 20 20 20 2a 2a 20  hemeral .    ** 
2a4f0 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e 64 65  instruction ende
2a500 64 20 75 70 20 6e 6f 74 20 62 65 69 6e 67 20 6e  d up not being n
2a510 65 65 64 65 64 2c 20 74 68 65 6e 20 63 68 61 6e  eeded, then chan
2a520 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70  ge the OP_OpenEp
2a530 68 65 6d 65 72 61 6c 0a 20 20 20 20 2a 2a 20 69  hemeral.    ** i
2a540 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a  nto an OP_Noop..
2a550 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
2a560 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64  Sort.addrSortInd
2a570 65 78 3e 3d 30 20 26 26 20 73 53 6f 72 74 2e 70  ex>=0 && sSort.p
2a580 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20  OrderBy==0 ){.  
2a590 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
2a5a0 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 73  hangeToNoop(v, s
2a5b0 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64  Sort.addrSortInd
2a5c0 65 78 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ex);.    }..    
2a5d0 2f 2a 20 55 73 65 20 74 68 65 20 73 74 61 6e 64  /* Use the stand
2a5e0 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e 20  ard inner loop. 
2a5f0 2a 2f 0a 20 20 20 20 73 65 6c 65 63 74 49 6e 6e  */.    selectInn
2a600 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
2a610 2c 20 70 45 4c 69 73 74 2c 20 2d 31 2c 20 26 73  , pEList, -1, &s
2a620 53 6f 72 74 2c 20 26 73 44 69 73 74 69 6e 63 74  Sort, &sDistinct
2a630 2c 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20  , pDest,.       
2a640 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
2a650 69 74 65 33 57 68 65 72 65 43 6f 6e 74 69 6e 75  ite3WhereContinu
2a660 65 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 2c 0a  eLabel(pWInfo),.
2a670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a680 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
2a690 42 72 65 61 6b 4c 61 62 65 6c 28 70 57 49 6e 66  BreakLabel(pWInf
2a6a0 6f 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e 64  o));..    /* End
2a6b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
2a6c0 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a  an loop..    */.
2a6d0 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
2a6e0 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d  End(pWInfo);.  }
2a6f0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69  else{.    /* Thi
2a700 73 20 63 61 73 65 20 77 68 65 6e 20 74 68 65 72  s case when ther
2a710 65 20 65 78 69 73 74 20 61 67 67 72 65 67 61 74  e exist aggregat
2a720 65 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 61  e functions or a
2a730 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
2a740 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68 20  .    ** or both 
2a750 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65  */.    NameConte
2a760 78 74 20 73 4e 43 3b 20 20 20 20 2f 2a 20 4e 61  xt sNC;    /* Na
2a770 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 70  me context for p
2a780 72 6f 63 65 73 73 69 6e 67 20 61 67 67 72 65 67  rocessing aggreg
2a790 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ate information 
2a7a0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 4d 65 6d  */.    int iAMem
2a7b0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ;          /* Fi
2a7c0 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20  rst Mem address 
2a7d0 66 6f 72 20 73 74 6f 72 69 6e 67 20 63 75 72 72  for storing curr
2a7e0 65 6e 74 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a  ent GROUP BY */.
2a7f0 20 20 20 20 69 6e 74 20 69 42 4d 65 6d 3b 20 20      int iBMem;  
2a800 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
2a810 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72   Mem address for
2a820 20 70 72 65 76 69 6f 75 73 20 47 52 4f 55 50 20   previous GROUP 
2a830 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 55  BY */.    int iU
2a840 73 65 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a  seFlag;       /*
2a850 20 4d 65 6d 20 61 64 64 72 65 73 73 20 68 6f 6c   Mem address hol
2a860 64 69 6e 67 20 66 6c 61 67 20 69 6e 64 69 63 61  ding flag indica
2a870 74 69 6e 67 20 74 68 61 74 20 61 74 20 6c 65 61  ting that at lea
2a880 73 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  st.             
2a890 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e             ** on
2a8a0 65 20 72 6f 77 20 6f 66 20 74 68 65 20 69 6e 70  e row of the inp
2a8b0 75 74 20 74 6f 20 74 68 65 20 61 67 67 72 65 67  ut to the aggreg
2a8c0 61 74 6f 72 20 68 61 73 20 62 65 65 6e 0a 20 20  ator has been.  
2a8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a8e0 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73        ** process
2a8f0 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41  ed */.    int iA
2a900 62 6f 72 74 46 6c 61 67 3b 20 20 20 20 20 2f 2a  bortFlag;     /*
2a910 20 4d 65 6d 20 61 64 64 72 65 73 73 20 77 68 69   Mem address whi
2a920 63 68 20 63 61 75 73 65 73 20 71 75 65 72 79 20  ch causes query 
2a930 61 62 6f 72 74 20 69 66 20 70 6f 73 69 74 69 76  abort if positiv
2a940 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 67 72 6f  e */.    int gro
2a950 75 70 42 79 53 6f 72 74 3b 20 20 20 20 2f 2a 20  upBySort;    /* 
2a960 52 6f 77 73 20 63 6f 6d 65 20 66 72 6f 6d 20 73  Rows come from s
2a970 6f 75 72 63 65 20 69 6e 20 47 52 4f 55 50 20 42  ource in GROUP B
2a980 59 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 69  Y order */.    i
2a990 6e 74 20 61 64 64 72 45 6e 64 3b 20 20 20 20 20  nt addrEnd;     
2a9a0 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 72 6f     /* End of pro
2a9b0 63 65 73 73 69 6e 67 20 66 6f 72 20 74 68 69 73  cessing for this
2a9c0 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 69   SELECT */.    i
2a9d0 6e 74 20 73 6f 72 74 50 54 61 62 20 3d 20 30 3b  nt sortPTab = 0;
2a9e0 20 20 20 2f 2a 20 50 73 65 75 64 6f 74 61 62 6c     /* Pseudotabl
2a9f0 65 20 75 73 65 64 20 74 6f 20 64 65 63 6f 64 65  e used to decode
2aa00 20 73 6f 72 74 69 6e 67 20 72 65 73 75 6c 74 73   sorting results
2aa10 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72 74   */.    int sort
2aa20 4f 75 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4f  Out = 0;    /* O
2aa30 75 74 70 75 74 20 72 65 67 69 73 74 65 72 20 66  utput register f
2aa40 72 6f 6d 20 74 68 65 20 73 6f 72 74 65 72 20 2a  rom the sorter *
2aa50 2f 0a 20 20 20 20 69 6e 74 20 6f 72 64 65 72 42  /.    int orderB
2aa60 79 47 72 70 20 3d 20 30 3b 20 2f 2a 20 54 72 75  yGrp = 0; /* Tru
2aa70 65 20 69 66 20 74 68 65 20 47 52 4f 55 50 20 42  e if the GROUP B
2aa80 59 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20 61  Y and ORDER BY a
2aa90 72 65 20 74 68 65 20 73 61 6d 65 20 2a 2f 0a 0a  re the same */..
2aaa0 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e      /* Remove an
2aab0 79 20 61 6e 64 20 61 6c 6c 20 61 6c 69 61 73 65  y and all aliase
2aac0 73 20 62 65 74 77 65 65 6e 20 74 68 65 20 72 65  s between the re
2aad0 73 75 6c 74 20 73 65 74 20 61 6e 64 20 74 68 65  sult set and the
2aae0 0a 20 20 20 20 2a 2a 20 47 52 4f 55 50 20 42 59  .    ** GROUP BY
2aaf0 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2f 0a   clause..    */.
2ab00 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79      if( pGroupBy
2ab10 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b   ){.      int k;
2ab20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab30 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
2ab40 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20  counter */.     
2ab50 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
2ab60 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20 2f  _item *pItem;  /
2ab70 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
2ab80 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  er expression in
2ab90 20 61 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 20 20   a list */..    
2aba0 20 20 66 6f 72 28 6b 3d 70 2d 3e 70 45 4c 69 73    for(k=p->pELis
2abb0 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d  t->nExpr, pItem=
2abc0 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 20 6b 3e  p->pEList->a; k>
2abd0 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29  0; k--, pItem++)
2abe0 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d  {.        pItem-
2abf0 3e 75 2e 78 2e 69 41 6c 69 61 73 20 3d 20 30 3b  >u.x.iAlias = 0;
2ac00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
2ac10 6f 72 28 6b 3d 70 47 72 6f 75 70 42 79 2d 3e 6e  or(k=pGroupBy->n
2ac20 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 47 72 6f  Expr, pItem=pGro
2ac30 75 70 42 79 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d  upBy->a; k>0; k-
2ac40 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  -, pItem++){.   
2ac50 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e       pItem->u.x.
2ac60 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20  iAlias = 0;.    
2ac70 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d    }.      if( p-
2ac80 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 31 30 30 20  >nSelectRow>100 
2ac90 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  ) p->nSelectRow 
2aca0 3d 20 31 30 30 3b 0a 20 20 20 20 7d 65 6c 73 65  = 100;.    }else
2acb0 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65  {.      p->nSele
2acc0 63 74 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 7d  ctRow = 1;.    }
2acd0 0a 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ...    /* If the
2ace0 72 65 20 69 73 20 62 6f 74 68 20 61 20 47 52 4f  re is both a GRO
2acf0 55 50 20 42 59 20 61 6e 64 20 61 6e 20 4f 52 44  UP BY and an ORD
2ad00 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64  ER BY clause and
2ad10 20 74 68 65 79 20 61 72 65 0a 20 20 20 20 2a 2a   they are.    **
2ad20 20 69 64 65 6e 74 69 63 61 6c 2c 20 74 68 65 6e   identical, then
2ad30 20 69 74 20 6d 61 79 20 62 65 20 70 6f 73 73 69   it may be possi
2ad40 62 6c 65 20 74 6f 20 64 69 73 61 62 6c 65 20 74  ble to disable t
2ad50 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
2ad60 73 65 20 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68  se .    ** on th
2ad70 65 20 67 72 6f 75 6e 64 73 20 74 68 61 74 20 74  e grounds that t
2ad80 68 65 20 47 52 4f 55 50 20 42 59 20 77 69 6c 6c  he GROUP BY will
2ad90 20 63 61 75 73 65 20 65 6c 65 6d 65 6e 74 73 20   cause elements 
2ada0 74 6f 20 63 6f 6d 65 20 6f 75 74 20 0a 20 20 20  to come out .   
2adb0 20 2a 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65   ** in the corre
2adc0 63 74 20 6f 72 64 65 72 2e 20 49 74 20 61 6c 73  ct order. It als
2add0 6f 20 6d 61 79 20 6e 6f 74 20 2d 20 74 68 65 20  o may not - the 
2ade0 47 52 4f 55 50 20 42 59 20 6d 61 79 20 75 73 65  GROUP BY may use
2adf0 20 61 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61   a.    ** databa
2ae00 73 65 20 69 6e 64 65 78 20 74 68 61 74 20 63 61  se index that ca
2ae10 75 73 65 73 20 72 6f 77 73 20 74 6f 20 62 65 20  uses rows to be 
2ae20 67 72 6f 75 70 65 64 20 74 6f 67 65 74 68 65 72  grouped together
2ae30 20 61 73 20 72 65 71 75 69 72 65 64 0a 20 20 20   as required.   
2ae40 20 2a 2a 20 62 75 74 20 6e 6f 74 20 61 63 74 75   ** but not actu
2ae50 61 6c 6c 79 20 73 6f 72 74 65 64 2e 20 45 69 74  ally sorted. Eit
2ae60 68 65 72 20 77 61 79 2c 20 72 65 63 6f 72 64 20  her way, record 
2ae70 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74 68  the fact that th
2ae80 65 0a 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42  e.    ** ORDER B
2ae90 59 20 61 6e 64 20 47 52 4f 55 50 20 42 59 20 63  Y and GROUP BY c
2aea0 6c 61 75 73 65 73 20 61 72 65 20 74 68 65 20 73  lauses are the s
2aeb0 61 6d 65 20 62 79 20 73 65 74 74 69 6e 67 20 74  ame by setting t
2aec0 68 65 20 6f 72 64 65 72 42 79 47 72 70 0a 20 20  he orderByGrp.  
2aed0 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 2e 20 20    ** variable.  
2aee0 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
2aef0 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72  e3ExprListCompar
2af00 65 28 70 47 72 6f 75 70 42 79 2c 20 73 53 6f 72  e(pGroupBy, sSor
2af10 74 2e 70 4f 72 64 65 72 42 79 2c 20 2d 31 29 3d  t.pOrderBy, -1)=
2af20 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 72 64 65  =0 ){.      orde
2af30 72 42 79 47 72 70 20 3d 20 31 3b 0a 20 20 20 20  rByGrp = 1;.    
2af40 7d 0a 20 0a 20 20 20 20 2f 2a 20 43 72 65 61 74  }. .    /* Creat
2af50 65 20 61 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d  e a label to jum
2af60 70 20 74 6f 20 77 68 65 6e 20 77 65 20 77 61 6e  p to when we wan
2af70 74 20 74 6f 20 61 62 6f 72 74 20 74 68 65 20 71  t to abort the q
2af80 75 65 72 79 20 2a 2f 0a 20 20 20 20 61 64 64 72  uery */.    addr
2af90 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  End = sqlite3Vdb
2afa0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a  eMakeLabel(v);..
2afb0 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 54      /* Convert T
2afc0 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 69  K_COLUMN nodes i
2afd0 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  nto TK_AGG_COLUM
2afe0 4e 20 61 6e 64 20 6d 61 6b 65 20 65 6e 74 72 69  N and make entri
2aff0 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20 73 41 67  es in.    ** sAg
2b000 67 49 6e 66 6f 20 66 6f 72 20 61 6c 6c 20 54 4b  gInfo for all TK
2b010 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f  _AGG_FUNCTION no
2b020 64 65 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f  des in expressio
2b030 6e 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ns of the.    **
2b040 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
2b050 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65  t..    */.    me
2b060 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69  mset(&sNC, 0, si
2b070 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20  zeof(sNC));.    
2b080 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61  sNC.pParse = pPa
2b090 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72  rse;.    sNC.pSr
2b0a0 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74  cList = pTabList
2b0b0 3b 0a 20 20 20 20 73 4e 43 2e 70 41 67 67 49 6e  ;.    sNC.pAggIn
2b0c0 66 6f 20 3d 20 26 73 41 67 67 49 6e 66 6f 3b 0a  fo = &sAggInfo;.
2b0d0 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d 6e 52      sAggInfo.mnR
2b0e0 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  eg = pParse->nMe
2b0f0 6d 2b 31 3b 0a 20 20 20 20 73 41 67 67 49 6e 66  m+1;.    sAggInf
2b100 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e  o.nSortingColumn
2b110 20 3d 20 70 47 72 6f 75 70 42 79 20 3f 20 70 47   = pGroupBy ? pG
2b120 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2b 31 20  roupBy->nExpr+1 
2b130 3a 20 30 3b 0a 20 20 20 20 73 41 67 67 49 6e 66  : 0;.    sAggInf
2b140 6f 2e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72  o.pGroupBy = pGr
2b150 6f 75 70 42 79 3b 0a 20 20 20 20 73 71 6c 69 74  oupBy;.    sqlit
2b160 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
2b170 4c 69 73 74 28 26 73 4e 43 2c 20 70 45 4c 69 73  List(&sNC, pELis
2b180 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
2b190 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73  xprAnalyzeAggLis
2b1a0 74 28 26 73 4e 43 2c 20 73 53 6f 72 74 2e 70 4f  t(&sNC, sSort.pO
2b1b0 72 64 65 72 42 79 29 3b 0a 20 20 20 20 69 66 28  rderBy);.    if(
2b1c0 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20   pHaving ){.    
2b1d0 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61    sqlite3ExprAna
2b1e0 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 26  lyzeAggregates(&
2b1f0 73 4e 43 2c 20 70 48 61 76 69 6e 67 29 3b 0a 20  sNC, pHaving);. 
2b200 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e 66     }.    sAggInf
2b210 6f 2e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 3d  o.nAccumulator =
2b220 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d   sAggInfo.nColum
2b230 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  n;.    for(i=0; 
2b240 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63  i<sAggInfo.nFunc
2b250 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73  ; i++){.      as
2b260 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
2b270 6f 70 65 72 74 79 28 73 41 67 67 49 6e 66 6f 2e  operty(sAggInfo.
2b280 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2c 20  aFunc[i].pExpr, 
2b290 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
2b2a0 0a 20 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61  .      sNC.ncFla
2b2b0 67 73 20 7c 3d 20 4e 43 5f 49 6e 41 67 67 46 75  gs |= NC_InAggFu
2b2c0 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  nc;.      sqlite
2b2d0 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c  3ExprAnalyzeAggL
2b2e0 69 73 74 28 26 73 4e 43 2c 20 73 41 67 67 49 6e  ist(&sNC, sAggIn
2b2f0 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70  fo.aFunc[i].pExp
2b300 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20  r->x.pList);.   
2b310 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 26     sNC.ncFlags &
2b320 3d 20 7e 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b  = ~NC_InAggFunc;
2b330 0a 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49  .    }.    sAggI
2b340 6e 66 6f 2e 6d 78 52 65 67 20 3d 20 70 50 61 72  nfo.mxReg = pPar
2b350 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 66  se->nMem;.    if
2b360 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
2b370 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  ed ) goto select
2b380 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20 50 72  _end;..    /* Pr
2b390 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 61 67 67  ocessing for agg
2b3a0 72 65 67 61 74 65 73 20 77 69 74 68 20 47 52 4f  regates with GRO
2b3b0 55 50 20 42 59 20 69 73 20 76 65 72 79 20 64 69  UP BY is very di
2b3c0 66 66 65 72 65 6e 74 20 61 6e 64 0a 20 20 20 20  fferent and.    
2b3d0 2a 2a 20 6d 75 63 68 20 6d 6f 72 65 20 63 6f 6d  ** much more com
2b3e0 70 6c 65 78 20 74 68 61 6e 20 61 67 67 72 65 67  plex than aggreg
2b3f0 61 74 65 73 20 77 69 74 68 6f 75 74 20 61 20 47  ates without a G
2b400 52 4f 55 50 20 42 59 2e 0a 20 20 20 20 2a 2f 0a  ROUP BY..    */.
2b410 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79      if( pGroupBy
2b420 20 29 7b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66   ){.      KeyInf
2b430 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a  o *pKeyInfo;  /*
2b440 20 4b 65 79 69 6e 67 20 69 6e 66 6f 72 6d 61 74   Keying informat
2b450 69 6f 6e 20 66 6f 72 20 74 68 65 20 67 72 6f 75  ion for the grou
2b460 70 20 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a 20  p by clause */. 
2b470 20 20 20 20 20 69 6e 74 20 6a 31 3b 20 20 20 20       int j1;    
2b480 20 20 20 20 20 20 20 20 20 2f 2a 20 41 2d 76 73           /* A-vs
2b490 2d 42 20 63 6f 6d 70 61 72 69 73 69 6f 6e 20 6a  -B comparision j
2b4a0 75 6d 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ump */.      int
2b4b0 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 3b 20   addrOutputRow; 
2b4c0 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 73 75 62   /* Start of sub
2b4d0 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74  routine that out
2b4e0 70 75 74 73 20 61 20 72 65 73 75 6c 74 20 72 6f  puts a result ro
2b4f0 77 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72  w */.      int r
2b500 65 67 4f 75 74 70 75 74 52 6f 77 3b 20 20 20 2f  egOutputRow;   /
2b510 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65 73 73  * Return address
2b520 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 6f 75   register for ou
2b530 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 20  tput subroutine 
2b540 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
2b550 72 53 65 74 41 62 6f 72 74 3b 20 20 20 2f 2a 20  rSetAbort;   /* 
2b560 53 65 74 20 74 68 65 20 61 62 6f 72 74 20 66 6c  Set the abort fl
2b570 61 67 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f  ag and return */
2b580 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54  .      int addrT
2b590 6f 70 4f 66 4c 6f 6f 70 3b 20 20 2f 2a 20 54 6f  opOfLoop;  /* To
2b5a0 70 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 6c  p of the input l
2b5b0 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  oop */.      int
2b5c0 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 3b   addrSortingIdx;
2b5d0 20 2f 2a 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45   /* The OP_OpenE
2b5e0 70 68 65 6d 65 72 61 6c 20 66 6f 72 20 74 68 65  phemeral for the
2b5f0 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 2a   sorting index *
2b600 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
2b610 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53  Reset;      /* S
2b620 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 65  ubroutine for re
2b630 73 65 74 74 69 6e 67 20 74 68 65 20 61 63 63 75  setting the accu
2b640 6d 75 6c 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20  mulator */.     
2b650 20 69 6e 74 20 72 65 67 52 65 73 65 74 3b 20 20   int regReset;  
2b660 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61       /* Return a
2b670 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
2b680 66 6f 72 20 72 65 73 65 74 20 73 75 62 72 6f 75  for reset subrou
2b690 74 69 6e 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f  tine */..      /
2b6a0 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  * If there is a 
2b6b0 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
2b6c0 77 65 20 6d 69 67 68 74 20 6e 65 65 64 20 61 20  we might need a 
2b6d0 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 6f  sorting index to
2b6e0 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d  .      ** implem
2b6f0 65 6e 74 20 69 74 2e 20 20 41 6c 6c 6f 63 61 74  ent it.  Allocat
2b700 65 20 74 68 61 74 20 73 6f 72 74 69 6e 67 20 69  e that sorting i
2b710 6e 64 65 78 20 6e 6f 77 2e 20 20 49 66 20 69 74  ndex now.  If it
2b720 20 74 75 72 6e 73 20 6f 75 74 0a 20 20 20 20 20   turns out.     
2b730 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e   ** that we do n
2b740 6f 74 20 6e 65 65 64 20 69 74 20 61 66 74 65 72  ot need it after
2b750 20 61 6c 6c 2c 20 74 68 65 20 4f 50 5f 53 6f 72   all, the OP_Sor
2b760 74 65 72 4f 70 65 6e 20 69 6e 73 74 72 75 63 74  terOpen instruct
2b770 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c  ion.      ** wil
2b780 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69  l be converted i
2b790 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a 20 20  nto a Noop.  .  
2b7a0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 41 67      */.      sAg
2b7b0 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
2b7c0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
2b7d0 2b 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66  +;.      pKeyInf
2b7e0 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  o = keyInfoFromE
2b7f0 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
2b800 70 47 72 6f 75 70 42 79 2c 20 30 2c 20 30 29 3b  pGroupBy, 0, 0);
2b810 0a 20 20 20 20 20 20 61 64 64 72 53 6f 72 74 69  .      addrSorti
2b820 6e 67 49 64 78 20 3d 20 73 71 6c 69 74 65 33 56  ngIdx = sqlite3V
2b830 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
2b840 53 6f 72 74 65 72 4f 70 65 6e 2c 20 0a 20 20 20  SorterOpen, .   
2b850 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e         sAggInfo.
2b860 73 6f 72 74 69 6e 67 49 64 78 2c 20 73 41 67 67  sortingIdx, sAgg
2b870 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c  Info.nSortingCol
2b880 75 6d 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20  umn, .          
2b890 30 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e  0, (char*)pKeyIn
2b8a0 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
2b8b0 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69  ..      /* Initi
2b8c0 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f 63  alize memory loc
2b8d0 61 74 69 6f 6e 73 20 75 73 65 64 20 62 79 20 47  ations used by G
2b8e0 52 4f 55 50 20 42 59 20 61 67 67 72 65 67 61 74  ROUP BY aggregat
2b8f0 65 20 70 72 6f 63 65 73 73 69 6e 67 0a 20 20 20  e processing.   
2b900 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 55 73 65     */.      iUse
2b910 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d  Flag = ++pParse-
2b920 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69 41 62  >nMem;.      iAb
2b930 6f 72 74 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72  ortFlag = ++pPar
2b940 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
2b950 72 65 67 4f 75 74 70 75 74 52 6f 77 20 3d 20 2b  regOutputRow = +
2b960 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
2b970 20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74 52       addrOutputR
2b980 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ow = sqlite3Vdbe
2b990 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
2b9a0 20 20 20 20 72 65 67 52 65 73 65 74 20 3d 20 2b      regReset = +
2b9b0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
2b9c0 20 20 20 20 20 61 64 64 72 52 65 73 65 74 20 3d       addrReset =
2b9d0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
2b9e0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
2b9f0 69 41 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e  iAMem = pParse->
2ba00 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20  nMem + 1;.      
2ba10 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
2ba20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b  pGroupBy->nExpr;
2ba30 0a 20 20 20 20 20 20 69 42 4d 65 6d 20 3d 20 70  .      iBMem = p
2ba40 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b  Parse->nMem + 1;
2ba50 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
2ba60 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d  Mem += pGroupBy-
2ba70 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71  >nExpr;.      sq
2ba80 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2ba90 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
2baa0 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20  , iAbortFlag);. 
2bab0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
2bac0 28 28 76 2c 20 22 63 6c 65 61 72 20 61 62 6f 72  ((v, "clear abor
2bad0 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20  t flag"));.     
2bae0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2baf0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
2bb00 2c 20 30 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a  , 0, iUseFlag);.
2bb10 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
2bb20 74 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20  t((v, "indicate 
2bb30 61 63 63 75 6d 75 6c 61 74 6f 72 20 65 6d 70 74  accumulator empt
2bb40 79 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  y"));.      sqli
2bb50 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
2bb60 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 41 4d   OP_Null, 0, iAM
2bb70 65 6d 2c 20 69 41 4d 65 6d 2b 70 47 72 6f 75 70  em, iAMem+pGroup
2bb80 42 79 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 0a 20  By->nExpr-1);.. 
2bb90 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 61 20       /* Begin a 
2bba0 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 65  loop that will e
2bbb0 78 74 72 61 63 74 20 61 6c 6c 20 73 6f 75 72 63  xtract all sourc
2bbc0 65 20 72 6f 77 73 20 69 6e 20 47 52 4f 55 50 20  e rows in GROUP 
2bbd0 42 59 20 6f 72 64 65 72 2e 0a 20 20 20 20 20 20  BY order..      
2bbe0 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 69 6e  ** This might in
2bbf0 76 6f 6c 76 65 20 74 77 6f 20 73 65 70 61 72 61  volve two separa
2bc00 74 65 20 6c 6f 6f 70 73 20 77 69 74 68 20 61 6e  te loops with an
2bc10 20 4f 50 5f 53 6f 72 74 20 69 6e 20 62 65 74 77   OP_Sort in betw
2bc20 65 65 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a 2a  een, or.      **
2bc30 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 20 73   it might be a s
2bc40 69 6e 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74 20  ingle loop that 
2bc50 75 73 65 73 20 61 6e 20 69 6e 64 65 78 20 74 6f  uses an index to
2bc60 20 65 78 74 72 61 63 74 20 69 6e 66 6f 72 6d 61   extract informa
2bc70 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e  tion.      ** in
2bc80 20 74 68 65 20 72 69 67 68 74 20 6f 72 64 65 72   the right order
2bc90 20 74 6f 20 62 65 67 69 6e 20 77 69 74 68 2e 0a   to begin with..
2bca0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
2bcb0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2bcc0 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
2bcd0 67 52 65 73 65 74 2c 20 61 64 64 72 52 65 73 65  gReset, addrRese
2bce0 74 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f  t);.      pWInfo
2bcf0 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42   = sqlite3WhereB
2bd00 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61  egin(pParse, pTa
2bd10 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 70  bList, pWhere, p
2bd20 47 72 6f 75 70 42 79 2c 20 30 2c 0a 20 20 20 20  GroupBy, 0,.    
2bd30 20 20 20 20 20 20 57 48 45 52 45 5f 47 52 4f 55        WHERE_GROU
2bd40 50 42 59 20 7c 20 28 6f 72 64 65 72 42 79 47 72  PBY | (orderByGr
2bd50 70 20 3f 20 57 48 45 52 45 5f 53 4f 52 54 42 59  p ? WHERE_SORTBY
2bd60 47 52 4f 55 50 20 3a 20 30 29 2c 20 30 0a 20 20  GROUP : 0), 0.  
2bd70 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28      );.      if(
2bd80 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74   pWInfo==0 ) got
2bd90 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
2bda0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
2bdb0 68 65 72 65 49 73 4f 72 64 65 72 65 64 28 70 57  hereIsOrdered(pW
2bdc0 49 6e 66 6f 29 3d 3d 70 47 72 6f 75 70 42 79 2d  Info)==pGroupBy-
2bdd0 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
2bde0 20 20 2f 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a    /* The optimiz
2bdf0 65 72 20 69 73 20 61 62 6c 65 20 74 6f 20 64 65  er is able to de
2be00 6c 69 76 65 72 20 72 6f 77 73 20 69 6e 20 67 72  liver rows in gr
2be10 6f 75 70 20 62 79 20 6f 72 64 65 72 20 73 6f 0a  oup by order so.
2be20 20 20 20 20 20 20 20 20 2a 2a 20 77 65 20 64 6f          ** we do
2be30 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 73 6f 72   not have to sor
2be40 74 2e 20 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45  t.  The OP_OpenE
2be50 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77  phemeral table w
2be60 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a  ill be.        *
2be70 2a 20 63 61 6e 63 65 6c 6c 65 64 20 6c 61 74 65  * cancelled late
2be80 72 20 62 65 63 61 75 73 65 20 77 65 20 73 74 69  r because we sti
2be90 6c 6c 20 6e 65 65 64 20 74 6f 20 75 73 65 20 74  ll need to use t
2bea0 68 65 20 70 4b 65 79 49 6e 66 6f 0a 20 20 20 20  he pKeyInfo.    
2beb0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 67      */.        g
2bec0 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 30 3b 0a  roupBySort = 0;.
2bed0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2bee0 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 61 72 65       /* Rows are
2bef0 20 63 6f 6d 69 6e 67 20 6f 75 74 20 69 6e 20 75   coming out in u
2bf00 6e 64 65 74 65 72 6d 69 6e 65 64 20 6f 72 64 65  ndetermined orde
2bf10 72 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 70  r.  We have to p
2bf20 75 73 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 65  ush.        ** e
2bf30 61 63 68 20 72 6f 77 20 69 6e 74 6f 20 61 20 73  ach row into a s
2bf40 6f 72 74 69 6e 67 20 69 6e 64 65 78 2c 20 74 65  orting index, te
2bf50 72 6d 69 6e 61 74 65 20 74 68 65 20 66 69 72 73  rminate the firs
2bf60 74 20 6c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20  t loop,.        
2bf70 2a 2a 20 74 68 65 6e 20 6c 6f 6f 70 20 6f 76 65  ** then loop ove
2bf80 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e  r the sorting in
2bf90 64 65 78 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  dex in order to 
2bfa0 67 65 74 20 74 68 65 20 6f 75 74 70 75 74 0a 20  get the output. 
2bfb0 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 73 6f 72         ** in sor
2bfc0 74 65 64 20 6f 72 64 65 72 0a 20 20 20 20 20 20  ted order.      
2bfd0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74    */.        int
2bfe0 20 72 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20   regBase;.      
2bff0 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b    int regRecord;
2c000 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f  .        int nCo
2c010 6c 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  l;.        int n
2c020 47 72 6f 75 70 42 79 3b 0a 0a 20 20 20 20 20 20  GroupBy;..      
2c030 20 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62    explainTempTab
2c040 6c 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  le(pParse, .    
2c050 20 20 20 20 20 20 20 20 28 73 44 69 73 74 69 6e          (sDistin
2c060 63 74 2e 69 73 54 6e 63 74 20 26 26 20 28 70 2d  ct.isTnct && (p-
2c070 3e 73 65 6c 46 6c 61 67 73 26 53 46 5f 44 69 73  >selFlags&SF_Dis
2c080 74 69 6e 63 74 29 3d 3d 30 29 20 3f 0a 20 20 20  tinct)==0) ?.   
2c090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c0a0 20 22 44 49 53 54 49 4e 43 54 22 20 3a 20 22 47   "DISTINCT" : "G
2c0b0 52 4f 55 50 20 42 59 22 29 3b 0a 0a 20 20 20 20  ROUP BY");..    
2c0c0 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20      groupBySort 
2c0d0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 6e 47 72  = 1;.        nGr
2c0e0 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79  oupBy = pGroupBy
2c0f0 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->nExpr;.       
2c100 20 6e 43 6f 6c 20 3d 20 6e 47 72 6f 75 70 42 79   nCol = nGroupBy
2c110 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 6a 20   + 1;.        j 
2c120 3d 20 6e 47 72 6f 75 70 42 79 2b 31 3b 0a 20 20  = nGroupBy+1;.  
2c130 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
2c140 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d  <sAggInfo.nColum
2c150 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
2c160 20 20 20 69 66 28 20 73 41 67 67 49 6e 66 6f 2e     if( sAggInfo.
2c170 61 43 6f 6c 5b 69 5d 2e 69 53 6f 72 74 65 72 43  aCol[i].iSorterC
2c180 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20  olumn>=j ){.    
2c190 20 20 20 20 20 20 20 20 6e 43 6f 6c 2b 2b 3b 0a          nCol++;.
2c1a0 20 20 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b              j++;
2c1b0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2c1c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
2c1d0 65 67 42 61 73 65 20 3d 20 73 71 6c 69 74 65 33  egBase = sqlite3
2c1e0 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
2c1f0 72 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20  rse, nCol);.    
2c200 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
2c210 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
2c220 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2c230 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
2c240 73 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75  st(pParse, pGrou
2c250 70 42 79 2c 20 72 65 67 42 61 73 65 2c 20 30 29  pBy, regBase, 0)
2c260 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2c270 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2c280 50 5f 53 65 71 75 65 6e 63 65 2c 20 73 41 67 67  P_Sequence, sAgg
2c290 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c  Info.sortingIdx,
2c2a0 72 65 67 42 61 73 65 2b 6e 47 72 6f 75 70 42 79  regBase+nGroupBy
2c2b0 29 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e  );.        j = n
2c2c0 47 72 6f 75 70 42 79 2b 31 3b 0a 20 20 20 20 20  GroupBy+1;.     
2c2d0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41     for(i=0; i<sA
2c2e0 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20  ggInfo.nColumn; 
2c2f0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
2c300 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63  struct AggInfo_c
2c310 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 73 41 67 67  ol *pCol = &sAgg
2c320 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a 20 20  Info.aCol[i];.  
2c330 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
2c340 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e  ->iSorterColumn>
2c350 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =j ){.          
2c360 20 20 69 6e 74 20 72 31 20 3d 20 6a 20 2b 20 72    int r1 = j + r
2c370 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20  egBase;.        
2c380 20 20 20 20 69 6e 74 20 72 32 3b 0a 0a 20 20 20      int r2;..   
2c390 20 20 20 20 20 20 20 20 20 72 32 20 3d 20 73 71           r2 = sq
2c3a0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
2c3b0 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 0a  Column(pParse, .
2c3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2c3e0 43 6f 6c 2d 3e 70 54 61 62 2c 20 70 43 6f 6c 2d  Col->pTab, pCol-
2c3f0 3e 69 43 6f 6c 75 6d 6e 2c 20 70 43 6f 6c 2d 3e  >iColumn, pCol->
2c400 69 54 61 62 6c 65 2c 20 72 31 2c 20 30 29 3b 0a  iTable, r1, 0);.
2c410 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2c420 72 31 21 3d 72 32 20 29 7b 0a 20 20 20 20 20 20  r1!=r2 ){.      
2c430 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2c440 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2c450 53 43 6f 70 79 2c 20 72 32 2c 20 72 31 29 3b 0a  SCopy, r2, r1);.
2c460 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2c470 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20            j++;. 
2c480 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2c490 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67     }.        reg
2c4a0 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33  Record = sqlite3
2c4b0 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
2c4c0 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
2c4d0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
2c4e0 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
2c4f0 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c 2c 20 72  regBase, nCol, r
2c500 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20  egRecord);.     
2c510 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2c520 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
2c530 72 49 6e 73 65 72 74 2c 20 73 41 67 67 49 6e 66  rInsert, sAggInf
2c540 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 72 65  o.sortingIdx, re
2c550 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20  gRecord);.      
2c560 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
2c570 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
2c580 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20  regRecord);.    
2c590 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
2c5a0 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  seTempRange(pPar
2c5b0 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f  se, regBase, nCo
2c5c0 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
2c5d0 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e  te3WhereEnd(pWIn
2c5e0 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 41 67  fo);.        sAg
2c5f0 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
2c600 50 54 61 62 20 3d 20 73 6f 72 74 50 54 61 62 20  PTab = sortPTab 
2c610 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
2c620 3b 0a 20 20 20 20 20 20 20 20 73 6f 72 74 4f 75  ;.        sortOu
2c630 74 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  t = sqlite3GetTe
2c640 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
2c650 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2c660 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f  beAddOp3(v, OP_O
2c670 70 65 6e 50 73 65 75 64 6f 2c 20 73 6f 72 74 50  penPseudo, sortP
2c680 54 61 62 2c 20 73 6f 72 74 4f 75 74 2c 20 6e 43  Tab, sortOut, nC
2c690 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
2c6a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2c6b0 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c  , OP_SorterSort,
2c6c0 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
2c6d0 67 49 64 78 2c 20 61 64 64 72 45 6e 64 29 3b 0a  gIdx, addrEnd);.
2c6e0 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
2c6f0 65 6e 74 28 28 76 2c 20 22 47 52 4f 55 50 20 42  ent((v, "GROUP B
2c700 59 20 73 6f 72 74 22 29 29 3b 20 56 64 62 65 43  Y sort")); VdbeC
2c710 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
2c720 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 75 73 65      sAggInfo.use
2c730 53 6f 72 74 69 6e 67 49 64 78 20 3d 20 31 3b 0a  SortingIdx = 1;.
2c740 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
2c750 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
2c760 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 7d 0a  arse);..      }.
2c770 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
2c780 20 69 6e 64 65 78 20 6f 72 20 74 65 6d 70 6f 72   index or tempor
2c790 61 72 79 20 74 61 62 6c 65 20 75 73 65 64 20 62  ary table used b
2c7a0 79 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 73  y the GROUP BY s
2c7b0 6f 72 74 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c  ort.      ** wil
2c7c0 6c 20 6e 61 74 75 72 61 6c 6c 79 20 64 65 6c 69  l naturally deli
2c7d0 76 65 72 20 72 6f 77 73 20 69 6e 20 74 68 65 20  ver rows in the 
2c7e0 6f 72 64 65 72 20 72 65 71 75 69 72 65 64 20 62  order required b
2c7f0 79 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a 20  y the ORDER BY. 
2c800 20 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 2c 20       ** clause, 
2c810 63 61 6e 63 65 6c 20 74 68 65 20 65 70 68 65 6d  cancel the ephem
2c820 65 72 61 6c 20 74 61 62 6c 65 20 6f 70 65 6e 20  eral table open 
2c830 63 6f 64 65 64 20 65 61 72 6c 69 65 72 2e 0a 20  coded earlier.. 
2c840 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
2c850 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69   This is an opti
2c860 6d 69 7a 61 74 69 6f 6e 20 2d 20 74 68 65 20 63  mization - the c
2c870 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20 73 68  orrect answer sh
2c880 6f 75 6c 64 20 72 65 73 75 6c 74 20 72 65 67 61  ould result rega
2c890 72 64 6c 65 73 73 2e 0a 20 20 20 20 20 20 2a 2a  rdless..      **
2c8a0 20 55 73 65 20 74 68 65 20 53 51 4c 49 54 45 5f   Use the SQLITE_
2c8b0 47 72 6f 75 70 42 79 4f 72 64 65 72 20 66 6c 61  GroupByOrder fla
2c8c0 67 20 77 69 74 68 20 53 51 4c 49 54 45 5f 54 45  g with SQLITE_TE
2c8d0 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 45 52  STCTRL_OPTIMIZER
2c8e0 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 64 69   to .      ** di
2c8f0 73 61 62 6c 65 20 74 68 69 73 20 6f 70 74 69 6d  sable this optim
2c900 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74 65 73 74  ization for test
2c910 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 20 20 2a  ing purposes.  *
2c920 2f 0a 20 20 20 20 20 20 69 66 28 20 6f 72 64 65  /.      if( orde
2c930 72 42 79 47 72 70 20 26 26 20 4f 70 74 69 6d 69  rByGrp && Optimi
2c940 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62  zationEnabled(db
2c950 2c 20 53 51 4c 49 54 45 5f 47 72 6f 75 70 42 79  , SQLITE_GroupBy
2c960 4f 72 64 65 72 29 20 0a 20 20 20 20 20 20 20 26  Order) .       &
2c970 26 20 28 67 72 6f 75 70 42 79 53 6f 72 74 20 7c  & (groupBySort |
2c980 7c 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73  | sqlite3WhereIs
2c990 53 6f 72 74 65 64 28 70 57 49 6e 66 6f 29 29 0a  Sorted(pWInfo)).
2c9a0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
2c9b0 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20   sSort.pOrderBy 
2c9c0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  = 0;.        sql
2c9d0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f  ite3VdbeChangeTo
2c9e0 4e 6f 6f 70 28 76 2c 20 73 53 6f 72 74 2e 61 64  Noop(v, sSort.ad
2c9f0 64 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20  drSortIndex);.  
2ca00 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
2ca10 45 76 61 6c 75 61 74 65 20 74 68 65 20 63 75 72  Evaluate the cur
2ca20 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65  rent GROUP BY te
2ca30 72 6d 73 20 61 6e 64 20 73 74 6f 72 65 20 69 6e  rms and store in
2ca40 20 62 30 2c 20 62 31 2c 20 62 32 2e 2e 2e 0a 20   b0, b1, b2.... 
2ca50 20 20 20 20 20 2a 2a 20 28 62 30 20 69 73 20 6d       ** (b0 is m
2ca60 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 69  emory location i
2ca70 42 4d 65 6d 2b 30 2c 20 62 31 20 69 73 20 69 42  BMem+0, b1 is iB
2ca80 4d 65 6d 2b 31 2c 20 61 6e 64 20 73 6f 20 66 6f  Mem+1, and so fo
2ca90 72 74 68 29 0a 20 20 20 20 20 20 2a 2a 20 54 68  rth).      ** Th
2caa0 65 6e 20 63 6f 6d 70 61 72 65 20 74 68 65 20 63  en compare the c
2cab0 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20  urrent GROUP BY 
2cac0 74 65 72 6d 73 20 61 67 61 69 6e 73 74 20 74 68  terms against th
2cad0 65 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73  e GROUP BY terms
2cae0 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74  .      ** from t
2caf0 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20  he previous row 
2cb00 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64  currently stored
2cb10 20 69 6e 20 61 30 2c 20 61 31 2c 20 61 32 2e 2e   in a0, a1, a2..
2cb20 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2cb30 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 20 3d   addrTopOfLoop =
2cb40 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
2cb50 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
2cb60 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
2cb70 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
2cb80 0a 20 20 20 20 20 20 69 66 28 20 67 72 6f 75 70  .      if( group
2cb90 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20  BySort ){.      
2cba0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2cbb0 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op2(v, OP_Sorter
2cbc0 44 61 74 61 2c 20 73 41 67 67 49 6e 66 6f 2e 73  Data, sAggInfo.s
2cbd0 6f 72 74 69 6e 67 49 64 78 2c 20 73 6f 72 74 4f  ortingIdx, sortO
2cbe0 75 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ut);.      }.   
2cbf0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47     for(j=0; j<pG
2cc00 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 6a  roupBy->nExpr; j
2cc10 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
2cc20 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a   groupBySort ){.
2cc30 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2cc40 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
2cc50 50 5f 43 6f 6c 75 6d 6e 2c 20 73 6f 72 74 50 54  P_Column, sortPT
2cc60 61 62 2c 20 6a 2c 20 69 42 4d 65 6d 2b 6a 29 3b  ab, j, iBMem+j);
2cc70 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a  .          if( j
2cc80 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64 62  ==0 ) sqlite3Vdb
2cc90 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
2cca0 4c 41 47 5f 43 4c 45 41 52 43 41 43 48 45 29 3b  LAG_CLEARCACHE);
2ccb0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2ccc0 20 20 20 20 20 20 20 20 20 20 73 41 67 67 49 6e            sAggIn
2ccd0 66 6f 2e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20  fo.directMode = 
2cce0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  1;.          sql
2ccf0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
2cd00 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61  rse, pGroupBy->a
2cd10 5b 6a 5d 2e 70 45 78 70 72 2c 20 69 42 4d 65 6d  [j].pExpr, iBMem
2cd20 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  +j);.        }. 
2cd30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
2cd40 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
2cd50 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 69 41  , OP_Compare, iA
2cd60 4d 65 6d 2c 20 69 42 4d 65 6d 2c 20 70 47 72 6f  Mem, iBMem, pGro
2cd70 75 70 42 79 2d 3e 6e 45 78 70 72 2c 0a 20 20 20  upBy->nExpr,.   
2cd80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cd90 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 73 71         (char*)sq
2cda0 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28  lite3KeyInfoRef(
2cdb0 70 4b 65 79 49 6e 66 6f 29 2c 20 50 34 5f 4b 45  pKeyInfo), P4_KE
2cdc0 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 6a 31  YINFO);.      j1
2cdd0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
2cde0 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
2cdf0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2ce00 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70  ddOp3(v, OP_Jump
2ce10 2c 20 6a 31 2b 31 2c 20 30 2c 20 6a 31 2b 31 29  , j1+1, 0, j1+1)
2ce20 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
2ce30 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e  );..      /* Gen
2ce40 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
2ce50 72 75 6e 73 20 77 68 65 6e 65 76 65 72 20 74 68  runs whenever th
2ce60 65 20 47 52 4f 55 50 20 42 59 20 63 68 61 6e 67  e GROUP BY chang
2ce70 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68 61  es..      ** Cha
2ce80 6e 67 65 73 20 69 6e 20 74 68 65 20 47 52 4f 55  nges in the GROU
2ce90 50 20 42 59 20 61 72 65 20 64 65 74 65 63 74 65  P BY are detecte
2cea0 64 20 62 79 20 74 68 65 20 70 72 65 76 69 6f 75  d by the previou
2ceb0 73 20 63 6f 64 65 0a 20 20 20 20 20 20 2a 2a 20  s code.      ** 
2cec0 62 6c 6f 63 6b 2e 20 20 49 66 20 74 68 65 72 65  block.  If there
2ced0 20 77 65 72 65 20 6e 6f 20 63 68 61 6e 67 65 73   were no changes
2cee0 2c 20 74 68 69 73 20 62 6c 6f 63 6b 20 69 73 20  , this block is 
2cef0 73 6b 69 70 70 65 64 2e 0a 20 20 20 20 20 20 2a  skipped..      *
2cf00 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20  *.      ** This 
2cf10 63 6f 64 65 20 63 6f 70 69 65 73 20 63 75 72 72  code copies curr
2cf20 65 6e 74 20 67 72 6f 75 70 20 62 79 20 74 65 72  ent group by ter
2cf30 6d 73 20 69 6e 20 62 30 2c 62 31 2c 62 32 2c 2e  ms in b0,b1,b2,.
2cf40 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72  ...      ** over
2cf50 20 74 6f 20 61 30 2c 61 31 2c 61 32 2e 20 20 49   to a0,a1,a2.  I
2cf60 74 20 74 68 65 6e 20 63 61 6c 6c 73 20 74 68 65  t then calls the
2cf70 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69   output subrouti
2cf80 6e 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  ne.      ** and 
2cf90 72 65 73 65 74 73 20 74 68 65 20 61 67 67 72 65  resets the aggre
2cfa0 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72  gate accumulator
2cfb0 20 72 65 67 69 73 74 65 72 73 20 69 6e 20 70 72   registers in pr
2cfc0 65 70 61 72 61 74 69 6f 6e 0a 20 20 20 20 20 20  eparation.      
2cfd0 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20  ** for the next 
2cfe0 47 52 4f 55 50 20 42 59 20 62 61 74 63 68 2e 0a  GROUP BY batch..
2cff0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
2d000 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f  qlite3ExprCodeMo
2d010 76 65 28 70 50 61 72 73 65 2c 20 69 42 4d 65 6d  ve(pParse, iBMem
2d020 2c 20 69 41 4d 65 6d 2c 20 70 47 72 6f 75 70 42  , iAMem, pGroupB
2d030 79 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20  y->nExpr);.     
2d040 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2d050 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
2d060 72 65 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64  regOutputRow, ad
2d070 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  drOutputRow);.  
2d080 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
2d090 28 76 2c 20 22 6f 75 74 70 75 74 20 6f 6e 65 20  (v, "output one 
2d0a0 72 6f 77 22 29 29 3b 0a 20 20 20 20 20 20 73 71  row"));.      sq
2d0b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2d0c0 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 41 62  v, OP_IfPos, iAb
2d0d0 6f 72 74 46 6c 61 67 2c 20 61 64 64 72 45 6e 64  ortFlag, addrEnd
2d0e0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
2d0f0 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  v);.      VdbeCo
2d100 6d 6d 65 6e 74 28 28 76 2c 20 22 63 68 65 63 6b  mment((v, "check
2d110 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a   abort flag"));.
2d120 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2d130 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
2d140 73 75 62 2c 20 72 65 67 52 65 73 65 74 2c 20 61  sub, regReset, a
2d150 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20  ddrReset);.     
2d160 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
2d170 20 22 72 65 73 65 74 20 61 63 63 75 6d 75 6c 61   "reset accumula
2d180 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f  tor"));..      /
2d190 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 67 67  * Update the agg
2d1a0 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74  regate accumulat
2d1b0 6f 72 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ors based on the
2d1c0 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 20 20 20 20   content of.    
2d1d0 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74    ** the current
2d1e0 20 72 6f 77 0a 20 20 20 20 20 20 2a 2f 0a 20 20   row.      */.  
2d1f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
2d200 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a  umpHere(v, j1);.
2d210 20 20 20 20 20 20 75 70 64 61 74 65 41 63 63 75        updateAccu
2d220 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20  mulator(pParse, 
2d230 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
2d240 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2d250 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
2d260 72 2c 20 31 2c 20 69 55 73 65 46 6c 61 67 29 3b  r, 1, iUseFlag);
2d270 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
2d280 6e 74 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65  nt((v, "indicate
2d290 20 64 61 74 61 20 69 6e 20 61 63 63 75 6d 75 6c   data in accumul
2d2a0 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20  ator"));..      
2d2b0 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6c 6f  /* End of the lo
2d2c0 6f 70 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  op.      */.    
2d2d0 20 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72    if( groupBySor
2d2e0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
2d2f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2d300 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c  , OP_SorterNext,
2d310 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
2d320 67 49 64 78 2c 20 61 64 64 72 54 6f 70 4f 66 4c  gIdx, addrTopOfL
2d330 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 56 64  oop);.        Vd
2d340 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
2d350 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2d360 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
2d370 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  End(pWInfo);.   
2d380 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2d390 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20  ChangeToNoop(v, 
2d3a0 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 29 3b  addrSortingIdx);
2d3b0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
2d3c0 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 66 69  /* Output the fi
2d3d0 6e 61 6c 20 72 6f 77 20 6f 66 20 72 65 73 75 6c  nal row of resul
2d3e0 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  t.      */.     
2d3f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2d400 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
2d410 72 65 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64  regOutputRow, ad
2d420 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  drOutputRow);.  
2d430 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
2d440 28 76 2c 20 22 6f 75 74 70 75 74 20 66 69 6e 61  (v, "output fina
2d450 6c 20 72 6f 77 22 29 29 3b 0a 0a 20 20 20 20 20  l row"));..     
2d460 20 2f 2a 20 4a 75 6d 70 20 6f 76 65 72 20 74 68   /* Jump over th
2d470 65 20 73 75 62 72 6f 75 74 69 6e 65 73 0a 20 20  e subroutines.  
2d480 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
2d490 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2d4a0 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64  , OP_Goto, 0, ad
2d4b0 64 72 45 6e 64 29 3b 0a 0a 20 20 20 20 20 20 2f  drEnd);..      /
2d4c0 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
2d4d0 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74  routine that out
2d4e0 70 75 74 73 20 61 20 73 69 6e 67 6c 65 20 72 6f  puts a single ro
2d4f0 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 0a  w of the result.
2d500 20 20 20 20 20 20 2a 2a 20 73 65 74 2e 20 20 54        ** set.  T
2d510 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20 66  his subroutine f
2d520 69 72 73 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68  irst looks at th
2d530 65 20 69 55 73 65 46 6c 61 67 2e 20 20 49 66 20  e iUseFlag.  If 
2d540 69 55 73 65 46 6c 61 67 0a 20 20 20 20 20 20 2a  iUseFlag.      *
2d550 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f  * is less than o
2d560 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c  r equal to zero,
2d570 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20   the subroutine 
2d580 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 0a  is a no-op.  If.
2d590 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72 6f        ** the pro
2d5a0 63 65 73 73 69 6e 67 20 63 61 6c 6c 73 20 66 6f  cessing calls fo
2d5b0 72 20 74 68 65 20 71 75 65 72 79 20 74 6f 20 61  r the query to a
2d5c0 62 6f 72 74 2c 20 74 68 69 73 20 73 75 62 72 6f  bort, this subro
2d5d0 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69  utine.      ** i
2d5e0 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20 69 41  ncrements the iA
2d5f0 62 6f 72 74 46 6c 61 67 20 6d 65 6d 6f 72 79 20  bortFlag memory 
2d600 6c 6f 63 61 74 69 6f 6e 20 62 65 66 6f 72 65 20  location before 
2d610 72 65 74 75 72 6e 69 6e 67 20 69 6e 0a 20 20 20  returning in.   
2d620 20 20 20 2a 2a 20 6f 72 64 65 72 20 74 6f 20 73     ** order to s
2d630 69 67 6e 61 6c 20 74 68 65 20 63 61 6c 6c 65 72  ignal the caller
2d640 20 74 6f 20 61 62 6f 72 74 2e 0a 20 20 20 20 20   to abort..     
2d650 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 53 65   */.      addrSe
2d660 74 41 62 6f 72 74 20 3d 20 73 71 6c 69 74 65 33  tAbort = sqlite3
2d670 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
2d680 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
2d690 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2d6a0 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 41  P_Integer, 1, iA
2d6b0 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20  bortFlag);.     
2d6c0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
2d6d0 20 22 73 65 74 20 61 62 6f 72 74 20 66 6c 61 67   "set abort flag
2d6e0 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
2d6f0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
2d700 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75  OP_Return, regOu
2d710 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  tputRow);.      
2d720 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
2d730 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4f  veLabel(v, addrO
2d740 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
2d750 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d   addrOutputRow =
2d760 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
2d770 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
2d780 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2d790 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c  Op2(v, OP_IfPos,
2d7a0 20 69 55 73 65 46 6c 61 67 2c 20 61 64 64 72 4f   iUseFlag, addrO
2d7b0 75 74 70 75 74 52 6f 77 2b 32 29 3b 20 56 64 62  utputRow+2); Vdb
2d7c0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
2d7d0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
2d7e0 28 76 2c 20 22 47 72 6f 75 70 62 79 20 72 65 73  (v, "Groupby res
2d7f0 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 20 65 6e  ult generator en
2d800 74 72 79 20 70 6f 69 6e 74 22 29 29 3b 0a 20 20  try point"));.  
2d810 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2d820 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
2d830 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77  rn, regOutputRow
2d840 29 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c 69 7a  );.      finaliz
2d850 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50  eAggFunctions(pP
2d860 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
2d870 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
2d880 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
2d890 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72  e, pHaving, addr
2d8a0 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 53 51 4c  OutputRow+1, SQL
2d8b0 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
2d8c0 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e  .      selectInn
2d8d0 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
2d8e0 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 2d 31 2c  , p->pEList, -1,
2d8f0 20 26 73 53 6f 72 74 2c 0a 20 20 20 20 20 20 20   &sSort,.       
2d900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
2d910 73 44 69 73 74 69 6e 63 74 2c 20 70 44 65 73 74  sDistinct, pDest
2d920 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2d930 20 20 20 20 20 20 20 20 61 64 64 72 4f 75 74 70          addrOutp
2d940 75 74 52 6f 77 2b 31 2c 20 61 64 64 72 53 65 74  utRow+1, addrSet
2d950 41 62 6f 72 74 29 3b 0a 20 20 20 20 20 20 73 71  Abort);.      sq
2d960 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
2d970 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65  v, OP_Return, re
2d980 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20  gOutputRow);.   
2d990 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
2d9a0 76 2c 20 22 65 6e 64 20 67 72 6f 75 70 62 79 20  v, "end groupby 
2d9b0 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72  result generator
2d9c0 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47  "));..      /* G
2d9d0 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
2d9e0 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 72  tine that will r
2d9f0 65 73 65 74 20 74 68 65 20 67 72 6f 75 70 2d 62  eset the group-b
2da00 79 20 61 63 63 75 6d 75 6c 61 74 6f 72 0a 20 20  y accumulator.  
2da10 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
2da20 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
2da30 61 62 65 6c 28 76 2c 20 61 64 64 72 52 65 73 65  abel(v, addrRese
2da40 74 29 3b 0a 20 20 20 20 20 20 72 65 73 65 74 41  t);.      resetA
2da50 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73  ccumulator(pPars
2da60 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
2da70 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2da80 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74  AddOp1(v, OP_Ret
2da90 75 72 6e 2c 20 72 65 67 52 65 73 65 74 29 3b 0a  urn, regReset);.
2daa0 20 20 20 20 20 0a 20 20 20 20 7d 20 2f 2a 20 65       .    } /* e
2dab0 6e 64 69 66 20 70 47 72 6f 75 70 42 79 2e 20 20  ndif pGroupBy.  
2dac0 42 65 67 69 6e 20 61 67 67 72 65 67 61 74 65 20  Begin aggregate 
2dad0 71 75 65 72 69 65 73 20 77 69 74 68 6f 75 74 20  queries without 
2dae0 47 52 4f 55 50 20 42 59 3a 20 2a 2f 0a 20 20 20  GROUP BY: */.   
2daf0 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 45 78   else {.      Ex
2db00 70 72 4c 69 73 74 20 2a 70 44 65 6c 20 3d 20 30  prList *pDel = 0
2db10 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
2db20 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54  _OMIT_BTREECOUNT
2db30 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
2db40 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70  ab;.      if( (p
2db50 54 61 62 20 3d 20 69 73 53 69 6d 70 6c 65 43 6f  Tab = isSimpleCo
2db60 75 6e 74 28 70 2c 20 26 73 41 67 67 49 6e 66 6f  unt(p, &sAggInfo
2db70 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))!=0 ){.       
2db80 20 2f 2a 20 49 66 20 69 73 53 69 6d 70 6c 65 43   /* If isSimpleC
2db90 6f 75 6e 74 28 29 20 72 65 74 75 72 6e 73 20 61  ount() returns a
2dba0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 54 61   pointer to a Ta
2dbb0 62 6c 65 20 73 74 72 75 63 74 75 72 65 2c 20 74  ble structure, t
2dbc0 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  hen.        ** t
2dbd0 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
2dbe0 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a   is of the form:
2dbf0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
2dc00 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20      **   SELECT 
2dc10 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c 74  count(*) FROM <t
2dc20 62 6c 3e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  bl>.        **. 
2dc30 20 20 20 20 20 20 20 2a 2a 20 77 68 65 72 65 20         ** where 
2dc40 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  the Table struct
2dc50 75 72 65 20 72 65 74 75 72 6e 65 64 20 72 65 70  ure returned rep
2dc60 72 65 73 65 6e 74 73 20 74 61 62 6c 65 20 3c 74  resents table <t
2dc70 62 6c 3e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  bl>..        **.
2dc80 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20          ** This 
2dc90 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73 6f 20  statement is so 
2dca0 63 6f 6d 6d 6f 6e 20 74 68 61 74 20 69 74 20 69  common that it i
2dcb0 73 20 6f 70 74 69 6d 69 7a 65 64 20 73 70 65 63  s optimized spec
2dcc0 69 61 6c 6c 79 2e 20 54 68 65 0a 20 20 20 20 20  ially. The.     
2dcd0 20 20 20 2a 2a 20 4f 50 5f 43 6f 75 6e 74 20 69     ** OP_Count i
2dce0 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 65 78  nstruction is ex
2dcf0 65 63 75 74 65 64 20 65 69 74 68 65 72 20 6f 6e  ecuted either on
2dd00 20 74 68 65 20 69 6e 74 6b 65 79 20 74 61 62 6c   the intkey tabl
2dd10 65 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a  e that.        *
2dd20 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64  * contains the d
2dd30 61 74 61 20 66 6f 72 20 74 61 62 6c 65 20 3c 74  ata for table <t
2dd40 62 6c 3e 20 6f 72 20 6f 6e 20 6f 6e 65 20 6f 66  bl> or on one of
2dd50 20 69 74 73 20 69 6e 64 65 78 65 73 2e 20 49 74   its indexes. It
2dd60 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 62  .        ** is b
2dd70 65 74 74 65 72 20 74 6f 20 65 78 65 63 75 74 65  etter to execute
2dd80 20 74 68 65 20 6f 70 20 6f 6e 20 61 6e 20 69 6e   the op on an in
2dd90 64 65 78 2c 20 61 73 20 69 6e 64 65 78 65 73 20  dex, as indexes 
2dda0 61 72 65 20 61 6c 6d 6f 73 74 0a 20 20 20 20 20  are almost.     
2ddb0 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 70 72     ** always spr
2ddc0 65 61 64 20 61 63 72 6f 73 73 20 6c 65 73 73 20  ead across less 
2ddd0 70 61 67 65 73 20 74 68 61 6e 20 74 68 65 69 72  pages than their
2dde0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
2ddf0 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  ables..        *
2de00 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  /.        const 
2de10 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65  int iDb = sqlite
2de20 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70  3SchemaToIndex(p
2de30 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d  Parse->db, pTab-
2de40 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20  >pSchema);.     
2de50 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 43 73     const int iCs
2de60 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
2de70 2b 2b 3b 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  ++;     /* Curso
2de80 72 20 74 6f 20 73 63 61 6e 20 62 2d 74 72 65 65  r to scan b-tree
2de90 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e 64 65   */.        Inde
2dea0 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20  x *pIdx;        
2deb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dec0 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72   /* Iterator var
2ded0 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  iable */.       
2dee0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
2def0 66 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  fo = 0;         
2df00 20 20 20 20 20 20 2f 2a 20 4b 65 79 69 6e 66 6f        /* Keyinfo
2df10 20 66 6f 72 20 73 63 61 6e 6e 65 64 20 69 6e 64   for scanned ind
2df20 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e  ex */.        In
2df30 64 65 78 20 2a 70 42 65 73 74 20 3d 20 30 3b 20  dex *pBest = 0; 
2df40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2df50 20 20 20 2f 2a 20 42 65 73 74 20 69 6e 64 65 78     /* Best index
2df60 20 66 6f 75 6e 64 20 73 6f 20 66 61 72 20 2a 2f   found so far */
2df70 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 6f  .        int iRo
2df80 6f 74 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b  ot = pTab->tnum;
2df90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2dfa0 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 73 63   Root page of sc
2dfb0 61 6e 6e 65 64 20 62 2d 74 72 65 65 20 2a 2f 0a  anned b-tree */.
2dfc0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2dfd0 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
2dfe0 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
2dff0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61         sqlite3Ta
2e000 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20  bleLock(pParse, 
2e010 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c  iDb, pTab->tnum,
2e020 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29   0, pTab->zName)
2e030 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65  ;..        /* Se
2e040 61 72 63 68 20 66 6f 72 20 74 68 65 20 69 6e 64  arch for the ind
2e050 65 78 20 74 68 61 74 20 68 61 73 20 74 68 65 20  ex that has the 
2e060 6c 6f 77 65 73 74 20 73 63 61 6e 20 63 6f 73 74  lowest scan cost
2e070 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
2e080 20 20 20 20 20 2a 2a 20 28 32 30 31 31 2d 30 34       ** (2011-04
2e090 2d 31 35 29 20 44 6f 20 6e 6f 74 20 64 6f 20 61  -15) Do not do a
2e0a0 20 66 75 6c 6c 20 73 63 61 6e 20 6f 66 20 61 6e   full scan of an
2e0b0 20 75 6e 6f 72 64 65 72 65 64 20 69 6e 64 65 78   unordered index
2e0c0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
2e0d0 20 20 20 20 20 2a 2a 20 28 32 30 31 33 2d 31 30       ** (2013-10
2e0e0 2d 30 33 29 20 44 6f 20 6e 6f 74 20 63 6f 75 6e  -03) Do not coun
2e0f0 74 20 74 68 65 20 65 6e 74 72 69 65 73 20 69 6e  t the entries in
2e100 20 61 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78   a partial index
2e110 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
2e120 20 20 20 20 20 2a 2a 20 49 6e 20 70 72 61 63 74       ** In pract
2e130 69 63 65 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  ice the KeyInfo 
2e140 73 74 72 75 63 74 75 72 65 20 77 69 6c 6c 20 6e  structure will n
2e150 6f 74 20 62 65 20 75 73 65 64 2e 20 49 74 20 69  ot be used. It i
2e160 73 20 6f 6e 6c 79 20 0a 20 20 20 20 20 20 20 20  s only .        
2e170 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 6b 65 65  ** passed to kee
2e180 70 20 4f 50 5f 4f 70 65 6e 52 65 61 64 20 68 61  p OP_OpenRead ha
2e190 70 70 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ppy..        */.
2e1a0 20 20 20 20 20 20 20 20 69 66 28 20 21 48 61 73          if( !Has
2e1b0 52 6f 77 69 64 28 70 54 61 62 29 20 29 20 70 42  Rowid(pTab) ) pB
2e1c0 65 73 74 20 3d 20 73 71 6c 69 74 65 33 50 72 69  est = sqlite3Pri
2e1d0 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61  maryKeyIndex(pTa
2e1e0 62 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  b);.        for(
2e1f0 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
2e200 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
2e210 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
2e220 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
2e230 62 55 6e 6f 72 64 65 72 65 64 3d 3d 30 0a 20 20  bUnordered==0.  
2e240 20 20 20 20 20 20 20 20 20 26 26 20 70 49 64 78           && pIdx
2e250 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 54 61 62 2d  ->szIdxRow<pTab-
2e260 3e 73 7a 54 61 62 52 6f 77 0a 20 20 20 20 20 20  >szTabRow.      
2e270 20 20 20 20 20 26 26 20 70 49 64 78 2d 3e 70 50       && pIdx->pP
2e280 61 72 74 49 64 78 57 68 65 72 65 3d 3d 30 0a 20  artIdxWhere==0. 
2e290 20 20 20 20 20 20 20 20 20 20 26 26 20 28 21 70            && (!p
2e2a0 42 65 73 74 20 7c 7c 20 70 49 64 78 2d 3e 73 7a  Best || pIdx->sz
2e2b0 49 64 78 52 6f 77 3c 70 42 65 73 74 2d 3e 73 7a  IdxRow<pBest->sz
2e2c0 49 64 78 52 6f 77 29 0a 20 20 20 20 20 20 20 20  IdxRow).        
2e2d0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
2e2e0 20 70 42 65 73 74 20 3d 20 70 49 64 78 3b 0a 20   pBest = pIdx;. 
2e2f0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2e300 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
2e310 20 70 42 65 73 74 20 29 7b 0a 20 20 20 20 20 20   pBest ){.      
2e320 20 20 20 20 69 52 6f 6f 74 20 3d 20 70 42 65 73      iRoot = pBes
2e330 74 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20  t->tnum;.       
2e340 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71     pKeyInfo = sq
2e350 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e  lite3KeyInfoOfIn
2e360 64 65 78 28 70 50 61 72 73 65 2c 20 70 42 65 73  dex(pParse, pBes
2e370 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  t);.        }.. 
2e380 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 61         /* Open a
2e390 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f   read-only curso
2e3a0 72 2c 20 65 78 65 63 75 74 65 20 74 68 65 20 4f  r, execute the O
2e3b0 50 5f 43 6f 75 6e 74 2c 20 63 6c 6f 73 65 20 74  P_Count, close t
2e3c0 68 65 20 63 75 72 73 6f 72 2e 20 2a 2f 0a 20 20  he cursor. */.  
2e3d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2e3e0 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
2e3f0 5f 4f 70 65 6e 52 65 61 64 2c 20 69 43 73 72 2c  _OpenRead, iCsr,
2e400 20 69 52 6f 6f 74 2c 20 69 44 62 2c 20 31 29 3b   iRoot, iDb, 1);
2e410 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4b 65  .        if( pKe
2e420 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20  yInfo ){.       
2e430 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
2e440 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63  angeP4(v, -1, (c
2e450 68 61 72 20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  har *)pKeyInfo, 
2e460 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P4_KEYINFO);.   
2e470 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
2e480 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2e490 28 76 2c 20 4f 50 5f 43 6f 75 6e 74 2c 20 69 43  (v, OP_Count, iC
2e4a0 73 72 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75  sr, sAggInfo.aFu
2e4b0 6e 63 5b 30 5d 2e 69 4d 65 6d 29 3b 0a 20 20 20  nc[0].iMem);.   
2e4c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2e4d0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp1(v, OP_Clo
2e4e0 73 65 2c 20 69 43 73 72 29 3b 0a 20 20 20 20 20  se, iCsr);.     
2e4f0 20 20 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65     explainSimple
2e500 43 6f 75 6e 74 28 70 50 61 72 73 65 2c 20 70 54  Count(pParse, pT
2e510 61 62 2c 20 70 42 65 73 74 29 3b 0a 20 20 20 20  ab, pBest);.    
2e520 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f    }else.#endif /
2e530 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54  * SQLITE_OMIT_BT
2e540 52 45 45 43 4f 55 4e 54 20 2a 2f 0a 20 20 20 20  REECOUNT */.    
2e550 20 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43    {.        /* C
2e560 68 65 63 6b 20 69 66 20 74 68 65 20 71 75 65 72  heck if the quer
2e570 79 20 69 73 20 6f 66 20 6f 6e 65 20 6f 66 20 74  y is of one of t
2e580 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72  he following for
2e590 6d 73 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ms:.        **. 
2e5a0 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45         **   SELE
2e5b0 43 54 20 6d 69 6e 28 78 29 20 46 52 4f 4d 20 2e  CT min(x) FROM .
2e5c0 2e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  ...        **   
2e5d0 53 45 4c 45 43 54 20 6d 61 78 28 78 29 20 46 52  SELECT max(x) FR
2e5e0 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 20 20 2a  OM ....        *
2e5f0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20  *.        ** If 
2e600 69 74 20 69 73 2c 20 74 68 65 6e 20 61 73 6b 20  it is, then ask 
2e610 74 68 65 20 63 6f 64 65 20 69 6e 20 77 68 65 72  the code in wher
2e620 65 2e 63 20 74 6f 20 61 74 74 65 6d 70 74 20 74  e.c to attempt t
2e630 6f 20 73 6f 72 74 20 72 65 73 75 6c 74 73 0a 20  o sort results. 
2e640 20 20 20 20 20 20 20 2a 2a 20 61 73 20 69 66 20         ** as if 
2e650 74 68 65 72 65 20 77 61 73 20 61 6e 20 22 4f 52  there was an "OR
2e660 44 45 52 20 4f 4e 20 78 22 20 6f 72 20 22 4f 52  DER ON x" or "OR
2e670 44 45 52 20 4f 4e 20 78 20 44 45 53 43 22 20 63  DER ON x DESC" c
2e680 6c 61 75 73 65 2e 20 0a 20 20 20 20 20 20 20 20  lause. .        
2e690 2a 2a 20 49 66 20 77 68 65 72 65 2e 63 20 69 73  ** If where.c is
2e6a0 20 61 62 6c 65 20 74 6f 20 70 72 6f 64 75 63 65   able to produce
2e6b0 20 72 65 73 75 6c 74 73 20 73 6f 72 74 65 64 20   results sorted 
2e6c0 69 6e 20 74 68 69 73 20 6f 72 64 65 72 2c 20 74  in this order, t
2e6d0 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  hen.        ** a
2e6e0 64 64 20 76 64 62 65 20 63 6f 64 65 20 74 6f 20  dd vdbe code to 
2e6f0 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65  break out of the
2e700 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 6f 70   processing loop
2e710 20 61 66 74 65 72 20 74 68 65 20 0a 20 20 20 20   after the .    
2e720 20 20 20 20 2a 2a 20 66 69 72 73 74 20 69 74 65      ** first ite
2e730 72 61 74 69 6f 6e 20 28 73 69 6e 63 65 20 74 68  ration (since th
2e740 65 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f  e first iteratio
2e750 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 73  n of the loop is
2e760 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 67 75 61   .        ** gua
2e770 72 61 6e 74 65 65 64 20 74 6f 20 6f 70 65 72 61  ranteed to opera
2e780 74 65 20 6f 6e 20 74 68 65 20 72 6f 77 20 77 69  te on the row wi
2e790 74 68 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 6f  th the minimum o
2e7a0 72 20 6d 61 78 69 6d 75 6d 20 0a 20 20 20 20 20  r maximum .     
2e7b0 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 78     ** value of x
2e7c0 2c 20 74 68 65 20 6f 6e 6c 79 20 72 6f 77 20 72  , the only row r
2e7d0 65 71 75 69 72 65 64 29 2e 0a 20 20 20 20 20 20  equired)..      
2e7e0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
2e7f0 41 20 73 70 65 63 69 61 6c 20 66 6c 61 67 20 6d  A special flag m
2e800 75 73 74 20 62 65 20 70 61 73 73 65 64 20 74 6f  ust be passed to
2e810 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
2e820 69 6e 28 29 20 74 6f 20 73 6c 69 67 68 74 6c 79  in() to slightly
2e830 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 69  .        ** modi
2e840 66 79 20 62 65 68 61 76 69 6f 72 20 61 73 20 66  fy behavior as f
2e850 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20 20 20  ollows:.        
2e860 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
2e870 2b 20 49 66 20 74 68 65 20 71 75 65 72 79 20 69  + If the query i
2e880 73 20 61 20 22 53 45 4c 45 43 54 20 6d 69 6e 28  s a "SELECT min(
2e890 78 29 22 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f  x)", then the lo
2e8a0 6f 70 20 63 6f 64 65 64 20 62 79 0a 20 20 20 20  op coded by.    
2e8b0 20 20 20 20 2a 2a 20 20 20 20 20 77 68 65 72 65      **     where
2e8c0 2e 63 20 73 68 6f 75 6c 64 20 6e 6f 74 20 69 74  .c should not it
2e8d0 65 72 61 74 65 20 6f 76 65 72 20 61 6e 79 20 76  erate over any v
2e8e0 61 6c 75 65 73 20 77 69 74 68 20 61 20 4e 55 4c  alues with a NUL
2e8f0 4c 20 76 61 6c 75 65 0a 20 20 20 20 20 20 20 20  L value.        
2e900 2a 2a 20 20 20 20 20 66 6f 72 20 78 2e 0a 20 20  **     for x..  
2e910 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
2e920 20 2a 2a 20 20 20 2b 20 54 68 65 20 6f 70 74 69   **   + The opti
2e930 6d 69 7a 65 72 20 63 6f 64 65 20 69 6e 20 77 68  mizer code in wh
2e940 65 72 65 2e 63 20 28 74 68 65 20 74 68 69 6e 67  ere.c (the thing
2e950 20 74 68 61 74 20 64 65 63 69 64 65 73 20 77 68   that decides wh
2e960 69 63 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  ich.        **  
2e970 20 20 20 69 6e 64 65 78 20 6f 72 20 69 6e 64 69     index or indi
2e980 63 65 73 20 74 6f 20 75 73 65 29 20 73 68 6f 75  ces to use) shou
2e990 6c 64 20 70 6c 61 63 65 20 61 20 64 69 66 66 65  ld place a diffe
2e9a0 72 65 6e 74 20 70 72 69 6f 72 69 74 79 20 6f 6e  rent priority on
2e9b0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20   .        **    
2e9c0 20 73 61 74 69 73 66 79 69 6e 67 20 74 68 65 20   satisfying the 
2e9d0 27 4f 52 44 45 52 20 42 59 27 20 63 6c 61 75 73  'ORDER BY' claus
2e9e0 65 20 74 68 61 6e 20 69 74 20 64 6f 65 73 20 69  e than it does i
2e9f0 6e 20 6f 74 68 65 72 20 63 61 73 65 73 2e 0a 20  n other cases.. 
2ea00 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 52 65         **     Re
2ea10 66 65 72 20 74 6f 20 63 6f 64 65 20 61 6e 64 20  fer to code and 
2ea20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 77 68 65 72  comments in wher
2ea30 65 2e 63 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  e.c for details.
2ea40 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
2ea50 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4d      ExprList *pM
2ea60 69 6e 4d 61 78 20 3d 20 30 3b 0a 20 20 20 20 20  inMax = 0;.     
2ea70 20 20 20 75 38 20 66 6c 61 67 20 3d 20 57 48 45     u8 flag = WHE
2ea80 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41  RE_ORDERBY_NORMA
2ea90 4c 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20  L;.        .    
2eaa0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
2eab0 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20  GroupBy==0 );.  
2eac0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 66 6c        assert( fl
2ead0 61 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ag==0 );.       
2eae0 20 69 66 28 20 70 2d 3e 70 48 61 76 69 6e 67 3d   if( p->pHaving=
2eaf0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2eb00 66 6c 61 67 20 3d 20 6d 69 6e 4d 61 78 51 75 65  flag = minMaxQue
2eb10 72 79 28 26 73 41 67 67 49 6e 66 6f 2c 20 26 70  ry(&sAggInfo, &p
2eb20 4d 69 6e 4d 61 78 29 3b 0a 20 20 20 20 20 20 20  MinMax);.       
2eb30 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
2eb40 74 28 20 66 6c 61 67 3d 3d 30 20 7c 7c 20 28 70  t( flag==0 || (p
2eb50 4d 69 6e 4d 61 78 21 3d 30 20 26 26 20 70 4d 69  MinMax!=0 && pMi
2eb60 6e 4d 61 78 2d 3e 6e 45 78 70 72 3d 3d 31 29 20  nMax->nExpr==1) 
2eb70 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20  );..        if( 
2eb80 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20  flag ){.        
2eb90 20 20 70 4d 69 6e 4d 61 78 20 3d 20 73 71 6c 69    pMinMax = sqli
2eba0 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
2ebb0 62 2c 20 70 4d 69 6e 4d 61 78 2c 20 30 29 3b 0a  b, pMinMax, 0);.
2ebc0 20 20 20 20 20 20 20 20 20 20 70 44 65 6c 20 3d            pDel =
2ebd0 20 70 4d 69 6e 4d 61 78 3b 0a 20 20 20 20 20 20   pMinMax;.      
2ebe0 20 20 20 20 69 66 28 20 70 4d 69 6e 4d 61 78 20      if( pMinMax 
2ebf0 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  && !db->mallocFa
2ec00 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  iled ){.        
2ec10 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30      pMinMax->a[0
2ec20 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 66 6c  ].sortOrder = fl
2ec30 61 67 21 3d 57 48 45 52 45 5f 4f 52 44 45 52 42  ag!=WHERE_ORDERB
2ec40 59 5f 4d 49 4e 20 3f 31 3a 30 3b 0a 20 20 20 20  Y_MIN ?1:0;.    
2ec50 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d          pMinMax-
2ec60 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 20  >a[0].pExpr->op 
2ec70 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20  = TK_COLUMN;.   
2ec80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2ec90 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 2f 2a   }.  .        /*
2eca0 20 54 68 69 73 20 63 61 73 65 20 72 75 6e 73 20   This case runs 
2ecb0 69 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65  if the aggregate
2ecc0 20 68 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59   has no GROUP BY
2ecd0 20 63 6c 61 75 73 65 2e 20 20 54 68 65 0a 20 20   clause.  The.  
2ece0 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73        ** process
2ecf0 69 6e 67 20 69 73 20 6d 75 63 68 20 73 69 6d 70  ing is much simp
2ed00 6c 65 72 20 73 69 6e 63 65 20 74 68 65 72 65 20  ler since there 
2ed10 69 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  is only a single
2ed20 20 72 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20   row.        ** 
2ed30 6f 66 20 6f 75 74 70 75 74 2e 0a 20 20 20 20 20  of output..     
2ed40 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65     */.        re
2ed50 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70  setAccumulator(p
2ed60 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
2ed70 29 3b 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66  );.        pWInf
2ed80 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  o = sqlite3Where
2ed90 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54  Begin(pParse, pT
2eda0 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20  abList, pWhere, 
2edb0 70 4d 69 6e 4d 61 78 2c 30 2c 66 6c 61 67 2c 30  pMinMax,0,flag,0
2edc0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
2edd0 57 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  WInfo==0 ){.    
2ede0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2edf0 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
2ee00 70 44 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  pDel);.         
2ee10 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
2ee20 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2ee30 20 20 20 20 75 70 64 61 74 65 41 63 63 75 6d 75      updateAccumu
2ee40 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73  lator(pParse, &s
2ee50 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
2ee60 20 20 61 73 73 65 72 74 28 20 70 4d 69 6e 4d 61    assert( pMinMa
2ee70 78 3d 3d 30 20 7c 7c 20 70 4d 69 6e 4d 61 78 2d  x==0 || pMinMax-
2ee80 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20 20  >nExpr==1 );.   
2ee90 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
2eea0 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28 70  WhereIsOrdered(p
2eeb0 57 49 6e 66 6f 29 3e 30 20 29 7b 0a 20 20 20 20  WInfo)>0 ){.    
2eec0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2eed0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
2eee0 74 6f 2c 20 30 2c 20 73 71 6c 69 74 65 33 57 68  to, 0, sqlite3Wh
2eef0 65 72 65 42 72 65 61 6b 4c 61 62 65 6c 28 70 57  ereBreakLabel(pW
2ef00 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20 20 20  Info));.        
2ef10 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
2ef20 2c 20 22 25 73 28 29 20 62 79 20 69 6e 64 65 78  , "%s() by index
2ef30 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
2ef40 20 20 20 28 66 6c 61 67 3d 3d 57 48 45 52 45 5f     (flag==WHERE_
2ef50 4f 52 44 45 52 42 59 5f 4d 49 4e 3f 22 6d 69 6e  ORDERBY_MIN?"min
2ef60 22 3a 22 6d 61 78 22 29 29 29 3b 0a 20 20 20 20  ":"max")));.    
2ef70 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
2ef80 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57  lite3WhereEnd(pW
2ef90 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 66  Info);.        f
2efa0 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69  inalizeAggFuncti
2efb0 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41 67  ons(pParse, &sAg
2efc0 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 7d 0a  gInfo);.      }.
2efd0 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72  .      sSort.pOr
2efe0 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20  derBy = 0;.     
2eff0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
2f000 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48 61 76  lse(pParse, pHav
2f010 69 6e 67 2c 20 61 64 64 72 45 6e 64 2c 20 53 51  ing, addrEnd, SQ
2f020 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
2f030 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e  ;.      selectIn
2f040 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
2f050 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 2d 31  p, p->pEList, -1
2f060 2c 20 30 2c 20 30 2c 20 0a 20 20 20 20 20 20 20  , 0, 0, .       
2f070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2f080 44 65 73 74 2c 20 61 64 64 72 45 6e 64 2c 20 61  Dest, addrEnd, a
2f090 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 73  ddrEnd);.      s
2f0a0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
2f0b0 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a  lete(db, pDel);.
2f0c0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
2f0d0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
2f0e0 6c 28 76 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20  l(v, addrEnd);. 
2f0f0 20 20 20 0a 20 20 7d 20 2f 2a 20 65 6e 64 69 66     .  } /* endif
2f100 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79   aggregate query
2f110 20 2a 2f 0a 0a 20 20 69 66 28 20 73 44 69 73 74   */..  if( sDist
2f120 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 3d 3d  inct.eTnctType==
2f130 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
2f140 4e 4f 52 44 45 52 45 44 20 29 7b 0a 20 20 20 20  NORDERED ){.    
2f150 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65  explainTempTable
2f160 28 70 50 61 72 73 65 2c 20 22 44 49 53 54 49 4e  (pParse, "DISTIN
2f170 43 54 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  CT");.  }..  /* 
2f180 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  If there is an O
2f190 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20  RDER BY clause, 
2f1a0 74 68 65 6e 20 77 65 20 6e 65 65 64 20 74 6f 20  then we need to 
2f1b0 73 6f 72 74 20 74 68 65 20 72 65 73 75 6c 74 73  sort the results
2f1c0 0a 20 20 2a 2a 20 61 6e 64 20 73 65 6e 64 20 74  .  ** and send t
2f1d0 68 65 6d 20 74 6f 20 74 68 65 20 63 61 6c 6c 62  hem to the callb
2f1e0 61 63 6b 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a  ack one by one..
2f1f0 20 20 2a 2f 0a 20 20 69 66 28 20 73 53 6f 72 74    */.  if( sSort
2f200 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  .pOrderBy ){.   
2f210 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c   explainTempTabl
2f220 65 28 70 50 61 72 73 65 2c 20 73 53 6f 72 74 2e  e(pParse, sSort.
2f230 6e 4f 42 53 61 74 3e 30 20 3f 20 22 52 49 47 48  nOBSat>0 ? "RIGH
2f240 54 20 50 41 52 54 20 4f 46 20 4f 52 44 45 52 20  T PART OF ORDER 
2f250 42 59 22 3a 22 4f 52 44 45 52 20 42 59 22 29 3b  BY":"ORDER BY");
2f260 0a 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72  .    generateSor
2f270 74 54 61 69 6c 28 70 50 61 72 73 65 2c 20 70 2c  tTail(pParse, p,
2f280 20 26 73 53 6f 72 74 2c 20 70 45 4c 69 73 74 2d   &sSort, pEList-
2f290 3e 6e 45 78 70 72 2c 20 70 44 65 73 74 29 3b 0a  >nExpr, pDest);.
2f2a0 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68    }..  /* Jump h
2f2b0 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68 69 73  ere to skip this
2f2c0 20 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71   query.  */.  sq
2f2d0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
2f2e0 4c 61 62 65 6c 28 76 2c 20 69 45 6e 64 29 3b 0a  Label(v, iEnd);.
2f2f0 0a 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54  .  /* The SELECT
2f300 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c   was successfull
2f310 79 20 63 6f 64 65 64 2e 20 20 20 53 65 74 20 74  y coded.   Set t
2f320 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 74  he return code t
2f330 6f 20 30 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69  o 0.  ** to indi
2f340 63 61 74 65 20 6e 6f 20 65 72 72 6f 72 73 2e 0a  cate no errors..
2f350 20 20 2a 2f 0a 20 20 72 63 20 3d 20 30 3b 0a 0a    */.  rc = 0;..
2f360 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d    /* Control jum
2f370 70 73 20 74 6f 20 68 65 72 65 20 69 66 20 61 6e  ps to here if an
2f380 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
2f390 74 65 72 65 64 20 61 62 6f 76 65 2c 20 6f 72 20  tered above, or 
2f3a0 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73  upon.  ** succes
2f3b0 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66 20 74  sful coding of t
2f3c0 68 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a  he SELECT..  */.
2f3d0 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 65 78  select_end:.  ex
2f3e0 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
2f3f0 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49  pParse->iSelectI
2f400 64 2c 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63  d, iRestoreSelec
2f410 74 49 64 29 3b 0a 0a 20 20 2f 2a 20 49 64 65 6e  tId);..  /* Iden
2f420 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  tify column name
2f430 73 20 69 66 20 72 65 73 75 6c 74 73 20 6f 66 20  s if results of 
2f440 74 68 65 20 53 45 4c 45 43 54 20 61 72 65 20 74  the SELECT are t
2f450 6f 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a  o be output..  *
2f460 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
2f470 54 45 5f 4f 4b 20 26 26 20 70 44 65 73 74 2d 3e  TE_OK && pDest->
2f480 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
2f490 74 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74  t ){.    generat
2f4a0 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  eColumnNames(pPa
2f4b0 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
2f4c0 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 73  EList);.  }..  s
2f4d0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
2f4e0 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 29 3b   sAggInfo.aCol);
2f4f0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
2f500 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46  (db, sAggInfo.aF
2f510 75 6e 63 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  unc);.  return r
2f520 63 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65  c;.}..#if define
2f530 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
2f540 54 52 45 45 5f 45 58 50 4c 41 49 4e 29 0a 2f 2a  TREE_EXPLAIN)./*
2f550 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 68  .** Generate a h
2f560 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 64 65  uman-readable de
2f570 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 61 20 74  scription of a t
2f580 68 65 20 53 65 6c 65 63 74 20 6f 62 6a 65 63 74  he Select object
2f590 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2f5a0 20 65 78 70 6c 61 69 6e 4f 6e 65 53 65 6c 65 63   explainOneSelec
2f5b0 74 28 56 64 62 65 20 2a 70 56 64 62 65 2c 20 53  t(Vdbe *pVdbe, S
2f5c0 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 73 71 6c  elect *p){.  sql
2f5d0 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
2f5e0 66 28 70 56 64 62 65 2c 20 22 53 45 4c 45 43 54  f(pVdbe, "SELECT
2f5f0 20 22 29 3b 0a 20 20 69 66 28 20 70 2d 3e 73 65   ");.  if( p->se
2f600 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73  lFlags & (SF_Dis
2f610 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61  tinct|SF_Aggrega
2f620 74 65 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70  te) ){.    if( p
2f630 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
2f640 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
2f650 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2f660 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 44  Printf(pVdbe, "D
2f670 49 53 54 49 4e 43 54 20 22 29 3b 0a 20 20 20 20  ISTINCT ");.    
2f680 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 65 6c  }.    if( p->sel
2f690 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65  Flags & SF_Aggre
2f6a0 67 61 74 65 20 29 7b 0a 20 20 20 20 20 20 73 71  gate ){.      sq
2f6b0 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
2f6c0 74 66 28 70 56 64 62 65 2c 20 22 61 67 67 5f 66  tf(pVdbe, "agg_f
2f6d0 6c 61 67 20 22 29 3b 0a 20 20 20 20 7d 0a 20 20  lag ");.    }.  
2f6e0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2f6f0 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 20 20 73  NL(pVdbe);.    s
2f700 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
2f710 6e 74 66 28 70 56 64 62 65 2c 20 22 20 20 20 22  ntf(pVdbe, "   "
2f720 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
2f730 45 78 70 6c 61 69 6e 45 78 70 72 4c 69 73 74 28  ExplainExprList(
2f740 70 56 64 62 65 2c 20 70 2d 3e 70 45 4c 69 73 74  pVdbe, p->pEList
2f750 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 6c  );.  sqlite3Expl
2f760 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20  ainNL(pVdbe);.  
2f770 69 66 28 20 70 2d 3e 70 53 72 63 20 26 26 20 70  if( p->pSrc && p
2f780 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 20 29 7b 0a  ->pSrc->nSrc ){.
2f790 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73      int i;.    s
2f7a0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
2f7b0 6e 74 66 28 70 56 64 62 65 2c 20 22 46 52 4f 4d  ntf(pVdbe, "FROM
2f7c0 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   ");.    sqlite3
2f7d0 45 78 70 6c 61 69 6e 50 75 73 68 28 70 56 64 62  ExplainPush(pVdb
2f7e0 65 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  e);.    for(i=0;
2f7f0 20 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63   i<p->pSrc->nSrc
2f800 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74  ; i++){.      st
2f810 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2f820 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 70  m *pItem = &p->p
2f830 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20  Src->a[i];.     
2f840 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
2f850 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 7b 25  rintf(pVdbe, "{%
2f860 64 2c 2a 7d 20 3d 20 22 2c 20 70 49 74 65 6d 2d  d,*} = ", pItem-
2f870 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  >iCursor);.     
2f880 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c   if( pItem->pSel
2f890 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ect ){.        s
2f8a0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 53 65 6c  qlite3ExplainSel
2f8b0 65 63 74 28 70 56 64 62 65 2c 20 70 49 74 65 6d  ect(pVdbe, pItem
2f8c0 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  ->pSelect);.    
2f8d0 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70      if( pItem->p
2f8e0 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Tab ){.         
2f8f0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
2f900 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 20 28  rintf(pVdbe, " (
2f910 74 61 62 6e 61 6d 65 3d 25 73 29 22 2c 20 70 49  tabname=%s)", pI
2f920 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  tem->pTab->zName
2f930 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2f940 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 49 74     }else if( pIt
2f950 65 6d 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  em->zName ){.   
2f960 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
2f970 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c  ainPrintf(pVdbe,
2f980 20 22 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a 4e   "%s", pItem->zN
2f990 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
2f9a0 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a      if( pItem->z
2f9b0 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20 20  Alias ){.       
2f9c0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
2f9d0 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 20 28  rintf(pVdbe, " (
2f9e0 41 53 20 25 73 29 22 2c 20 70 49 74 65 6d 2d 3e  AS %s)", pItem->
2f9f0 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 7d  zAlias);.      }
2fa00 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
2fa10 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  ->jointype & JT_
2fa20 4c 45 46 54 20 29 7b 0a 20 20 20 20 20 20 20 20  LEFT ){.        
2fa30 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
2fa40 69 6e 74 66 28 70 56 64 62 65 2c 20 22 20 4c 45  intf(pVdbe, " LE
2fa50 46 54 2d 4a 4f 49 4e 22 29 3b 0a 20 20 20 20 20  FT-JOIN");.     
2fa60 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
2fa70 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29  ExplainNL(pVdbe)
2fa80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
2fa90 74 65 33 45 78 70 6c 61 69 6e 50 6f 70 28 70 56  te3ExplainPop(pV
2faa0 64 62 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  dbe);.  }.  if( 
2fab0 70 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20 20 20  p->pWhere ){.   
2fac0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
2fad0 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 57 48  rintf(pVdbe, "WH
2fae0 45 52 45 20 22 29 3b 0a 20 20 20 20 73 71 6c 69  ERE ");.    sqli
2faf0 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70  te3ExplainExpr(p
2fb00 56 64 62 65 2c 20 70 2d 3e 70 57 68 65 72 65 29  Vdbe, p->pWhere)
2fb10 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
2fb20 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20  lainNL(pVdbe);. 
2fb30 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 47 72 6f   }.  if( p->pGro
2fb40 75 70 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  upBy ){.    sqli
2fb50 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
2fb60 28 70 56 64 62 65 2c 20 22 47 52 4f 55 50 42 59  (pVdbe, "GROUPBY
2fb70 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   ");.    sqlite3
2fb80 45 78 70 6c 61 69 6e 45 78 70 72 4c 69 73 74 28  ExplainExprList(
2fb90 70 56 64 62 65 2c 20 70 2d 3e 70 47 72 6f 75 70  pVdbe, p->pGroup
2fba0 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  By);.    sqlite3
2fbb0 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29  ExplainNL(pVdbe)
2fbc0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
2fbd0 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 73 71  Having ){.    sq
2fbe0 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
2fbf0 74 66 28 70 56 64 62 65 2c 20 22 48 41 56 49 4e  tf(pVdbe, "HAVIN
2fc00 47 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  G ");.    sqlite
2fc10 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70 56 64  3ExplainExpr(pVd
2fc20 62 65 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b  be, p->pHaving);
2fc30 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
2fc40 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20  ainNL(pVdbe);.  
2fc50 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65  }.  if( p->pOrde
2fc60 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  rBy ){.    sqlit
2fc70 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
2fc80 70 56 64 62 65 2c 20 22 4f 52 44 45 52 42 59 20  pVdbe, "ORDERBY 
2fc90 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  ");.    sqlite3E
2fca0 78 70 6c 61 69 6e 45 78 70 72 4c 69 73 74 28 70  xplainExprList(p
2fcb0 56 64 62 65 2c 20 70 2d 3e 70 4f 72 64 65 72 42  Vdbe, p->pOrderB
2fcc0 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  y);.    sqlite3E
2fcd0 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b  xplainNL(pVdbe);
2fce0 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4c  .  }.  if( p->pL
2fcf0 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  imit ){.    sqli
2fd00 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
2fd10 28 70 56 64 62 65 2c 20 22 4c 49 4d 49 54 20 22  (pVdbe, "LIMIT "
2fd20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
2fd30 70 6c 61 69 6e 45 78 70 72 28 70 56 64 62 65 2c  plainExpr(pVdbe,
2fd40 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20   p->pLimit);.   
2fd50 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e   sqlite3ExplainN
2fd60 4c 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a 20 20  L(pVdbe);.  }.  
2fd70 69 66 28 20 70 2d 3e 70 4f 66 66 73 65 74 20 29  if( p->pOffset )
2fd80 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
2fd90 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65  lainPrintf(pVdbe
2fda0 2c 20 22 4f 46 46 53 45 54 20 22 29 3b 0a 20 20  , "OFFSET ");.  
2fdb0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2fdc0 45 78 70 72 28 70 56 64 62 65 2c 20 70 2d 3e 70  Expr(pVdbe, p->p
2fdd0 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 73 71 6c  Offset);.    sql
2fde0 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56  ite3ExplainNL(pV
2fdf0 64 62 65 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64  dbe);.  }.}.void
2fe00 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 53   sqlite3ExplainS
2fe10 65 6c 65 63 74 28 56 64 62 65 20 2a 70 56 64 62  elect(Vdbe *pVdb
2fe20 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  e, Select *p){. 
2fe30 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20   if( p==0 ){.   
2fe40 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
2fe50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 28 6e  rintf(pVdbe, "(n
2fe60 75 6c 6c 2d 73 65 6c 65 63 74 29 22 29 3b 0a 20  ull-select)");. 
2fe70 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
2fe80 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
2fe90 75 73 68 28 70 56 64 62 65 29 3b 0a 20 20 77 68  ush(pVdbe);.  wh
2fea0 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 65 78  ile( p ){.    ex
2feb0 70 6c 61 69 6e 4f 6e 65 53 65 6c 65 63 74 28 70  plainOneSelect(p
2fec0 56 64 62 65 2c 20 70 29 3b 0a 20 20 20 20 70 20  Vdbe, p);.    p 
2fed0 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  = p->pNext;.    
2fee0 69 66 28 20 70 3d 3d 30 20 29 20 62 72 65 61 6b  if( p==0 ) break
2fef0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
2ff00 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20  lainNL(pVdbe);. 
2ff10 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2ff20 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22  nPrintf(pVdbe, "
2ff30 25 73 5c 6e 22 2c 20 73 65 6c 65 63 74 4f 70 4e  %s\n", selectOpN
2ff40 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 7d  ame(p->op));.  }
2ff50 0a 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69  .  sqlite3Explai
2ff60 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22  nPrintf(pVdbe, "
2ff70 45 4e 44 22 29 3b 0a 20 20 73 71 6c 69 74 65 33  END");.  sqlite3
2ff80 45 78 70 6c 61 69 6e 50 6f 70 28 70 56 64 62 65  ExplainPop(pVdbe
2ff90 29 3b 0a 7d 0a 0a 2f 2a 20 45 6e 64 20 6f 66 20  );.}../* End of 
2ffa0 74 68 65 20 73 74 72 75 63 74 75 72 65 20 64 65  the structure de
2ffb0 62 75 67 20 70 72 69 6e 74 69 6e 67 20 63 6f 64  bug printing cod
2ffc0 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e.**************
2ffd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ffe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2fff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
30010 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e  .#endif /* defin
30020 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
30030 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 29 20 2a  _TREE_EXPLAIN) *
30040 2f 0a                                            /.