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

Artifact bf5446f892259f2bb59b0fd9f123b37862b6282b:


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 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
3d80: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 70 75  ode that will pu
3d90: 73 68 20 74 68 65 20 72 65 63 6f 72 64 20 69 6e  sh the record in
3da0: 20 72 65 67 69 73 74 65 72 73 20 72 65 67 44 61   registers regDa
3db0: 74 61 0a 2a 2a 20 74 68 72 6f 75 67 68 20 72 65  ta.** through re
3dc0: 67 44 61 74 61 2b 6e 44 61 74 61 2d 31 20 6f 6e  gData+nData-1 on
3dd0: 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a  to the sorter..*
3de0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 75  /.static void pu
3df0: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20  shOntoSorter(.  
3e00: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
3e10: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72         /* Parser
3e20: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 6f   context */.  So
3e30: 72 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20  rtCtx *pSort,   
3e40: 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74       /* Informat
3e50: 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 4f 52  ion about the OR
3e60: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
3e70: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
3e80: 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ct,       /* The
3e90: 20 77 68 6f 6c 65 20 53 45 4c 45 43 54 20 73 74   whole SELECT st
3ea0: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  atement */.  int
3eb0: 20 72 65 67 44 61 74 61 2c 20 20 20 20 20 20 20   regData,       
3ec0: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 72 65 67      /* First reg
3ed0: 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 64 61  ister holding da
3ee0: 74 61 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20  ta to be sorted 
3ef0: 2a 2f 0a 20 20 69 6e 74 20 6e 44 61 74 61 20 20  */.  int nData  
3f00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3f10: 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
3f20: 73 20 69 6e 20 74 68 65 20 64 61 74 61 20 61 72  s in the data ar
3f30: 72 61 79 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  ray */.){.  Vdbe
3f40: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
3f50: 64 62 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  dbe;            
3f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3f70: 53 74 6d 74 20 75 6e 64 65 72 20 63 6f 6e 73 74  Stmt under const
3f80: 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ruction */.  int
3f90: 20 6e 45 78 70 72 20 3d 20 70 53 6f 72 74 2d 3e   nExpr = pSort->
3fa0: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
3fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3fc0: 20 4e 6f 2e 20 6f 66 20 4f 52 44 45 52 20 42 59   No. of ORDER BY
3fd0: 20 74 65 72 6d 73 20 2a 2f 0a 20 20 69 6e 74 20   terms */.  int 
3fe0: 6e 42 61 73 65 20 3d 20 6e 45 78 70 72 20 2b 20  nBase = nExpr + 
3ff0: 31 20 2b 20 6e 44 61 74 61 3b 20 20 20 20 20 20  1 + nData;      
4000: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4010: 46 69 65 6c 64 73 20 69 6e 20 73 6f 72 74 65 72  Fields in sorter
4020: 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74   record */.  int
4030: 20 72 65 67 42 61 73 65 20 3d 20 73 71 6c 69 74   regBase = sqlit
4040: 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
4050: 50 61 72 73 65 2c 20 6e 42 61 73 65 29 3b 20 2f  Parse, nBase); /
4060: 2a 20 52 65 67 73 20 66 6f 72 20 73 6f 72 74 65  * Regs for sorte
4070: 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  r record */.  in
4080: 74 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71  t regRecord = sq
4090: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
40a0: 70 50 61 72 73 65 29 3b 20 20 20 20 20 20 20 2f  pParse);       /
40b0: 2a 20 41 73 73 65 6d 62 6c 69 65 64 20 73 6f 72  * Assemblied sor
40c0: 74 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ter record */.  
40d0: 69 6e 74 20 6e 4f 42 53 61 74 20 3d 20 70 53 6f  int nOBSat = pSo
40e0: 72 74 2d 3e 6e 4f 42 53 61 74 3b 20 20 20 20 20  rt->nOBSat;     
40f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4100: 20 2f 2a 20 4e 6f 2e 20 4f 52 44 45 52 20 42 59   /* No. ORDER BY
4110: 20 74 65 72 6d 73 20 74 6f 20 73 6b 69 70 20 2a   terms to skip *
4120: 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20  /.  int op;     
4130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4140: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 63            /* Opc
4150: 6f 64 65 20 74 6f 20 61 64 64 20 73 6f 72 74 65  ode to add sorte
4160: 72 20 72 65 63 6f 72 64 20 74 6f 20 73 6f 72 74  r record to sort
4170: 65 72 20 2a 2f 0a 0a 20 20 73 71 6c 69 74 65 33  er */..  sqlite3
4180: 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
4190: 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2d 3e  (pParse, pSort->
41a0: 70 4f 72 64 65 72 42 79 2c 20 72 65 67 42 61 73  pOrderBy, regBas
41b0: 65 2c 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44  e, SQLITE_ECEL_D
41c0: 55 50 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  UP);.  sqlite3Vd
41d0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
41e0: 65 71 75 65 6e 63 65 2c 20 70 53 6f 72 74 2d 3e  equence, pSort->
41f0: 69 45 43 75 72 73 6f 72 2c 20 72 65 67 42 61 73  iECursor, regBas
4200: 65 2b 6e 45 78 70 72 29 3b 0a 20 20 73 71 6c 69  e+nExpr);.  sqli
4210: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
4220: 20 4f 50 5f 4d 6f 76 65 2c 20 72 65 67 44 61 74   OP_Move, regDat
4230: 61 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72  a, regBase+nExpr
4240: 2b 31 2c 20 6e 44 61 74 61 29 3b 0a 20 20 73 71  +1, nData);.  sq
4250: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
4260: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
4270: 2c 20 72 65 67 42 61 73 65 2b 6e 4f 42 53 61 74  , regBase+nOBSat
4280: 2c 20 6e 42 61 73 65 2d 6e 4f 42 53 61 74 2c 20  , nBase-nOBSat, 
4290: 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 69 66  regRecord);.  if
42a0: 28 20 6e 4f 42 53 61 74 3e 30 20 29 7b 0a 20 20  ( nOBSat>0 ){.  
42b0: 20 20 69 6e 74 20 72 65 67 50 72 65 76 4b 65 79    int regPrevKey
42c0: 3b 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74  ;   /* The first
42d0: 20 6e 4f 42 53 61 74 20 63 6f 6c 75 6d 6e 73 20   nOBSat columns 
42e0: 6f 66 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  of the previous 
42f0: 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61  row */.    int a
4300: 64 64 72 46 69 72 73 74 3b 20 20 20 20 2f 2a 20  ddrFirst;    /* 
4310: 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 4f  Address of the O
4320: 50 5f 49 66 4e 6f 74 20 6f 70 63 6f 64 65 20 2a  P_IfNot opcode *
4330: 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4a 6d  /.    int addrJm
4340: 70 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65  p;      /* Addre
4350: 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 4a 75 6d  ss of the OP_Jum
4360: 70 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20  p opcode */.    
4370: 56 64 62 65 4f 70 20 2a 70 4f 70 3b 20 20 20 20  VdbeOp *pOp;    
4380: 20 20 2f 2a 20 4f 70 63 6f 64 65 20 74 68 61 74    /* Opcode that
4390: 20 6f 70 65 6e 73 20 74 68 65 20 73 6f 72 74 65   opens the sorte
43a0: 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4b 65  r */.    int nKe
43b0: 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  y;         /* Nu
43c0: 6d 62 65 72 20 6f 66 20 73 6f 72 74 69 6e 67 20  mber of sorting 
43d0: 6b 65 79 20 63 6f 6c 75 6d 6e 73 2c 20 69 6e 63  key columns, inc
43e0: 6c 75 64 69 6e 67 20 4f 50 5f 53 65 71 75 65 6e  luding OP_Sequen
43f0: 63 65 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66  ce */.    KeyInf
4400: 6f 20 2a 70 4b 49 3b 20 20 20 20 20 2f 2a 20 4f  o *pKI;     /* O
4410: 72 69 67 69 6e 61 6c 20 4b 65 79 49 6e 66 6f 20  riginal KeyInfo 
4420: 6f 6e 20 74 68 65 20 73 6f 72 74 65 72 20 74 61  on the sorter ta
4430: 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 72 65 67 50  ble */..    regP
4440: 72 65 76 4b 65 79 20 3d 20 70 50 61 72 73 65 2d  revKey = pParse-
4450: 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61  >nMem+1;.    pPa
4460: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 53 6f  rse->nMem += pSo
4470: 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20 20 20  rt->nOBSat;.    
4480: 6e 4b 65 79 20 3d 20 6e 45 78 70 72 20 2d 20 70  nKey = nExpr - p
4490: 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 20 2b 20 31  Sort->nOBSat + 1
44a0: 3b 0a 20 20 20 20 61 64 64 72 46 69 72 73 74 20  ;.    addrFirst 
44b0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
44c0: 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c  Op1(v, OP_IfNot,
44d0: 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 29 3b   regBase+nExpr);
44e0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
44f0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
4500: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
4510: 6d 70 61 72 65 2c 20 72 65 67 50 72 65 76 4b 65  mpare, regPrevKe
4520: 79 2c 20 72 65 67 42 61 73 65 2c 20 70 53 6f 72  y, regBase, pSor
4530: 74 2d 3e 6e 4f 42 53 61 74 29 3b 0a 20 20 20 20  t->nOBSat);.    
4540: 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  pOp = sqlite3Vdb
4550: 65 47 65 74 4f 70 28 76 2c 20 70 53 6f 72 74 2d  eGetOp(v, pSort-
4560: 3e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29 3b  >addrSortIndex);
4570: 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
4580: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
4590: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  d ) return;.    
45a0: 70 4f 70 2d 3e 70 32 20 3d 20 6e 4b 65 79 20 2b  pOp->p2 = nKey +
45b0: 20 31 3b 0a 20 20 20 20 70 4b 49 20 3d 20 70 4f   1;.    pKI = pO
45c0: 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a  p->p4.pKeyInfo;.
45d0: 20 20 20 20 6d 65 6d 73 65 74 28 70 4b 49 2d 3e      memset(pKI->
45e0: 61 53 6f 72 74 4f 72 64 65 72 2c 20 30 2c 20 70  aSortOrder, 0, p
45f0: 4b 49 2d 3e 6e 46 69 65 6c 64 29 3b 20 2f 2a 20  KI->nField); /* 
4600: 4d 61 6b 65 73 20 4f 50 5f 4a 75 6d 70 20 62 65  Makes OP_Jump be
4610: 6c 6f 77 20 74 65 73 74 61 62 6c 65 20 2a 2f 0a  low testable */.
4620: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
4630: 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28  hangeP4(v, -1, (
4640: 63 68 61 72 2a 29 70 4b 49 2c 20 50 34 5f 4b 45  char*)pKI, P4_KE
4650: 59 49 4e 46 4f 29 3b 0a 20 20 20 20 70 4f 70 2d  YINFO);.    pOp-
4660: 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 6b  >p4.pKeyInfo = k
4670: 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
4680: 73 74 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74  st(pParse, pSort
4690: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 6e 4f 42 53  ->pOrderBy, nOBS
46a0: 61 74 2c 20 31 29 3b 0a 20 20 20 20 61 64 64 72  at, 1);.    addr
46b0: 4a 6d 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Jmp = sqlite3Vdb
46c0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
46d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
46e0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d  AddOp3(v, OP_Jum
46f0: 70 2c 20 61 64 64 72 4a 6d 70 2b 31 2c 20 30 2c  p, addrJmp+1, 0,
4700: 20 61 64 64 72 4a 6d 70 2b 31 29 3b 20 56 64 62   addrJmp+1); Vdb
4710: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
4720: 20 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b    pSort->labelBk
4730: 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Out = sqlite3Vdb
4740: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
4750: 20 20 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74     pSort->regRet
4760: 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  urn = ++pParse->
4770: 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65  nMem;.    sqlite
4780: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
4790: 50 5f 47 6f 73 75 62 2c 20 70 53 6f 72 74 2d 3e  P_Gosub, pSort->
47a0: 72 65 67 52 65 74 75 72 6e 2c 20 70 53 6f 72 74  regReturn, pSort
47b0: 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20  ->labelBkOut);. 
47c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
47d0: 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73 65 74  dOp1(v, OP_Reset
47e0: 53 6f 72 74 65 72 2c 20 70 53 6f 72 74 2d 3e 69  Sorter, pSort->i
47f0: 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 73 71  ECursor);.    sq
4800: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
4810: 65 28 76 2c 20 61 64 64 72 46 69 72 73 74 29 3b  e(v, addrFirst);
4820: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
4830: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 6f 76  AddOp3(v, OP_Mov
4840: 65 2c 20 72 65 67 42 61 73 65 2c 20 72 65 67 50  e, regBase, regP
4850: 72 65 76 4b 65 79 2c 20 70 53 6f 72 74 2d 3e 6e  revKey, pSort->n
4860: 4f 42 53 61 74 29 3b 0a 20 20 20 20 73 71 6c 69  OBSat);.    sqli
4870: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
4880: 76 2c 20 61 64 64 72 4a 6d 70 29 3b 0a 20 20 7d  v, addrJmp);.  }
4890: 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f  .  if( pSort->so
48a0: 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c  rtFlags & SORTFL
48b0: 41 47 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a  AG_UseSorter ){.
48c0: 20 20 20 20 6f 70 20 3d 20 4f 50 5f 53 6f 72 74      op = OP_Sort
48d0: 65 72 49 6e 73 65 72 74 3b 0a 20 20 7d 65 6c 73  erInsert;.  }els
48e0: 65 7b 0a 20 20 20 20 6f 70 20 3d 20 4f 50 5f 49  e{.    op = OP_I
48f0: 64 78 49 6e 73 65 72 74 3b 0a 20 20 7d 0a 20 20  dxInsert;.  }.  
4900: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4910: 32 28 76 2c 20 6f 70 2c 20 70 53 6f 72 74 2d 3e  2(v, op, pSort->
4920: 69 45 43 75 72 73 6f 72 2c 20 72 65 67 52 65 63  iECursor, regRec
4930: 6f 72 64 29 3b 0a 20 20 69 66 28 20 6e 4f 42 53  ord);.  if( nOBS
4940: 61 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  at==0 ){.    sql
4950: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
4960: 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65  eg(pParse, regRe
4970: 63 6f 72 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  cord);.    sqlit
4980: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
4990: 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 42 61  ge(pParse, regBa
49a0: 73 65 2c 20 6e 42 61 73 65 29 3b 0a 20 20 7d 0a  se, nBase);.  }.
49b0: 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 69    if( pSelect->i
49c0: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 69 6e 74  Limit ){.    int
49d0: 20 61 64 64 72 31 2c 20 61 64 64 72 32 3b 0a 20   addr1, addr2;. 
49e0: 20 20 20 69 6e 74 20 69 4c 69 6d 69 74 3b 0a 20     int iLimit;. 
49f0: 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e     if( pSelect->
4a00: 69 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20  iOffset ){.     
4a10: 20 69 4c 69 6d 69 74 20 3d 20 70 53 65 6c 65 63   iLimit = pSelec
4a20: 74 2d 3e 69 4f 66 66 73 65 74 2b 31 3b 0a 20 20  t->iOffset+1;.  
4a30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
4a40: 4c 69 6d 69 74 20 3d 20 70 53 65 6c 65 63 74 2d  Limit = pSelect-
4a50: 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 7d 0a 20  >iLimit;.    }. 
4a60: 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74     addr1 = sqlit
4a70: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
4a80: 4f 50 5f 49 66 5a 65 72 6f 2c 20 69 4c 69 6d 69  OP_IfZero, iLimi
4a90: 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
4aa0: 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
4ab0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
4ac0: 5f 41 64 64 49 6d 6d 2c 20 69 4c 69 6d 69 74 2c  _AddImm, iLimit,
4ad0: 20 2d 31 29 3b 0a 20 20 20 20 61 64 64 72 32 20   -1);.    addr2 
4ae0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
4af0: 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b  Op0(v, OP_Goto);
4b00: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
4b10: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
4b20: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
4b30: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
4b40: 4c 61 73 74 2c 20 70 53 6f 72 74 2d 3e 69 45 43  Last, pSort->iEC
4b50: 75 72 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69  ursor);.    sqli
4b60: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
4b70: 20 4f 50 5f 44 65 6c 65 74 65 2c 20 70 53 6f 72   OP_Delete, pSor
4b80: 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20  t->iECursor);.  
4b90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
4ba0: 70 48 65 72 65 28 76 2c 20 61 64 64 72 32 29 3b  pHere(v, addr2);
4bb0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
4bc0: 64 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d  d code to implem
4bd0: 65 6e 74 20 74 68 65 20 4f 46 46 53 45 54 0a 2a  ent the OFFSET.*
4be0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
4bf0: 64 65 4f 66 66 73 65 74 28 0a 20 20 56 64 62 65  deOffset(.  Vdbe
4c00: 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20 2f 2a   *v,          /*
4c10: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69   Generate code i
4c20: 6e 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20  nto this VM */. 
4c30: 20 69 6e 74 20 69 4f 66 66 73 65 74 2c 20 20 20   int iOffset,   
4c40: 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68     /* Register h
4c50: 6f 6c 64 69 6e 67 20 74 68 65 20 6f 66 66 73 65  olding the offse
4c60: 74 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  t counter */.  i
4c70: 6e 74 20 69 43 6f 6e 74 69 6e 75 65 20 20 20 20  nt iContinue    
4c80: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
4c90: 20 73 6b 69 70 20 74 68 65 20 63 75 72 72 65 6e   skip the curren
4ca0: 74 20 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20  t record */.){. 
4cb0: 20 69 66 28 20 69 4f 66 66 73 65 74 3e 30 20 29   if( iOffset>0 )
4cc0: 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a  {.    int addr;.
4cd0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4ce0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49  ddOp2(v, OP_AddI
4cf0: 6d 6d 2c 20 69 4f 66 66 73 65 74 2c 20 2d 31 29  mm, iOffset, -1)
4d00: 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c  ;.    addr = sql
4d10: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
4d20: 2c 20 4f 50 5f 49 66 4e 65 67 2c 20 69 4f 66 66  , OP_IfNeg, iOff
4d30: 73 65 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  set); VdbeCovera
4d40: 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  ge(v);.    sqlit
4d50: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
4d60: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e  OP_Goto, 0, iCon
4d70: 74 69 6e 75 65 29 3b 0a 20 20 20 20 56 64 62 65  tinue);.    Vdbe
4d80: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73 6b 69  Comment((v, "ski
4d90: 70 20 4f 46 46 53 45 54 20 72 65 63 6f 72 64 73  p OFFSET records
4da0: 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  "));.    sqlite3
4db0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
4dc0: 61 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  addr);.  }.}../*
4dd0: 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 68 61  .** Add code tha
4de0: 74 20 77 69 6c 6c 20 63 68 65 63 6b 20 74 6f 20  t will check to 
4df0: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 4e 20  make sure the N 
4e00: 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69  registers starti
4e10: 6e 67 20 61 74 20 69 4d 65 6d 0a 2a 2a 20 66 6f  ng at iMem.** fo
4e20: 72 6d 20 61 20 64 69 73 74 69 6e 63 74 20 65 6e  rm a distinct en
4e30: 74 72 79 2e 20 20 69 54 61 62 20 69 73 20 61 20  try.  iTab is a 
4e40: 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68  sorting index th
4e50: 61 74 20 68 6f 6c 64 73 20 70 72 65 76 69 6f 75  at holds previou
4e60: 73 6c 79 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d 62  sly.** seen comb
4e70: 69 6e 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20  inations of the 
4e80: 4e 20 76 61 6c 75 65 73 2e 20 20 41 20 6e 65 77  N values.  A new
4e90: 20 65 6e 74 72 79 20 69 73 20 6d 61 64 65 20 69   entry is made i
4ea0: 6e 20 69 54 61 62 0a 2a 2a 20 69 66 20 74 68 65  n iTab.** if the
4eb0: 20 63 75 72 72 65 6e 74 20 4e 20 76 61 6c 75 65   current N value
4ec0: 73 20 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a  s are new..**.**
4ed0: 20 41 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 52   A jump to addrR
4ee0: 65 70 65 61 74 20 69 73 20 6d 61 64 65 20 61 6e  epeat is made an
4ef0: 64 20 74 68 65 20 4e 2b 31 20 76 61 6c 75 65 73  d the N+1 values
4f00: 20 61 72 65 20 70 6f 70 70 65 64 20 66 72 6f 6d   are popped from
4f10: 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 66   the.** stack if
4f20: 20 74 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d 65   the top N eleme
4f30: 6e 74 73 20 61 72 65 20 6e 6f 74 20 64 69 73 74  nts are not dist
4f40: 69 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  inct..*/.static 
4f50: 76 6f 69 64 20 63 6f 64 65 44 69 73 74 69 6e 63  void codeDistinc
4f60: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
4f70: 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69  se,     /* Parsi
4f80: 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  ng and code gene
4f90: 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
4fa0: 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20 20  /.  int iTab,   
4fb0: 20 20 20 20 20 20 20 2f 2a 20 41 20 73 6f 72 74         /* A sort
4fc0: 69 6e 67 20 69 6e 64 65 78 20 75 73 65 64 20 74  ing index used t
4fd0: 6f 20 74 65 73 74 20 66 6f 72 20 64 69 73 74 69  o test for disti
4fe0: 6e 63 74 6e 65 73 73 20 2a 2f 0a 20 20 69 6e 74  nctness */.  int
4ff0: 20 61 64 64 72 52 65 70 65 61 74 2c 20 20 20 20   addrRepeat,    
5000: 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20  /* Jump to here 
5010: 69 66 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 20  if not distinct 
5020: 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20  */.  int N,     
5030: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
5040: 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 2a 2f  r of elements */
5050: 0a 20 20 69 6e 74 20 69 4d 65 6d 20 20 20 20 20  .  int iMem     
5060: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 65        /* First e
5070: 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56  lement */.){.  V
5080: 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 72 31  dbe *v;.  int r1
5090: 3b 0a 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d  ;..  v = pParse-
50a0: 3e 70 56 64 62 65 3b 0a 20 20 72 31 20 3d 20 73  >pVdbe;.  r1 = s
50b0: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
50c0: 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69  (pParse);.  sqli
50d0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
50e0: 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 54  (v, OP_Found, iT
50f0: 61 62 2c 20 61 64 64 72 52 65 70 65 61 74 2c 20  ab, addrRepeat, 
5100: 69 4d 65 6d 2c 20 4e 29 3b 20 56 64 62 65 43 6f  iMem, N); VdbeCo
5110: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c  verage(v);.  sql
5120: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
5130: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
5140: 20 69 4d 65 6d 2c 20 4e 2c 20 72 31 29 3b 0a 20   iMem, N, r1);. 
5150: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5160: 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
5170: 72 74 2c 20 69 54 61 62 2c 20 72 31 29 3b 0a 20  rt, iTab, r1);. 
5180: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
5190: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
51a0: 31 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  1);.}..#ifndef S
51b0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
51c0: 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  ERY./*.** Genera
51d0: 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  te an error mess
51e0: 61 67 65 20 77 68 65 6e 20 61 20 53 45 4c 45 43  age when a SELEC
51f0: 54 20 69 73 20 75 73 65 64 20 77 69 74 68 69 6e  T is used within
5200: 20 61 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e   a subexpression
5210: 0a 2a 2a 20 28 65 78 61 6d 70 6c 65 3a 20 20 22  .** (example:  "
5220: 61 20 49 4e 20 28 53 45 4c 45 43 54 20 2a 20 46  a IN (SELECT * F
5230: 52 4f 4d 20 74 61 62 6c 65 29 22 29 20 62 75 74  ROM table)") but
5240: 20 69 74 20 68 61 73 20 6d 6f 72 65 20 74 68 61   it has more tha
5250: 6e 20 31 20 72 65 73 75 6c 74 0a 2a 2a 20 63 6f  n 1 result.** co
5260: 6c 75 6d 6e 2e 20 20 57 65 20 64 6f 20 74 68 69  lumn.  We do thi
5270: 73 20 69 6e 20 61 20 73 75 62 72 6f 75 74 69 6e  s in a subroutin
5280: 65 20 62 65 63 61 75 73 65 20 74 68 65 20 65 72  e because the er
5290: 72 6f 72 20 75 73 65 64 20 74 6f 20 6f 63 63 75  ror used to occu
52a0: 72 0a 2a 2a 20 69 6e 20 6d 75 6c 74 69 70 6c 65  r.** in multiple
52b0: 20 70 6c 61 63 65 73 2e 20 20 28 54 68 65 20 65   places.  (The e
52c0: 72 72 6f 72 20 6f 6e 6c 79 20 6f 63 63 75 72 73  rror only occurs
52d0: 20 69 6e 20 6f 6e 65 20 70 6c 61 63 65 20 6e 6f   in one place no
52e0: 77 2c 20 62 75 74 20 77 65 0a 2a 2a 20 72 65 74  w, but we.** ret
52f0: 61 69 6e 20 74 68 65 20 73 75 62 72 6f 75 74 69  ain the subrouti
5300: 6e 65 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 63  ne to minimize c
5310: 6f 64 65 20 64 69 73 72 75 70 74 69 6f 6e 2e 29  ode disruption.)
5320: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
5330: 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75  heckForMultiColu
5340: 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72 28 0a 20  mnSelectError(. 
5350: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
5360: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63        /* Parse c
5370: 6f 6e 74 65 78 74 2e 20 2a 2f 0a 20 20 53 65 6c  ontext. */.  Sel
5380: 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20  ectDest *pDest, 
5390: 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e    /* Destination
53a0: 20 6f 66 20 53 45 4c 45 43 54 20 72 65 73 75 6c   of SELECT resul
53b0: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 70  ts */.  int nExp
53c0: 72 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r            /* 
53d0: 4e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  Number of result
53e0: 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65   columns returne
53f0: 64 20 62 79 20 53 45 4c 45 43 54 20 2a 2f 0a 29  d by SELECT */.)
5400: 7b 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20  {.  int eDest = 
5410: 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20  pDest->eDest;.  
5420: 69 66 28 20 6e 45 78 70 72 3e 31 20 26 26 20 28  if( nExpr>1 && (
5430: 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c  eDest==SRT_Mem |
5440: 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 65 74  | eDest==SRT_Set
5450: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
5460: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
5470: 20 22 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20   "only a single 
5480: 72 65 73 75 6c 74 20 61 6c 6c 6f 77 65 64 20 66  result allowed f
5490: 6f 72 20 22 0a 20 20 20 20 20 20 20 22 61 20 53  or ".       "a S
54a0: 45 4c 45 43 54 20 74 68 61 74 20 69 73 20 70 61  ELECT that is pa
54b0: 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  rt of an express
54c0: 69 6f 6e 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ion");.    retur
54d0: 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  n 1;.  }else{.  
54e0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
54f0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
5500: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e  This routine gen
5510: 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20  erates the code 
5520: 66 6f 72 20 74 68 65 20 69 6e 73 69 64 65 20 6f  for the inside o
5530: 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  f the inner loop
5540: 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45 43 54 2e  .** of a SELECT.
5550: 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72 63 54 61 62  .**.** If srcTab
5560: 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68   is negative, th
5570: 65 6e 20 74 68 65 20 70 45 4c 69 73 74 20 65 78  en the pEList ex
5580: 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 61 72 65  pressions.** are
5590: 20 65 76 61 6c 75 61 74 65 64 20 69 6e 20 6f 72   evaluated in or
55a0: 64 65 72 20 74 6f 20 67 65 74 20 74 68 65 20 64  der to get the d
55b0: 61 74 61 20 66 6f 72 20 74 68 69 73 20 72 6f 77  ata for this row
55c0: 2e 20 20 49 66 20 73 72 63 54 61 62 20 69 73 0a  .  If srcTab is.
55d0: 2a 2a 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 2c  ** zero or more,
55e0: 20 74 68 65 6e 20 64 61 74 61 20 69 73 20 70 75   then data is pu
55f0: 6c 6c 65 64 20 66 72 6f 6d 20 73 72 63 54 61 62  lled from srcTab
5600: 20 61 6e 64 20 70 45 4c 69 73 74 20 69 73 20 75   and pEList is u
5610: 73 65 64 20 6f 6e 6c 79 20 0a 2a 2a 20 74 6f 20  sed only .** to 
5620: 67 65 74 20 6e 75 6d 62 65 72 20 63 6f 6c 75 6d  get number colum
5630: 6e 73 20 61 6e 64 20 74 68 65 20 64 61 74 61 74  ns and the datat
5640: 79 70 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  ype for each col
5650: 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  umn..*/.static v
5660: 6f 69 64 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c  oid selectInnerL
5670: 6f 6f 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50  oop(.  Parse *pP
5680: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
5690: 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
56a0: 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
56b0: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
56c0: 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74    /* The complet
56d0: 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  e select stateme
56e0: 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a  nt being coded *
56f0: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
5700: 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 4c  List,       /* L
5710: 69 73 74 20 6f 66 20 76 61 6c 75 65 73 20 62 65  ist of values be
5720: 69 6e 67 20 65 78 74 72 61 63 74 65 64 20 2a 2f  ing extracted */
5730: 0a 20 20 69 6e 74 20 73 72 63 54 61 62 2c 20 20  .  int srcTab,  
5740: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 75             /* Pu
5750: 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68 69  ll data from thi
5760: 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 53 6f 72  s table */.  Sor
5770: 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20 20  tCtx *pSort,    
5780: 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e       /* If not N
5790: 55 4c 4c 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f 77  ULL, info on how
57a0: 20 74 6f 20 70 72 6f 63 65 73 73 20 4f 52 44 45   to process ORDE
57b0: 52 20 42 59 20 2a 2f 0a 20 20 44 69 73 74 69 6e  R BY */.  Distin
57c0: 63 74 43 74 78 20 2a 70 44 69 73 74 69 6e 63 74  ctCtx *pDistinct
57d0: 2c 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c  , /* If not NULL
57e0: 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f  , info on how to
57f0: 20 70 72 6f 63 65 73 73 20 44 49 53 54 49 4e 43   process DISTINC
5800: 54 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  T */.  SelectDes
5810: 74 20 2a 70 44 65 73 74 2c 20 20 20 20 20 20 2f  t *pDest,      /
5820: 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65  * How to dispose
5830: 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 73 20   of the results 
5840: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e  */.  int iContin
5850: 75 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ue,          /* 
5860: 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 63 6f 6e  Jump here to con
5870: 74 69 6e 75 65 20 77 69 74 68 20 6e 65 78 74 20  tinue with next 
5880: 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72  row */.  int iBr
5890: 65 61 6b 20 20 20 20 20 20 20 20 20 20 20 20 20  eak             
58a0: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
58b0: 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68   break out of th
58c0: 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a  e inner loop */.
58d0: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
58e0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
58f0: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 68 61 73  int i;.  int has
5900: 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20  Distinct;       
5910: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
5920: 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
5930: 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20   is present */. 
5940: 20 69 6e 74 20 72 65 67 52 65 73 75 6c 74 3b 20   int regResult; 
5950: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5960: 53 74 61 72 74 20 6f 66 20 6d 65 6d 6f 72 79 20  Start of memory 
5970: 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 20 73  holding result s
5980: 65 74 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73  et */.  int eDes
5990: 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74  t = pDest->eDest
59a0: 3b 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69  ;   /* How to di
59b0: 73 70 6f 73 65 20 6f 66 20 72 65 73 75 6c 74 73  spose of results
59c0: 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 20   */.  int iParm 
59d0: 3d 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  = pDest->iSDParm
59e0: 3b 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d  ; /* First argum
59f0: 65 6e 74 20 74 6f 20 64 69 73 70 6f 73 61 6c 20  ent to disposal 
5a00: 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 69 6e 74 20  method */.  int 
5a10: 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 20 20 20 20  nResultCol;     
5a20: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
5a30: 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  r of result colu
5a40: 6d 6e 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  mns */..  assert
5a50: 28 20 76 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ( v );.  assert(
5a60: 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20   pEList!=0 );.  
5a70: 68 61 73 44 69 73 74 69 6e 63 74 20 3d 20 70 44  hasDistinct = pD
5a80: 69 73 74 69 6e 63 74 20 3f 20 70 44 69 73 74 69  istinct ? pDisti
5a90: 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65 20 3a  nct->eTnctType :
5aa0: 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
5ab0: 4e 4f 4f 50 3b 0a 20 20 69 66 28 20 70 53 6f 72  NOOP;.  if( pSor
5ac0: 74 20 26 26 20 70 53 6f 72 74 2d 3e 70 4f 72 64  t && pSort->pOrd
5ad0: 65 72 42 79 3d 3d 30 20 29 20 70 53 6f 72 74 20  erBy==0 ) pSort 
5ae0: 3d 20 30 3b 0a 20 20 69 66 28 20 70 53 6f 72 74  = 0;.  if( pSort
5af0: 3d 3d 30 20 26 26 20 21 68 61 73 44 69 73 74 69  ==0 && !hasDisti
5b00: 6e 63 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nct ){.    asser
5b10: 74 28 20 69 43 6f 6e 74 69 6e 75 65 21 3d 30 20  t( iContinue!=0 
5b20: 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65  );.    codeOffse
5b30: 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c  t(v, p->iOffset,
5b40: 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 7d   iContinue);.  }
5b50: 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20 74 68 65 20  ..  /* Pull the 
5b60: 72 65 71 75 65 73 74 65 64 20 63 6f 6c 75 6d 6e  requested column
5b70: 73 2e 0a 20 20 2a 2f 0a 20 20 6e 52 65 73 75 6c  s..  */.  nResul
5b80: 74 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e  tCol = pEList->n
5b90: 45 78 70 72 3b 0a 0a 20 20 69 66 28 20 70 44 65  Expr;..  if( pDe
5ba0: 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29 7b 0a  st->iSdst==0 ){.
5bb0: 20 20 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74      pDest->iSdst
5bc0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
5bd0: 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  1;.    pParse->n
5be0: 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f  Mem += nResultCo
5bf0: 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  l;.  }else if( p
5c00: 44 65 73 74 2d 3e 69 53 64 73 74 2b 6e 52 65 73  Dest->iSdst+nRes
5c10: 75 6c 74 43 6f 6c 20 3e 20 70 50 61 72 73 65 2d  ultCol > pParse-
5c20: 3e 6e 4d 65 6d 20 29 7b 0a 20 20 20 20 2f 2a 20  >nMem ){.    /* 
5c30: 54 68 69 73 20 69 73 20 61 6e 20 65 72 72 6f 72  This is an error
5c40: 20 63 6f 6e 64 69 74 69 6f 6e 20 74 68 61 74 20   condition that 
5c50: 63 61 6e 20 72 65 73 75 6c 74 2c 20 66 6f 72 20  can result, for 
5c60: 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 61 20  example, when a 
5c70: 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20 6f 6e  SELECT.    ** on
5c80: 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   the right-hand 
5c90: 73 69 64 65 20 6f 66 20 61 6e 20 49 4e 53 45 52  side of an INSER
5ca0: 54 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20  T contains more 
5cb0: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 74  result columns t
5cc0: 68 61 6e 0a 20 20 20 20 2a 2a 20 74 68 65 72 65  han.    ** there
5cd0: 20 61 72 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   are columns in 
5ce0: 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74 68 65  the table on the
5cf0: 20 6c 65 66 74 2e 20 20 54 68 65 20 65 72 72 6f   left.  The erro
5d00: 72 20 77 69 6c 6c 20 62 65 20 63 61 75 67 68 74  r will be caught
5d10: 0a 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 70 6f  .    ** and repo
5d20: 72 74 65 64 20 6c 61 74 65 72 2e 20 20 42 75 74  rted later.  But
5d30: 20 77 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65   we need to make
5d40: 20 73 75 72 65 20 65 6e 6f 75 67 68 20 6d 65 6d   sure enough mem
5d50: 6f 72 79 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ory is allocated
5d60: 0a 20 20 20 20 2a 2a 20 74 6f 20 61 76 6f 69 64  .    ** to avoid
5d70: 20 6f 74 68 65 72 20 73 70 75 72 69 6f 75 73 20   other spurious 
5d80: 65 72 72 6f 72 73 20 69 6e 20 74 68 65 20 6d 65  errors in the me
5d90: 61 6e 74 69 6d 65 2e 20 2a 2f 0a 20 20 20 20 70  antime. */.    p
5da0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
5db0: 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d 0a 20  ResultCol;.  }. 
5dc0: 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20   pDest->nSdst = 
5dd0: 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 72 65  nResultCol;.  re
5de0: 67 52 65 73 75 6c 74 20 3d 20 70 44 65 73 74 2d  gResult = pDest-
5df0: 3e 69 53 64 73 74 3b 0a 20 20 69 66 28 20 73 72  >iSdst;.  if( sr
5e00: 63 54 61 62 3e 3d 30 20 29 7b 0a 20 20 20 20 66  cTab>=0 ){.    f
5e10: 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 73 75 6c  or(i=0; i<nResul
5e20: 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  tCol; i++){.    
5e30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5e40: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
5e50: 2c 20 73 72 63 54 61 62 2c 20 69 2c 20 72 65 67  , srcTab, i, reg
5e60: 52 65 73 75 6c 74 2b 69 29 3b 0a 20 20 20 20 20  Result+i);.     
5e70: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
5e80: 20 22 25 73 22 2c 20 70 45 4c 69 73 74 2d 3e 61   "%s", pEList->a
5e90: 5b 69 5d 2e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  [i].zName));.   
5ea0: 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65   }.  }else if( e
5eb0: 44 65 73 74 21 3d 53 52 54 5f 45 78 69 73 74 73  Dest!=SRT_Exists
5ec0: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
5ed0: 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73  e destination is
5ee0: 20 61 6e 20 45 58 49 53 54 53 28 2e 2e 2e 29 20   an EXISTS(...) 
5ef0: 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 20  expression, the 
5f00: 61 63 74 75 61 6c 0a 20 20 20 20 2a 2a 20 76 61  actual.    ** va
5f10: 6c 75 65 73 20 72 65 74 75 72 6e 65 64 20 62 79  lues returned by
5f20: 20 74 68 65 20 53 45 4c 45 43 54 20 61 72 65 20   the SELECT are 
5f30: 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 20 20  not required..  
5f40: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
5f50: 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
5f60: 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2c  (pParse, pEList,
5f70: 20 72 65 67 52 65 73 75 6c 74 2c 0a 20 20 20 20   regResult,.    
5f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 65                (e
5f90: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
5fa0: 7c 7c 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  ||eDest==SRT_Cor
5fb0: 6f 75 74 69 6e 65 29 3f 53 51 4c 49 54 45 5f 45  outine)?SQLITE_E
5fc0: 43 45 4c 5f 44 55 50 3a 30 29 3b 0a 20 20 7d 0a  CEL_DUP:0);.  }.
5fd0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 44 49 53  .  /* If the DIS
5fe0: 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 77 61  TINCT keyword wa
5ff0: 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 74 68 65  s present on the
6000: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
6010: 74 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69 73 20  t.  ** and this 
6020: 72 6f 77 20 68 61 73 20 62 65 65 6e 20 73 65 65  row has been see
6030: 6e 20 62 65 66 6f 72 65 2c 20 74 68 65 6e 20 64  n before, then d
6040: 6f 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69 73 20  o not make this 
6050: 72 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20 6f 66  row.  ** part of
6060: 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a   the result..  *
6070: 2f 0a 20 20 69 66 28 20 68 61 73 44 69 73 74 69  /.  if( hasDisti
6080: 6e 63 74 20 29 7b 0a 20 20 20 20 73 77 69 74 63  nct ){.    switc
6090: 68 28 20 70 44 69 73 74 69 6e 63 74 2d 3e 65 54  h( pDistinct->eT
60a0: 6e 63 74 54 79 70 65 20 29 7b 0a 20 20 20 20 20  nctType ){.     
60b0: 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53 54   case WHERE_DIST
60c0: 49 4e 43 54 5f 4f 52 44 45 52 45 44 3a 20 7b 0a  INCT_ORDERED: {.
60d0: 20 20 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a          VdbeOp *
60e0: 70 4f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  pOp;            
60f0: 2f 2a 20 4e 6f 20 6c 6f 6e 67 65 72 20 72 65 71  /* No longer req
6100: 75 69 72 65 64 20 4f 70 65 6e 45 70 68 65 6d 65  uired OpenEpheme
6110: 72 61 6c 20 69 6e 73 74 72 2e 20 2a 2f 0a 20 20  ral instr. */.  
6120: 20 20 20 20 20 20 69 6e 74 20 69 4a 75 6d 70 3b        int iJump;
6130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6140: 20 4a 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f   Jump destinatio
6150: 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  n */.        int
6160: 20 72 65 67 50 72 65 76 3b 20 20 20 20 20 20 20   regPrev;       
6170: 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73       /* Previous
6180: 20 72 6f 77 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a   row content */.
6190: 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f  .        /* Allo
61a0: 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74  cate space for t
61b0: 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20  he previous row 
61c0: 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 67 50 72  */.        regPr
61d0: 65 76 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  ev = pParse->nMe
61e0: 6d 2b 31 3b 0a 20 20 20 20 20 20 20 20 70 50 61  m+1;.        pPa
61f0: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65  rse->nMem += nRe
6200: 73 75 6c 74 43 6f 6c 3b 0a 0a 20 20 20 20 20 20  sultCol;..      
6210: 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 68 65 20    /* Change the 
6220: 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
6230: 20 63 6f 64 65 64 20 65 61 72 6c 69 65 72 20 74   coded earlier t
6240: 6f 20 61 6e 20 4f 50 5f 4e 75 6c 6c 0a 20 20 20  o an OP_Null.   
6250: 20 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68 65       ** sets the
6260: 20 4d 45 4d 5f 43 6c 65 61 72 65 64 20 62 69 74   MEM_Cleared bit
6270: 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 72 65   on the first re
6280: 67 69 73 74 65 72 20 6f 66 20 74 68 65 0a 20 20  gister of the.  
6290: 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75        ** previou
62a0: 73 20 76 61 6c 75 65 2e 20 20 54 68 69 73 20 77  s value.  This w
62b0: 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20 4f 50  ill cause the OP
62c0: 5f 4e 65 20 62 65 6c 6f 77 20 74 6f 20 61 6c 77  _Ne below to alw
62d0: 61 79 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  ays.        ** f
62e0: 61 69 6c 20 6f 6e 20 74 68 65 20 66 69 72 73 74  ail on the first
62f0: 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
6300: 65 20 6c 6f 6f 70 20 65 76 65 6e 20 69 66 20 74  e loop even if t
6310: 68 65 20 66 69 72 73 74 0a 20 20 20 20 20 20 20  he first.       
6320: 20 2a 2a 20 72 6f 77 20 69 73 20 61 6c 6c 20 4e   ** row is all N
6330: 55 4c 4c 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ULLs..        */
6340: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
6350: 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70  VdbeChangeToNoop
6360: 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 61  (v, pDistinct->a
6370: 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20 20  ddrTnct);.      
6380: 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56    pOp = sqlite3V
6390: 64 62 65 47 65 74 4f 70 28 76 2c 20 70 44 69 73  dbeGetOp(v, pDis
63a0: 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29  tinct->addrTnct)
63b0: 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f  ;.        pOp->o
63c0: 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 75 6c 6c 3b  pcode = OP_Null;
63d0: 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31  .        pOp->p1
63e0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4f   = 1;.        pO
63f0: 70 2d 3e 70 32 20 3d 20 72 65 67 50 72 65 76 3b  p->p2 = regPrev;
6400: 0a 0a 20 20 20 20 20 20 20 20 69 4a 75 6d 70 20  ..        iJump 
6410: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
6420: 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 6e 52  rentAddr(v) + nR
6430: 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 20 20 20 20  esultCol;.      
6440: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65    for(i=0; i<nRe
6450: 73 75 6c 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  sultCol; i++){. 
6460: 20 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71           CollSeq
6470: 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65   *pColl = sqlite
6480: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
6490: 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69  rse, pEList->a[i
64a0: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
64b0: 20 20 20 20 69 66 28 20 69 3c 6e 52 65 73 75 6c      if( i<nResul
64c0: 74 43 6f 6c 2d 31 20 29 7b 0a 20 20 20 20 20 20  tCol-1 ){.      
64d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
64e0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 65  eAddOp3(v, OP_Ne
64f0: 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 2c 20 69  , regResult+i, i
6500: 4a 75 6d 70 2c 20 72 65 67 50 72 65 76 2b 69 29  Jump, regPrev+i)
6510: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 56 64  ;.            Vd
6520: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
6530: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
6540: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
6550: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
6560: 20 4f 50 5f 45 71 2c 20 72 65 67 52 65 73 75 6c   OP_Eq, regResul
6570: 74 2b 69 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20  t+i, iContinue, 
6580: 72 65 67 50 72 65 76 2b 69 29 3b 0a 20 20 20 20  regPrev+i);.    
6590: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
65a0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
65b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
65c0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
65d0: 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 6f 6e 73  eP4(v, -1, (cons
65e0: 74 20 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20  t char *)pColl, 
65f0: 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20  P4_COLLSEQ);.   
6600: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
6610: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51  beChangeP5(v, SQ
6620: 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20  LITE_NULLEQ);.  
6630: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6640: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 56  assert( sqlite3V
6650: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
6660: 29 3d 3d 69 4a 75 6d 70 20 29 3b 0a 20 20 20 20  )==iJump );.    
6670: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6680: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79  ddOp3(v, OP_Copy
6690: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 72 65 67  , regResult, reg
66a0: 50 72 65 76 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  Prev, nResultCol
66b0: 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  -1);.        bre
66c0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ak;.      }..   
66d0: 20 20 20 63 61 73 65 20 57 48 45 52 45 5f 44 49     case WHERE_DI
66e0: 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3a 20 7b  STINCT_UNIQUE: {
66f0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
6700: 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70  VdbeChangeToNoop
6710: 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 61  (v, pDistinct->a
6720: 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20 20  ddrTnct);.      
6730: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
6740: 0a 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a  ..      default:
6750: 20 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   {.        asser
6760: 74 28 20 70 44 69 73 74 69 6e 63 74 2d 3e 65 54  t( pDistinct->eT
6770: 6e 63 74 54 79 70 65 3d 3d 57 48 45 52 45 5f 44  nctType==WHERE_D
6780: 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45  ISTINCT_UNORDERE
6790: 44 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 64  D );.        cod
67a0: 65 44 69 73 74 69 6e 63 74 28 70 50 61 72 73 65  eDistinct(pParse
67b0: 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 74 61 62  , pDistinct->tab
67c0: 54 6e 63 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c  Tnct, iContinue,
67d0: 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72 65 67   nResultCol, reg
67e0: 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 20  Result);.       
67f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
6800: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53      }.    if( pS
6810: 6f 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ort==0 ){.      
6820: 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d  codeOffset(v, p-
6830: 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74 69  >iOffset, iConti
6840: 6e 75 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  nue);.    }.  }.
6850: 0a 20 20 73 77 69 74 63 68 28 20 65 44 65 73 74  .  switch( eDest
6860: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68   ){.    /* In th
6870: 69 73 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 65  is mode, write e
6880: 61 63 68 20 71 75 65 72 79 20 72 65 73 75 6c 74  ach query result
6890: 20 74 6f 20 74 68 65 20 6b 65 79 20 6f 66 20 74   to the key of t
68a0: 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20  he temporary.   
68b0: 20 2a 2a 20 74 61 62 6c 65 20 69 50 61 72 6d 2e   ** table iParm.
68c0: 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  .    */.#ifndef 
68d0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
68e0: 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 20 20  OUND_SELECT.    
68f0: 63 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e 3a 20  case SRT_Union: 
6900: 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a  {.      int r1;.
6910: 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
6920: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
6930: 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
6940: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
6950: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
6960: 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75  regResult, nResu
6970: 6c 74 43 6f 6c 2c 20 72 31 29 3b 0a 20 20 20 20  ltCol, r1);.    
6980: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6990: 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
69a0: 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 29 3b  ert, iParm, r1);
69b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
69c0: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
69d0: 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
69e0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
69f0: 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61    /* Construct a
6a00: 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65   record from the
6a10: 20 71 75 65 72 79 20 72 65 73 75 6c 74 2c 20 62   query result, b
6a20: 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20  ut instead of.  
6a30: 20 20 2a 2a 20 73 61 76 69 6e 67 20 74 68 61 74    ** saving that
6a40: 20 72 65 63 6f 72 64 2c 20 75 73 65 20 69 74 20   record, use it 
6a50: 61 73 20 61 20 6b 65 79 20 74 6f 20 64 65 6c 65  as a key to dele
6a60: 74 65 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d  te elements from
6a70: 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 65 6d 70  .    ** the temp
6a80: 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50 61 72  orary table iPar
6a90: 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  m..    */.    ca
6aa0: 73 65 20 53 52 54 5f 45 78 63 65 70 74 3a 20 7b  se SRT_Except: {
6ab0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
6ac0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
6ad0: 64 78 44 65 6c 65 74 65 2c 20 69 50 61 72 6d 2c  dxDelete, iParm,
6ae0: 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73   regResult, nRes
6af0: 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 62  ultCol);.      b
6b00: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
6b10: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
6b20: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
6b30: 54 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 74 6f  T */..    /* Sto
6b40: 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 61 73  re the result as
6b50: 20 64 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e   data using a un
6b60: 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f  ique key..    */
6b70: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 46 69  .    case SRT_Fi
6b80: 66 6f 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  fo:.    case SRT
6b90: 5f 44 69 73 74 46 69 66 6f 3a 0a 20 20 20 20 63  _DistFifo:.    c
6ba0: 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20  ase SRT_Table:. 
6bb0: 20 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65     case SRT_Ephe
6bc0: 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e  mTab: {.      in
6bd0: 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
6be0: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
6bf0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
6c00: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 54 61 62  ( eDest==SRT_Tab
6c10: 6c 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  le );.      test
6c20: 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54  case( eDest==SRT
6c30: 5f 45 70 68 65 6d 54 61 62 20 29 3b 0a 20 20 20  _EphemTab );.   
6c40: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6c50: 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
6c60: 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74  ecord, regResult
6c70: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72 31  , nResultCol, r1
6c80: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
6c90: 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20 20  E_OMIT_CTE.     
6ca0: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
6cb0: 44 69 73 74 46 69 66 6f 20 29 7b 0a 20 20 20 20  DistFifo ){.    
6cc0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 65      /* If the de
6cd0: 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 44 69 73  stination is Dis
6ce0: 74 46 69 66 6f 2c 20 74 68 65 6e 20 63 75 72 73  tFifo, then curs
6cf0: 6f 72 20 28 69 50 61 72 6d 2b 31 29 20 69 73 20  or (iParm+1) is 
6d00: 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  open.        ** 
6d10: 6f 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20  on an ephemeral 
6d20: 69 6e 64 65 78 2e 20 49 66 20 74 68 65 20 63 75  index. If the cu
6d30: 72 72 65 6e 74 20 72 6f 77 20 69 73 20 61 6c 72  rrent row is alr
6d40: 65 61 64 79 20 70 72 65 73 65 6e 74 0a 20 20 20  eady present.   
6d50: 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 69       ** in the i
6d60: 6e 64 65 78 2c 20 64 6f 20 6e 6f 74 20 77 72 69  ndex, do not wri
6d70: 74 65 20 69 74 20 74 6f 20 74 68 65 20 6f 75 74  te it to the out
6d80: 70 75 74 2e 20 49 66 20 6e 6f 74 2c 20 61 64 64  put. If not, add
6d90: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
6da0: 63 75 72 72 65 6e 74 20 72 6f 77 20 74 6f 20 74  current row to t
6db0: 68 65 20 69 6e 64 65 78 20 61 6e 64 20 70 72 6f  he index and pro
6dc0: 63 65 65 64 20 77 69 74 68 20 77 72 69 74 69 6e  ceed with writin
6dd0: 67 20 69 74 20 74 6f 20 74 68 65 0a 20 20 20 20  g it to the.    
6de0: 20 20 20 20 2a 2a 20 6f 75 74 70 75 74 20 74 61      ** output ta
6df0: 62 6c 65 20 61 73 20 77 65 6c 6c 2e 20 20 2a 2f  ble as well.  */
6e00: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64  .        int add
6e10: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  r = sqlite3VdbeC
6e20: 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20  urrentAddr(v) + 
6e30: 34 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  4;.        sqlit
6e40: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
6e50: 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 50 61  v, OP_Found, iPa
6e60: 72 6d 2b 31 2c 20 61 64 64 72 2c 20 72 31 2c 20  rm+1, addr, r1, 
6e70: 30 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  0); VdbeCoverage
6e80: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  (v);.        sql
6e90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
6ea0: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
6eb0: 69 50 61 72 6d 2b 31 2c 20 72 31 29 3b 0a 20 20  iParm+1, r1);.  
6ec0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
6ed0: 6f 72 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ort==0 );.      
6ee0: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  }.#endif.      i
6ef0: 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20  f( pSort ){.    
6f00: 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74      pushOntoSort
6f10: 65 72 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74  er(pParse, pSort
6f20: 2c 20 70 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20  , p, r1, 1);.   
6f30: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6f40: 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74    int r2 = sqlit
6f50: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
6f60: 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
6f70: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
6f80: 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20  v, OP_NewRowid, 
6f90: 69 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20  iParm, r2);.    
6fa0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6fb0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65  ddOp3(v, OP_Inse
6fc0: 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20 72  rt, iParm, r1, r
6fd0: 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  2);.        sqli
6fe0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
6ff0: 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44  v, OPFLAG_APPEND
7000: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
7010: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
7020: 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20  (pParse, r2);.  
7030: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
7040: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
7050: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
7060: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7070: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
7080: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
7090: 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65      /* If we are
70a0: 20 63 72 65 61 74 69 6e 67 20 61 20 73 65 74 20   creating a set 
70b0: 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20  for an "expr IN 
70c0: 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f  (SELECT ...)" co
70d0: 6e 73 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20  nstruct,.    ** 
70e0: 74 68 65 6e 20 74 68 65 72 65 20 73 68 6f 75 6c  then there shoul
70f0: 64 20 62 65 20 61 20 73 69 6e 67 6c 65 20 69 74  d be a single it
7100: 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  em on the stack.
7110: 20 20 57 72 69 74 65 20 74 68 69 73 0a 20 20 20    Write this.   
7120: 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74 68   ** item into th
7130: 65 20 73 65 74 20 74 61 62 6c 65 20 77 69 74 68  e set table with
7140: 20 62 6f 67 75 73 20 64 61 74 61 2e 0a 20 20 20   bogus data..   
7150: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
7160: 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 61 73  _Set: {.      as
7170: 73 65 72 74 28 20 6e 52 65 73 75 6c 74 43 6f 6c  sert( nResultCol
7180: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 70 44 65  ==1 );.      pDe
7190: 73 74 2d 3e 61 66 66 53 64 73 74 20 3d 0a 20 20  st->affSdst =.  
71a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
71b0: 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
71c0: 66 69 6e 69 74 79 28 70 45 4c 69 73 74 2d 3e 61  finity(pEList->a
71d0: 5b 30 5d 2e 70 45 78 70 72 2c 20 70 44 65 73 74  [0].pExpr, pDest
71e0: 2d 3e 61 66 66 53 64 73 74 29 3b 0a 20 20 20 20  ->affSdst);.    
71f0: 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20    if( pSort ){. 
7200: 20 20 20 20 20 20 20 2f 2a 20 41 74 20 66 69 72         /* At fir
7210: 73 74 20 67 6c 61 6e 63 65 20 79 6f 75 20 77 6f  st glance you wo
7220: 75 6c 64 20 74 68 69 6e 6b 20 77 65 20 63 6f 75  uld think we cou
7230: 6c 64 20 6f 70 74 69 6d 69 7a 65 20 6f 75 74 20  ld optimize out 
7240: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f  the.        ** O
7250: 52 44 45 52 20 42 59 20 69 6e 20 74 68 69 73 20  RDER BY in this 
7260: 63 61 73 65 20 73 69 6e 63 65 20 74 68 65 20 6f  case since the o
7270: 72 64 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  rder of entries 
7280: 69 6e 20 74 68 65 20 73 65 74 0a 20 20 20 20 20  in the set.     
7290: 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 6d     ** does not m
72a0: 61 74 74 65 72 2e 20 20 42 75 74 20 74 68 65 72  atter.  But ther
72b0: 65 20 6d 69 67 68 74 20 62 65 20 61 20 4c 49 4d  e might be a LIM
72c0: 49 54 20 63 6c 61 75 73 65 2c 20 69 6e 20 77 68  IT clause, in wh
72d0: 69 63 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  ich.        ** c
72e0: 61 73 65 20 74 68 65 20 6f 72 64 65 72 20 64 6f  ase the order do
72f0: 65 73 20 6d 61 74 74 65 72 20 2a 2f 0a 20 20 20  es matter */.   
7300: 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72       pushOntoSor
7310: 74 65 72 28 70 50 61 72 73 65 2c 20 70 53 6f 72  ter(pParse, pSor
7320: 74 2c 20 70 2c 20 72 65 67 52 65 73 75 6c 74 2c  t, p, regResult,
7330: 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   1);.      }else
7340: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 31  {.        int r1
7350: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
7360: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
7370: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7380: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61  eAddOp4(v, OP_Ma
7390: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73  keRecord, regRes
73a0: 75 6c 74 2c 31 2c 72 31 2c 20 26 70 44 65 73 74  ult,1,r1, &pDest
73b0: 2d 3e 61 66 66 53 64 73 74 2c 20 31 29 3b 0a 20  ->affSdst, 1);. 
73c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
73d0: 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
73e0: 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  hange(pParse, re
73f0: 67 52 65 73 75 6c 74 2c 20 31 29 3b 0a 20 20 20  gResult, 1);.   
7400: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7410: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
7420: 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72  Insert, iParm, r
7430: 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
7440: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
7450: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
7460: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
7470: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
7480: 2a 20 49 66 20 61 6e 79 20 72 6f 77 20 65 78 69  * If any row exi
7490: 73 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  st in the result
74a0: 20 73 65 74 2c 20 72 65 63 6f 72 64 20 74 68 61   set, record tha
74b0: 74 20 66 61 63 74 20 61 6e 64 20 61 62 6f 72 74  t fact and abort
74c0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
74d0: 65 20 53 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a  e SRT_Exists: {.
74e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
74f0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
7500: 74 65 67 65 72 2c 20 31 2c 20 69 50 61 72 6d 29  teger, 1, iParm)
7510: 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c  ;.      /* The L
7520: 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c  IMIT clause will
7530: 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c   terminate the l
7540: 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20  oop for us */.  
7550: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7560: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
7570: 20 69 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c   is a scalar sel
7580: 65 63 74 20 74 68 61 74 20 69 73 20 70 61 72 74  ect that is part
7590: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
75a0: 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73  n, then.    ** s
75b0: 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
75c0: 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69   in the appropri
75d0: 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  ate memory cell 
75e0: 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20  and break out.  
75f0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 61 6e    ** of the scan
7600: 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20   loop..    */.  
7610: 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20    case SRT_Mem: 
7620: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
7630: 6e 52 65 73 75 6c 74 43 6f 6c 3d 3d 31 20 29 3b  nResultCol==1 );
7640: 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f 72 74  .      if( pSort
7650: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68   ){.        push
7660: 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73  OntoSorter(pPars
7670: 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67  e, pSort, p, reg
7680: 52 65 73 75 6c 74 2c 20 31 29 3b 0a 20 20 20 20  Result, 1);.    
7690: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
76a0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
76b0: 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65 67  Move(pParse, reg
76c0: 52 65 73 75 6c 74 2c 20 69 50 61 72 6d 2c 20 31  Result, iParm, 1
76d0: 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  );.        /* Th
76e0: 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77  e LIMIT clause w
76f0: 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20  ill jump out of 
7700: 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20  the loop for us 
7710: 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  */.      }.     
7720: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
7730: 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20  ndif /* #ifndef 
7740: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
7750: 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 63 61 73  UERY */..    cas
7760: 65 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a  e SRT_Coroutine:
7770: 20 20 20 20 20 20 20 2f 2a 20 53 65 6e 64 20 64         /* Send d
7780: 61 74 61 20 74 6f 20 61 20 63 6f 2d 72 6f 75 74  ata to a co-rout
7790: 69 6e 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ine */.    case 
77a0: 53 52 54 5f 4f 75 74 70 75 74 3a 20 7b 20 20 20  SRT_Output: {   
77b0: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74       /* Return t
77c0: 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20  he results */.  
77d0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
77e0: 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69  est==SRT_Corouti
77f0: 6e 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ne );.      test
7800: 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54  case( eDest==SRT
7810: 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20  _Output );.     
7820: 20 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20   if( pSort ){.  
7830: 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f        pushOntoSo
7840: 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 53 6f  rter(pParse, pSo
7850: 72 74 2c 20 70 2c 20 72 65 67 52 65 73 75 6c 74  rt, p, regResult
7860: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20  , nResultCol);. 
7870: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65       }else if( e
7880: 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74  Dest==SRT_Corout
7890: 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ine ){.        s
78a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
78b0: 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44  (v, OP_Yield, pD
78c0: 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20  est->iSDParm);. 
78d0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
78e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
78f0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75  ddOp2(v, OP_Resu
7900: 6c 74 52 6f 77 2c 20 72 65 67 52 65 73 75 6c 74  ltRow, regResult
7910: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20  , nResultCol);. 
7920: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
7930: 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
7940: 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  hange(pParse, re
7950: 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74  gResult, nResult
7960: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Col);.      }.  
7970: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7980: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
7990: 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20 2f 2a  _OMIT_CTE.    /*
79a0: 20 57 72 69 74 65 20 74 68 65 20 72 65 73 75 6c   Write the resul
79b0: 74 73 20 69 6e 74 6f 20 61 20 70 72 69 6f 72 69  ts into a priori
79c0: 74 79 20 71 75 65 75 65 20 74 68 61 74 20 69 73  ty queue that is
79d0: 20 6f 72 64 65 72 20 61 63 63 6f 72 64 69 6e 67   order according
79e0: 20 74 6f 0a 20 20 20 20 2a 2a 20 70 44 65 73 74   to.    ** pDest
79f0: 2d 3e 70 4f 72 64 65 72 42 79 20 28 69 6e 20 70  ->pOrderBy (in p
7a00: 53 4f 29 2e 20 20 70 44 65 73 74 2d 3e 69 53 44  SO).  pDest->iSD
7a10: 50 61 72 6d 20 28 69 6e 20 69 50 61 72 6d 29 20  Parm (in iParm) 
7a20: 69 73 20 74 68 65 20 63 75 72 73 6f 72 20 66 6f  is the cursor fo
7a30: 72 20 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 64 65  r an.    ** inde
7a40: 78 20 77 69 74 68 20 70 53 4f 2d 3e 6e 45 78 70  x with pSO->nExp
7a50: 72 2b 32 20 63 6f 6c 75 6d 6e 73 2e 20 20 42 75  r+2 columns.  Bu
7a60: 69 6c 64 20 61 20 6b 65 79 20 75 73 69 6e 67 20  ild a key using 
7a70: 70 53 4f 20 66 6f 72 20 74 68 65 20 66 69 72 73  pSO for the firs
7a80: 74 0a 20 20 20 20 2a 2a 20 70 53 4f 2d 3e 6e 45  t.    ** pSO->nE
7a90: 78 70 72 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65  xpr columns, the
7aa0: 6e 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20  n make sure all 
7ab0: 6b 65 79 73 20 61 72 65 20 75 6e 69 71 75 65 20  keys are unique 
7ac0: 62 79 20 61 64 64 69 6e 67 20 61 0a 20 20 20 20  by adding a.    
7ad0: 2a 2a 20 66 69 6e 61 6c 20 4f 50 5f 53 65 71 75  ** final OP_Sequ
7ae0: 65 6e 63 65 20 63 6f 6c 75 6d 6e 2e 20 20 54 68  ence column.  Th
7af0: 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69 73  e last column is
7b00: 20 74 68 65 20 72 65 63 6f 72 64 20 61 73 20 61   the record as a
7b10: 20 62 6c 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20 20   blob..    */.  
7b20: 20 20 63 61 73 65 20 53 52 54 5f 44 69 73 74 51    case SRT_DistQ
7b30: 75 65 75 65 3a 0a 20 20 20 20 63 61 73 65 20 53  ueue:.    case S
7b40: 52 54 5f 51 75 65 75 65 3a 20 7b 0a 20 20 20 20  RT_Queue: {.    
7b50: 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 20 20    int nKey;.    
7b60: 20 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33    int r1, r2, r3
7b70: 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  ;.      int addr
7b80: 54 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Test = 0;.      
7b90: 45 78 70 72 4c 69 73 74 20 2a 70 53 4f 3b 0a 20  ExprList *pSO;. 
7ba0: 20 20 20 20 20 70 53 4f 20 3d 20 70 44 65 73 74       pSO = pDest
7bb0: 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  ->pOrderBy;.    
7bc0: 20 20 61 73 73 65 72 74 28 20 70 53 4f 20 29 3b    assert( pSO );
7bd0: 0a 20 20 20 20 20 20 6e 4b 65 79 20 3d 20 70 53  .      nKey = pS
7be0: 4f 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  O->nExpr;.      
7bf0: 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
7c00: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
7c10: 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
7c20: 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
7c30: 50 61 72 73 65 2c 20 6e 4b 65 79 2b 32 29 3b 0a  Parse, nKey+2);.
7c40: 20 20 20 20 20 20 72 33 20 3d 20 72 32 2b 6e 4b        r3 = r2+nK
7c50: 65 79 2b 31 3b 0a 20 20 20 20 20 20 69 66 28 20  ey+1;.      if( 
7c60: 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 51  eDest==SRT_DistQ
7c70: 75 65 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20  ueue ){.        
7c80: 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74 69 6e  /* If the destin
7c90: 61 74 69 6f 6e 20 69 73 20 44 69 73 74 51 75 65  ation is DistQue
7ca0: 75 65 2c 20 74 68 65 6e 20 63 75 72 73 6f 72 20  ue, then cursor 
7cb0: 28 69 50 61 72 6d 2b 31 29 20 69 73 20 6f 70 65  (iParm+1) is ope
7cc0: 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20  n.        ** on 
7cd0: 61 20 73 65 63 6f 6e 64 20 65 70 68 65 6d 65 72  a second ephemer
7ce0: 61 6c 20 69 6e 64 65 78 20 74 68 61 74 20 68 6f  al index that ho
7cf0: 6c 64 73 20 61 6c 6c 20 76 61 6c 75 65 73 20 65  lds all values e
7d00: 76 65 72 79 20 70 72 65 76 69 6f 75 73 6c 79 0a  very previously.
7d10: 20 20 20 20 20 20 20 20 2a 2a 20 61 64 64 65 64          ** added
7d20: 20 74 6f 20 74 68 65 20 71 75 65 75 65 2e 20 2a   to the queue. *
7d30: 2f 0a 20 20 20 20 20 20 20 20 61 64 64 72 54 65  /.        addrTe
7d40: 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  st = sqlite3Vdbe
7d50: 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
7d60: 46 6f 75 6e 64 2c 20 69 50 61 72 6d 2b 31 2c 20  Found, iParm+1, 
7d70: 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  0, .            
7d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d90: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67 52              regR
7da0: 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f  esult, nResultCo
7db0: 6c 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  l);.        Vdbe
7dc0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
7dd0: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
7de0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
7df0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
7e00: 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c  egResult, nResul
7e10: 74 43 6f 6c 2c 20 72 33 29 3b 0a 20 20 20 20 20  tCol, r3);.     
7e20: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
7e30: 44 69 73 74 51 75 65 75 65 20 29 7b 0a 20 20 20  DistQueue ){.   
7e40: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7e50: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
7e60: 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2b 31 2c  Insert, iParm+1,
7e70: 20 72 33 29 3b 0a 20 20 20 20 20 20 20 20 73 71   r3);.        sq
7e80: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
7e90: 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53  5(v, OPFLAG_USES
7ea0: 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 20 20  EEKRESULT);.    
7eb0: 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d    }.      for(i=
7ec0: 30 3b 20 69 3c 6e 4b 65 79 3b 20 69 2b 2b 29 7b  0; i<nKey; i++){
7ed0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7ee0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
7ef0: 5f 53 43 6f 70 79 2c 0a 20 20 20 20 20 20 20 20  _SCopy,.        
7f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f10: 20 20 72 65 67 52 65 73 75 6c 74 20 2b 20 70 53    regResult + pS
7f20: 4f 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64  O->a[i].u.x.iOrd
7f30: 65 72 42 79 43 6f 6c 20 2d 20 31 2c 0a 20 20 20  erByCol - 1,.   
7f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f50: 20 20 20 20 20 20 20 72 32 2b 69 29 3b 0a 20 20         r2+i);.  
7f60: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
7f70: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
7f80: 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 69 50   OP_Sequence, iP
7f90: 61 72 6d 2c 20 72 32 2b 6e 4b 65 79 29 3b 0a 20  arm, r2+nKey);. 
7fa0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7fb0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
7fc0: 65 52 65 63 6f 72 64 2c 20 72 32 2c 20 6e 4b 65  eRecord, r2, nKe
7fd0: 79 2b 32 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  y+2, r1);.      
7fe0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7ff0: 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
8000: 74 2c 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20  t, iParm, r1);. 
8010: 20 20 20 20 20 69 66 28 20 61 64 64 72 54 65 73       if( addrTes
8020: 74 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a  t ) sqlite3VdbeJ
8030: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 54  umpHere(v, addrT
8040: 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  est);.      sqli
8050: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
8060: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
8070: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
8080: 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
8090: 72 73 65 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 29  rse, r2, nKey+2)
80a0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
80b0: 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
80c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a  QLITE_OMIT_CTE *
80d0: 2f 0a 0a 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  /....#if !define
80e0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
80f0: 49 47 47 45 52 29 0a 20 20 20 20 2f 2a 20 44 69  IGGER).    /* Di
8100: 73 63 61 72 64 20 74 68 65 20 72 65 73 75 6c 74  scard the result
8110: 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  s.  This is used
8120: 20 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74   for SELECT stat
8130: 65 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20  ements inside.  
8140: 20 20 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66    ** the body of
8150: 20 61 20 54 52 49 47 47 45 52 2e 20 20 54 68 65   a TRIGGER.  The
8160: 20 70 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68   purpose of such
8170: 20 73 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63   selects is to c
8180: 61 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d  all.    ** user-
8190: 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e  defined function
81a0: 73 20 74 68 61 74 20 68 61 76 65 20 73 69 64 65  s that have side
81b0: 20 65 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f   effects.  We do
81c0: 20 6e 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a   not care.    **
81d0: 20 61 62 6f 75 74 20 74 68 65 20 61 63 74 75 61   about the actua
81e0: 6c 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  l results of the
81f0: 20 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a   select..    */.
8200: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
8210: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65       assert( eDe
8220: 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20  st==SRT_Discard 
8230: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
8240: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
8250: 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74  ..  /* Jump to t
8260: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f  he end of the lo
8270: 6f 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20  op if the LIMIT 
8280: 69 73 20 72 65 61 63 68 65 64 2e 20 20 45 78 63  is reached.  Exc
8290: 65 70 74 2c 20 69 66 0a 20 20 2a 2a 20 74 68 65  ept, if.  ** the
82a0: 72 65 20 69 73 20 61 20 73 6f 72 74 65 72 2c 20  re is a sorter, 
82b0: 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68  in which case th
82c0: 65 20 73 6f 72 74 65 72 20 68 61 73 20 61 6c 72  e sorter has alr
82d0: 65 61 64 79 20 6c 69 6d 69 74 65 64 0a 20 20 2a  eady limited.  *
82e0: 2a 20 74 68 65 20 6f 75 74 70 75 74 20 66 6f 72  * the output for
82f0: 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20   us..  */.  if( 
8300: 70 53 6f 72 74 3d 3d 30 20 26 26 20 70 2d 3e 69  pSort==0 && p->i
8310: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  Limit ){.    sql
8320: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
8330: 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e  , OP_IfZero, p->
8340: 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 2c 20  iLimit, iBreak, 
8350: 2d 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  -1); VdbeCoverag
8360: 65 28 76 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  e(v);.  }.}../*.
8370: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 4b 65  ** Allocate a Ke
8380: 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 73 75 66  yInfo object suf
8390: 66 69 63 69 65 6e 74 20 66 6f 72 20 61 6e 20 69  ficient for an i
83a0: 6e 64 65 78 20 6f 66 20 4e 20 6b 65 79 20 63 6f  ndex of N key co
83b0: 6c 75 6d 6e 73 20 61 6e 64 0a 2a 2a 20 58 20 65  lumns and.** X e
83c0: 78 74 72 61 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f  xtra columns..*/
83d0: 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65  .KeyInfo *sqlite
83e0: 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 73 71  3KeyInfoAlloc(sq
83f0: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e  lite3 *db, int N
8400: 2c 20 69 6e 74 20 58 29 7b 0a 20 20 4b 65 79 49  , int X){.  KeyI
8410: 6e 66 6f 20 2a 70 20 3d 20 73 71 6c 69 74 65 33  nfo *p = sqlite3
8420: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 30 2c 20  DbMallocZero(0, 
8430: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8440: 20 20 20 20 73 69 7a 65 6f 66 28 4b 65 79 49 6e      sizeof(KeyIn
8450: 66 6f 29 20 2b 20 28 4e 2b 58 29 2a 28 73 69 7a  fo) + (N+X)*(siz
8460: 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b 31 29  eof(CollSeq*)+1)
8470: 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  );.  if( p ){.  
8480: 20 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20    p->aSortOrder 
8490: 3d 20 28 75 38 2a 29 26 70 2d 3e 61 43 6f 6c 6c  = (u8*)&p->aColl
84a0: 5b 4e 2b 58 5d 3b 0a 20 20 20 20 70 2d 3e 6e 46  [N+X];.    p->nF
84b0: 69 65 6c 64 20 3d 20 28 75 31 36 29 4e 3b 0a 20  ield = (u16)N;. 
84c0: 20 20 20 70 2d 3e 6e 58 46 69 65 6c 64 20 3d 20     p->nXField = 
84d0: 28 75 31 36 29 58 3b 0a 20 20 20 20 70 2d 3e 65  (u16)X;.    p->e
84e0: 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20  nc = ENC(db);.  
84f0: 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20    p->db = db;.  
8500: 20 20 70 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20    p->nRef = 1;. 
8510: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d 3e   }else{.    db->
8520: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
8530: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
8540: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c  ;.}../*.** Deall
8550: 6f 63 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20  ocate a KeyInfo 
8560: 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69 64 20 73  object.*/.void s
8570: 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72  qlite3KeyInfoUnr
8580: 65 66 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 0a  ef(KeyInfo *p){.
8590: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 61    if( p ){.    a
85a0: 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3e 30  ssert( p->nRef>0
85b0: 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2d   );.    p->nRef-
85c0: 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 52  -;.    if( p->nR
85d0: 65 66 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 44  ef==0 ) sqlite3D
85e0: 62 46 72 65 65 28 30 2c 20 70 29 3b 0a 20 20 7d  bFree(0, p);.  }
85f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61  .}../*.** Make a
8600: 20 6e 65 77 20 70 6f 69 6e 74 65 72 20 74 6f 20   new pointer to 
8610: 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74  a KeyInfo object
8620: 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c  .*/.KeyInfo *sql
8630: 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 4b  ite3KeyInfoRef(K
8640: 65 79 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 66  eyInfo *p){.  if
8650: 28 20 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ( p ){.    asser
8660: 74 28 20 70 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a  t( p->nRef>0 );.
8670: 20 20 20 20 70 2d 3e 6e 52 65 66 2b 2b 3b 0a 20      p->nRef++;. 
8680: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
8690: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
86a0: 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75  DEBUG./*.** Retu
86b0: 72 6e 20 54 52 55 45 20 69 66 20 61 20 4b 65 79  rn TRUE if a Key
86c0: 49 6e 66 6f 20 6f 62 6a 65 63 74 20 63 61 6e 20  Info object can 
86d0: 62 65 20 63 68 61 6e 67 65 2e 20 20 54 68 65 20  be change.  The 
86e0: 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a  KeyInfo object.*
86f0: 2a 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 63 68  * can only be ch
8700: 61 6e 67 65 64 20 69 66 20 74 68 69 73 20 69 73  anged if this is
8710: 20 6a 75 73 74 20 61 20 73 69 6e 67 6c 65 20 72   just a single r
8720: 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
8730: 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  object..**.** Th
8740: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
8750: 65 64 20 6f 6e 6c 79 20 69 6e 73 69 64 65 20 6f  ed only inside o
8760: 66 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  f assert() state
8770: 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ments..*/.int sq
8780: 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72  lite3KeyInfoIsWr
8790: 69 74 65 61 62 6c 65 28 4b 65 79 49 6e 66 6f 20  iteable(KeyInfo 
87a0: 2a 70 29 7b 20 72 65 74 75 72 6e 20 70 2d 3e 6e  *p){ return p->n
87b0: 52 65 66 3d 3d 31 3b 20 7d 0a 23 65 6e 64 69 66  Ref==1; }.#endif
87c0: 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47   /* SQLITE_DEBUG
87d0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e   */../*.** Given
87e0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
87f0: 69 73 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20  ist, generate a 
8800: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
8810: 65 20 74 68 61 74 20 72 65 63 6f 72 64 73 0a 2a  e that records.*
8820: 2a 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  * the collating 
8830: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 65 61 63  sequence for eac
8840: 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  h expression in 
8850: 74 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 20  that expression 
8860: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  list..**.** If t
8870: 68 65 20 45 78 70 72 4c 69 73 74 20 69 73 20 61  he ExprList is a
8880: 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52  n ORDER BY or GR
8890: 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 74 68  OUP BY clause th
88a0: 65 6e 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67  en the resulting
88b0: 0a 2a 2a 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  .** KeyInfo stru
88c0: 63 74 75 72 65 20 69 73 20 61 70 70 72 6f 70 72  cture is appropr
88d0: 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c  iate for initial
88e0: 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c 20  izing a virtual 
88f0: 69 6e 64 65 78 20 74 6f 0a 2a 2a 20 69 6d 70 6c  index to.** impl
8900: 65 6d 65 6e 74 20 74 68 61 74 20 63 6c 61 75 73  ement that claus
8910: 65 2e 20 20 49 66 20 74 68 65 20 45 78 70 72 4c  e.  If the ExprL
8920: 69 73 74 20 69 73 20 74 68 65 20 72 65 73 75 6c  ist is the resul
8930: 74 20 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43  t set of a SELEC
8940: 54 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 4b 65  T.** then the Ke
8950: 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
8960: 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  is appropriate f
8970: 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  or initializing 
8980: 61 20 76 69 72 74 75 61 6c 0a 2a 2a 20 69 6e 64  a virtual.** ind
8990: 65 78 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ex to implement 
89a0: 61 20 44 49 53 54 49 4e 43 54 20 74 65 73 74 2e  a DISTINCT test.
89b0: 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20  .**.** Space to 
89c0: 68 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e 66 6f  hold the KeyInfo
89d0: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6f 62   structure is ob
89e0: 74 61 69 6e 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  tain from malloc
89f0: 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a  .  The calling.*
8a00: 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65  * function is re
8a10: 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 73 65  sponsible for se
8a20: 65 69 6e 67 20 74 68 61 74 20 74 68 69 73 20 73  eing that this s
8a30: 74 72 75 63 74 75 72 65 20 69 73 20 65 76 65 6e  tructure is even
8a40: 74 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e  tually.** freed.
8a50: 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79 49 6e  .*/.static KeyIn
8a60: 66 6f 20 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  fo *keyInfoFromE
8a70: 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65  xprList(.  Parse
8a80: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
8a90: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
8aa0: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
8ab0: 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20   *pList,     /* 
8ac0: 46 6f 72 6d 20 74 68 65 20 4b 65 79 49 6e 66 6f  Form the KeyInfo
8ad0: 20 6f 62 6a 65 63 74 20 66 72 6f 6d 20 74 68 69   object from thi
8ae0: 73 20 45 78 70 72 4c 69 73 74 20 2a 2f 0a 20 20  s ExprList */.  
8af0: 69 6e 74 20 69 53 74 61 72 74 2c 20 20 20 20 20  int iStart,     
8b00: 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 77 69       /* Begin wi
8b10: 74 68 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 6f  th this column o
8b20: 66 20 70 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  f pList */.  int
8b30: 20 6e 45 78 74 72 61 20 20 20 20 20 20 20 20 20   nExtra         
8b40: 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61    /* Add this ma
8b50: 6e 79 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73  ny extra columns
8b60: 20 74 6f 20 74 68 65 20 65 6e 64 20 2a 2f 0a 29   to the end */.)
8b70: 7b 0a 20 20 69 6e 74 20 6e 45 78 70 72 3b 0a 20  {.  int nExpr;. 
8b80: 20 4b 65 79 49 6e 66 6f 20 2a 70 49 6e 66 6f 3b   KeyInfo *pInfo;
8b90: 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
8ba0: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
8bb0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
8bc0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
8bd0: 74 20 69 3b 0a 0a 20 20 6e 45 78 70 72 20 3d 20  t i;..  nExpr = 
8be0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
8bf0: 70 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b  pInfo = sqlite3K
8c00: 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20  eyInfoAlloc(db, 
8c10: 6e 45 78 70 72 2b 6e 45 78 74 72 61 2d 69 53 74  nExpr+nExtra-iSt
8c20: 61 72 74 2c 20 31 29 3b 0a 20 20 69 66 28 20 70  art, 1);.  if( p
8c30: 49 6e 66 6f 20 29 7b 0a 20 20 20 20 61 73 73 65  Info ){.    asse
8c40: 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  rt( sqlite3KeyIn
8c50: 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 49  foIsWriteable(pI
8c60: 6e 66 6f 29 20 29 3b 0a 20 20 20 20 66 6f 72 28  nfo) );.    for(
8c70: 69 3d 69 53 74 61 72 74 2c 20 70 49 74 65 6d 3d  i=iStart, pItem=
8c80: 70 4c 69 73 74 2d 3e 61 2b 69 53 74 61 72 74 3b  pList->a+iStart;
8c90: 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70   i<nExpr; i++, p
8ca0: 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 43  Item++){.      C
8cb0: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20  ollSeq *pColl;. 
8cc0: 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
8cd0: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
8ce0: 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70  pParse, pItem->p
8cf0: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28  Expr);.      if(
8d00: 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20   !pColl ) pColl 
8d10: 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  = db->pDfltColl;
8d20: 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43  .      pInfo->aC
8d30: 6f 6c 6c 5b 69 2d 69 53 74 61 72 74 5d 20 3d 20  oll[i-iStart] = 
8d40: 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 49 6e  pColl;.      pIn
8d50: 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  fo->aSortOrder[i
8d60: 2d 69 53 74 61 72 74 5d 20 3d 20 70 49 74 65 6d  -iStart] = pItem
8d70: 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  ->sortOrder;.   
8d80: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
8d90: 70 49 6e 66 6f 3b 0a 7d 0a 0a 23 69 66 6e 64 65  pInfo;.}..#ifnde
8da0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
8db0: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a  MPOUND_SELECT./*
8dc0: 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20  .** Name of the 
8dd0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 72 61  connection opera
8de0: 74 6f 72 2c 20 75 73 65 64 20 66 6f 72 20 65 72  tor, used for er
8df0: 72 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2f  ror messages..*/
8e00: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
8e10: 61 72 20 2a 73 65 6c 65 63 74 4f 70 4e 61 6d 65  ar *selectOpName
8e20: 28 69 6e 74 20 69 64 29 7b 0a 20 20 63 68 61 72  (int id){.  char
8e30: 20 2a 7a 3b 0a 20 20 73 77 69 74 63 68 28 20 69   *z;.  switch( i
8e40: 64 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  d ){.    case TK
8e50: 5f 41 4c 4c 3a 20 20 20 20 20 20 20 7a 20 3d 20  _ALL:       z = 
8e60: 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20 20 62  "UNION ALL";   b
8e70: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
8e80: 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20 7a 20 3d  K_INTERSECT: z =
8e90: 20 22 49 4e 54 45 52 53 45 43 54 22 3b 20 20 20   "INTERSECT";   
8ea0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
8eb0: 54 4b 5f 45 58 43 45 50 54 3a 20 20 20 20 7a 20  TK_EXCEPT:    z 
8ec0: 3d 20 22 45 58 43 45 50 54 22 3b 20 20 20 20 20  = "EXCEPT";     
8ed0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61   break;.    defa
8ee0: 75 6c 74 3a 20 20 20 20 20 20 20 20 20 20 20 7a  ult:           z
8ef0: 20 3d 20 22 55 4e 49 4f 4e 22 3b 20 20 20 20 20   = "UNION";     
8f00: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72    break;.  }.  r
8f10: 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69  eturn z;.}.#endi
8f20: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
8f30: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
8f40: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
8f50: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
8f60: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 61 6e  ./*.** Unless an
8f70: 20 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20   "EXPLAIN QUERY 
8f80: 50 4c 41 4e 22 20 63 6f 6d 6d 61 6e 64 20 69 73  PLAN" command is
8f90: 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64   being processed
8fa0: 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  , this function.
8fb0: 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f  ** is a no-op. O
8fc0: 74 68 65 72 77 69 73 65 2c 20 69 74 20 61 64 64  therwise, it add
8fd0: 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f  s a single row o
8fe0: 66 20 6f 75 74 70 75 74 20 74 6f 20 74 68 65 20  f output to the 
8ff0: 45 51 50 20 72 65 73 75 6c 74 2c 0a 2a 2a 20 77  EQP result,.** w
9000: 68 65 72 65 20 74 68 65 20 63 61 70 74 69 6f 6e  here the caption
9010: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a   is of the form:
9020: 0a 2a 2a 0a 2a 2a 20 20 20 22 55 53 45 20 54 45  .**.**   "USE TE
9030: 4d 50 20 42 2d 54 52 45 45 20 46 4f 52 20 78 78  MP B-TREE FOR xx
9040: 78 22 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 78  x".**.** where x
9050: 78 78 20 69 73 20 6f 6e 65 20 6f 66 20 22 44 49  xx is one of "DI
9060: 53 54 49 4e 43 54 22 2c 20 22 4f 52 44 45 52 20  STINCT", "ORDER 
9070: 42 59 22 20 6f 72 20 22 47 52 4f 55 50 20 42 59  BY" or "GROUP BY
9080: 22 2e 20 45 78 61 63 74 6c 79 20 77 68 69 63 68  ". Exactly which
9090: 0a 2a 2a 20 69 73 20 64 65 74 65 72 6d 69 6e 65  .** is determine
90a0: 64 20 62 79 20 74 68 65 20 7a 55 73 61 67 65 20  d by the zUsage 
90b0: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  argument..*/.sta
90c0: 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e  tic void explain
90d0: 54 65 6d 70 54 61 62 6c 65 28 50 61 72 73 65 20  TempTable(Parse 
90e0: 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63  *pParse, const c
90f0: 68 61 72 20 2a 7a 55 73 61 67 65 29 7b 0a 20 20  har *zUsage){.  
9100: 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
9110: 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 56 64  ain==2 ){.    Vd
9120: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
9130: 70 56 64 62 65 3b 0a 20 20 20 20 63 68 61 72 20  pVdbe;.    char 
9140: 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d  *zMsg = sqlite3M
9150: 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64  Printf(pParse->d
9160: 62 2c 20 22 55 53 45 20 54 45 4d 50 20 42 2d 54  b, "USE TEMP B-T
9170: 52 45 45 20 46 4f 52 20 25 73 22 2c 20 7a 55 73  REE FOR %s", zUs
9180: 61 67 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  age);.    sqlite
9190: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
91a0: 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73  P_Explain, pPars
91b0: 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c  e->iSelectId, 0,
91c0: 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e   0, zMsg, P4_DYN
91d0: 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  AMIC);.  }.}../*
91e0: 0a 2a 2a 20 41 73 73 69 67 6e 20 65 78 70 72 65  .** Assign expre
91f0: 73 73 69 6f 6e 20 62 20 74 6f 20 6c 76 61 6c 75  ssion b to lvalu
9200: 65 20 61 2e 20 41 20 73 65 63 6f 6e 64 2c 20 6e  e a. A second, n
9210: 6f 2d 6f 70 2c 20 76 65 72 73 69 6f 6e 20 6f 66  o-op, version of
9220: 20 74 68 69 73 20 6d 61 63 72 6f 0a 2a 2a 20 69   this macro.** i
9230: 73 20 70 72 6f 76 69 64 65 64 20 77 68 65 6e 20  s provided when 
9240: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
9250: 41 49 4e 20 69 73 20 64 65 66 69 6e 65 64 2e 20  AIN is defined. 
9260: 54 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20  This allows the 
9270: 63 6f 64 65 0a 2a 2a 20 69 6e 20 73 71 6c 69 74  code.** in sqlit
9280: 65 33 53 65 6c 65 63 74 28 29 20 74 6f 20 61 73  e3Select() to as
9290: 73 69 67 6e 20 76 61 6c 75 65 73 20 74 6f 20 73  sign values to s
92a0: 74 72 75 63 74 75 72 65 20 6d 65 6d 62 65 72 20  tructure member 
92b0: 76 61 72 69 61 62 6c 65 73 20 74 68 61 74 0a 2a  variables that.*
92c0: 2a 20 6f 6e 6c 79 20 65 78 69 73 74 20 69 66 20  * only exist if 
92d0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
92e0: 41 49 4e 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  AIN is not defin
92f0: 65 64 20 77 69 74 68 6f 75 74 20 70 6f 6c 6c 75  ed without pollu
9300: 74 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 64 65  ting the.** code
9310: 20 77 69 74 68 20 23 69 66 6e 64 65 66 20 64 69   with #ifndef di
9320: 72 65 63 74 69 76 65 73 2e 0a 2a 2f 0a 23 20 64  rectives..*/.# d
9330: 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 53 65 74  efine explainSet
9340: 49 6e 74 65 67 65 72 28 61 2c 20 62 29 20 61 20  Integer(a, b) a 
9350: 3d 20 62 0a 0a 23 65 6c 73 65 0a 2f 2a 20 4e 6f  = b..#else./* No
9360: 2d 6f 70 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  -op versions of 
9370: 74 68 65 20 65 78 70 6c 61 69 6e 58 58 58 28 29  the explainXXX()
9380: 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6d   functions and m
9390: 61 63 72 6f 73 2e 20 2a 2f 0a 23 20 64 65 66 69  acros. */.# defi
93a0: 6e 65 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61  ne explainTempTa
93b0: 62 6c 65 28 79 2c 7a 29 0a 23 20 64 65 66 69 6e  ble(y,z).# defin
93c0: 65 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65  e explainSetInte
93d0: 67 65 72 28 79 2c 7a 29 0a 23 65 6e 64 69 66 0a  ger(y,z).#endif.
93e0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
93f0: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
9400: 4e 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  N) && !defined(S
9410: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
9420: 55 4e 44 5f 53 45 4c 45 43 54 29 0a 2f 2a 0a 2a  UND_SELECT)./*.*
9430: 2a 20 55 6e 6c 65 73 73 20 61 6e 20 22 45 58 50  * Unless an "EXP
9440: 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 22  LAIN QUERY PLAN"
9450: 20 63 6f 6d 6d 61 6e 64 20 69 73 20 62 65 69 6e   command is bein
9460: 67 20 70 72 6f 63 65 73 73 65 64 2c 20 74 68 69  g processed, thi
9470: 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73  s function.** is
9480: 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77   a no-op. Otherw
9490: 69 73 65 2c 20 69 74 20 61 64 64 73 20 61 20 73  ise, it adds a s
94a0: 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 6f 75 74  ingle row of out
94b0: 70 75 74 20 74 6f 20 74 68 65 20 45 51 50 20 72  put to the EQP r
94c0: 65 73 75 6c 74 2c 0a 2a 2a 20 77 68 65 72 65 20  esult,.** where 
94d0: 74 68 65 20 63 61 70 74 69 6f 6e 20 69 73 20 6f  the caption is o
94e0: 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 77 6f  f one of the two
94f0: 20 66 6f 72 6d 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   forms:.**.**   
9500: 22 43 4f 4d 50 4f 53 49 54 45 20 53 55 42 51 55  "COMPOSITE SUBQU
9510: 45 52 49 45 53 20 69 53 75 62 31 20 61 6e 64 20  ERIES iSub1 and 
9520: 69 53 75 62 32 20 28 6f 70 29 22 0a 2a 2a 20 20  iSub2 (op)".**  
9530: 20 22 43 4f 4d 50 4f 53 49 54 45 20 53 55 42 51   "COMPOSITE SUBQ
9540: 55 45 52 49 45 53 20 69 53 75 62 31 20 61 6e 64  UERIES iSub1 and
9550: 20 69 53 75 62 32 20 55 53 49 4e 47 20 54 45 4d   iSub2 USING TEM
9560: 50 20 42 2d 54 52 45 45 20 28 6f 70 29 22 0a 2a  P B-TREE (op)".*
9570: 2a 0a 2a 2a 20 77 68 65 72 65 20 69 53 75 62 31  *.** where iSub1
9580: 20 61 6e 64 20 69 53 75 62 32 20 61 72 65 20 74   and iSub2 are t
9590: 68 65 20 69 6e 74 65 67 65 72 73 20 70 61 73 73  he integers pass
95a0: 65 64 20 61 73 20 74 68 65 20 63 6f 72 72 65 73  ed as the corres
95b0: 70 6f 6e 64 69 6e 67 0a 2a 2a 20 66 75 6e 63 74  ponding.** funct
95c0: 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 73 2c 20  ion parameters, 
95d0: 61 6e 64 20 6f 70 20 69 73 20 74 68 65 20 74 65  and op is the te
95e0: 78 74 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  xt representatio
95f0: 6e 20 6f 66 20 74 68 65 20 70 61 72 61 6d 65 74  n of the paramet
9600: 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61 6d  er.** of the sam
9610: 65 20 6e 61 6d 65 2e 20 54 68 65 20 70 61 72 61  e name. The para
9620: 6d 65 74 65 72 20 22 6f 70 22 20 6d 75 73 74 20  meter "op" must 
9630: 62 65 20 6f 6e 65 20 6f 66 20 54 4b 5f 55 4e 49  be one of TK_UNI
9640: 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c 0a 2a  ON, TK_EXCEPT,.*
9650: 2a 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 6f  * TK_INTERSECT o
9660: 72 20 54 4b 5f 41 4c 4c 2e 20 54 68 65 20 66 69  r TK_ALL. The fi
9670: 72 73 74 20 66 6f 72 6d 20 69 73 20 75 73 65 64  rst form is used
9680: 20 69 66 20 61 72 67 75 6d 65 6e 74 20 62 55 73   if argument bUs
9690: 65 54 6d 70 20 69 73 20 0a 2a 2a 20 66 61 6c 73  eTmp is .** fals
96a0: 65 2c 20 6f 72 20 74 68 65 20 73 65 63 6f 6e 64  e, or the second
96b0: 20 66 6f 72 6d 20 69 66 20 69 74 20 69 73 20 74   form if it is t
96c0: 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  rue..*/.static v
96d0: 6f 69 64 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f  oid explainCompo
96e0: 73 69 74 65 28 0a 20 20 50 61 72 73 65 20 2a 70  site(.  Parse *p
96f0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
9700: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
9710: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
9720: 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  t op,           
9730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9740: 20 4f 6e 65 20 6f 66 20 54 4b 5f 55 4e 49 4f 4e   One of TK_UNION
9750: 2c 20 54 4b 5f 45 58 43 45 50 54 20 65 74 63 2e  , TK_EXCEPT etc.
9760: 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 31 2c   */.  int iSub1,
9770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9780: 20 20 20 20 20 20 2f 2a 20 53 75 62 71 75 65 72        /* Subquer
9790: 79 20 69 64 20 31 20 2a 2f 0a 20 20 69 6e 74 20  y id 1 */.  int 
97a0: 69 53 75 62 32 2c 20 20 20 20 20 20 20 20 20 20  iSub2,          
97b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
97c0: 75 62 71 75 65 72 79 20 69 64 20 32 20 2a 2f 0a  ubquery id 2 */.
97d0: 20 20 69 6e 74 20 62 55 73 65 54 6d 70 20 20 20    int bUseTmp   
97e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97f0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 74    /* True if a t
9800: 65 6d 70 20 74 61 62 6c 65 20 77 61 73 20 75 73  emp table was us
9810: 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72  ed */.){.  asser
9820: 74 28 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  t( op==TK_UNION 
9830: 7c 7c 20 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54  || op==TK_EXCEPT
9840: 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52   || op==TK_INTER
9850: 53 45 43 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 41  SECT || op==TK_A
9860: 4c 4c 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72  LL );.  if( pPar
9870: 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29  se->explain==2 )
9880: 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20  {.    Vdbe *v = 
9890: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
98a0: 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20     char *zMsg = 
98b0: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 0a  sqlite3MPrintf(.
98c0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
98d0: 64 62 2c 20 22 43 4f 4d 50 4f 55 4e 44 20 53 55  db, "COMPOUND SU
98e0: 42 51 55 45 52 49 45 53 20 25 64 20 41 4e 44 20  BQUERIES %d AND 
98f0: 25 64 20 25 73 28 25 73 29 22 2c 20 69 53 75 62  %d %s(%s)", iSub
9900: 31 2c 20 69 53 75 62 32 2c 0a 20 20 20 20 20 20  1, iSub2,.      
9910: 20 20 62 55 73 65 54 6d 70 3f 22 55 53 49 4e 47    bUseTmp?"USING
9920: 20 54 45 4d 50 20 42 2d 54 52 45 45 20 22 3a 22   TEMP B-TREE ":"
9930: 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28  ", selectOpName(
9940: 6f 70 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 73  op).    );.    s
9950: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
9960: 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20  (v, OP_Explain, 
9970: 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49  pParse->iSelectI
9980: 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20 50  d, 0, 0, zMsg, P
9990: 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a  4_DYNAMIC);.  }.
99a0: 7d 0a 23 65 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70  }.#else./* No-op
99b0: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65   versions of the
99c0: 20 65 78 70 6c 61 69 6e 58 58 58 28 29 20 66 75   explainXXX() fu
99d0: 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6d 61 63 72  nctions and macr
99e0: 6f 73 2e 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20  os. */.# define 
99f0: 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65  explainComposite
9a00: 28 76 2c 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64  (v,w,x,y,z).#end
9a10: 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  if../*.** If the
9a20: 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 77 61 73 20   inner loop was 
9a30: 67 65 6e 65 72 61 74 65 64 20 75 73 69 6e 67 20  generated using 
9a40: 61 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65  a non-null pOrde
9a50: 72 42 79 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a  rBy argument,.**
9a60: 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
9a70: 73 20 77 65 72 65 20 70 6c 61 63 65 64 20 69 6e  s were placed in
9a80: 20 61 20 73 6f 72 74 65 72 2e 20 20 41 66 74 65   a sorter.  Afte
9a90: 72 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 74 65  r the loop is te
9aa0: 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 77 65 20 6e  rminated.** we n
9ab0: 65 65 64 20 74 6f 20 72 75 6e 20 74 68 65 20 73  eed to run the s
9ac0: 6f 72 74 65 72 20 61 6e 64 20 6f 75 74 70 75 74  orter and output
9ad0: 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54   the results.  T
9ae0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
9af0: 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65  routine generate
9b00: 73 20 74 68 65 20 63 6f 64 65 20 6e 65 65 64 65  s the code neede
9b10: 64 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f  d to do that..*/
9b20: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e  .static void gen
9b30: 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 0a 20  erateSortTail(. 
9b40: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
9b50: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
9b60: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
9b70: 74 20 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a 20  t *p,        /* 
9b80: 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
9b90: 6d 65 6e 74 20 2a 2f 0a 20 20 53 6f 72 74 43 74  ment */.  SortCt
9ba0: 78 20 2a 70 53 6f 72 74 2c 20 20 20 2f 2a 20 49  x *pSort,   /* I
9bb0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 74 68  nformation on th
9bc0: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
9bd0: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75  e */.  int nColu
9be0: 6d 6e 2c 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  mn,      /* Numb
9bf0: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66  er of columns of
9c00: 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63   data */.  Selec
9c10: 74 44 65 73 74 20 2a 70 44 65 73 74 20 2f 2a 20  tDest *pDest /* 
9c20: 57 72 69 74 65 20 74 68 65 20 73 6f 72 74 65 64  Write the sorted
9c30: 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f   results here */
9c40: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
9c50: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20  pParse->pVdbe;  
9c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c70: 20 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72     /* The prepar
9c80: 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  ed statement */.
9c90: 20 20 69 6e 74 20 61 64 64 72 42 72 65 61 6b 20    int addrBreak 
9ca0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
9cb0: 65 4c 61 62 65 6c 28 76 29 3b 20 20 20 20 20 2f  eLabel(v);     /
9cc0: 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 65  * Jump here to e
9cd0: 78 69 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e  xit loop */.  in
9ce0: 74 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 20 3d  t addrContinue =
9cf0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
9d00: 4c 61 62 65 6c 28 76 29 3b 20 20 2f 2a 20 4a 75  Label(v);  /* Ju
9d10: 6d 70 20 68 65 72 65 20 66 6f 72 20 6e 65 78 74  mp here for next
9d20: 20 63 79 63 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   cycle */.  int 
9d30: 61 64 64 72 3b 0a 20 20 69 6e 74 20 61 64 64 72  addr;.  int addr
9d40: 4f 6e 63 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Once = 0;.  int 
9d50: 69 54 61 62 3b 0a 20 20 45 78 70 72 4c 69 73 74  iTab;.  ExprList
9d60: 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 53 6f   *pOrderBy = pSo
9d70: 72 74 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20  rt->pOrderBy;.  
9d80: 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65 73  int eDest = pDes
9d90: 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69 6e 74 20  t->eDest;.  int 
9da0: 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69  iParm = pDest->i
9db0: 53 44 50 61 72 6d 3b 0a 20 20 69 6e 74 20 72 65  SDParm;.  int re
9dc0: 67 52 6f 77 3b 0a 20 20 69 6e 74 20 72 65 67 52  gRow;.  int regR
9dd0: 6f 77 69 64 3b 0a 20 20 69 6e 74 20 6e 4b 65 79  owid;.  int nKey
9de0: 3b 0a 20 20 69 6e 74 20 69 53 6f 72 74 54 61 62  ;.  int iSortTab
9df0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9e00: 20 20 20 20 2f 2a 20 53 6f 72 74 65 72 20 63 75      /* Sorter cu
9e10: 72 73 6f 72 20 74 6f 20 72 65 61 64 20 66 72 6f  rsor to read fro
9e20: 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 6f 72 74  m */.  int nSort
9e30: 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
9e40: 20 20 20 20 20 20 20 2f 2a 20 54 72 61 69 6c 69         /* Traili
9e50: 6e 67 20 76 61 6c 75 65 73 20 74 6f 20 72 65 61  ng values to rea
9e60: 64 20 66 72 6f 6d 20 73 6f 72 74 65 72 20 2a 2f  d from sorter */
9e70: 0a 20 20 75 38 20 70 35 3b 20 20 20 20 20 20 20  .  u8 p5;       
9e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e90: 20 20 20 2f 2a 20 70 35 20 70 61 72 61 6d 65 74     /* p5 paramet
9ea0: 65 72 20 66 6f 72 20 31 73 74 20 4f 50 5f 43 6f  er for 1st OP_Co
9eb0: 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  lumn */.  int i;
9ec0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
9ed0: 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f  NABLE_EXPLAIN_CO
9ee0: 4d 4d 45 4e 54 53 0a 20 20 73 74 72 75 63 74 20  MMENTS.  struct 
9ef0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
9f00: 4f 75 74 45 78 20 3d 20 70 2d 3e 70 45 4c 69 73  OutEx = p->pELis
9f10: 74 2d 3e 61 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  t->a;.#endif..  
9f20: 69 66 28 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c  if( pSort->label
9f30: 42 6b 4f 75 74 20 29 7b 0a 20 20 20 20 73 71 6c  BkOut ){.    sql
9f40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
9f50: 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 53 6f 72  , OP_Gosub, pSor
9f60: 74 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 53  t->regReturn, pS
9f70: 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29  ort->labelBkOut)
9f80: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
9f90: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
9fa0: 74 6f 2c 20 30 2c 20 61 64 64 72 42 72 65 61 6b  to, 0, addrBreak
9fb0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
9fc0: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
9fd0: 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b  , pSort->labelBk
9fe0: 4f 75 74 29 3b 0a 20 20 20 20 61 64 64 72 4f 6e  Out);.    addrOn
9ff0: 63 65 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65  ce = sqlite3Code
a000: 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 20 56 64  Once(pParse); Vd
a010: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
a020: 20 7d 0a 20 20 69 54 61 62 20 3d 20 70 53 6f 72   }.  iTab = pSor
a030: 74 2d 3e 69 45 43 75 72 73 6f 72 3b 0a 20 20 72  t->iECursor;.  r
a040: 65 67 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 47  egRow = sqlite3G
a050: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
a060: 29 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d  );.  if( eDest==
a070: 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44  SRT_Output || eD
a080: 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69  est==SRT_Corouti
a090: 6e 65 20 29 7b 0a 20 20 20 20 72 65 67 52 6f 77  ne ){.    regRow
a0a0: 69 64 20 3d 20 30 3b 0a 20 20 20 20 72 65 67 52  id = 0;.    regR
a0b0: 6f 77 20 3d 20 70 44 65 73 74 2d 3e 69 53 64 73  ow = pDest->iSds
a0c0: 74 3b 0a 20 20 20 20 6e 53 6f 72 74 44 61 74 61  t;.    nSortData
a0d0: 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7d 65   = nColumn;.  }e
a0e0: 6c 73 65 7b 0a 20 20 20 20 72 65 67 52 6f 77 69  lse{.    regRowi
a0f0: 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  d = sqlite3GetTe
a100: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
a110: 20 20 20 72 65 67 52 6f 77 20 3d 20 73 71 6c 69     regRow = sqli
a120: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
a130: 61 72 73 65 29 3b 0a 20 20 20 20 6e 53 6f 72 74  arse);.    nSort
a140: 44 61 74 61 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  Data = 1;.  }.  
a150: 6e 4b 65 79 20 3d 20 70 4f 72 64 65 72 42 79 2d  nKey = pOrderBy-
a160: 3e 6e 45 78 70 72 20 2d 20 70 53 6f 72 74 2d 3e  >nExpr - pSort->
a170: 6e 4f 42 53 61 74 3b 0a 20 20 69 66 28 20 70 53  nOBSat;.  if( pS
a180: 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26  ort->sortFlags &
a190: 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72   SORTFLAG_UseSor
a1a0: 74 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ter ){.    int r
a1b0: 65 67 53 6f 72 74 4f 75 74 20 3d 20 2b 2b 70 50  egSortOut = ++pP
a1c0: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
a1d0: 69 53 6f 72 74 54 61 62 20 3d 20 70 50 61 72 73  iSortTab = pPars
a1e0: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73  e->nTab++;.    s
a1f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
a200: 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64  (v, OP_OpenPseud
a210: 6f 2c 20 69 53 6f 72 74 54 61 62 2c 20 72 65 67  o, iSortTab, reg
a220: 53 6f 72 74 4f 75 74 2c 20 6e 4b 65 79 2b 31 2b  SortOut, nKey+1+
a230: 6e 53 6f 72 74 44 61 74 61 29 3b 0a 20 20 20 20  nSortData);.    
a240: 69 66 28 20 61 64 64 72 4f 6e 63 65 20 29 20 73  if( addrOnce ) s
a250: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
a260: 72 65 28 76 2c 20 61 64 64 72 4f 6e 63 65 29 3b  re(v, addrOnce);
a270: 0a 20 20 20 20 61 64 64 72 20 3d 20 31 20 2b 20  .    addr = 1 + 
a280: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a290: 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f  2(v, OP_SorterSo
a2a0: 72 74 2c 20 69 54 61 62 2c 20 61 64 64 72 42 72  rt, iTab, addrBr
a2b0: 65 61 6b 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  eak);.    VdbeCo
a2c0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 63  verage(v);.    c
a2d0: 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e  odeOffset(v, p->
a2e0: 69 4f 66 66 73 65 74 2c 20 61 64 64 72 43 6f 6e  iOffset, addrCon
a2f0: 74 69 6e 75 65 29 3b 0a 20 20 20 20 73 71 6c 69  tinue);.    sqli
a300: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
a310: 20 4f 50 5f 53 6f 72 74 65 72 44 61 74 61 2c 20   OP_SorterData, 
a320: 69 54 61 62 2c 20 72 65 67 53 6f 72 74 4f 75 74  iTab, regSortOut
a330: 29 3b 0a 20 20 20 20 70 35 20 3d 20 4f 50 46 4c  );.    p5 = OPFL
a340: 41 47 5f 43 4c 45 41 52 43 41 43 48 45 3b 0a 20  AG_CLEARCACHE;. 
a350: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
a360: 61 64 64 72 4f 6e 63 65 20 29 20 73 71 6c 69 74  addrOnce ) sqlit
a370: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
a380: 2c 20 61 64 64 72 4f 6e 63 65 29 3b 0a 20 20 20  , addrOnce);.   
a390: 20 61 64 64 72 20 3d 20 31 20 2b 20 73 71 6c 69   addr = 1 + sqli
a3a0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
a3b0: 20 4f 50 5f 53 6f 72 74 2c 20 69 54 61 62 2c 20   OP_Sort, iTab, 
a3c0: 61 64 64 72 42 72 65 61 6b 29 3b 20 56 64 62 65  addrBreak); Vdbe
a3d0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
a3e0: 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70   codeOffset(v, p
a3f0: 2d 3e 69 4f 66 66 73 65 74 2c 20 61 64 64 72 43  ->iOffset, addrC
a400: 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 73 71  ontinue);.    sq
a410: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
a420: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54  v, OP_Column, iT
a430: 61 62 2c 20 6e 4b 65 79 2b 31 2c 20 72 65 67 52  ab, nKey+1, regR
a440: 6f 77 29 3b 0a 20 20 20 20 69 53 6f 72 74 54 61  ow);.    iSortTa
a450: 62 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70 35  b = iTab;.    p5
a460: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28   = 0;.  }.  for(
a470: 69 3d 30 3b 20 69 3c 6e 53 6f 72 74 44 61 74 61  i=0; i<nSortData
a480: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
a490: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
a4a0: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53 6f 72   OP_Column, iSor
a4b0: 74 54 61 62 2c 20 6e 4b 65 79 2b 31 2b 69 2c 20  tTab, nKey+1+i, 
a4c0: 72 65 67 52 6f 77 2b 69 29 3b 0a 20 20 20 20 69  regRow+i);.    i
a4d0: 66 28 20 69 3d 3d 30 20 29 20 73 71 6c 69 74 65  f( i==0 ) sqlite
a4e0: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
a4f0: 20 70 35 29 3b 0a 20 20 20 20 56 64 62 65 43 6f   p5);.    VdbeCo
a500: 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20  mment((v, "%s", 
a510: 61 4f 75 74 45 78 5b 69 5d 2e 7a 4e 61 6d 65 20  aOutEx[i].zName 
a520: 3f 20 61 4f 75 74 45 78 5b 69 5d 2e 7a 4e 61 6d  ? aOutEx[i].zNam
a530: 65 20 3a 20 61 4f 75 74 45 78 5b 69 5d 2e 7a 53  e : aOutEx[i].zS
a540: 70 61 6e 29 29 3b 0a 20 20 7d 0a 20 20 73 77 69  pan));.  }.  swi
a550: 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20  tch( eDest ){.  
a560: 20 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65    case SRT_Table
a570: 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45  :.    case SRT_E
a580: 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20  phemTab: {.     
a590: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
a5a0: 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20  ==SRT_Table );. 
a5b0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
a5c0: 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54  Dest==SRT_EphemT
a5d0: 61 62 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ab );.      sqli
a5e0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
a5f0: 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50   OP_NewRowid, iP
a600: 61 72 6d 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  arm, regRowid);.
a610: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a620: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
a630: 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67  sert, iParm, reg
a640: 52 6f 77 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  Row, regRowid);.
a650: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a660: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
a670: 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20  LAG_APPEND);.   
a680: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
a690: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
a6a0: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
a6b0: 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b   case SRT_Set: {
a6c0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
a6d0: 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20  Column==1 );.   
a6e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a6f0: 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp4(v, OP_MakeR
a700: 65 63 6f 72 64 2c 20 72 65 67 52 6f 77 2c 20 31  ecord, regRow, 1
a710: 2c 20 72 65 67 52 6f 77 69 64 2c 0a 20 20 20 20  , regRowid,.    
a720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a730: 20 20 20 20 26 70 44 65 73 74 2d 3e 61 66 66 53      &pDest->affS
a740: 64 73 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 73  dst, 1);.      s
a750: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
a760: 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
a770: 61 72 73 65 2c 20 72 65 67 52 6f 77 2c 20 31 29  arse, regRow, 1)
a780: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
a790: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
a7a0: 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  IdxInsert, iParm
a7b0: 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20  , regRowid);.   
a7c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
a7d0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d      case SRT_Mem
a7e0: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
a7f0: 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a  ( nColumn==1 );.
a800: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
a810: 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65  rCodeMove(pParse
a820: 2c 20 72 65 67 52 6f 77 2c 20 69 50 61 72 6d 2c  , regRow, iParm,
a830: 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68   1);.      /* Th
a840: 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77  e LIMIT clause w
a850: 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68  ill terminate th
a860: 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f  e loop for us */
a870: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
a880: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64    }.#endif.    d
a890: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
a8a0: 61 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d 53  assert( eDest==S
a8b0: 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65  RT_Output || eDe
a8c0: 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st==SRT_Coroutin
a8d0: 65 20 29 3b 20 0a 20 20 20 20 20 20 74 65 73 74  e ); .      test
a8e0: 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54  case( eDest==SRT
a8f0: 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20  _Output );.     
a900: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
a910: 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20  ==SRT_Coroutine 
a920: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44 65  );.      if( eDe
a930: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
a940: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
a950: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
a960: 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70 44 65  P_ResultRow, pDe
a970: 73 74 2d 3e 69 53 64 73 74 2c 20 6e 43 6f 6c 75  st->iSdst, nColu
a980: 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  mn);.        sql
a990: 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
a9a0: 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
a9b0: 73 65 2c 20 70 44 65 73 74 2d 3e 69 53 64 73 74  se, pDest->iSdst
a9c0: 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  , nColumn);.    
a9d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a9e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a9f0: 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
aa00: 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b  pDest->iSDParm);
aa10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
aa20: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
aa30: 20 20 69 66 28 20 72 65 67 52 6f 77 69 64 20 29    if( regRowid )
aa40: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  {.    sqlite3Rel
aa50: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
aa60: 73 65 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20 20  se, regRow);.   
aa70: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
aa80: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
aa90: 65 67 52 6f 77 69 64 29 3b 0a 20 20 7d 0a 20 20  egRowid);.  }.  
aaa0: 2f 2a 20 54 68 65 20 62 6f 74 74 6f 6d 20 6f 66  /* The bottom of
aab0: 20 74 68 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20   the loop.  */. 
aac0: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
aad0: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
aae0: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 69 66 28  Continue);.  if(
aaf0: 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67   pSort->sortFlag
ab00: 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65  s & SORTFLAG_Use
ab10: 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 73 71  Sorter ){.    sq
ab20: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
ab30: 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74  v, OP_SorterNext
ab40: 2c 20 69 54 61 62 2c 20 61 64 64 72 29 3b 20 56  , iTab, addr); V
ab50: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
ab60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
ab70: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
ab80: 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c  , OP_Next, iTab,
ab90: 20 61 64 64 72 29 3b 20 56 64 62 65 43 6f 76 65   addr); VdbeCove
aba0: 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 69  rage(v);.  }.  i
abb0: 66 28 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74  f( pSort->regRet
abc0: 75 72 6e 20 29 20 73 71 6c 69 74 65 33 56 64 62  urn ) sqlite3Vdb
abd0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
abe0: 74 75 72 6e 2c 20 70 53 6f 72 74 2d 3e 72 65 67  turn, pSort->reg
abf0: 52 65 74 75 72 6e 29 3b 0a 20 20 73 71 6c 69 74  Return);.  sqlit
ac00: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
ac10: 65 6c 28 76 2c 20 61 64 64 72 42 72 65 61 6b 29  el(v, addrBreak)
ac20: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
ac30: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
ac40: 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69   string containi
ac50: 6e 67 20 74 68 65 20 27 64 65 63 6c 61 72 61 74  ng the 'declarat
ac60: 69 6f 6e 20 74 79 70 65 27 20 6f 66 20 74 68 65  ion type' of the
ac70: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70  .** expression p
ac80: 45 78 70 72 2e 20 54 68 65 20 73 74 72 69 6e 67  Expr. The string
ac90: 20 6d 61 79 20 62 65 20 74 72 65 61 74 65 64 20   may be treated 
aca0: 61 73 20 73 74 61 74 69 63 20 62 79 20 74 68 65  as static by the
acb0: 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41   caller..**.** A
acc0: 6c 73 6f 20 74 72 79 20 74 6f 20 65 73 74 69 6d  lso try to estim
acd0: 61 74 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ate the size of 
ace0: 74 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c  the returned val
acf0: 75 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  ue and return th
ad00: 61 74 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20  at.** result in 
ad10: 2a 70 45 73 74 57 69 64 74 68 2e 0a 2a 2a 0a 2a  *pEstWidth..**.*
ad20: 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74 69 6f  * The declaratio
ad30: 6e 20 74 79 70 65 20 69 73 20 74 68 65 20 65 78  n type is the ex
ad40: 61 63 74 20 64 61 74 61 74 79 70 65 20 64 65 66  act datatype def
ad50: 69 6e 69 74 69 6f 6e 20 65 78 74 72 61 63 74 65  inition extracte
ad60: 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6f 72  d from the.** or
ad70: 69 67 69 6e 61 6c 20 43 52 45 41 54 45 20 54 41  iginal CREATE TA
ad80: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69 66  BLE statement if
ad90: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
ada0: 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 54 68 65  is a column. The
adb0: 0a 2a 2a 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  .** declaration 
adc0: 74 79 70 65 20 66 6f 72 20 61 20 52 4f 57 49 44  type for a ROWID
add0: 20 66 69 65 6c 64 20 69 73 20 49 4e 54 45 47 45   field is INTEGE
ade0: 52 2e 20 45 78 61 63 74 6c 79 20 77 68 65 6e 20  R. Exactly when 
adf0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  an expression.**
ae00: 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
ae10: 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20 63   column can be c
ae20: 6f 6d 70 6c 65 78 20 69 6e 20 74 68 65 20 70 72  omplex in the pr
ae30: 65 73 65 6e 63 65 20 6f 66 20 73 75 62 71 75 65  esence of subque
ae40: 72 69 65 73 2e 20 54 68 65 0a 2a 2a 20 72 65 73  ries. The.** res
ae50: 75 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73 69  ult-set expressi
ae60: 6f 6e 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 65  on in all of the
ae70: 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 45 4c 45 43   following SELEC
ae80: 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69 73 20  T statements is 
ae90: 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 61  .** considered a
aea0: 20 63 6f 6c 75 6d 6e 20 62 79 20 74 68 69 73 20   column by this 
aeb0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
aec0: 20 20 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f    SELECT col FRO
aed0: 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45  M tbl;.**   SELE
aee0: 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 46  CT (SELECT col F
aef0: 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45  ROM tbl;.**   SE
af00: 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c  LECT (SELECT col
af10: 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 20   FROM tbl);.**  
af20: 20 53 45 4c 45 43 54 20 61 62 63 20 46 52 4f 4d   SELECT abc FROM
af30: 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 41 53 20   (SELECT col AS 
af40: 61 62 63 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a  abc FROM tbl);.*
af50: 2a 20 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72  * .** The declar
af60: 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61  ation type for a
af70: 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 74  ny expression ot
af80: 68 65 72 20 74 68 61 6e 20 61 20 63 6f 6c 75 6d  her than a colum
af90: 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  n is NULL..**.**
afa0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61   This routine ha
afb0: 73 20 65 69 74 68 65 72 20 33 20 6f 72 20 36 20  s either 3 or 6 
afc0: 70 61 72 61 6d 65 74 65 72 73 20 64 65 70 65 6e  parameters depen
afd0: 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20  ding on whether 
afe0: 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 53 51  or not.** the SQ
aff0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
b000: 4d 4e 5f 4d 45 54 41 44 41 54 41 20 63 6f 6d 70  MN_METADATA comp
b010: 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20  ile-time option 
b020: 69 73 20 75 73 65 64 2e 0a 2a 2f 0a 23 69 66 64  is used..*/.#ifd
b030: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
b040: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
b050: 0a 23 20 64 65 66 69 6e 65 20 63 6f 6c 75 6d 6e  .# define column
b060: 54 79 70 65 28 41 2c 42 2c 43 2c 44 2c 45 2c 46  Type(A,B,C,D,E,F
b070: 29 20 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c  ) columnTypeImpl
b080: 28 41 2c 42 2c 43 2c 44 2c 45 2c 46 29 0a 73 74  (A,B,C,D,E,F).st
b090: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
b0a0: 2a 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28  *columnTypeImpl(
b0b0: 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
b0c0: 70 4e 43 2c 20 0a 20 20 45 78 70 72 20 2a 70 45  pNC, .  Expr *pE
b0d0: 78 70 72 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  xpr,.  const cha
b0e0: 72 20 2a 2a 70 7a 4f 72 69 67 44 62 2c 0a 20 20  r **pzOrigDb,.  
b0f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f  const char **pzO
b100: 72 69 67 54 61 62 2c 0a 20 20 63 6f 6e 73 74 20  rigTab,.  const 
b110: 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 43 6f 6c  char **pzOrigCol
b120: 2c 0a 20 20 75 38 20 2a 70 45 73 74 57 69 64 74  ,.  u8 *pEstWidt
b130: 68 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73  h.){.  char cons
b140: 74 20 2a 7a 4f 72 69 67 44 62 20 3d 20 30 3b 0a  t *zOrigDb = 0;.
b150: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f    char const *zO
b160: 72 69 67 54 61 62 20 3d 20 30 3b 0a 20 20 63 68  rigTab = 0;.  ch
b170: 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 43  ar const *zOrigC
b180: 6f 6c 20 3d 20 30 3b 0a 23 65 6c 73 65 20 2f 2a  ol = 0;.#else /*
b190: 20 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c   if !defined(SQL
b1a0: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
b1b0: 4e 5f 4d 45 54 41 44 41 54 41 29 20 2a 2f 0a 23  N_METADATA) */.#
b1c0: 20 64 65 66 69 6e 65 20 63 6f 6c 75 6d 6e 54 79   define columnTy
b1d0: 70 65 28 41 2c 42 2c 43 2c 44 2c 45 2c 46 29 20  pe(A,B,C,D,E,F) 
b1e0: 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28 41  columnTypeImpl(A
b1f0: 2c 42 2c 46 29 0a 73 74 61 74 69 63 20 63 6f 6e  ,B,F).static con
b200: 73 74 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e 54  st char *columnT
b210: 79 70 65 49 6d 70 6c 28 0a 20 20 4e 61 6d 65 43  ypeImpl(.  NameC
b220: 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 0a 20 20  ontext *pNC, .  
b230: 45 78 70 72 20 2a 70 45 78 70 72 2c 0a 20 20 75  Expr *pExpr,.  u
b240: 38 20 2a 70 45 73 74 57 69 64 74 68 0a 29 7b 0a  8 *pEstWidth.){.
b250: 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
b260: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
b270: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
b280: 29 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73  ) */.  char cons
b290: 74 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20  t *zType = 0;.  
b2a0: 69 6e 74 20 6a 3b 0a 20 20 75 38 20 65 73 74 57  int j;.  u8 estW
b2b0: 69 64 74 68 20 3d 20 31 3b 0a 0a 20 20 69 66 28  idth = 1;..  if(
b2c0: 20 4e 45 56 45 52 28 70 45 78 70 72 3d 3d 30 29   NEVER(pExpr==0)
b2d0: 20 7c 7c 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73   || pNC->pSrcLis
b2e0: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  t==0 ) return 0;
b2f0: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
b300: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
b310: 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a   TK_AGG_COLUMN:.
b320: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
b330: 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54  MN: {.      /* T
b340: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
b350: 20 61 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63 61 74   a column. Locat
b360: 65 20 74 68 65 20 74 61 62 6c 65 20 74 68 65 20  e the table the 
b370: 63 6f 6c 75 6d 6e 20 69 73 20 62 65 69 6e 67 0a  column is being.
b380: 20 20 20 20 20 20 2a 2a 20 65 78 74 72 61 63 74        ** extract
b390: 65 64 20 66 72 6f 6d 20 69 6e 20 4e 61 6d 65 43  ed from in NameC
b3a0: 6f 6e 74 65 78 74 2e 70 53 72 63 4c 69 73 74 2e  ontext.pSrcList.
b3b0: 20 54 68 69 73 20 74 61 62 6c 65 20 6d 61 79 20   This table may 
b3c0: 62 65 20 72 65 61 6c 0a 20 20 20 20 20 20 2a 2a  be real.      **
b3d0: 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20   database table 
b3e0: 6f 72 20 61 20 73 75 62 71 75 65 72 79 2e 0a 20  or a subquery.. 
b3f0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 61       */.      Ta
b400: 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 20 20  ble *pTab = 0;  
b410: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
b420: 6c 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6c  le structure col
b430: 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74 65 64  umn is extracted
b440: 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 53   from */.      S
b450: 65 6c 65 63 74 20 2a 70 53 20 3d 20 30 3b 20 20  elect *pS = 0;  
b460: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
b470: 6c 65 63 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20  lect the column 
b480: 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
b490: 6d 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  m */.      int i
b4a0: 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f  Col = pExpr->iCo
b4b0: 6c 75 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65 78 20  lumn;  /* Index 
b4c0: 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 54 61  of column in pTa
b4d0: 62 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63  b */.      testc
b4e0: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
b4f0: 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b  TK_AGG_COLUMN );
b500: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
b510: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
b520: 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 77  OLUMN );.      w
b530: 68 69 6c 65 28 20 70 4e 43 20 26 26 20 21 70 54  hile( pNC && !pT
b540: 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 53 72  ab ){.        Sr
b550: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20  cList *pTabList 
b560: 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b  = pNC->pSrcList;
b570: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  .        for(j=0
b580: 3b 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  ;j<pTabList->nSr
b590: 63 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 61  c && pTabList->a
b5a0: 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70 45 78  [j].iCursor!=pEx
b5b0: 70 72 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b 29 3b  pr->iTable;j++);
b5c0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3c 70  .        if( j<p
b5d0: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 7b  TabList->nSrc ){
b5e0: 0a 20 20 20 20 20 20 20 20 20 20 70 54 61 62 20  .          pTab 
b5f0: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  = pTabList->a[j]
b600: 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20  .pTab;.         
b610: 20 70 53 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e   pS = pTabList->
b620: 61 5b 6a 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20  a[j].pSelect;.  
b630: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
b640: 20 20 20 20 20 20 20 70 4e 43 20 3d 20 70 4e 43         pNC = pNC
b650: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
b660: 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
b670: 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b    if( pTab==0 ){
b680: 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 6f  .        /* At o
b690: 6e 65 20 74 69 6d 65 2c 20 63 6f 64 65 20 73 75  ne time, code su
b6a0: 63 68 20 61 73 20 22 53 45 4c 45 43 54 20 6e 65  ch as "SELECT ne
b6b0: 77 2e 78 22 20 77 69 74 68 69 6e 20 61 20 74 72  w.x" within a tr
b6c0: 69 67 67 65 72 20 77 6f 75 6c 64 0a 20 20 20 20  igger would.    
b6d0: 20 20 20 20 2a 2a 20 63 61 75 73 65 20 74 68 69      ** cause thi
b6e0: 73 20 63 6f 6e 64 69 74 69 6f 6e 20 74 6f 20 72  s condition to r
b6f0: 75 6e 2e 20 20 53 69 6e 63 65 20 74 68 65 6e 2c  un.  Since then,
b700: 20 77 65 20 68 61 76 65 20 72 65 73 74 72 75 63   we have restruc
b710: 74 75 72 65 64 20 68 6f 77 0a 20 20 20 20 20 20  tured how.      
b720: 20 20 2a 2a 20 74 72 69 67 67 65 72 20 63 6f 64    ** trigger cod
b730: 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 61  e is generated a
b740: 6e 64 20 73 6f 20 74 68 69 73 20 63 6f 6e 64 69  nd so this condi
b750: 74 69 6f 6e 20 69 73 20 6e 6f 20 6c 6f 6e 67 65  tion is no longe
b760: 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f  r .        ** po
b770: 73 73 69 62 6c 65 2e 20 48 6f 77 65 76 65 72 2c  ssible. However,
b780: 20 69 74 20 63 61 6e 20 73 74 69 6c 6c 20 62 65   it can still be
b790: 20 74 72 75 65 20 66 6f 72 20 73 74 61 74 65 6d   true for statem
b7a0: 65 6e 74 73 20 6c 69 6b 65 0a 20 20 20 20 20 20  ents like.      
b7b0: 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69    ** the followi
b7c0: 6e 67 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ng:.        **. 
b7d0: 20 20 20 20 20 20 20 2a 2a 20 20 20 43 52 45 41         **   CREA
b7e0: 54 45 20 54 41 42 4c 45 20 74 31 28 63 6f 6c 20  TE TABLE t1(col 
b7f0: 49 4e 54 45 47 45 52 29 3b 0a 20 20 20 20 20 20  INTEGER);.      
b800: 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53    **   SELECT (S
b810: 45 4c 45 43 54 20 74 31 2e 63 6f 6c 29 20 46 52  ELECT t1.col) FR
b820: 4f 4d 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20  OM FROM t1;.    
b830: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
b840: 2a 20 77 68 65 6e 20 63 6f 6c 75 6d 6e 54 79 70  * when columnTyp
b850: 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  e() is called on
b860: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
b870: 22 74 31 2e 63 6f 6c 22 20 69 6e 20 74 68 65 20  "t1.col" in the 
b880: 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 75 62 2d  .        ** sub-
b890: 73 65 6c 65 63 74 2e 20 49 6e 20 74 68 69 73 20  select. In this 
b8a0: 63 61 73 65 2c 20 73 65 74 20 74 68 65 20 63 6f  case, set the co
b8b0: 6c 75 6d 6e 20 74 79 70 65 20 74 6f 20 4e 55 4c  lumn type to NUL
b8c0: 4c 2c 20 65 76 65 6e 0a 20 20 20 20 20 20 20 20  L, even.        
b8d0: 2a 2a 20 74 68 6f 75 67 68 20 69 74 20 73 68 6f  ** though it sho
b8e0: 75 6c 64 20 72 65 61 6c 6c 79 20 62 65 20 22 49  uld really be "I
b8f0: 4e 54 45 47 45 52 22 2e 0a 20 20 20 20 20 20 20  NTEGER"..       
b900: 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
b910: 68 69 73 20 69 73 20 6e 6f 74 20 61 20 70 72 6f  his is not a pro
b920: 62 6c 65 6d 2c 20 61 73 20 74 68 65 20 63 6f 6c  blem, as the col
b930: 75 6d 6e 20 74 79 70 65 20 6f 66 20 22 74 31 2e  umn type of "t1.
b940: 63 6f 6c 22 20 69 73 20 6e 65 76 65 72 0a 20 20  col" is never.  
b950: 20 20 20 20 20 20 2a 2a 20 75 73 65 64 2e 20 57        ** used. W
b960: 68 65 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28 29  hen columnType()
b970: 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68   is called on th
b980: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 0a 20 20  e expression .  
b990: 20 20 20 20 20 20 2a 2a 20 22 28 53 45 4c 45 43        ** "(SELEC
b9a0: 54 20 74 31 2e 63 6f 6c 29 22 2c 20 74 68 65 20  T t1.col)", the 
b9b0: 63 6f 72 72 65 63 74 20 74 79 70 65 20 69 73 20  correct type is 
b9c0: 72 65 74 75 72 6e 65 64 20 28 73 65 65 20 74 68  returned (see th
b9d0: 65 20 54 4b 5f 53 45 4c 45 43 54 0a 20 20 20 20  e TK_SELECT.    
b9e0: 20 20 20 20 2a 2a 20 62 72 61 6e 63 68 20 62 65      ** branch be
b9f0: 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  low.  */.       
ba00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
ba10: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
ba20: 54 61 62 20 26 26 20 70 45 78 70 72 2d 3e 70 54  Tab && pExpr->pT
ba30: 61 62 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20 20  ab==pTab );.    
ba40: 20 20 69 66 28 20 70 53 20 29 7b 0a 20 20 20 20    if( pS ){.    
ba50: 20 20 20 20 2f 2a 20 54 68 65 20 22 74 61 62 6c      /* The "tabl
ba60: 65 22 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61  e" is actually a
ba70: 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 61   sub-select or a
ba80: 20 76 69 65 77 20 69 6e 20 74 68 65 20 46 52 4f   view in the FRO
ba90: 4d 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20  M clause.       
baa0: 20 2a 2a 20 6f 66 20 74 68 65 20 53 45 4c 45 43   ** of the SELEC
bab0: 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 52 65 74  T statement. Ret
bac0: 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74  urn the declarat
bad0: 69 6f 6e 20 74 79 70 65 20 61 6e 64 20 6f 72 69  ion type and ori
bae0: 67 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  gin.        ** d
baf0: 61 74 61 20 66 6f 72 20 74 68 65 20 72 65 73 75  ata for the resu
bb00: 6c 74 2d 73 65 74 20 63 6f 6c 75 6d 6e 20 6f 66  lt-set column of
bb10: 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e   the sub-select.
bb20: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
bb30: 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20      if( iCol>=0 
bb40: 26 26 20 41 4c 57 41 59 53 28 69 43 6f 6c 3c 70  && ALWAYS(iCol<p
bb50: 53 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  S->pEList->nExpr
bb60: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  ) ){.          /
bb70: 2a 20 49 66 20 69 43 6f 6c 20 69 73 20 6c 65 73  * If iCol is les
bb80: 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  s than zero, the
bb90: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
bba0: 20 72 65 71 75 65 73 74 73 20 74 68 65 0a 20 20   requests the.  
bbb0: 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 69 64          ** rowid
bbc0: 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65   of the sub-sele
bbd0: 63 74 20 6f 72 20 76 69 65 77 2e 20 54 68 69 73  ct or view. This
bbe0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6c   expression is l
bbf0: 65 67 61 6c 20 28 73 65 65 20 0a 20 20 20 20 20  egal (see .     
bc00: 20 20 20 20 20 2a 2a 20 74 65 73 74 20 63 61 73       ** test cas
bc10: 65 20 6d 69 73 63 32 2e 32 2e 32 29 20 2d 20 69  e misc2.2.2) - i
bc20: 74 20 61 6c 77 61 79 73 20 65 76 61 6c 75 61 74  t always evaluat
bc30: 65 73 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20  es to NULL..    
bc40: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
bc50: 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73     NameContext s
bc60: 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 45 78  NC;.          Ex
bc70: 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69  pr *p = pS->pELi
bc80: 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70  st->a[iCol].pExp
bc90: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43  r;.          sNC
bca0: 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e  .pSrcList = pS->
bcb0: 70 53 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20  pSrc;.          
bcc0: 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b  sNC.pNext = pNC;
bcd0: 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70  .          sNC.p
bce0: 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61  Parse = pNC->pPa
bcf0: 72 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  rse;.          z
bd00: 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70  Type = columnTyp
bd10: 65 28 26 73 4e 43 2c 20 70 2c 26 7a 4f 72 69 67  e(&sNC, p,&zOrig
bd20: 44 62 2c 26 7a 4f 72 69 67 54 61 62 2c 26 7a 4f  Db,&zOrigTab,&zO
bd30: 72 69 67 43 6f 6c 2c 20 26 65 73 74 57 69 64 74  rigCol, &estWidt
bd40: 68 29 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20  h); .        }. 
bd50: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
bd60: 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a  Tab->pSchema ){.
bd70: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72 65 61          /* A rea
bd80: 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  l table */.     
bd90: 20 20 20 61 73 73 65 72 74 28 20 21 70 53 20 29     assert( !pS )
bda0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43  ;.        if( iC
bdb0: 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54  ol<0 ) iCol = pT
bdc0: 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20  ab->iPKey;.     
bdd0: 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d     assert( iCol=
bde0: 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20  =-1 || (iCol>=0 
bdf0: 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  && iCol<pTab->nC
be00: 6f 6c 29 20 29 3b 0a 23 69 66 64 65 66 20 53 51  ol) );.#ifdef SQ
be10: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
be20: 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 20 20  MN_METADATA.    
be30: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
be40: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70  {.          zTyp
be50: 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20  e = "INTEGER";. 
be60: 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 43 6f           zOrigCo
be70: 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20  l = "rowid";.   
be80: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
be90: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54        zType = pT
bea0: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
beb0: 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Type;.          
bec0: 7a 4f 72 69 67 43 6f 6c 20 3d 20 70 54 61 62 2d  zOrigCol = pTab-
bed0: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d  >aCol[iCol].zNam
bee0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 65 73 74  e;.          est
bef0: 57 69 64 74 68 20 3d 20 70 54 61 62 2d 3e 61 43  Width = pTab->aC
bf00: 6f 6c 5b 69 43 6f 6c 5d 2e 73 7a 45 73 74 3b 0a  ol[iCol].szEst;.
bf10: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
bf20: 20 20 7a 4f 72 69 67 54 61 62 20 3d 20 70 54 61    zOrigTab = pTa
bf30: 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  b->zName;.      
bf40: 20 20 69 66 28 20 70 4e 43 2d 3e 70 50 61 72 73    if( pNC->pPars
bf50: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  e ){.          i
bf60: 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  nt iDb = sqlite3
bf70: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 4e  SchemaToIndex(pN
bf80: 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  C->pParse->db, p
bf90: 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
bfa0: 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 44 62           zOrigDb
bfb0: 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e   = pNC->pParse->
bfc0: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
bfd0: 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65  me;.        }.#e
bfe0: 6c 73 65 0a 20 20 20 20 20 20 20 20 69 66 28 20  lse.        if( 
bff0: 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20  iCol<0 ){.      
c000: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54      zType = "INT
c010: 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20 20 7d  EGER";.        }
c020: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
c030: 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43  zType = pTab->aC
c040: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a  ol[iCol].zType;.
c050: 20 20 20 20 20 20 20 20 20 20 65 73 74 57 69 64            estWid
c060: 74 68 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  th = pTab->aCol[
c070: 69 43 6f 6c 5d 2e 73 7a 45 73 74 3b 0a 20 20 20  iCol].szEst;.   
c080: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
c090: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
c0a0: 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
c0b0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
c0c0: 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54  QUERY.    case T
c0d0: 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20  K_SELECT: {.    
c0e0: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
c0f0: 69 6f 6e 20 69 73 20 61 20 73 75 62 2d 73 65 6c  ion is a sub-sel
c100: 65 63 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20  ect. Return the 
c110: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
c120: 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 6f 72   and.      ** or
c130: 69 67 69 6e 20 69 6e 66 6f 20 66 6f 72 20 74 68  igin info for th
c140: 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20  e single column 
c150: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
c160: 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 0a  t of the SELECT.
c170: 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65        ** stateme
c180: 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  nt..      */.   
c190: 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73     NameContext s
c1a0: 4e 43 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74  NC;.      Select
c1b0: 20 2a 70 53 20 3d 20 70 45 78 70 72 2d 3e 78 2e   *pS = pExpr->x.
c1c0: 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 45  pSelect;.      E
c1d0: 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c  xpr *p = pS->pEL
c1e0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
c1f0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45  .      assert( E
c200: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
c210: 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
c220: 63 74 29 20 29 3b 0a 20 20 20 20 20 20 73 4e 43  ct) );.      sNC
c230: 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e  .pSrcList = pS->
c240: 70 53 72 63 3b 0a 20 20 20 20 20 20 73 4e 43 2e  pSrc;.      sNC.
c250: 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20  pNext = pNC;.   
c260: 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20     sNC.pParse = 
c270: 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20  pNC->pParse;.   
c280: 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d     zType = colum
c290: 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26  nType(&sNC, p, &
c2a0: 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69 67 54  zOrigDb, &zOrigT
c2b0: 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 2c 20 26  ab, &zOrigCol, &
c2c0: 65 73 74 57 69 64 74 68 29 3b 20 0a 20 20 20 20  estWidth); .    
c2d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
c2e0: 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 64 65  endif.  }..#ifde
c2f0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
c300: 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 20  COLUMN_METADATA 
c310: 20 0a 20 20 69 66 28 20 70 7a 4f 72 69 67 44 62   .  if( pzOrigDb
c320: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
c330: 70 7a 4f 72 69 67 54 61 62 20 26 26 20 70 7a 4f  pzOrigTab && pzO
c340: 72 69 67 43 6f 6c 20 29 3b 0a 20 20 20 20 2a 70  rigCol );.    *p
c350: 7a 4f 72 69 67 44 62 20 3d 20 7a 4f 72 69 67 44  zOrigDb = zOrigD
c360: 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 54 61  b;.    *pzOrigTa
c370: 62 20 3d 20 7a 4f 72 69 67 54 61 62 3b 0a 20 20  b = zOrigTab;.  
c380: 20 20 2a 70 7a 4f 72 69 67 43 6f 6c 20 3d 20 7a    *pzOrigCol = z
c390: 4f 72 69 67 43 6f 6c 3b 0a 20 20 7d 0a 23 65 6e  OrigCol;.  }.#en
c3a0: 64 69 66 0a 20 20 69 66 28 20 70 45 73 74 57 69  dif.  if( pEstWi
c3b0: 64 74 68 20 29 20 2a 70 45 73 74 57 69 64 74 68  dth ) *pEstWidth
c3c0: 20 3d 20 65 73 74 57 69 64 74 68 3b 0a 20 20 72   = estWidth;.  r
c3d0: 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a 0a  eturn zType;.}..
c3e0: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
c3f0: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65  ode that will te
c400: 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68 65 20  ll the VDBE the 
c410: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
c420: 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20  s of columns.** 
c430: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
c440: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
c450: 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e  d generateColumn
c460: 54 79 70 65 73 28 0a 20 20 50 61 72 73 65 20 2a  Types(.  Parse *
c470: 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20  pParse,      /* 
c480: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
c490: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
c4a0: 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20  bList,  /* List 
c4b0: 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45  of tables */.  E
c4c0: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
c4d0: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
c4e0: 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72  s defining the r
c4f0: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a  esult set */.){.
c500: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
c510: 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a 20 20 56  MIT_DECLTYPE.  V
c520: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
c530: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
c540: 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73  .  NameContext s
c550: 4e 43 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69  NC;.  sNC.pSrcLi
c560: 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20  st = pTabList;. 
c570: 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50   sNC.pParse = pP
c580: 61 72 73 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  arse;.  for(i=0;
c590: 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
c5a0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
c5b0: 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b   *p = pEList->a[
c5c0: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 63 6f  i].pExpr;.    co
c5d0: 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b  nst char *zType;
c5e0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
c5f0: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
c600: 41 44 41 54 41 0a 20 20 20 20 63 6f 6e 73 74 20  ADATA.    const 
c610: 63 68 61 72 20 2a 7a 4f 72 69 67 44 62 20 3d 20  char *zOrigDb = 
c620: 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  0;.    const cha
c630: 72 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20 30 3b  r *zOrigTab = 0;
c640: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
c650: 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b 0a 20  *zOrigCol = 0;. 
c660: 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d     zType = colum
c670: 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26  nType(&sNC, p, &
c680: 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69 67 54  zOrigDb, &zOrigT
c690: 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 2c 20 30  ab, &zOrigCol, 0
c6a0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 76  );..    /* The v
c6b0: 64 62 65 20 6d 75 73 74 20 6d 61 6b 65 20 69 74  dbe must make it
c6c0: 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20 74 68  s own copy of th
c6d0: 65 20 63 6f 6c 75 6d 6e 2d 74 79 70 65 20 61 6e  e column-type an
c6e0: 64 20 6f 74 68 65 72 20 0a 20 20 20 20 2a 2a 20  d other .    ** 
c6f0: 63 6f 6c 75 6d 6e 20 73 70 65 63 69 66 69 63 20  column specific 
c700: 73 74 72 69 6e 67 73 2c 20 69 6e 20 63 61 73 65  strings, in case
c710: 20 74 68 65 20 73 63 68 65 6d 61 20 69 73 20 72   the schema is r
c720: 65 73 65 74 20 62 65 66 6f 72 65 20 74 68 69 73  eset before this
c730: 0a 20 20 20 20 2a 2a 20 76 69 72 74 75 61 6c 20  .    ** virtual 
c740: 6d 61 63 68 69 6e 65 20 69 73 20 64 65 6c 65 74  machine is delet
c750: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ed..    */.    s
c760: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
c770: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
c780: 4d 45 5f 44 41 54 41 42 41 53 45 2c 20 7a 4f 72  ME_DATABASE, zOr
c790: 69 67 44 62 2c 20 53 51 4c 49 54 45 5f 54 52 41  igDb, SQLITE_TRA
c7a0: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c  NSIENT);.    sql
c7b0: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
c7c0: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
c7d0: 5f 54 41 42 4c 45 2c 20 7a 4f 72 69 67 54 61 62  _TABLE, zOrigTab
c7e0: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
c7f0: 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  NT);.    sqlite3
c800: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
c810: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 43 4f 4c  , i, COLNAME_COL
c820: 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f 6c 2c 20 53  UMN, zOrigCol, S
c830: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
c840: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 7a 54 79 70  ;.#else.    zTyp
c850: 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26  e = columnType(&
c860: 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30 2c  sNC, p, 0, 0, 0,
c870: 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20   0);.#endif.    
c880: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
c890: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
c8a0: 41 4d 45 5f 44 45 43 4c 54 59 50 45 2c 20 7a 54  AME_DECLTYPE, zT
c8b0: 79 70 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  ype, SQLITE_TRAN
c8c0: 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 23 65 6e 64  SIENT);.  }.#end
c8d0: 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
c8e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54  QLITE_OMIT_DECLT
c8f0: 59 50 45 29 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a  YPE) */.}../*.**
c900: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
c910: 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68  hat will tell th
c920: 65 20 56 44 42 45 20 74 68 65 20 6e 61 6d 65 73  e VDBE the names
c930: 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69   of columns.** i
c940: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
c950: 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74  .  This informat
c960: 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 70  ion is used to p
c970: 72 6f 76 69 64 65 20 74 68 65 0a 2a 2a 20 61 7a  rovide the.** az
c980: 43 6f 6c 5b 5d 20 76 61 6c 75 65 73 20 69 6e 20  Col[] values in 
c990: 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f  the callback..*/
c9a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e  .static void gen
c9b0: 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
c9c0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
c9d0: 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65  e,      /* Parse
c9e0: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
c9f0: 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
ca00: 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61  ,  /* List of ta
ca10: 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69  bles */.  ExprLi
ca20: 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a  st *pEList    /*
ca30: 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66   Expressions def
ca40: 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74  ining the result
ca50: 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62   set */.){.  Vdb
ca60: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
ca70: 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  Vdbe;.  int i, j
ca80: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
ca90: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
caa0: 69 6e 74 20 66 75 6c 6c 4e 61 6d 65 73 2c 20 73  int fullNames, s
cab0: 68 6f 72 74 4e 61 6d 65 73 3b 0a 0a 23 69 66 6e  hortNames;..#ifn
cac0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
cad0: 45 58 50 4c 41 49 4e 0a 20 20 2f 2a 20 49 66 20  EXPLAIN.  /* If 
cae0: 74 68 69 73 20 69 73 20 61 6e 20 45 58 50 4c 41  this is an EXPLA
caf0: 49 4e 2c 20 73 6b 69 70 20 74 68 69 73 20 73 74  IN, skip this st
cb00: 65 70 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  ep */.  if( pPar
cb10: 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20  se->explain ){. 
cb20: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23     return;.  }.#
cb30: 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 50 61  endif..  if( pPa
cb40: 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74  rse->colNamesSet
cb50: 20 7c 7c 20 4e 45 56 45 52 28 76 3d 3d 30 29 20   || NEVER(v==0) 
cb60: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
cb70: 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
cb80: 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73  pParse->colNames
cb90: 53 65 74 20 3d 20 31 3b 0a 20 20 66 75 6c 6c 4e  Set = 1;.  fullN
cba0: 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67  ames = (db->flag
cbb0: 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43  s & SQLITE_FullC
cbc0: 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73  olNames)!=0;.  s
cbd0: 68 6f 72 74 4e 61 6d 65 73 20 3d 20 28 64 62 2d  hortNames = (db-
cbe0: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
cbf0: 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 21 3d  ShortColNames)!=
cc00: 30 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  0;.  sqlite3Vdbe
cc10: 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 70 45  SetNumCols(v, pE
cc20: 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
cc30: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73  for(i=0; i<pELis
cc40: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
cc50: 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20      Expr *p;.   
cc60: 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69   p = pEList->a[i
cc70: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ].pExpr;.    if(
cc80: 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20 63   NEVER(p==0) ) c
cc90: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
cca0: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e   pEList->a[i].zN
ccb0: 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 63 68 61  ame ){.      cha
ccc0: 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73  r *zName = pELis
ccd0: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20  t->a[i].zName;. 
cce0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ccf0: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
cd00: 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a   COLNAME_NAME, z
cd10: 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 54 52 41  Name, SQLITE_TRA
cd20: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d 65 6c  NSIENT);.    }el
cd30: 73 65 20 69 66 28 20 28 70 2d 3e 6f 70 3d 3d 54  se if( (p->op==T
cd40: 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 2d 3e 6f  K_COLUMN || p->o
cd50: 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p==TK_AGG_COLUMN
cd60: 29 20 26 26 20 70 54 61 62 4c 69 73 74 20 29 7b  ) && pTabList ){
cd70: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
cd80: 61 62 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  ab;.      char *
cd90: 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20  zCol;.      int 
cda0: 69 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d  iCol = p->iColum
cdb0: 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  n;.      for(j=0
cdc0: 3b 20 41 4c 57 41 59 53 28 6a 3c 70 54 61 62 4c  ; ALWAYS(j<pTabL
cdd0: 69 73 74 2d 3e 6e 53 72 63 29 3b 20 6a 2b 2b 29  ist->nSrc); j++)
cde0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  {.        if( pT
cdf0: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75  abList->a[j].iCu
ce00: 72 73 6f 72 3d 3d 70 2d 3e 69 54 61 62 6c 65 20  rsor==p->iTable 
ce10: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
ce20: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a  .      assert( j
ce30: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20  <pTabList->nSrc 
ce40: 29 3b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20  );.      pTab = 
ce50: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70  pTabList->a[j].p
ce60: 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 69  Tab;.      if( i
ce70: 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70  Col<0 ) iCol = p
ce80: 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20  Tab->iPKey;.    
ce90: 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d    assert( iCol==
cea0: 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26  -1 || (iCol>=0 &
ceb0: 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  & iCol<pTab->nCo
cec0: 6c 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  l) );.      if( 
ced0: 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20  iCol<0 ){.      
cee0: 20 20 7a 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22    zCol = "rowid"
cef0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
cf00: 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54         zCol = pT
cf10: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
cf20: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Name;.      }.  
cf30: 20 20 20 20 69 66 28 20 21 73 68 6f 72 74 4e 61      if( !shortNa
cf40: 6d 65 73 20 26 26 20 21 66 75 6c 6c 4e 61 6d 65  mes && !fullName
cf50: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  s ){.        sql
cf60: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
cf70: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
cf80: 5f 4e 41 4d 45 2c 20 0a 20 20 20 20 20 20 20 20  _NAME, .        
cf90: 20 20 20 20 73 71 6c 69 74 65 33 44 62 53 74 72      sqlite3DbStr
cfa0: 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74 2d 3e  Dup(db, pEList->
cfb0: 61 5b 69 5d 2e 7a 53 70 61 6e 29 2c 20 53 51 4c  a[i].zSpan), SQL
cfc0: 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ITE_DYNAMIC);.  
cfd0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 75      }else if( fu
cfe0: 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20  llNames ){.     
cff0: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d     char *zName =
d000: 20 30 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d   0;.        zNam
d010: 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
d020: 74 66 28 64 62 2c 20 22 25 73 2e 25 73 22 2c 20  tf(db, "%s.%s", 
d030: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f  pTab->zName, zCo
d040: 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
d050: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
d060: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
d070: 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c  NAME, zName, SQL
d080: 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ITE_DYNAMIC);.  
d090: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d0a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
d0b0: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
d0c0: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 43 6f  OLNAME_NAME, zCo
d0d0: 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  l, SQLITE_TRANSI
d0e0: 45 4e 54 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ENT);.      }.  
d0f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
d100: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70  onst char *z = p
d110: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61  EList->a[i].zSpa
d120: 6e 3b 0a 20 20 20 20 20 20 7a 20 3d 20 7a 3d 3d  n;.      z = z==
d130: 30 20 3f 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  0 ? sqlite3MPrin
d140: 74 66 28 64 62 2c 20 22 63 6f 6c 75 6d 6e 25 64  tf(db, "column%d
d150: 22 2c 20 69 2b 31 29 20 3a 20 73 71 6c 69 74 65  ", i+1) : sqlite
d160: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a 29  3DbStrDup(db, z)
d170: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
d180: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
d190: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
d1a0: 2c 20 7a 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41  , z, SQLITE_DYNA
d1b0: 4d 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  MIC);.    }.  }.
d1c0: 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
d1d0: 54 79 70 65 73 28 70 50 61 72 73 65 2c 20 70 54  Types(pParse, pT
d1e0: 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b  abList, pEList);
d1f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
d200: 61 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  a an expression 
d210: 6c 69 73 74 20 28 77 68 69 63 68 20 69 73 20 72  list (which is r
d220: 65 61 6c 6c 79 20 74 68 65 20 6c 69 73 74 20 6f  eally the list o
d230: 66 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  f expressions.**
d240: 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20 72   that form the r
d250: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20 53  esult set of a S
d260: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 29  ELECT statement)
d270: 20 63 6f 6d 70 75 74 65 20 61 70 70 72 6f 70 72   compute appropr
d280: 69 61 74 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6e  iate.** column n
d290: 61 6d 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65  ames for a table
d2a0: 20 74 68 61 74 20 77 6f 75 6c 64 20 68 6f 6c 64   that would hold
d2b0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
d2c0: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  list..**.** All 
d2d0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 77 69 6c  column names wil
d2e0: 6c 20 62 65 20 75 6e 69 71 75 65 2e 0a 2a 2a 0a  l be unique..**.
d2f0: 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 63 6f 6c 75  ** Only the colu
d300: 6d 6e 20 6e 61 6d 65 73 20 61 72 65 20 63 6f 6d  mn names are com
d310: 70 75 74 65 64 2e 20 20 43 6f 6c 75 6d 6e 2e 7a  puted.  Column.z
d320: 54 79 70 65 2c 20 43 6f 6c 75 6d 6e 2e 7a 43 6f  Type, Column.zCo
d330: 6c 6c 2c 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72  ll,.** and other
d340: 20 66 69 65 6c 64 73 20 6f 66 20 43 6f 6c 75 6d   fields of Colum
d350: 6e 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a  n are zeroed..**
d360: 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
d370: 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e  E_OK on success.
d380: 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c    If a memory al
d390: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f  location error o
d3a0: 63 63 75 72 73 2c 0a 2a 2a 20 73 74 6f 72 65 20  ccurs,.** store 
d3b0: 4e 55 4c 4c 20 69 6e 20 2a 70 61 43 6f 6c 20 61  NULL in *paCol a
d3c0: 6e 64 20 30 20 69 6e 20 2a 70 6e 43 6f 6c 20 61  nd 0 in *pnCol a
d3d0: 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
d3e0: 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 73 74 61 74 69  _NOMEM..*/.stati
d3f0: 63 20 69 6e 74 20 73 65 6c 65 63 74 43 6f 6c 75  c int selectColu
d400: 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  mnsFromExprList(
d410: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
d420: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
d430: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
d440: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
d450: 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 45 78  ist,       /* Ex
d460: 70 72 20 6c 69 73 74 20 66 72 6f 6d 20 77 68 69  pr list from whi
d470: 63 68 20 74 6f 20 64 65 72 69 76 65 20 63 6f 6c  ch to derive col
d480: 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69  umn names */.  i
d490: 31 36 20 2a 70 6e 43 6f 6c 2c 20 20 20 20 20 20  16 *pnCol,      
d4a0: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
d4b0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
d4c0: 6c 75 6d 6e 73 20 68 65 72 65 20 2a 2f 0a 20 20  lumns here */.  
d4d0: 43 6f 6c 75 6d 6e 20 2a 2a 70 61 43 6f 6c 20 20  Column **paCol  
d4e0: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
d4f0: 20 74 68 65 20 6e 65 77 20 63 6f 6c 75 6d 6e 20   the new column 
d500: 6c 69 73 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  list here */.){.
d510: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
d520: 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a  pParse->db;   /*
d530: 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
d540: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  tion */.  int i,
d550: 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
d560: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
d570: 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  unters */.  int 
d580: 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  cnt;            
d590: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
d5a0: 20 61 64 64 65 64 20 74 6f 20 6d 61 6b 65 20 74   added to make t
d5b0: 68 65 20 6e 61 6d 65 20 75 6e 69 71 75 65 20 2a  he name unique *
d5c0: 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c  /.  Column *aCol
d5d0: 2c 20 2a 70 43 6f 6c 3b 20 20 20 20 20 20 20 20  , *pCol;        
d5e0: 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
d5f0: 76 65 72 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  ver result colum
d600: 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c  ns */.  int nCol
d610: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d620: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
d630: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
d640: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
d650: 45 78 70 72 20 2a 70 3b 20 20 20 20 20 20 20 20  Expr *p;        
d660: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
d670: 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 61 20  xpression for a 
d680: 73 69 6e 67 6c 65 20 72 65 73 75 6c 74 20 63 6f  single result co
d690: 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a  lumn */.  char *
d6a0: 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  zName;          
d6b0: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
d6c0: 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e  name */.  int nN
d6d0: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
d6e0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
d6f0: 20 6e 61 6d 65 20 69 6e 20 7a 4e 61 6d 65 5b 5d   name in zName[]
d700: 20 2a 2f 0a 0a 20 20 69 66 28 20 70 45 4c 69 73   */..  if( pELis
d710: 74 20 29 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20  t ){.    nCol = 
d720: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
d730: 20 20 20 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65     aCol = sqlite
d740: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
d750: 2c 20 73 69 7a 65 6f 66 28 61 43 6f 6c 5b 30 5d  , sizeof(aCol[0]
d760: 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20 74 65 73  )*nCol);.    tes
d770: 74 63 61 73 65 28 20 61 43 6f 6c 3d 3d 30 20 29  tcase( aCol==0 )
d780: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
d790: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 61 43 6f  Col = 0;.    aCo
d7a0: 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 6e  l = 0;.  }.  *pn
d7b0: 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 2a 70  Col = nCol;.  *p
d7c0: 61 43 6f 6c 20 3d 20 61 43 6f 6c 3b 0a 0a 20 20  aCol = aCol;..  
d7d0: 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43  for(i=0, pCol=aC
d7e0: 6f 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c  ol; i<nCol; i++,
d7f0: 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 2f 2a   pCol++){.    /*
d800: 20 47 65 74 20 61 6e 20 61 70 70 72 6f 70 72 69   Get an appropri
d810: 61 74 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65  ate name for the
d820: 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2f 0a 20   column.    */. 
d830: 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78     p = sqlite3Ex
d840: 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45  prSkipCollate(pE
d850: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
d860: 29 3b 0a 20 20 20 20 69 66 28 20 28 7a 4e 61 6d  );.    if( (zNam
d870: 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  e = pEList->a[i]
d880: 2e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20  .zName)!=0 ){.  
d890: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f      /* If the co
d8a0: 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61 6e  lumn contains an
d8b0: 20 22 41 53 20 3c 6e 61 6d 65 3e 22 20 70 68 72   "AS <name>" phr
d8c0: 61 73 65 2c 20 75 73 65 20 3c 6e 61 6d 65 3e 20  ase, use <name> 
d8d0: 61 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20  as the name */. 
d8e0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
d8f0: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
d900: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c   zName);.    }el
d910: 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  se{.      Expr *
d920: 70 43 6f 6c 45 78 70 72 20 3d 20 70 3b 20 20 2f  pColExpr = p;  /
d930: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
d940: 20 74 68 61 74 20 69 73 20 74 68 65 20 72 65 73   that is the res
d950: 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  ult column name 
d960: 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  */.      Table *
d970: 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 2f 2a  pTab;         /*
d980: 20 54 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65   Table associate
d990: 64 20 77 69 74 68 20 74 68 69 73 20 65 78 70 72  d with this expr
d9a0: 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  ession */.      
d9b0: 77 68 69 6c 65 28 20 70 43 6f 6c 45 78 70 72 2d  while( pColExpr-
d9c0: 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20  >op==TK_DOT ){. 
d9d0: 20 20 20 20 20 20 20 70 43 6f 6c 45 78 70 72 20         pColExpr 
d9e0: 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 52 69 67  = pColExpr->pRig
d9f0: 68 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ht;.        asse
da00: 72 74 28 20 70 43 6f 6c 45 78 70 72 21 3d 30 20  rt( pColExpr!=0 
da10: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
da20: 20 69 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f   if( pColExpr->o
da30: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p==TK_COLUMN && 
da40: 41 4c 57 41 59 53 28 70 43 6f 6c 45 78 70 72 2d  ALWAYS(pColExpr-
da50: 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a 20 20 20  >pTab!=0) ){.   
da60: 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6c 75       /* For colu
da70: 6d 6e 73 20 75 73 65 20 74 68 65 20 63 6f 6c 75  mns use the colu
da80: 6d 6e 20 6e 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a  mn name name */.
da90: 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c          int iCol
daa0: 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 69 43 6f   = pColExpr->iCo
dab0: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70 54  lumn;.        pT
dac0: 61 62 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70  ab = pColExpr->p
dad0: 54 61 62 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Tab;.        if(
dae0: 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d   iCol<0 ) iCol =
daf0: 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20   pTab->iPKey;.  
db00: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
db10: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
db20: 20 22 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20   "%s",.         
db30: 20 20 20 20 20 20 20 20 69 43 6f 6c 3e 3d 30 20          iCol>=0 
db40: 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  ? pTab->aCol[iCo
db50: 6c 5d 2e 7a 4e 61 6d 65 20 3a 20 22 72 6f 77 69  l].zName : "rowi
db60: 64 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  d");.      }else
db70: 20 69 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f   if( pColExpr->o
db80: 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20  p==TK_ID ){.    
db90: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
dba0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 43 6f  rHasProperty(pCo
dbb0: 6c 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  lExpr, EP_IntVal
dbc0: 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 7a  ue) );.        z
dbd0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
dbe0: 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22 2c 20  rintf(db, "%s", 
dbf0: 70 43 6f 6c 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  pColExpr->u.zTok
dc00: 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  en);.      }else
dc10: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65  {.        /* Use
dc20: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65   the original te
dc30: 78 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  xt of the column
dc40: 20 65 78 70 72 65 73 73 69 6f 6e 20 61 73 20 69   expression as i
dc50: 74 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20  ts name */.     
dc60: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
dc70: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
dc80: 73 22 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  s", pEList->a[i]
dc90: 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20 20 7d  .zSpan);.      }
dca0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64  .    }.    if( d
dcb0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
dcc0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
dcd0: 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65  DbFree(db, zName
dce0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
dcf0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61      }..    /* Ma
dd00: 6b 65 20 73 75 72 65 20 74 68 65 20 63 6f 6c 75  ke sure the colu
dd10: 6d 6e 20 6e 61 6d 65 20 69 73 20 75 6e 69 71 75  mn name is uniqu
dd20: 65 2e 20 20 49 66 20 74 68 65 20 6e 61 6d 65 20  e.  If the name 
dd30: 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 2c 0a 20  is not unique,. 
dd40: 20 20 20 2a 2a 20 61 70 70 65 6e 64 20 61 20 69     ** append a i
dd50: 6e 74 65 67 65 72 20 74 6f 20 74 68 65 20 6e 61  nteger to the na
dd60: 6d 65 20 73 6f 20 74 68 61 74 20 69 74 20 62 65  me so that it be
dd70: 63 6f 6d 65 73 20 75 6e 69 71 75 65 2e 0a 20 20  comes unique..  
dd80: 20 20 2a 2f 0a 20 20 20 20 6e 4e 61 6d 65 20 3d    */.    nName =
dd90: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
dda0: 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72  (zName);.    for
ddb0: 28 6a 3d 63 6e 74 3d 30 3b 20 6a 3c 69 3b 20 6a  (j=cnt=0; j<i; j
ddc0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
ddd0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 61 43  qlite3StrICmp(aC
dde0: 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61  ol[j].zName, zNa
ddf0: 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
de00: 20 20 63 68 61 72 20 2a 7a 4e 65 77 4e 61 6d 65    char *zNewName
de10: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b  ;.        int k;
de20: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 6e  .        for(k=n
de30: 4e 61 6d 65 2d 31 3b 20 6b 3e 31 20 26 26 20 73  Name-1; k>1 && s
de40: 71 6c 69 74 65 33 49 73 64 69 67 69 74 28 7a 4e  qlite3Isdigit(zN
de50: 61 6d 65 5b 6b 5d 29 3b 20 6b 2d 2d 29 7b 7d 0a  ame[k]); k--){}.
de60: 20 20 20 20 20 20 20 20 69 66 28 20 6b 3e 3d 30          if( k>=0
de70: 20 26 26 20 7a 4e 61 6d 65 5b 6b 5d 3d 3d 27 3a   && zName[k]==':
de80: 27 20 29 20 6e 4e 61 6d 65 20 3d 20 6b 3b 0a 20  ' ) nName = k;. 
de90: 20 20 20 20 20 20 20 7a 4e 61 6d 65 5b 6e 4e 61         zName[nNa
dea0: 6d 65 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  me] = 0;.       
deb0: 20 7a 4e 65 77 4e 61 6d 65 20 3d 20 73 71 6c 69   zNewName = sqli
dec0: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
ded0: 25 73 3a 25 64 22 2c 20 7a 4e 61 6d 65 2c 20 2b  %s:%d", zName, +
dee0: 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73  +cnt);.        s
def0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
df00: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
df10: 20 7a 4e 61 6d 65 20 3d 20 7a 4e 65 77 4e 61 6d   zName = zNewNam
df20: 65 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 2d  e;.        j = -
df30: 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  1;.        if( z
df40: 4e 61 6d 65 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Name==0 ) break;
df50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
df60: 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d     pCol->zName =
df70: 20 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 69 66   zName;.  }.  if
df80: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
df90: 65 64 20 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d  ed ){.    for(j=
dfa0: 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20  0; j<i; j++){.  
dfb0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
dfc0: 65 28 64 62 2c 20 61 43 6f 6c 5b 6a 5d 2e 7a 4e  e(db, aCol[j].zN
dfd0: 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
dfe0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
dff0: 2c 20 61 43 6f 6c 29 3b 0a 20 20 20 20 2a 70 61  , aCol);.    *pa
e000: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 2a 70 6e  Col = 0;.    *pn
e010: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  Col = 0;.    ret
e020: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
e030: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
e040: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
e050: 2a 2a 20 41 64 64 20 74 79 70 65 20 61 6e 64 20  ** Add type and 
e060: 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d  collation inform
e070: 61 74 69 6f 6e 20 74 6f 20 61 20 63 6f 6c 75 6d  ation to a colum
e080: 6e 20 6c 69 73 74 20 62 61 73 65 64 20 6f 6e 0a  n list based on.
e090: 2a 2a 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  ** a SELECT stat
e0a0: 65 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20 54 68  ement..** .** Th
e0b0: 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 70 72  e column list pr
e0c0: 65 73 75 6d 61 62 6c 79 20 63 61 6d 65 20 66 72  esumably came fr
e0d0: 6f 6d 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 4e  om selectColumnN
e0e0: 61 6d 65 73 46 72 6f 6d 45 78 70 72 4c 69 73 74  amesFromExprList
e0f0: 28 29 2e 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d  ()..** The colum
e100: 6e 20 6c 69 73 74 20 68 61 73 20 6f 6e 6c 79 20  n list has only 
e110: 6e 61 6d 65 73 2c 20 6e 6f 74 20 74 79 70 65 73  names, not types
e120: 20 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e 20   or collations. 
e130: 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   This.** routine
e140: 20 67 6f 65 73 20 74 68 72 6f 75 67 68 20 61 6e   goes through an
e150: 64 20 61 64 64 73 20 74 68 65 20 74 79 70 65 73  d adds the types
e160: 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e   and collations.
e170: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
e180: 69 6e 65 20 72 65 71 75 69 72 65 73 20 74 68 61  ine requires tha
e190: 74 20 61 6c 6c 20 69 64 65 6e 74 69 66 69 65 72  t all identifier
e1a0: 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 0a  s in the SELECT.
e1b0: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 62 65 20  ** statement be 
e1c0: 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f 0a 73 74 61  resolved..*/.sta
e1d0: 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74 41  tic void selectA
e1e0: 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43  ddColumnTypeAndC
e1f0: 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 50 61 72 73  ollation(.  Pars
e200: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
e210: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
e220: 74 65 78 74 73 20 2a 2f 0a 20 20 54 61 62 6c 65  texts */.  Table
e230: 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20   *pTab,         
e240: 20 2f 2a 20 41 64 64 20 63 6f 6c 75 6d 6e 20 74   /* Add column t
e250: 79 70 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ype information 
e260: 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f  to this table */
e270: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
e280: 63 74 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45  ct       /* SELE
e290: 43 54 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  CT used to deter
e2a0: 6d 69 6e 65 20 74 79 70 65 73 20 61 6e 64 20 63  mine types and c
e2b0: 6f 6c 6c 61 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a  ollations */.){.
e2c0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
e2d0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4e 61  pParse->db;.  Na
e2e0: 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20  meContext sNC;. 
e2f0: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
e300: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
e310: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78 70 72  .  int i;.  Expr
e320: 20 2a 70 3b 0a 20 20 73 74 72 75 63 74 20 45 78   *p;.  struct Ex
e330: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a  prList_item *a;.
e340: 20 20 75 36 34 20 73 7a 41 6c 6c 20 3d 20 30 3b    u64 szAll = 0;
e350: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53 65 6c  ..  assert( pSel
e360: 65 63 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ect!=0 );.  asse
e370: 72 74 28 20 28 70 53 65 6c 65 63 74 2d 3e 73 65  rt( (pSelect->se
e380: 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73 6f  lFlags & SF_Reso
e390: 6c 76 65 64 29 21 3d 30 20 29 3b 0a 20 20 61 73  lved)!=0 );.  as
e3a0: 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c  sert( pTab->nCol
e3b0: 3d 3d 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  ==pSelect->pELis
e3c0: 74 2d 3e 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e  t->nExpr || db->
e3d0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
e3e0: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
e3f0: 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
e400: 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20  .  memset(&sNC, 
e410: 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b  0, sizeof(sNC));
e420: 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20  .  sNC.pSrcList 
e430: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b  = pSelect->pSrc;
e440: 0a 20 20 61 20 3d 20 70 53 65 6c 65 63 74 2d 3e  .  a = pSelect->
e450: 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 66 6f 72  pEList->a;.  for
e460: 28 69 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62 2d  (i=0, pCol=pTab-
e470: 3e 61 43 6f 6c 3b 20 69 3c 70 54 61 62 2d 3e 6e  >aCol; i<pTab->n
e480: 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b  Col; i++, pCol++
e490: 29 7b 0a 20 20 20 20 70 20 3d 20 61 5b 69 5d 2e  ){.    p = a[i].
e4a0: 70 45 78 70 72 3b 0a 20 20 20 20 70 43 6f 6c 2d  pExpr;.    pCol-
e4b0: 3e 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33  >zType = sqlite3
e4c0: 44 62 53 74 72 44 75 70 28 64 62 2c 20 63 6f 6c  DbStrDup(db, col
e4d0: 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c  umnType(&sNC, p,
e4e0: 30 2c 30 2c 30 2c 20 26 70 43 6f 6c 2d 3e 73 7a  0,0,0, &pCol->sz
e4f0: 45 73 74 29 29 3b 0a 20 20 20 20 73 7a 41 6c 6c  Est));.    szAll
e500: 20 2b 3d 20 70 43 6f 6c 2d 3e 73 7a 45 73 74 3b   += pCol->szEst;
e510: 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  .    pCol->affin
e520: 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ity = sqlite3Exp
e530: 72 41 66 66 69 6e 69 74 79 28 70 29 3b 0a 20 20  rAffinity(p);.  
e540: 20 20 69 66 28 20 70 43 6f 6c 2d 3e 61 66 66 69    if( pCol->affi
e550: 6e 69 74 79 3d 3d 30 20 29 20 70 43 6f 6c 2d 3e  nity==0 ) pCol->
e560: 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54  affinity = SQLIT
e570: 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20  E_AFF_NONE;.    
e580: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
e590: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
e5a0: 65 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70  e, p);.    if( p
e5b0: 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 43  Coll ){.      pC
e5c0: 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69  ol->zColl = sqli
e5d0: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
e5e0: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pColl->zName);. 
e5f0: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 54 61 62 2d     }.  }.  pTab-
e600: 3e 73 7a 54 61 62 52 6f 77 20 3d 20 73 71 6c 69  >szTabRow = sqli
e610: 74 65 33 4c 6f 67 45 73 74 28 73 7a 41 6c 6c 2a  te3LogEst(szAll*
e620: 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  4);.}../*.** Giv
e630: 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  en a SELECT stat
e640: 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65 20  ement, generate 
e650: 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  a Table structur
e660: 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
e670: 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73  .** the result s
e680: 65 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45 43  et of that SELEC
e690: 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c  T..*/.Table *sql
e6a0: 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
e6b0: 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61  elect(Parse *pPa
e6c0: 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  rse, Select *pSe
e6d0: 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a  lect){.  Table *
e6e0: 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 20  pTab;.  sqlite3 
e6f0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
e700: 3b 0a 20 20 69 6e 74 20 73 61 76 65 64 46 6c 61  ;.  int savedFla
e710: 67 73 3b 0a 0a 20 20 73 61 76 65 64 46 6c 61 67  gs;..  savedFlag
e720: 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b 0a 20  s = db->flags;. 
e730: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
e740: 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d  QLITE_FullColNam
e750: 65 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20  es;.  db->flags 
e760: 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43  |= SQLITE_ShortC
e770: 6f 6c 4e 61 6d 65 73 3b 0a 20 20 73 71 6c 69 74  olNames;.  sqlit
e780: 65 33 53 65 6c 65 63 74 50 72 65 70 28 70 50 61  e3SelectPrep(pPa
e790: 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 30 29  rse, pSelect, 0)
e7a0: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
e7b0: 6e 45 72 72 20 29 20 72 65 74 75 72 6e 20 30 3b  nErr ) return 0;
e7c0: 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65 63  .  while( pSelec
e7d0: 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c  t->pPrior ) pSel
e7e0: 65 63 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70  ect = pSelect->p
e7f0: 50 72 69 6f 72 3b 0a 20 20 64 62 2d 3e 66 6c 61  Prior;.  db->fla
e800: 67 73 20 3d 20 73 61 76 65 64 46 6c 61 67 73 3b  gs = savedFlags;
e810: 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65  .  pTab = sqlite
e820: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
e830: 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20  , sizeof(Table) 
e840: 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30  );.  if( pTab==0
e850: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
e860: 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20 73  ;.  }.  /* The s
e870: 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
e880: 66 53 65 6c 65 63 74 28 29 20 69 73 20 6f 6e 6c  fSelect() is onl
e890: 79 20 75 73 65 64 20 6e 20 63 6f 6e 74 65 78 74  y used n context
e8a0: 73 20 77 68 65 72 65 20 6c 6f 6f 6b 61 73 69 64  s where lookasid
e8b0: 65 0a 20 20 2a 2a 20 69 73 20 64 69 73 61 62 6c  e.  ** is disabl
e8c0: 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ed */.  assert( 
e8d0: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45  db->lookaside.bE
e8e0: 6e 61 62 6c 65 64 3d 3d 30 20 29 3b 0a 20 20 70  nabled==0 );.  p
e8f0: 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  Tab->nRef = 1;. 
e900: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30   pTab->zName = 0
e910: 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 6f 77 45 73  ;.  pTab->nRowEs
e920: 74 20 3d 20 31 30 34 38 35 37 36 3b 0a 20 20 73  t = 1048576;.  s
e930: 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d  electColumnsFrom
e940: 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
e950: 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74   pSelect->pEList
e960: 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26  , &pTab->nCol, &
e970: 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 73  pTab->aCol);.  s
e980: 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79  electAddColumnTy
e990: 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70  peAndCollation(p
e9a0: 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 53 65  Parse, pTab, pSe
e9b0: 6c 65 63 74 29 3b 0a 20 20 70 54 61 62 2d 3e 69  lect);.  pTab->i
e9c0: 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 69 66 28  PKey = -1;.  if(
e9d0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
e9e0: 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  d ){.    sqlite3
e9f0: 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20  DeleteTable(db, 
ea00: 70 54 61 62 29 3b 0a 20 20 20 20 72 65 74 75 72  pTab);.    retur
ea10: 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 0;.  }.  retur
ea20: 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pTab;.}../*.**
ea30: 20 47 65 74 20 61 20 56 44 42 45 20 66 6f 72 20   Get a VDBE for 
ea40: 74 68 65 20 67 69 76 65 6e 20 70 61 72 73 65 72  the given parser
ea50: 20 63 6f 6e 74 65 78 74 2e 20 20 43 72 65 61 74   context.  Creat
ea60: 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e  e a new one if n
ea70: 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66 20  ecessary..** If 
ea80: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
ea90: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64   return NULL and
eaa0: 20 6c 65 61 76 65 20 61 20 6d 65 73 73 61 67 65   leave a message
eab0: 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 56   in pParse..*/.V
eac0: 64 62 65 20 2a 73 71 6c 69 74 65 33 47 65 74 56  dbe *sqlite3GetV
ead0: 64 62 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  dbe(Parse *pPars
eae0: 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  e){.  Vdbe *v = 
eaf0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
eb00: 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20   if( v==0 ){.   
eb10: 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64   v = pParse->pVd
eb20: 62 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  be = sqlite3Vdbe
eb30: 43 72 65 61 74 65 28 70 50 61 72 73 65 29 3b 0a  Create(pParse);.
eb40: 20 20 20 20 69 66 28 20 76 20 29 20 73 71 6c 69      if( v ) sqli
eb50: 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
eb60: 20 4f 50 5f 49 6e 69 74 29 3b 0a 20 20 20 20 69   OP_Init);.    i
eb70: 66 28 20 70 50 61 72 73 65 2d 3e 70 54 6f 70 6c  f( pParse->pTopl
eb80: 65 76 65 6c 3d 3d 30 0a 20 20 20 20 20 26 26 20  evel==0.     && 
eb90: 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62  OptimizationEnab
eba0: 6c 65 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 53  led(pParse->db,S
ebb0: 51 4c 49 54 45 5f 46 61 63 74 6f 72 4f 75 74 43  QLITE_FactorOutC
ebc0: 6f 6e 73 74 29 0a 20 20 20 20 29 7b 0a 20 20 20  onst).    ){.   
ebd0: 20 20 20 70 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e     pParse->okCon
ebe0: 73 74 46 61 63 74 6f 72 20 3d 20 31 3b 0a 20 20  stFactor = 1;.  
ebf0: 20 20 7d 0a 0a 20 20 7d 0a 20 20 72 65 74 75 72    }..  }.  retur
ec00: 6e 20 76 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  n v;.}.../*.** C
ec10: 6f 6d 70 75 74 65 20 74 68 65 20 69 4c 69 6d 69  ompute the iLimi
ec20: 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 66 69  t and iOffset fi
ec30: 65 6c 64 73 20 6f 66 20 74 68 65 20 53 45 4c 45  elds of the SELE
ec40: 43 54 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a  CT based on the.
ec50: 2a 2a 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f  ** pLimit and pO
ec60: 66 66 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e  ffset expression
ec70: 73 2e 20 20 70 4c 69 6d 69 74 20 61 6e 64 20 70  s.  pLimit and p
ec80: 4f 66 66 73 65 74 20 68 6f 6c 64 20 74 68 65 20  Offset hold the 
ec90: 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74  expressions.** t
eca0: 68 61 74 20 61 70 70 65 61 72 20 69 6e 20 74 68  hat appear in th
ecb0: 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73  e original SQL s
ecc0: 74 61 74 65 6d 65 6e 74 20 61 66 74 65 72 20 74  tatement after t
ecd0: 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  he LIMIT and OFF
ece0: 53 45 54 0a 2a 2a 20 6b 65 79 77 6f 72 64 73 2e  SET.** keywords.
ecf0: 20 20 4f 72 20 4e 55 4c 4c 20 69 66 20 74 68 6f    Or NULL if tho
ed00: 73 65 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20  se keywords are 
ed10: 6f 6d 69 74 74 65 64 2e 20 69 4c 69 6d 69 74 20  omitted. iLimit 
ed20: 61 6e 64 20 69 4f 66 66 73 65 74 20 0a 2a 2a 20  and iOffset .** 
ed30: 61 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 20  are the integer 
ed40: 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72 20  memory register 
ed50: 6e 75 6d 62 65 72 73 20 66 6f 72 20 63 6f 75 6e  numbers for coun
ed60: 74 65 72 73 20 75 73 65 64 20 74 6f 20 63 6f 6d  ters used to com
ed70: 70 75 74 65 20 0a 2a 2a 20 74 68 65 20 6c 69 6d  pute .** the lim
ed80: 69 74 20 61 6e 64 20 6f 66 66 73 65 74 2e 20 20  it and offset.  
ed90: 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6c  If there is no l
eda0: 69 6d 69 74 20 61 6e 64 2f 6f 72 20 6f 66 66 73  imit and/or offs
edb0: 65 74 2c 20 74 68 65 6e 20 0a 2a 2a 20 69 4c 69  et, then .** iLi
edc0: 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20  mit and iOffset 
edd0: 61 72 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a  are negative..**
ede0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
edf0: 20 63 68 61 6e 67 65 73 20 74 68 65 20 76 61 6c   changes the val
ee00: 75 65 73 20 6f 66 20 69 4c 69 6d 69 74 20 61 6e  ues of iLimit an
ee10: 64 20 69 4f 66 66 73 65 74 20 6f 6e 6c 79 20 69  d iOffset only i
ee20: 66 0a 2a 2a 20 61 20 6c 69 6d 69 74 20 6f 72 20  f.** a limit or 
ee30: 6f 66 66 73 65 74 20 69 73 20 64 65 66 69 6e 65  offset is define
ee40: 64 20 62 79 20 70 4c 69 6d 69 74 20 61 6e 64 20  d by pLimit and 
ee50: 70 4f 66 66 73 65 74 2e 20 20 69 4c 69 6d 69 74  pOffset.  iLimit
ee60: 20 61 6e 64 0a 2a 2a 20 69 4f 66 66 73 65 74 20   and.** iOffset 
ee70: 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e  should have been
ee80: 20 70 72 65 73 65 74 20 74 6f 20 61 70 70 72 6f   preset to appro
ee90: 70 72 69 61 74 65 20 64 65 66 61 75 6c 74 20 76  priate default v
eea0: 61 6c 75 65 73 20 28 7a 65 72 6f 29 0a 2a 2a 20  alues (zero).** 
eeb0: 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67  prior to calling
eec0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
eed0: 2a 0a 2a 2a 20 54 68 65 20 69 4f 66 66 73 65 74  *.** The iOffset
eee0: 20 72 65 67 69 73 74 65 72 20 28 69 66 20 69 74   register (if it
eef0: 20 65 78 69 73 74 73 29 20 69 73 20 69 6e 69 74   exists) is init
ef00: 69 61 6c 69 7a 65 64 20 74 6f 20 74 68 65 20 76  ialized to the v
ef10: 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 65 20 4f  alue.** of the O
ef20: 46 46 53 45 54 2e 20 20 54 68 65 20 69 4c 69 6d  FFSET.  The iLim
ef30: 69 74 20 72 65 67 69 73 74 65 72 20 69 73 20 69  it register is i
ef40: 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 4c 49  nitialized to LI
ef50: 4d 49 54 2e 20 20 52 65 67 69 73 74 65 72 0a 2a  MIT.  Register.*
ef60: 2a 20 69 4f 66 66 73 65 74 2b 31 20 69 73 20 69  * iOffset+1 is i
ef70: 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 4c 49  nitialized to LI
ef80: 4d 49 54 2b 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a  MIT+OFFSET..**.*
ef90: 2a 20 4f 6e 6c 79 20 69 66 20 70 4c 69 6d 69 74  * Only if pLimit
efa0: 21 3d 30 20 6f 72 20 70 4f 66 66 73 65 74 21 3d  !=0 or pOffset!=
efb0: 30 20 64 6f 20 74 68 65 20 6c 69 6d 69 74 20 72  0 do the limit r
efc0: 65 67 69 73 74 65 72 73 20 67 65 74 0a 2a 2a 20  egisters get.** 
efd0: 72 65 64 65 66 69 6e 65 64 2e 20 20 54 68 65 20  redefined.  The 
efe0: 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74  UNION ALL operat
eff0: 6f 72 20 75 73 65 73 20 74 68 69 73 20 70 72 6f  or uses this pro
f000: 70 65 72 74 79 20 74 6f 20 66 6f 72 63 65 0a 2a  perty to force.*
f010: 2a 20 74 68 65 20 72 65 75 73 65 20 6f 66 20 74  * the reuse of t
f020: 68 65 20 73 61 6d 65 20 6c 69 6d 69 74 20 61 6e  he same limit an
f030: 64 20 6f 66 66 73 65 74 20 72 65 67 69 73 74 65  d offset registe
f040: 72 73 20 61 63 72 6f 73 73 20 6d 75 6c 74 69 70  rs across multip
f050: 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61  le.** SELECT sta
f060: 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74  tements..*/.stat
f070: 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74 65 4c  ic void computeL
f080: 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 50 61  imitRegisters(Pa
f090: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
f0a0: 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 42 72 65  ect *p, int iBre
f0b0: 61 6b 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  ak){.  Vdbe *v =
f0c0: 20 30 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74   0;.  int iLimit
f0d0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66 66   = 0;.  int iOff
f0e0: 73 65 74 3b 0a 20 20 69 6e 74 20 61 64 64 72 31  set;.  int addr1
f0f0: 2c 20 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c  , n;.  if( p->iL
f100: 69 6d 69 74 20 29 20 72 65 74 75 72 6e 3b 0a 0a  imit ) return;..
f110: 20 20 2f 2a 20 0a 20 20 2a 2a 20 22 4c 49 4d 49    /* .  ** "LIMI
f120: 54 20 2d 31 22 20 61 6c 77 61 79 73 20 73 68 6f  T -1" always sho
f130: 77 73 20 61 6c 6c 20 72 6f 77 73 2e 20 20 54 68  ws all rows.  Th
f140: 65 72 65 20 69 73 20 73 6f 6d 65 0a 20 20 2a 2a  ere is some.  **
f150: 20 63 6f 6e 74 72 6f 76 65 72 73 79 20 61 62 6f   controversy abo
f160: 75 74 20 77 68 61 74 20 74 68 65 20 63 6f 72 72  ut what the corr
f170: 65 63 74 20 62 65 68 61 76 69 6f 72 20 73 68 6f  ect behavior sho
f180: 75 6c 64 20 62 65 2e 0a 20 20 2a 2a 20 54 68 65  uld be..  ** The
f190: 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65   current impleme
f1a0: 6e 74 61 74 69 6f 6e 20 69 6e 74 65 72 70 72 65  ntation interpre
f1b0: 74 73 20 22 4c 49 4d 49 54 20 30 22 20 74 6f 20  ts "LIMIT 0" to 
f1c0: 6d 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77  mean.  ** no row
f1d0: 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  s..  */.  sqlite
f1e0: 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
f1f0: 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72  pParse);.  asser
f200: 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30  t( p->pOffset==0
f210: 20 7c 7c 20 70 2d 3e 70 4c 69 6d 69 74 21 3d 30   || p->pLimit!=0
f220: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69   );.  if( p->pLi
f230: 6d 69 74 20 29 7b 0a 20 20 20 20 70 2d 3e 69 4c  mit ){.    p->iL
f240: 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74 20 3d 20  imit = iLimit = 
f250: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
f260: 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47      v = sqlite3G
f270: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
f280: 20 20 20 20 61 73 73 65 72 74 28 20 76 21 3d 30      assert( v!=0
f290: 20 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   );.    if( sqli
f2a0: 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
f2b0: 28 70 2d 3e 70 4c 69 6d 69 74 2c 20 26 6e 29 20  (p->pLimit, &n) 
f2c0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
f2d0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
f2e0: 5f 49 6e 74 65 67 65 72 2c 20 6e 2c 20 69 4c 69  _Integer, n, iLi
f2f0: 6d 69 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65  mit);.      Vdbe
f300: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d  Comment((v, "LIM
f310: 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20  IT counter"));. 
f320: 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b       if( n==0 ){
f330: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
f340: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
f350: 5f 47 6f 74 6f 2c 20 30 2c 20 69 42 72 65 61 6b  _Goto, 0, iBreak
f360: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
f370: 66 28 20 6e 3e 3d 30 20 26 26 20 70 2d 3e 6e 53  f( n>=0 && p->nS
f380: 65 6c 65 63 74 52 6f 77 3e 28 75 36 34 29 6e 20  electRow>(u64)n 
f390: 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 53  ){.        p->nS
f3a0: 65 6c 65 63 74 52 6f 77 20 3d 20 6e 3b 0a 20 20  electRow = n;.  
f3b0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
f3c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
f3d0: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
f3e0: 2d 3e 70 4c 69 6d 69 74 2c 20 69 4c 69 6d 69 74  ->pLimit, iLimit
f3f0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f400: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
f410: 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 4c 69 6d  _MustBeInt, iLim
f420: 69 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  it); VdbeCoverag
f430: 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65  e(v);.      Vdbe
f440: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d  Comment((v, "LIM
f450: 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20  IT counter"));. 
f460: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f470: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 5a  AddOp2(v, OP_IfZ
f480: 65 72 6f 2c 20 69 4c 69 6d 69 74 2c 20 69 42 72  ero, iLimit, iBr
f490: 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61  eak); VdbeCovera
f4a0: 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ge(v);.    }.   
f4b0: 20 69 66 28 20 70 2d 3e 70 4f 66 66 73 65 74 20   if( p->pOffset 
f4c0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66  ){.      p->iOff
f4d0: 73 65 74 20 3d 20 69 4f 66 66 73 65 74 20 3d 20  set = iOffset = 
f4e0: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
f4f0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
f500: 65 6d 2b 2b 3b 20 20 20 2f 2a 20 41 6c 6c 6f 63  em++;   /* Alloc
f510: 61 74 65 20 61 6e 20 65 78 74 72 61 20 72 65 67  ate an extra reg
f520: 69 73 74 65 72 20 66 6f 72 20 6c 69 6d 69 74 2b  ister for limit+
f530: 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 20 20  offset */.      
f540: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
f550: 70 50 61 72 73 65 2c 20 70 2d 3e 70 4f 66 66 73  pParse, p->pOffs
f560: 65 74 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20  et, iOffset);.  
f570: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f580: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74  ddOp1(v, OP_Must
f590: 42 65 49 6e 74 2c 20 69 4f 66 66 73 65 74 29 3b  BeInt, iOffset);
f5a0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
f5b0: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
f5c0: 65 6e 74 28 28 76 2c 20 22 4f 46 46 53 45 54 20  ent((v, "OFFSET 
f5d0: 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20  counter"));.    
f5e0: 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65    addr1 = sqlite
f5f0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
f600: 50 5f 49 66 50 6f 73 2c 20 69 4f 66 66 73 65 74  P_IfPos, iOffset
f610: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
f620: 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
f630: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
f640: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 4f  P_Integer, 0, iO
f650: 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73 71  ffset);.      sq
f660: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
f670: 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20  e(v, addr1);.   
f680: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
f690: 64 4f 70 33 28 76 2c 20 4f 50 5f 41 64 64 2c 20  dOp3(v, OP_Add, 
f6a0: 69 4c 69 6d 69 74 2c 20 69 4f 66 66 73 65 74 2c  iLimit, iOffset,
f6b0: 20 69 4f 66 66 73 65 74 2b 31 29 3b 0a 20 20 20   iOffset+1);.   
f6c0: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
f6d0: 76 2c 20 22 4c 49 4d 49 54 2b 4f 46 46 53 45 54  v, "LIMIT+OFFSET
f6e0: 22 29 29 3b 0a 20 20 20 20 20 20 61 64 64 72 31  "));.      addr1
f6f0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
f700: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73  dOp1(v, OP_IfPos
f710: 2c 20 69 4c 69 6d 69 74 29 3b 20 56 64 62 65 43  , iLimit); VdbeC
f720: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
f730: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f740: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
f750: 72 2c 20 2d 31 2c 20 69 4f 66 66 73 65 74 2b 31  r, -1, iOffset+1
f760: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f770: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
f780: 61 64 64 72 31 29 3b 0a 20 20 20 20 7d 0a 20 20  addr1);.    }.  
f790: 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  }.}..#ifndef SQL
f7a0: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
f7b0: 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52  D_SELECT./*.** R
f7c0: 65 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f 70  eturn the approp
f7d0: 72 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20  riate collating 
f7e0: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65  sequence for the
f7f0: 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20   iCol-th column 
f800: 6f 66 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  of.** the result
f810: 20 73 65 74 20 66 6f 72 20 74 68 65 20 63 6f 6d   set for the com
f820: 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 73 74 61  pound-select sta
f830: 74 65 6d 65 6e 74 20 22 70 22 2e 20 20 52 65 74  tement "p".  Ret
f840: 75 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74  urn NULL if.** t
f850: 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f  he column has no
f860: 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69   default collati
f870: 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a  ng sequence..**.
f880: 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67  ** The collating
f890: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68   sequence for th
f8a0: 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  e compound selec
f8b0: 74 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20  t is taken from 
f8c0: 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74  the.** left-most
f8d0: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 73 65 6c   term of the sel
f8e0: 65 63 74 20 74 68 61 74 20 68 61 73 20 61 20 63  ect that has a c
f8f0: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
f900: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c  e..*/.static Col
f910: 6c 53 65 71 20 2a 6d 75 6c 74 69 53 65 6c 65 63  lSeq *multiSelec
f920: 74 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a  tCollSeq(Parse *
f930: 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
f940: 70 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20  p, int iCol){.  
f950: 43 6f 6c 6c 53 65 71 20 2a 70 52 65 74 3b 0a 20  CollSeq *pRet;. 
f960: 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29   if( p->pPrior )
f970: 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 6d 75 6c  {.    pRet = mul
f980: 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
f990: 70 50 61 72 73 65 2c 20 70 2d 3e 70 50 72 69 6f  pParse, p->pPrio
f9a0: 72 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73  r, iCol);.  }els
f9b0: 65 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 30 3b  e{.    pRet = 0;
f9c0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69  .  }.  assert( i
f9d0: 43 6f 6c 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20  Col>=0 );.  if( 
f9e0: 70 52 65 74 3d 3d 30 20 26 26 20 69 43 6f 6c 3c  pRet==0 && iCol<
f9f0: 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
fa00: 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 73   ){.    pRet = s
fa10: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
fa20: 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c  q(pParse, p->pEL
fa30: 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78  ist->a[iCol].pEx
fa40: 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  pr);.  }.  retur
fa50: 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pRet;.}../*.**
fa60: 20 54 68 65 20 73 65 6c 65 63 74 20 73 74 61 74   The select stat
fa70: 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73 20  ement passed as 
fa80: 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d  the second param
fa90: 65 74 65 72 20 69 73 20 61 20 63 6f 6d 70 6f 75  eter is a compou
faa0: 6e 64 20 53 45 4c 45 43 54 0a 2a 2a 20 77 69 74  nd SELECT.** wit
fab0: 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  h an ORDER BY cl
fac0: 61 75 73 65 2e 20 54 68 69 73 20 66 75 6e 63 74  ause. This funct
fad0: 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e  ion allocates an
fae0: 64 20 72 65 74 75 72 6e 73 20 61 20 4b 65 79 49  d returns a KeyI
faf0: 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  nfo.** structure
fb00: 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20 69 6d   suitable for im
fb10: 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 4f  plementing the O
fb20: 52 44 45 52 20 42 59 2e 0a 2a 2a 0a 2a 2a 20 53  RDER BY..**.** S
fb30: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
fb40: 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
fb50: 72 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  re is obtained f
fb60: 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 54 68 65 20  rom malloc. The 
fb70: 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74  calling.** funct
fb80: 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73 69 62  ion is responsib
fb90: 6c 65 20 66 6f 72 20 65 6e 73 75 72 69 6e 67 20  le for ensuring 
fba0: 74 68 61 74 20 74 68 69 73 20 73 74 72 75 63 74  that this struct
fbb0: 75 72 65 20 69 73 20 65 76 65 6e 74 75 61 6c 6c  ure is eventuall
fbc0: 79 0a 2a 2a 20 66 72 65 65 64 2e 0a 2a 2f 0a 73  y.** freed..*/.s
fbd0: 74 61 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6d  tatic KeyInfo *m
fbe0: 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
fbf0: 79 4b 65 79 49 6e 66 6f 28 50 61 72 73 65 20 2a  yKeyInfo(Parse *
fc00: 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
fc10: 70 2c 20 69 6e 74 20 6e 45 78 74 72 61 29 7b 0a  p, int nExtra){.
fc20: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
fc30: 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
fc40: 42 79 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72  By;.  int nOrder
fc50: 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
fc60: 2d 3e 6e 45 78 70 72 3b 0a 20 20 73 71 6c 69 74  ->nExpr;.  sqlit
fc70: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
fc80: 3e 64 62 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  >db;.  KeyInfo *
fc90: 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 4b 65  pRet = sqlite3Ke
fca0: 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e  yInfoAlloc(db, n
fcb0: 4f 72 64 65 72 42 79 2b 6e 45 78 74 72 61 2c 20  OrderBy+nExtra, 
fcc0: 31 29 3b 0a 20 20 69 66 28 20 70 52 65 74 20 29  1);.  if( pRet )
fcd0: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
fce0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64   for(i=0; i<nOrd
fcf0: 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  erBy; i++){.    
fd00: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
fd10: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
fd20: 26 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 3b  &pOrderBy->a[i];
fd30: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 54 65  .      Expr *pTe
fd40: 72 6d 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70  rm = pItem->pExp
fd50: 72 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  r;.      CollSeq
fd60: 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 20 20 20 20   *pColl;..      
fd70: 69 66 28 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73  if( pTerm->flags
fd80: 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b   & EP_Collate ){
fd90: 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
fda0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
fdb0: 53 65 71 28 70 50 61 72 73 65 2c 20 70 54 65 72  Seq(pParse, pTer
fdc0: 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  m);.      }else{
fdd0: 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
fde0: 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c   multiSelectColl
fdf0: 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20 70  Seq(pParse, p, p
fe00: 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72  Item->u.x.iOrder
fe10: 42 79 43 6f 6c 2d 31 29 3b 0a 20 20 20 20 20 20  ByCol-1);.      
fe20: 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29    if( pColl==0 )
fe30: 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66   pColl = db->pDf
fe40: 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  ltColl;.        
fe50: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
fe60: 45 78 70 72 20 3d 0a 20 20 20 20 20 20 20 20 20  Expr =.         
fe70: 20 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43   sqlite3ExprAddC
fe80: 6f 6c 6c 61 74 65 53 74 72 69 6e 67 28 70 50 61  ollateString(pPa
fe90: 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 43 6f 6c  rse, pTerm, pCol
fea0: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  l->zName);.     
feb0: 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
fec0: 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49   sqlite3KeyInfoI
fed0: 73 57 72 69 74 65 61 62 6c 65 28 70 52 65 74 29  sWriteable(pRet)
fee0: 20 29 3b 0a 20 20 20 20 20 20 70 52 65 74 2d 3e   );.      pRet->
fef0: 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f 6c 6c  aColl[i] = pColl
ff00: 3b 0a 20 20 20 20 20 20 70 52 65 74 2d 3e 61 53  ;.      pRet->aS
ff10: 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 4f  ortOrder[i] = pO
ff20: 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72  rderBy->a[i].sor
ff30: 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20  tOrder;.    }.  
ff40: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74  }..  return pRet
ff50: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
ff60: 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a  ITE_OMIT_CTE./*.
ff70: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
ff80: 67 65 6e 65 72 61 74 65 73 20 56 44 42 45 20 63  generates VDBE c
ff90: 6f 64 65 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  ode to compute t
ffa0: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  he content of a 
ffb0: 57 49 54 48 20 52 45 43 55 52 53 49 56 45 0a 2a  WITH RECURSIVE.*
ffc0: 2a 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 66  * query of the f
ffd0: 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 3c 72 65  orm:.**.**   <re
ffe0: 63 75 72 73 69 76 65 2d 74 61 62 6c 65 3e 20 41  cursive-table> A
fff0: 53 20 28 3c 73 65 74 75 70 2d 71 75 65 72 79 3e  S (<setup-query>
10000 20 55 4e 49 4f 4e 20 5b 41 4c 4c 5d 20 3c 72 65   UNION [ALL] <re
10010 63 75 72 73 69 76 65 2d 71 75 65 72 79 3e 29 0a  cursive-query>).
10020 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
10030 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f             \____
10040 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20  _______/        
10050 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f       \__________
10060 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20 20  _____/.**       
10070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10080 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 20 20      p->pPrior   
10090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100a0 20 20 20 70 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68     p.**.**.** Th
100b0 65 72 65 20 69 73 20 65 78 61 63 74 6c 79 20 6f  ere is exactly o
100c0 6e 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  ne reference to 
100d0 74 68 65 20 72 65 63 75 72 73 69 76 65 2d 74 61  the recursive-ta
100e0 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ble in the FROM 
100f0 63 6c 61 75 73 65 0a 2a 2a 20 6f 66 20 72 65 63  clause.** of rec
10100 75 72 73 69 76 65 2d 71 75 65 72 79 2c 20 6d 61  ursive-query, ma
10110 72 6b 65 64 20 77 69 74 68 20 74 68 65 20 53 72  rked with the Sr
10120 63 4c 69 73 74 2d 3e 61 5b 5d 2e 69 73 52 65 63  cList->a[].isRec
10130 75 72 73 69 76 65 20 66 6c 61 67 2e 0a 2a 2a 0a  ursive flag..**.
10140 2a 2a 20 54 68 65 20 73 65 74 75 70 2d 71 75 65  ** The setup-que
10150 72 79 20 72 75 6e 73 20 6f 6e 63 65 20 74 6f 20  ry runs once to 
10160 67 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 69 74  generate an init
10170 69 61 6c 20 73 65 74 20 6f 66 20 72 6f 77 73 20  ial set of rows 
10180 74 68 61 74 20 67 6f 0a 2a 2a 20 69 6e 74 6f 20  that go.** into 
10190 61 20 51 75 65 75 65 20 74 61 62 6c 65 2e 20 20  a Queue table.  
101a0 52 6f 77 73 20 61 72 65 20 65 78 74 72 61 63 74  Rows are extract
101b0 65 64 20 66 72 6f 6d 20 74 68 65 20 51 75 65 75  ed from the Queu
101c0 65 20 74 61 62 6c 65 20 6f 6e 65 20 62 79 0a 2a  e table one by.*
101d0 2a 20 6f 6e 65 2e 20 20 45 61 63 68 20 72 6f 77  * one.  Each row
101e0 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
101f0 51 75 65 75 65 20 69 73 20 6f 75 74 70 75 74 20  Queue is output 
10200 74 6f 20 70 44 65 73 74 2e 20 20 54 68 65 6e 20  to pDest.  Then 
10210 74 68 65 20 73 69 6e 67 6c 65 0a 2a 2a 20 65 78  the single.** ex
10220 74 72 61 63 74 65 64 20 72 6f 77 20 28 6e 6f 77  tracted row (now
10230 20 69 6e 20 74 68 65 20 69 43 75 72 72 65 6e 74   in the iCurrent
10240 20 74 61 62 6c 65 29 20 62 65 63 6f 6d 65 73 20   table) becomes 
10250 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
10260 68 65 0a 2a 2a 20 72 65 63 75 72 73 69 76 65 2d  he.** recursive-
10270 74 61 62 6c 65 20 66 6f 72 20 61 20 72 65 63 75  table for a recu
10280 72 73 69 76 65 2d 71 75 65 72 79 20 72 75 6e 2e  rsive-query run.
10290 20 20 54 68 65 20 6f 75 74 70 75 74 20 6f 66 20    The output of 
102a0 74 68 65 20 72 65 63 75 72 73 69 76 65 2d 71 75  the recursive-qu
102b0 65 72 79 0a 2a 2a 20 69 73 20 61 64 64 65 64 20  ery.** is added 
102c0 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 51 75  back into the Qu
102d0 65 75 65 20 74 61 62 6c 65 2e 20 20 54 68 65 6e  eue table.  Then
102e0 20 61 6e 6f 74 68 65 72 20 72 6f 77 20 69 73 20   another row is 
102f0 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 51  extracted from Q
10300 75 65 75 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20  ueue.** and the 
10310 69 74 65 72 61 74 69 6f 6e 20 63 6f 6e 74 69 6e  iteration contin
10320 75 65 73 20 75 6e 74 69 6c 20 74 68 65 20 51 75  ues until the Qu
10330 65 75 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  eue table is emp
10340 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ty..**.** If the
10350 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20   compound query 
10360 6f 70 65 72 61 74 6f 72 20 69 73 20 55 4e 49 4f  operator is UNIO
10370 4e 20 74 68 65 6e 20 6e 6f 20 64 75 70 6c 69 63  N then no duplic
10380 61 74 65 20 72 6f 77 73 20 61 72 65 20 65 76 65  ate rows are eve
10390 72 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 69 6e  r.** inserted in
103a0 74 6f 20 74 68 65 20 51 75 65 75 65 20 74 61 62  to the Queue tab
103b0 6c 65 2e 20 20 54 68 65 20 69 44 69 73 74 69 6e  le.  The iDistin
103c0 63 74 20 74 61 62 6c 65 20 6b 65 65 70 73 20 61  ct table keeps a
103d0 20 63 6f 70 79 20 6f 66 20 61 6c 6c 20 72 6f 77   copy of all row
103e0 73 0a 2a 2a 20 74 68 61 74 20 68 61 76 65 20 65  s.** that have e
103f0 76 65 72 20 62 65 65 6e 20 69 6e 73 65 72 74 65  ver been inserte
10400 64 20 69 6e 74 6f 20 51 75 65 75 65 20 61 6e 64  d into Queue and
10410 20 63 61 75 73 65 73 20 64 75 70 6c 69 63 61 74   causes duplicat
10420 65 73 20 74 6f 20 62 65 0a 2a 2a 20 64 69 73 63  es to be.** disc
10430 61 72 64 65 64 2e 20 20 49 66 20 74 68 65 20 6f  arded.  If the o
10440 70 65 72 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e  perator is UNION
10450 20 41 4c 4c 2c 20 74 68 65 6e 20 64 75 70 6c 69   ALL, then dupli
10460 63 61 74 65 73 20 61 72 65 20 61 6c 6c 6f 77 65  cates are allowe
10470 64 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65  d..** .** If the
10480 20 71 75 65 72 79 20 68 61 73 20 61 6e 20 4f 52   query has an OR
10490 44 45 52 20 42 59 2c 20 74 68 65 6e 20 65 6e 74  DER BY, then ent
104a0 72 69 65 73 20 69 6e 20 74 68 65 20 51 75 65 75  ries in the Queu
104b0 65 20 74 61 62 6c 65 20 61 72 65 20 6b 65 70 74  e table are kept
104c0 20 69 6e 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20   in.** ORDER BY 
104d0 6f 72 64 65 72 20 61 6e 64 20 74 68 65 20 66 69  order and the fi
104e0 72 73 74 20 65 6e 74 72 79 20 69 73 20 65 78 74  rst entry is ext
104f0 72 61 63 74 65 64 20 66 6f 72 20 65 61 63 68 20  racted for each 
10500 63 79 63 6c 65 2e 20 20 57 69 74 68 6f 75 74 0a  cycle.  Without.
10510 2a 2a 20 61 6e 20 4f 52 44 45 52 20 42 59 2c 20  ** an ORDER BY, 
10520 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20  the Queue table 
10530 69 73 20 6a 75 73 74 20 61 20 46 49 46 4f 2e 0a  is just a FIFO..
10540 2a 2a 0a 2a 2a 20 49 66 20 61 20 4c 49 4d 49 54  **.** If a LIMIT
10550 20 63 6c 61 75 73 65 20 69 73 20 70 72 6f 76 69   clause is provi
10560 64 65 64 2c 20 74 68 65 6e 20 74 68 65 20 69 74  ded, then the it
10570 65 72 61 74 69 6f 6e 20 73 74 6f 70 73 20 61 66  eration stops af
10580 74 65 72 20 4c 49 4d 49 54 20 72 6f 77 73 0a 2a  ter LIMIT rows.*
10590 2a 20 68 61 76 65 20 62 65 65 6e 20 6f 75 74 70  * have been outp
105a0 75 74 20 74 6f 20 70 44 65 73 74 2e 20 20 41 20  ut to pDest.  A 
105b0 4c 49 4d 49 54 20 6f 66 20 7a 65 72 6f 20 6d 65  LIMIT of zero me
105c0 61 6e 73 20 74 6f 20 6f 75 74 70 75 74 20 6e 6f  ans to output no
105d0 20 72 6f 77 73 20 61 6e 64 20 61 0a 2a 2a 20 6e   rows and a.** n
105e0 65 67 61 74 69 76 65 20 4c 49 4d 49 54 20 6d 65  egative LIMIT me
105f0 61 6e 73 20 74 6f 20 6f 75 74 70 75 74 20 61 6c  ans to output al
10600 6c 20 72 6f 77 73 2e 20 20 49 66 20 74 68 65 72  l rows.  If ther
10610 65 20 69 73 20 61 6c 73 6f 20 61 6e 20 4f 46 46  e is also an OFF
10620 53 45 54 20 63 6c 61 75 73 65 0a 2a 2a 20 77 69  SET clause.** wi
10630 74 68 20 61 20 70 6f 73 69 74 69 76 65 20 76 61  th a positive va
10640 6c 75 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69  lue, then the fi
10650 72 73 74 20 4f 46 46 53 45 54 20 6f 75 74 70 75  rst OFFSET outpu
10660 74 73 20 61 72 65 20 64 69 73 63 61 72 64 65 64  ts are discarded
10670 20 72 61 74 68 65 72 0a 2a 2a 20 74 68 61 6e 20   rather.** than 
10680 62 65 69 6e 67 20 73 65 6e 74 20 74 6f 20 70 44  being sent to pD
10690 65 73 74 2e 20 20 54 68 65 20 4c 49 4d 49 54 20  est.  The LIMIT 
106a0 63 6f 75 6e 74 20 64 6f 65 73 20 6e 6f 74 20 62  count does not b
106b0 65 67 69 6e 20 75 6e 74 69 6c 20 61 66 74 65 72  egin until after
106c0 20 4f 46 46 53 45 54 0a 2a 2a 20 72 6f 77 73 20   OFFSET.** rows 
106d0 68 61 76 65 20 62 65 65 6e 20 73 6b 69 70 70 65  have been skippe
106e0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
106f0 64 20 67 65 6e 65 72 61 74 65 57 69 74 68 52 65  d generateWithRe
10700 63 75 72 73 69 76 65 51 75 65 72 79 28 0a 20 20  cursiveQuery(.  
10710 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
10720 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
10730 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
10740 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
10750 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63 75 72      /* The recur
10760 73 69 76 65 20 53 45 4c 45 43 54 20 74 6f 20 62  sive SELECT to b
10770 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c  e coded */.  Sel
10780 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20  ectDest *pDest  
10790 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
107a0 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75   with query resu
107b0 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c  lts */.){.  SrcL
107c0 69 73 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70  ist *pSrc = p->p
107d0 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  Src;      /* The
107e0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
107f0 74 68 65 20 72 65 63 75 72 73 69 76 65 20 71 75  the recursive qu
10800 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f  ery */.  int nCo
10810 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  l = p->pEList->n
10820 45 78 70 72 3b 20 20 2f 2a 20 4e 75 6d 62 65 72  Expr;  /* Number
10830 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
10840 68 65 20 72 65 63 75 72 73 69 76 65 20 74 61 62  he recursive tab
10850 6c 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20  le */.  Vdbe *v 
10860 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
10870 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72 65        /* The pre
10880 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
10890 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
108a0 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  on */.  Select *
108b0 70 53 65 74 75 70 20 3d 20 70 2d 3e 70 50 72 69  pSetup = p->pPri
108c0 6f 72 3b 20 20 20 2f 2a 20 54 68 65 20 73 65 74  or;   /* The set
108d0 75 70 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  up query */.  in
108e0 74 20 61 64 64 72 54 6f 70 3b 20 20 20 20 20 20  t addrTop;      
108f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
10900 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a  op of the loop *
10910 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74  /.  int addrCont
10920 2c 20 61 64 64 72 42 72 65 61 6b 3b 20 20 20 20  , addrBreak;    
10930 20 20 2f 2a 20 43 4f 4e 54 49 4e 55 45 20 61 6e    /* CONTINUE an
10940 64 20 42 52 45 41 4b 20 61 64 64 72 65 73 73 65  d BREAK addresse
10950 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 72  s */.  int iCurr
10960 65 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ent = 0;        
10970 20 20 20 20 20 2f 2a 20 54 68 65 20 43 75 72 72       /* The Curr
10980 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  ent table */.  i
10990 6e 74 20 72 65 67 43 75 72 72 65 6e 74 3b 20 20  nt regCurrent;  
109a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
109b0 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  Register holding
109c0 20 43 75 72 72 65 6e 74 20 74 61 62 6c 65 20 2a   Current table *
109d0 2f 0a 20 20 69 6e 74 20 69 51 75 65 75 65 3b 20  /.  int iQueue; 
109e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
109f0 20 20 2f 2a 20 54 68 65 20 51 75 65 75 65 20 74    /* The Queue t
10a00 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44  able */.  int iD
10a10 69 73 74 69 6e 63 74 20 3d 20 30 3b 20 20 20 20  istinct = 0;    
10a20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 20 65 6e          /* To en
10a30 73 75 72 65 20 75 6e 69 71 75 65 20 72 65 73 75  sure unique resu
10a40 6c 74 73 20 69 66 20 55 4e 49 4f 4e 20 2a 2f 0a  lts if UNION */.
10a50 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20 53 52    int eDest = SR
10a60 54 5f 46 69 66 6f 3b 20 20 20 20 20 20 20 20 20  T_Fifo;         
10a70 2f 2a 20 48 6f 77 20 74 6f 20 77 72 69 74 65 20  /* How to write 
10a80 74 6f 20 51 75 65 75 65 20 2a 2f 0a 20 20 53 65  to Queue */.  Se
10a90 6c 65 63 74 44 65 73 74 20 64 65 73 74 51 75 65  lectDest destQue
10aa0 75 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ue;         /* S
10ab0 65 6c 65 63 74 44 65 73 74 20 74 61 72 67 65 74  electDest target
10ac0 74 69 6e 67 20 74 68 65 20 51 75 65 75 65 20 74  ting the Queue t
10ad0 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  able */.  int i;
10ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10af0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
10b00 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
10b10 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
10b20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
10b30 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 45  sult code */.  E
10b40 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
10b50 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y;           /* 
10b60 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  The ORDER BY cla
10b70 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  use */.  Expr *p
10b80 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b  Limit, *pOffset;
10b90 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20         /* Saved 
10ba0 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
10bb0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d   */.  int regLim
10bc0 69 74 2c 20 72 65 67 4f 66 66 73 65 74 3b 20 20  it, regOffset;  
10bd0 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 73      /* Registers
10be0 20 75 73 65 64 20 62 79 20 4c 49 4d 49 54 20 61   used by LIMIT a
10bf0 6e 64 20 4f 46 46 53 45 54 20 2a 2f 0a 0a 20 20  nd OFFSET */..  
10c00 2f 2a 20 4f 62 74 61 69 6e 20 61 75 74 68 6f 72  /* Obtain author
10c10 69 7a 61 74 69 6f 6e 20 74 6f 20 64 6f 20 61 20  ization to do a 
10c20 72 65 63 75 72 73 69 76 65 20 71 75 65 72 79 20  recursive query 
10c30 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
10c40 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
10c50 2c 20 53 51 4c 49 54 45 5f 52 45 43 55 52 53 49  , SQLITE_RECURSI
10c60 56 45 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72  VE, 0, 0, 0) ) r
10c70 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 50 72 6f  eturn;..  /* Pro
10c80 63 65 73 73 20 74 68 65 20 4c 49 4d 49 54 20 61  cess the LIMIT a
10c90 6e 64 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65  nd OFFSET clause
10ca0 73 2c 20 69 66 20 74 68 65 79 20 65 78 69 73 74  s, if they exist
10cb0 20 2a 2f 0a 20 20 61 64 64 72 42 72 65 61 6b 20   */.  addrBreak 
10cc0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
10cd0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 63 6f 6d  eLabel(v);.  com
10ce0 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
10cf0 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 61 64  rs(pParse, p, ad
10d00 64 72 42 72 65 61 6b 29 3b 0a 20 20 70 4c 69 6d  drBreak);.  pLim
10d10 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a  it = p->pLimit;.
10d20 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70    pOffset = p->p
10d30 4f 66 66 73 65 74 3b 0a 20 20 72 65 67 4c 69 6d  Offset;.  regLim
10d40 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a  it = p->iLimit;.
10d50 20 20 72 65 67 4f 66 66 73 65 74 20 3d 20 70 2d    regOffset = p-
10d60 3e 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e 70  >iOffset;.  p->p
10d70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4f 66 66 73  Limit = p->pOffs
10d80 65 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 69 4c 69  et = 0;.  p->iLi
10d90 6d 69 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74  mit = p->iOffset
10da0 20 3d 20 30 3b 0a 20 20 70 4f 72 64 65 72 42 79   = 0;.  pOrderBy
10db0 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
10dc0 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65  .  /* Locate the
10dd0 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   cursor number o
10de0 66 20 74 68 65 20 43 75 72 72 65 6e 74 20 74 61  f the Current ta
10df0 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ble */.  for(i=0
10e00 3b 20 41 4c 57 41 59 53 28 69 3c 70 53 72 63 2d  ; ALWAYS(i<pSrc-
10e10 3e 6e 53 72 63 29 3b 20 69 2b 2b 29 7b 0a 20 20  >nSrc); i++){.  
10e20 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 69 5d    if( pSrc->a[i]
10e30 2e 69 73 52 65 63 75 72 73 69 76 65 20 29 7b 0a  .isRecursive ){.
10e40 20 20 20 20 20 20 69 43 75 72 72 65 6e 74 20 3d        iCurrent =
10e50 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72   pSrc->a[i].iCur
10e60 73 6f 72 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  sor;.      break
10e70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
10e80 2a 20 41 6c 6c 6f 63 61 74 65 20 63 75 72 73 6f  * Allocate curso
10e90 72 73 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 51  rs numbers for Q
10ea0 75 65 75 65 20 61 6e 64 20 44 69 73 74 69 6e 63  ueue and Distinc
10eb0 74 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6e  t.  The cursor n
10ec0 75 6d 62 65 72 20 66 6f 72 0a 20 20 2a 2a 20 74  umber for.  ** t
10ed0 68 65 20 44 69 73 74 69 6e 63 74 20 74 61 62 6c  he Distinct tabl
10ee0 65 20 6d 75 73 74 20 62 65 20 65 78 61 63 74 6c  e must be exactl
10ef0 79 20 6f 6e 65 20 67 72 65 61 74 65 72 20 74 68  y one greater th
10f00 61 6e 20 51 75 65 75 65 20 69 6e 20 6f 72 64 65  an Queue in orde
10f10 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 53  r.  ** for the S
10f20 52 54 5f 44 69 73 74 46 69 66 6f 20 61 6e 64 20  RT_DistFifo and 
10f30 53 52 54 5f 44 69 73 74 51 75 65 75 65 20 64 65  SRT_DistQueue de
10f40 73 74 69 6e 61 74 69 6f 6e 73 20 74 6f 20 77 6f  stinations to wo
10f50 72 6b 2e 20 2a 2f 0a 20 20 69 51 75 65 75 65 20  rk. */.  iQueue 
10f60 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
10f70 3b 0a 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54  ;.  if( p->op==T
10f80 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 65  K_UNION ){.    e
10f90 44 65 73 74 20 3d 20 70 4f 72 64 65 72 42 79 20  Dest = pOrderBy 
10fa0 3f 20 53 52 54 5f 44 69 73 74 51 75 65 75 65 20  ? SRT_DistQueue 
10fb0 3a 20 53 52 54 5f 44 69 73 74 46 69 66 6f 3b 0a  : SRT_DistFifo;.
10fc0 20 20 20 20 69 44 69 73 74 69 6e 63 74 20 3d 20      iDistinct = 
10fd0 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
10fe0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 65 44 65    }else{.    eDe
10ff0 73 74 20 3d 20 70 4f 72 64 65 72 42 79 20 3f 20  st = pOrderBy ? 
11000 53 52 54 5f 51 75 65 75 65 20 3a 20 53 52 54 5f  SRT_Queue : SRT_
11010 46 69 66 6f 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  Fifo;.  }.  sqli
11020 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
11030 74 28 26 64 65 73 74 51 75 65 75 65 2c 20 65 44  t(&destQueue, eD
11040 65 73 74 2c 20 69 51 75 65 75 65 29 3b 0a 0a 20  est, iQueue);.. 
11050 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 63 75 72   /* Allocate cur
11060 73 6f 72 73 20 66 6f 72 20 43 75 72 72 65 6e 74  sors for Current
11070 2c 20 51 75 65 75 65 2c 20 61 6e 64 20 44 69 73  , Queue, and Dis
11080 74 69 6e 63 74 2e 20 2a 2f 0a 20 20 72 65 67 43  tinct. */.  regC
11090 75 72 72 65 6e 74 20 3d 20 2b 2b 70 50 61 72 73  urrent = ++pPars
110a0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74  e->nMem;.  sqlit
110b0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
110c0 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 69  OP_OpenPseudo, i
110d0 43 75 72 72 65 6e 74 2c 20 72 65 67 43 75 72 72  Current, regCurr
110e0 65 6e 74 2c 20 6e 43 6f 6c 29 3b 0a 20 20 69 66  ent, nCol);.  if
110f0 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
11100 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
11110 6e 66 6f 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63  nfo = multiSelec
11120 74 4f 72 64 65 72 42 79 4b 65 79 49 6e 66 6f 28  tOrderByKeyInfo(
11130 70 50 61 72 73 65 2c 20 70 2c 20 31 29 3b 0a 20  pParse, p, 1);. 
11140 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11150 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp4(v, OP_OpenE
11160 70 68 65 6d 65 72 61 6c 2c 20 69 51 75 65 75 65  phemeral, iQueue
11170 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  , pOrderBy->nExp
11180 72 2b 32 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  r+2, 0,.        
11190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
111a0 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  har*)pKeyInfo, P
111b0 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
111c0 64 65 73 74 51 75 65 75 65 2e 70 4f 72 64 65 72  destQueue.pOrder
111d0 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20  By = pOrderBy;. 
111e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
111f0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
11200 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
11210 6c 2c 20 69 51 75 65 75 65 2c 20 6e 43 6f 6c 29  l, iQueue, nCol)
11220 3b 0a 20 20 7d 0a 20 20 56 64 62 65 43 6f 6d 6d  ;.  }.  VdbeComm
11230 65 6e 74 28 28 76 2c 20 22 51 75 65 75 65 20 74  ent((v, "Queue t
11240 61 62 6c 65 22 29 29 3b 0a 20 20 69 66 28 20 69  able"));.  if( i
11250 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
11260 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
11270 30 5d 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  0] = sqlite3Vdbe
11280 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
11290 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69 44 69 73  nEphemeral, iDis
112a0 74 69 6e 63 74 2c 20 30 29 3b 0a 20 20 20 20 70  tinct, 0);.    p
112b0 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
112c0 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a  _UsesEphemeral;.
112d0 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74 61 63 68    }..  /* Detach
112e0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
112f0 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20 63 6f  ause from the co
11300 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 2a 2f  mpound SELECT */
11310 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d  .  p->pOrderBy =
11320 20 30 3b 0a 0a 20 20 2f 2a 20 53 74 6f 72 65 20   0;..  /* Store 
11330 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  the results of t
11340 68 65 20 73 65 74 75 70 2d 71 75 65 72 79 20 69  he setup-query i
11350 6e 20 51 75 65 75 65 2e 20 2a 2f 0a 20 20 70 53  n Queue. */.  pS
11360 65 74 75 70 2d 3e 70 4e 65 78 74 20 3d 20 30 3b  etup->pNext = 0;
11370 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53  .  rc = sqlite3S
11380 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
11390 65 74 75 70 2c 20 26 64 65 73 74 51 75 65 75 65  etup, &destQueue
113a0 29 3b 0a 20 20 70 53 65 74 75 70 2d 3e 70 4e 65  );.  pSetup->pNe
113b0 78 74 20 3d 20 70 3b 0a 20 20 69 66 28 20 72 63  xt = p;.  if( rc
113c0 20 29 20 67 6f 74 6f 20 65 6e 64 5f 6f 66 5f 72   ) goto end_of_r
113d0 65 63 75 72 73 69 76 65 5f 71 75 65 72 79 3b 0a  ecursive_query;.
113e0 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 6e  .  /* Find the n
113f0 65 78 74 20 72 6f 77 20 69 6e 20 74 68 65 20 51  ext row in the Q
11400 75 65 75 65 20 61 6e 64 20 6f 75 74 70 75 74 20  ueue and output 
11410 74 68 61 74 20 72 6f 77 20 2a 2f 0a 20 20 61 64  that row */.  ad
11420 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  drTop = sqlite3V
11430 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
11440 52 65 77 69 6e 64 2c 20 69 51 75 65 75 65 2c 20  Rewind, iQueue, 
11450 61 64 64 72 42 72 65 61 6b 29 3b 20 56 64 62 65  addrBreak); Vdbe
11460 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20  Coverage(v);..  
11470 2f 2a 20 54 72 61 6e 73 66 65 72 20 74 68 65 20  /* Transfer the 
11480 6e 65 78 74 20 72 6f 77 20 69 6e 20 51 75 65 75  next row in Queu
11490 65 20 6f 76 65 72 20 74 6f 20 43 75 72 72 65 6e  e over to Curren
114a0 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64  t */.  sqlite3Vd
114b0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e  beAddOp1(v, OP_N
114c0 75 6c 6c 52 6f 77 2c 20 69 43 75 72 72 65 6e 74  ullRow, iCurrent
114d0 29 3b 20 2f 2a 20 54 6f 20 72 65 73 65 74 20 63  ); /* To reset c
114e0 6f 6c 75 6d 6e 20 63 61 63 68 65 20 2a 2f 0a 20  olumn cache */. 
114f0 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
11500 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
11510 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
11520 75 6d 6e 2c 20 69 51 75 65 75 65 2c 20 70 4f 72  umn, iQueue, pOr
11530 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2c 20  derBy->nExpr+1, 
11540 72 65 67 43 75 72 72 65 6e 74 29 3b 0a 20 20 7d  regCurrent);.  }
11550 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
11560 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
11570 50 5f 52 6f 77 44 61 74 61 2c 20 69 51 75 65 75  P_RowData, iQueu
11580 65 2c 20 72 65 67 43 75 72 72 65 6e 74 29 3b 0a  e, regCurrent);.
11590 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
115a0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65  eAddOp1(v, OP_De
115b0 6c 65 74 65 2c 20 69 51 75 65 75 65 29 3b 0a 0a  lete, iQueue);..
115c0 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20    /* Output the 
115d0 73 69 6e 67 6c 65 20 72 6f 77 20 69 6e 20 43 75  single row in Cu
115e0 72 72 65 6e 74 20 2a 2f 0a 20 20 61 64 64 72 43  rrent */.  addrC
115f0 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ont = sqlite3Vdb
11600 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
11610 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 72   codeOffset(v, r
11620 65 67 4f 66 66 73 65 74 2c 20 61 64 64 72 43 6f  egOffset, addrCo
11630 6e 74 29 3b 0a 20 20 73 65 6c 65 63 74 49 6e 6e  nt);.  selectInn
11640 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
11650 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 69 43 75  , p->pEList, iCu
11660 72 72 65 6e 74 2c 0a 20 20 20 20 20 20 30 2c 20  rrent,.      0, 
11670 30 2c 20 70 44 65 73 74 2c 20 61 64 64 72 43 6f  0, pDest, addrCo
11680 6e 74 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a  nt, addrBreak);.
11690 20 20 69 66 28 20 72 65 67 4c 69 6d 69 74 20 29    if( regLimit )
116a0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
116b0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66  eAddOp3(v, OP_If
116c0 5a 65 72 6f 2c 20 72 65 67 4c 69 6d 69 74 2c 20  Zero, regLimit, 
116d0 61 64 64 72 42 72 65 61 6b 2c 20 2d 31 29 3b 0a  addrBreak, -1);.
116e0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
116f0 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  (v);.  }.  sqlit
11700 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
11710 65 6c 28 76 2c 20 61 64 64 72 43 6f 6e 74 29 3b  el(v, addrCont);
11720 0a 0a 20 20 2f 2a 20 45 78 65 63 75 74 65 20 74  ..  /* Execute t
11730 68 65 20 72 65 63 75 72 73 69 76 65 20 53 45 4c  he recursive SEL
11740 45 43 54 20 74 61 6b 69 6e 67 20 74 68 65 20 73  ECT taking the s
11750 69 6e 67 6c 65 20 72 6f 77 20 69 6e 20 43 75 72  ingle row in Cur
11760 72 65 6e 74 20 61 73 0a 20 20 2a 2a 20 74 68 65  rent as.  ** the
11770 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 72   value for the r
11780 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65 2e 20  ecursive-table. 
11790 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  Store the result
117a0 73 20 69 6e 20 74 68 65 20 51 75 65 75 65 2e 0a  s in the Queue..
117b0 20 20 2a 2f 0a 20 20 70 2d 3e 70 50 72 69 6f 72    */.  p->pPrior
117c0 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 53   = 0;.  sqlite3S
117d0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
117e0 20 26 64 65 73 74 51 75 65 75 65 29 3b 0a 20 20   &destQueue);.  
117f0 61 73 73 65 72 74 28 20 70 2d 3e 70 50 72 69 6f  assert( p->pPrio
11800 72 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 70 50 72  r==0 );.  p->pPr
11810 69 6f 72 20 3d 20 70 53 65 74 75 70 3b 0a 0a 20  ior = pSetup;.. 
11820 20 2f 2a 20 4b 65 65 70 20 72 75 6e 6e 69 6e 67   /* Keep running
11830 20 74 68 65 20 6c 6f 6f 70 20 75 6e 74 69 6c 20   the loop until 
11840 74 68 65 20 51 75 65 75 65 20 69 73 20 65 6d 70  the Queue is emp
11850 74 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  ty */.  sqlite3V
11860 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
11870 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 54 6f 70  Goto, 0, addrTop
11880 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
11890 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
118a0 61 64 64 72 42 72 65 61 6b 29 3b 0a 0a 65 6e 64  addrBreak);..end
118b0 5f 6f 66 5f 72 65 63 75 72 73 69 76 65 5f 71 75  _of_recursive_qu
118c0 65 72 79 3a 0a 20 20 73 71 6c 69 74 65 33 45 78  ery:.  sqlite3Ex
118d0 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61  prListDelete(pPa
118e0 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 4f 72 64  rse->db, p->pOrd
118f0 65 72 42 79 29 3b 0a 20 20 70 2d 3e 70 4f 72 64  erBy);.  p->pOrd
11900 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
11910 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70  .  p->pLimit = p
11920 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e 70 4f 66 66  Limit;.  p->pOff
11930 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20  set = pOffset;. 
11940 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69   return;.}.#endi
11950 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
11960 5f 43 54 45 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77  _CTE */../* Forw
11970 61 72 64 20 72 65 66 65 72 65 6e 63 65 73 20 2a  ard references *
11980 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c  /.static int mul
11990 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28  tiSelectOrderBy(
119a0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
119b0 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
119c0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
119d0 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
119e0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
119f0 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45  ght-most of SELE
11a00 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20  CTs to be coded 
11a10 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
11a20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68  *pDest     /* Wh
11a30 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75  at to do with qu
11a40 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29  ery results */.)
11a50 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  ;.../*.** This r
11a60 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
11a70 20 74 6f 20 70 72 6f 63 65 73 73 20 61 20 63 6f   to process a co
11a80 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 66 6f 72  mpound query for
11a90 6d 20 66 72 6f 6d 0a 2a 2a 20 74 77 6f 20 6f 72  m from.** two or
11aa0 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65 20 71   more separate q
11ab0 75 65 72 69 65 73 20 75 73 69 6e 67 20 55 4e 49  ueries using UNI
11ac0 4f 4e 2c 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 45  ON, UNION ALL, E
11ad0 58 43 45 50 54 2c 20 6f 72 0a 2a 2a 20 49 4e 54  XCEPT, or.** INT
11ae0 45 52 53 45 43 54 0a 2a 2a 0a 2a 2a 20 22 70 22  ERSECT.**.** "p"
11af0 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 72   points to the r
11b00 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 74 68 65  ight-most of the
11b10 20 74 77 6f 20 71 75 65 72 69 65 73 2e 20 20 74   two queries.  t
11b20 68 65 20 71 75 65 72 79 20 6f 6e 20 74 68 65 0a  he query on the.
11b30 2a 2a 20 6c 65 66 74 20 69 73 20 70 2d 3e 70 50  ** left is p->pP
11b40 72 69 6f 72 2e 20 20 54 68 65 20 6c 65 66 74 20  rior.  The left 
11b50 71 75 65 72 79 20 63 6f 75 6c 64 20 61 6c 73 6f  query could also
11b60 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71   be a compound q
11b70 75 65 72 79 0a 2a 2a 20 69 6e 20 77 68 69 63 68  uery.** in which
11b80 20 63 61 73 65 20 74 68 69 73 20 72 6f 75 74 69   case this routi
11b90 6e 65 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65  ne will be calle
11ba0 64 20 72 65 63 75 72 73 69 76 65 6c 79 2e 20 0a  d recursively. .
11bb0 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74  **.** The result
11bc0 73 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 20 71  s of the total q
11bd0 75 65 72 79 20 61 72 65 20 74 6f 20 62 65 20 77  uery are to be w
11be0 72 69 74 74 65 6e 20 69 6e 74 6f 20 61 20 64 65  ritten into a de
11bf0 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20  stination.** of 
11c00 74 79 70 65 20 65 44 65 73 74 20 77 69 74 68 20  type eDest with 
11c10 70 61 72 61 6d 65 74 65 72 20 69 50 61 72 6d 2e  parameter iParm.
11c20 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31  .**.** Example 1
11c30 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 20 74 68  :  Consider a th
11c40 72 65 65 2d 77 61 79 20 63 6f 6d 70 6f 75 6e 64  ree-way compound
11c50 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a   SQL statement..
11c60 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
11c70 20 61 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e   a FROM t1 UNION
11c80 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74   SELECT b FROM t
11c90 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 63  2 UNION SELECT c
11ca0 20 46 52 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54   FROM t3.**.** T
11cb0 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73  his statement is
11cc0 20 70 61 72 73 65 64 20 75 70 20 61 73 20 66 6f   parsed up as fo
11cd0 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  llows:.**.**    
11ce0 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74   SELECT c FROM t
11cf0 33 0a 2a 2a 20 20 20 20 20 20 7c 0a 2a 2a 20 20  3.**      |.**  
11d00 20 20 20 20 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c      `----->  SEL
11d10 45 43 54 20 62 20 46 52 4f 4d 20 74 32 0a 2a 2a  ECT b FROM t2.**
11d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d30 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
11d40 20 20 20 20 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45      `------>  SE
11d50 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 0a 2a  LECT a FROM t1.*
11d60 2a 0a 2a 2a 20 54 68 65 20 61 72 72 6f 77 73 20  *.** The arrows 
11d70 69 6e 20 74 68 65 20 64 69 61 67 72 61 6d 20 61  in the diagram a
11d80 62 6f 76 65 20 72 65 70 72 65 73 65 6e 74 20 74  bove represent t
11d90 68 65 20 53 65 6c 65 63 74 2e 70 50 72 69 6f 72  he Select.pPrior
11da0 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20   pointer..** So 
11db0 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  if this routine 
11dc0 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70  is called with p
11dd0 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 33   equal to the t3
11de0 20 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20   query, then.** 
11df0 70 50 72 69 6f 72 20 77 69 6c 6c 20 62 65 20 74  pPrior will be t
11e00 68 65 20 74 32 20 71 75 65 72 79 2e 20 20 70 2d  he t2 query.  p-
11e10 3e 6f 70 20 77 69 6c 6c 20 62 65 20 54 4b 5f 55  >op will be TK_U
11e20 4e 49 4f 4e 20 69 6e 20 74 68 69 73 20 63 61 73  NION in this cas
11e30 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20  e..**.** Notice 
11e40 74 68 61 74 20 62 65 63 61 75 73 65 20 6f 66 20  that because of 
11e50 74 68 65 20 77 61 79 20 53 51 4c 69 74 65 20 70  the way SQLite p
11e60 61 72 73 65 73 20 63 6f 6d 70 6f 75 6e 64 20 53  arses compound S
11e70 45 4c 45 43 54 73 2c 20 74 68 65 0a 2a 2a 20 69  ELECTs, the.** i
11e80 6e 64 69 76 69 64 75 61 6c 20 73 65 6c 65 63 74  ndividual select
11e90 73 20 61 6c 77 61 79 73 20 67 72 6f 75 70 20 66  s always group f
11ea0 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68  rom left to righ
11eb0 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
11ec0 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 0a 20 20   multiSelect(.  
11ed0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
11ee0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
11ef0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
11f00 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
11f10 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
11f20 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73  -most of SELECTs
11f30 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
11f40 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
11f50 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20  est     /* What 
11f60 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79  to do with query
11f70 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20   results */.){. 
11f80 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
11f90 5f 4f 4b 3b 20 20 20 2f 2a 20 53 75 63 63 65 73  _OK;   /* Succes
11fa0 73 20 63 6f 64 65 20 66 72 6f 6d 20 61 20 73 75  s code from a su
11fb0 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 53 65  broutine */.  Se
11fc0 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20  lect *pPrior;   
11fd0 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53      /* Another S
11fe0 45 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c  ELECT immediatel
11ff0 79 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f  y to our left */
12000 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
12010 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
12020 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69  rate code to thi
12030 73 20 56 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65  s VDBE */.  Sele
12040 63 74 44 65 73 74 20 64 65 73 74 3b 20 20 20 20  ctDest dest;    
12050 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74 69 76 65    /* Alternative
12060 20 64 61 74 61 20 64 65 73 74 69 6e 61 74 69 6f   data destinatio
12070 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  n */.  Select *p
12080 44 65 6c 65 74 65 20 3d 20 30 3b 20 20 2f 2a 20  Delete = 0;  /* 
12090 43 68 61 69 6e 20 6f 66 20 73 69 6d 70 6c 65 20  Chain of simple 
120a0 73 65 6c 65 63 74 73 20 74 6f 20 64 65 6c 65 74  selects to delet
120b0 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  e */.  sqlite3 *
120c0 64 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  db;          /* 
120d0 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
120e0 69 6f 6e 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ion */.#ifndef S
120f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
12100 49 4e 0a 20 20 69 6e 74 20 69 53 75 62 31 20 3d  IN.  int iSub1 =
12110 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 51   0;        /* EQ
12120 50 20 69 64 20 6f 66 20 6c 65 66 74 2d 68 61 6e  P id of left-han
12130 64 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  d query */.  int
12140 20 69 53 75 62 32 20 3d 20 30 3b 20 20 20 20 20   iSub2 = 0;     
12150 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20     /* EQP id of 
12160 72 69 67 68 74 2d 68 61 6e 64 20 71 75 65 72 79  right-hand query
12170 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a   */.#endif..  /*
12180 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65   Make sure there
12190 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20   is no ORDER BY 
121a0 6f 72 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  or LIMIT clause 
121b0 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45 43 54 73  on prior SELECTs
121c0 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20 74 68 65  .  Only.  ** the
121d0 20 6c 61 73 74 20 28 72 69 67 68 74 2d 6d 6f 73   last (right-mos
121e0 74 29 20 53 45 4c 45 43 54 20 69 6e 20 74 68 65  t) SELECT in the
121f0 20 73 65 72 69 65 73 20 6d 61 79 20 68 61 76 65   series may have
12200 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20   an ORDER BY or 
12210 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20 20 61 73  LIMIT..  */.  as
12220 73 65 72 74 28 20 70 20 26 26 20 70 2d 3e 70 50  sert( p && p->pP
12230 72 69 6f 72 20 29 3b 20 20 2f 2a 20 43 61 6c 6c  rior );  /* Call
12240 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 67 75 61  ing function gua
12250 72 61 6e 74 65 65 73 20 74 68 69 73 20 6d 75 63  rantees this muc
12260 68 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  h */.  assert( (
12270 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
12280 5f 52 65 63 75 72 73 69 76 65 29 3d 3d 30 20 7c  _Recursive)==0 |
12290 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20  | p->op==TK_ALL 
122a0 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49  || p->op==TK_UNI
122b0 4f 4e 20 29 3b 0a 20 20 64 62 20 3d 20 70 50 61  ON );.  db = pPa
122c0 72 73 65 2d 3e 64 62 3b 0a 20 20 70 50 72 69 6f  rse->db;.  pPrio
122d0 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  r = p->pPrior;. 
122e0 20 64 65 73 74 20 3d 20 2a 70 44 65 73 74 3b 0a   dest = *pDest;.
122f0 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4f    if( pPrior->pO
12300 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71  rderBy ){.    sq
12310 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
12320 61 72 73 65 2c 22 4f 52 44 45 52 20 42 59 20 63  arse,"ORDER BY c
12330 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d  lause should com
12340 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62  e after %s not b
12350 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 73 65  efore",.      se
12360 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70  lectOpName(p->op
12370 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a  ));.    rc = 1;.
12380 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
12390 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20  elect_end;.  }. 
123a0 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69   if( pPrior->pLi
123b0 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  mit ){.    sqlit
123c0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
123d0 65 2c 22 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  e,"LIMIT clause 
123e0 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65  should come afte
123f0 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22  r %s not before"
12400 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70  ,.      selectOp
12410 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20  Name(p->op));.  
12420 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f    rc = 1;.    go
12430 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
12440 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d 20  end;.  }..  v = 
12450 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
12460 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74  Parse);.  assert
12470 28 20 76 21 3d 30 20 29 3b 20 20 2f 2a 20 54 68  ( v!=0 );  /* Th
12480 65 20 56 44 42 45 20 61 6c 72 65 61 64 79 20 63  e VDBE already c
12490 72 65 61 74 65 64 20 62 79 20 63 61 6c 6c 69 6e  reated by callin
124a0 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20  g function */.. 
124b0 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 64   /* Create the d
124c0 65 73 74 69 6e 61 74 69 6f 6e 20 74 65 6d 70 6f  estination tempo
124d0 72 61 72 79 20 74 61 62 6c 65 20 69 66 20 6e 65  rary table if ne
124e0 63 65 73 73 61 72 79 0a 20 20 2a 2f 0a 20 20 69  cessary.  */.  i
124f0 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53  f( dest.eDest==S
12500 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20  RT_EphemTab ){. 
12510 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
12520 4c 69 73 74 20 29 3b 0a 20 20 20 20 73 71 6c 69  List );.    sqli
12530 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
12540 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
12550 6c 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d 2c  l, dest.iSDParm,
12560 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
12570 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  r);.    sqlite3V
12580 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 42  dbeChangeP5(v, B
12590 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b  TREE_UNORDERED);
125a0 0a 20 20 20 20 64 65 73 74 2e 65 44 65 73 74 20  .    dest.eDest 
125b0 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a 20 20 7d  = SRT_Table;.  }
125c0 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
125d0 20 61 6c 6c 20 53 45 4c 45 43 54 73 20 69 6e 20   all SELECTs in 
125e0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 68 61  the statement ha
125f0 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  ve the same numb
12600 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 0a 20  er of elements. 
12610 20 2a 2a 20 69 6e 20 74 68 65 69 72 20 72 65 73   ** in their res
12620 75 6c 74 20 73 65 74 73 2e 0a 20 20 2a 2f 0a 20  ult sets..  */. 
12630 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
12640 73 74 20 26 26 20 70 50 72 69 6f 72 2d 3e 70 45  st && pPrior->pE
12650 4c 69 73 74 20 29 3b 0a 20 20 69 66 28 20 70 2d  List );.  if( p-
12660 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  >pEList->nExpr!=
12670 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e  pPrior->pEList->
12680 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 69 66 28  nExpr ){.    if(
12690 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
126a0 46 5f 56 61 6c 75 65 73 20 29 7b 0a 20 20 20 20  F_Values ){.    
126b0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
126c0 67 28 70 50 61 72 73 65 2c 20 22 61 6c 6c 20 56  g(pParse, "all V
126d0 41 4c 55 45 53 20 6d 75 73 74 20 68 61 76 65 20  ALUES must have 
126e0 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20  the same number 
126f0 6f 66 20 74 65 72 6d 73 22 29 3b 0a 20 20 20 20  of terms");.    
12700 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
12710 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
12720 72 73 65 2c 20 22 53 45 4c 45 43 54 73 20 74 6f  rse, "SELECTs to
12730 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69   the left and ri
12740 67 68 74 20 6f 66 20 25 73 22 0a 20 20 20 20 20  ght of %s".     
12750 20 20 20 22 20 64 6f 20 6e 6f 74 20 68 61 76 65     " do not have
12760 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
12770 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d   of result colum
12780 6e 73 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d  ns", selectOpNam
12790 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 7d  e(p->op));.    }
127a0 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20  .    rc = 1;.   
127b0 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
127c0 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 23 69 66  ct_end;.  }..#if
127d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
127e0 5f 43 54 45 0a 20 20 69 66 28 20 70 2d 3e 73 65  _CTE.  if( p->se
127f0 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75  lFlags & SF_Recu
12800 72 73 69 76 65 20 29 7b 0a 20 20 20 20 67 65 6e  rsive ){.    gen
12810 65 72 61 74 65 57 69 74 68 52 65 63 75 72 73 69  erateWithRecursi
12820 76 65 51 75 65 72 79 28 70 50 61 72 73 65 2c 20  veQuery(pParse, 
12830 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 7d 65 6c  p, &dest);.  }el
12840 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  se.#endif..  /* 
12850 43 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73  Compound SELECTs
12860 20 74 68 61 74 20 68 61 76 65 20 61 6e 20 4f 52   that have an OR
12870 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72  DER BY clause ar
12880 65 20 68 61 6e 64 6c 65 64 20 73 65 70 61 72 61  e handled separa
12890 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tely..  */.  if(
128a0 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a   p->pOrderBy ){.
128b0 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69      return multi
128c0 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 70 50  SelectOrderBy(pP
128d0 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b  arse, p, pDest);
128e0 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20 47  .  }else..  /* G
128f0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
12900 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69   the left and ri
12910 67 68 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ght SELECT state
12920 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 73 77  ments..  */.  sw
12930 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20  itch( p->op ){. 
12940 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20     case TK_ALL: 
12950 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
12960 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 0;.      int 
12970 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 61 73  nLimit;.      as
12980 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70  sert( !pPrior->p
12990 4c 69 6d 69 74 20 29 3b 0a 20 20 20 20 20 20 70  Limit );.      p
129a0 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d 20  Prior->iLimit = 
129b0 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20  p->iLimit;.     
129c0 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74   pPrior->iOffset
129d0 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20   = p->iOffset;. 
129e0 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4c 69       pPrior->pLi
129f0 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b  mit = p->pLimit;
12a00 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70  .      pPrior->p
12a10 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66  Offset = p->pOff
12a20 73 65 74 3b 0a 20 20 20 20 20 20 65 78 70 6c 61  set;.      expla
12a30 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75  inSetInteger(iSu
12a40 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78  b1, pParse->iNex
12a50 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20  tSelectId);.    
12a60 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
12a70 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72  lect(pParse, pPr
12a80 69 6f 72 2c 20 26 64 65 73 74 29 3b 0a 20 20 20  ior, &dest);.   
12a90 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30     p->pLimit = 0
12aa0 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73  ;.      p->pOffs
12ab0 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  et = 0;.      if
12ac0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
12ad0 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
12ae0 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20  t_end;.      }. 
12af0 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
12b00 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 69   0;.      p->iLi
12b10 6d 69 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4c  mit = pPrior->iL
12b20 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69  imit;.      p->i
12b30 4f 66 66 73 65 74 20 3d 20 70 50 72 69 6f 72 2d  Offset = pPrior-
12b40 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  >iOffset;.      
12b50 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b  if( p->iLimit ){
12b60 0a 20 20 20 20 20 20 20 20 61 64 64 72 20 3d 20  .        addr = 
12b70 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12b80 31 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20  1(v, OP_IfZero, 
12b90 70 2d 3e 69 4c 69 6d 69 74 29 3b 20 56 64 62 65  p->iLimit); Vdbe
12ba0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
12bb0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
12bc0 28 28 76 2c 20 22 4a 75 6d 70 20 61 68 65 61 64  ((v, "Jump ahead
12bd0 20 69 66 20 4c 49 4d 49 54 20 72 65 61 63 68 65   if LIMIT reache
12be0 64 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  d"));.      }.  
12bf0 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
12c00 74 65 67 65 72 28 69 53 75 62 32 2c 20 70 50 61  teger(iSub2, pPa
12c10 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
12c20 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Id);.      rc = 
12c30 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
12c40 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b  arse, p, &dest);
12c50 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
12c60 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
12c70 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65 20  ;.      pDelete 
12c80 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  = p->pPrior;.   
12c90 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
12ca0 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e  Prior;.      p->
12cb0 6e 53 65 6c 65 63 74 52 6f 77 20 2b 3d 20 70 50  nSelectRow += pP
12cc0 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  rior->nSelectRow
12cd0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 69  ;.      if( pPri
12ce0 6f 72 2d 3e 70 4c 69 6d 69 74 0a 20 20 20 20 20  or->pLimit.     
12cf0 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72    && sqlite3Expr
12d00 49 73 49 6e 74 65 67 65 72 28 70 50 72 69 6f 72  IsInteger(pPrior
12d10 2d 3e 70 4c 69 6d 69 74 2c 20 26 6e 4c 69 6d 69  ->pLimit, &nLimi
12d20 74 29 0a 20 20 20 20 20 20 20 26 26 20 6e 4c 69  t).       && nLi
12d30 6d 69 74 3e 30 20 26 26 20 70 2d 3e 6e 53 65 6c  mit>0 && p->nSel
12d40 65 63 74 52 6f 77 20 3e 20 28 75 36 34 29 6e 4c  ectRow > (u64)nL
12d50 69 6d 69 74 20 0a 20 20 20 20 20 20 29 7b 0a 20  imit .      ){. 
12d60 20 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63         p->nSelec
12d70 74 52 6f 77 20 3d 20 6e 4c 69 6d 69 74 3b 0a 20  tRow = nLimit;. 
12d80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
12d90 20 61 64 64 72 20 29 7b 0a 20 20 20 20 20 20 20   addr ){.       
12da0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
12db0 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  Here(v, addr);. 
12dc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
12dd0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
12de0 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 0a 20 20  se TK_EXCEPT:.  
12df0 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a    case TK_UNION:
12e00 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 75 6e 69   {.      int uni
12e10 6f 6e 54 61 62 3b 20 20 20 20 2f 2a 20 43 75 72  onTab;    /* Cur
12e20 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  sor number of th
12e30 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
12e40 65 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74  e holding result
12e50 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 6f 70 20   */.      u8 op 
12e60 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6e  = 0;       /* On
12e70 65 20 6f 66 20 74 68 65 20 53 52 54 5f 20 6f 70  e of the SRT_ op
12e80 65 72 61 74 69 6f 6e 73 20 74 6f 20 61 70 70 6c  erations to appl
12e90 79 20 74 6f 20 73 65 6c 66 20 2a 2f 0a 20 20 20  y to self */.   
12ea0 20 20 20 69 6e 74 20 70 72 69 6f 72 4f 70 3b 20     int priorOp; 
12eb0 20 20 20 20 2f 2a 20 54 68 65 20 53 52 54 5f 20      /* The SRT_ 
12ec0 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 61 70 70  operation to app
12ed0 6c 79 20 74 6f 20 70 72 69 6f 72 20 73 65 6c 65  ly to prior sele
12ee0 63 74 73 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  cts */.      Exp
12ef0 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66  r *pLimit, *pOff
12f00 73 65 74 3b 20 2f 2a 20 53 61 76 65 64 20 76 61  set; /* Saved va
12f10 6c 75 65 73 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69  lues of p->nLimi
12f20 74 20 61 6e 64 20 70 2d 3e 6e 4f 66 66 73 65 74  t and p->nOffset
12f30 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
12f40 64 72 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74  dr;.      Select
12f50 44 65 73 74 20 75 6e 69 6f 6e 64 65 73 74 3b 0a  Dest uniondest;.
12f60 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
12f70 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50   p->op==TK_EXCEP
12f80 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
12f90 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55  ase( p->op==TK_U
12fa0 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 70 72  NION );.      pr
12fb0 69 6f 72 4f 70 20 3d 20 53 52 54 5f 55 6e 69 6f  iorOp = SRT_Unio
12fc0 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 64 65 73  n;.      if( des
12fd0 74 2e 65 44 65 73 74 3d 3d 70 72 69 6f 72 4f 70  t.eDest==priorOp
12fe0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57   ){.        /* W
12ff0 65 20 63 61 6e 20 72 65 75 73 65 20 61 20 74 65  e can reuse a te
13000 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 67 65  mporary table ge
13010 6e 65 72 61 74 65 64 20 62 79 20 61 20 53 45 4c  nerated by a SEL
13020 45 43 54 20 74 6f 20 6f 75 72 0a 20 20 20 20 20  ECT to our.     
13030 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20 20     ** right..   
13040 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
13050 61 73 73 65 72 74 28 20 70 2d 3e 70 4c 69 6d 69  assert( p->pLimi
13060 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20  t==0 );      /* 
13070 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c  Not allowed on l
13080 65 66 74 77 61 72 64 20 65 6c 65 6d 65 6e 74 73  eftward elements
13090 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
130a0 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d  rt( p->pOffset==
130b0 30 20 29 3b 20 20 20 20 20 2f 2a 20 4e 6f 74 20  0 );     /* Not 
130c0 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74 77  allowed on leftw
130d0 61 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a  ard elements */.
130e0 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62          unionTab
130f0 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b   = dest.iSDParm;
13100 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
13110 20 20 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c        /* We will
13120 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20   need to create 
13130 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72  our own temporar
13140 79 20 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20  y table to hold 
13150 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  the.        ** i
13160 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75  ntermediate resu
13170 6c 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  lts..        */.
13180 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62          unionTab
13190 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
131a0 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  +;.        asser
131b0 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  t( p->pOrderBy==
131c0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64  0 );.        add
131d0 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
131e0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
131f0 45 70 68 65 6d 65 72 61 6c 2c 20 75 6e 69 6f 6e  Ephemeral, union
13200 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Tab, 0);.       
13210 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72   assert( p->addr
13220 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d  OpenEphm[0] == -
13230 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  1 );.        p->
13240 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20  addrOpenEphm[0] 
13250 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20 20  = addr;.        
13260 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29  findRightmost(p)
13270 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
13280 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a  _UsesEphemeral;.
13290 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
132a0 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  p->pEList );.   
132b0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43     }..      /* C
132c0 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 20 73  ode the SELECT s
132d0 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72  tatements to our
132e0 20 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a 20   left.      */. 
132f0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
13300 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29  rior->pOrderBy )
13310 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
13320 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 75  electDestInit(&u
13330 6e 69 6f 6e 64 65 73 74 2c 20 70 72 69 6f 72 4f  niondest, priorO
13340 70 2c 20 75 6e 69 6f 6e 54 61 62 29 3b 0a 20 20  p, unionTab);.  
13350 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
13360 74 65 67 65 72 28 69 53 75 62 31 2c 20 70 50 61  teger(iSub1, pPa
13370 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
13380 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Id);.      rc = 
13390 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
133a0 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 75  arse, pPrior, &u
133b0 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20  niondest);.     
133c0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
133d0 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
133e0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
133f0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  }..      /* Code
13400 20 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c   the current SEL
13410 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  ECT statement.  
13420 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
13430 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50   p->op==TK_EXCEP
13440 54 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 20  T ){.        op 
13450 3d 20 53 52 54 5f 45 78 63 65 70 74 3b 0a 20 20  = SRT_Except;.  
13460 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13470 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70     assert( p->op
13480 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20  ==TK_UNION );.  
13490 20 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 55        op = SRT_U
134a0 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nion;.      }.  
134b0 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
134c0 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20  0;.      pLimit 
134d0 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  = p->pLimit;.   
134e0 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30     p->pLimit = 0
134f0 3b 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74 20  ;.      pOffset 
13500 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20  = p->pOffset;.  
13510 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d      p->pOffset =
13520 20 30 3b 0a 20 20 20 20 20 20 75 6e 69 6f 6e 64   0;.      uniond
13530 65 73 74 2e 65 44 65 73 74 20 3d 20 6f 70 3b 0a  est.eDest = op;.
13540 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74        explainSet
13550 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20 70  Integer(iSub2, p
13560 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
13570 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20  ctId);.      rc 
13580 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
13590 70 50 61 72 73 65 2c 20 70 2c 20 26 75 6e 69 6f  pParse, p, &unio
135a0 6e 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65  ndest);.      te
135b0 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
135c0 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 2f  TE_OK );.      /
135d0 2a 20 51 75 65 72 79 20 66 6c 61 74 74 65 6e 69  * Query flatteni
135e0 6e 67 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c  ng in sqlite3Sel
135f0 65 63 74 28 29 20 6d 69 67 68 74 20 72 65 66 69  ect() might refi
13600 6c 6c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2e 0a  ll p->pOrderBy..
13610 20 20 20 20 20 20 2a 2a 20 42 65 20 73 75 72 65        ** Be sure
13620 20 74 6f 20 64 65 6c 65 74 65 20 70 2d 3e 70 4f   to delete p->pO
13630 72 64 65 72 42 79 2c 20 74 68 65 72 65 66 6f 72  rderBy, therefor
13640 65 2c 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 65  e, to avoid a me
13650 6d 6f 72 79 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20  mory leak. */.  
13660 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
13670 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
13680 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20  >pOrderBy);.    
13690 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70    pDelete = p->p
136a0 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e  Prior;.      p->
136b0 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
136c0 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  .      p->pOrder
136d0 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  By = 0;.      if
136e0 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  ( p->op==TK_UNIO
136f0 4e 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  N ) p->nSelectRo
13700 77 20 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65  w += pPrior->nSe
13710 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 73  lectRow;.      s
13720 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
13730 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b  (db, p->pLimit);
13740 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  .      p->pLimit
13750 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20   = pLimit;.     
13760 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f   p->pOffset = pO
13770 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e  ffset;.      p->
13780 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  iLimit = 0;.    
13790 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30    p->iOffset = 0
137a0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76  ;..      /* Conv
137b0 65 72 74 20 74 68 65 20 64 61 74 61 20 69 6e 20  ert the data in 
137c0 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
137d0 62 6c 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65  ble into whateve
137e0 72 20 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20  r form.      ** 
137f0 69 74 20 69 73 20 74 68 61 74 20 77 65 20 63 75  it is that we cu
13800 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20  rrently need..  
13810 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
13820 65 72 74 28 20 75 6e 69 6f 6e 54 61 62 3d 3d 64  ert( unionTab==d
13830 65 73 74 2e 69 53 44 50 61 72 6d 20 7c 7c 20 64  est.iSDParm || d
13840 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f 72  est.eDest!=prior
13850 4f 70 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Op );.      if( 
13860 64 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f  dest.eDest!=prio
13870 72 4f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 69  rOp ){.        i
13880 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b  nt iCont, iBreak
13890 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20  , iStart;.      
138a0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
138b0 69 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ist );.        i
138c0 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53  f( dest.eDest==S
138d0 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20  RT_Output ){.   
138e0 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70         Select *p
138f0 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 20 20 20  First = p;.     
13900 20 20 20 20 20 77 68 69 6c 65 28 20 70 46 69 72       while( pFir
13910 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69  st->pPrior ) pFi
13920 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50  rst = pFirst->pP
13930 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20  rior;.          
13940 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
13950 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70  mes(pParse, 0, p
13960 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a  First->pEList);.
13970 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13980 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74    iBreak = sqlit
13990 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
139a0 76 29 3b 0a 20 20 20 20 20 20 20 20 69 43 6f 6e  v);.        iCon
139b0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
139c0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
139d0 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69       computeLimi
139e0 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73  tRegisters(pPars
139f0 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20  e, p, iBreak);. 
13a00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
13a10 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
13a20 65 77 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c  ewind, unionTab,
13a30 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f   iBreak); VdbeCo
13a40 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
13a50 20 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69     iStart = sqli
13a60 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
13a70 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73  dr(v);.        s
13a80 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
13a90 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c  Parse, p, p->pEL
13aa0 69 73 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 0a 20  ist, unionTab,. 
13ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ac0 20 20 20 20 20 20 20 30 2c 20 30 2c 20 26 64 65         0, 0, &de
13ad0 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61  st, iCont, iBrea
13ae0 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  k);.        sqli
13af0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
13b00 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20  bel(v, iCont);. 
13b10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
13b20 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
13b30 65 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69  ext, unionTab, i
13b40 53 74 61 72 74 29 3b 20 56 64 62 65 43 6f 76 65  Start); VdbeCove
13b50 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
13b60 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
13b70 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65  lveLabel(v, iBre
13b80 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ak);.        sql
13b90 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
13ba0 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f  , OP_Close, unio
13bb0 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  nTab, 0);.      
13bc0 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
13bd0 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
13be0 3a 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d  : assert( p->op=
13bf0 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 3b  =TK_INTERSECT );
13c00 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 61 62   {.      int tab
13c10 31 2c 20 74 61 62 32 3b 0a 20 20 20 20 20 20 69  1, tab2;.      i
13c20 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b  nt iCont, iBreak
13c30 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20  , iStart;.      
13c40 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70  Expr *pLimit, *p
13c50 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69 6e  Offset;.      in
13c60 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 53 65  t addr;.      Se
13c70 6c 65 63 74 44 65 73 74 20 69 6e 74 65 72 73 65  lectDest interse
13c80 63 74 64 65 73 74 3b 0a 20 20 20 20 20 20 69 6e  ctdest;.      in
13c90 74 20 72 31 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  t r1;..      /* 
13ca0 49 4e 54 45 52 53 45 43 54 20 69 73 20 64 69 66  INTERSECT is dif
13cb0 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  ferent from the 
13cc0 6f 74 68 65 72 73 20 73 69 6e 63 65 20 69 74 20  others since it 
13cd0 72 65 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a  requires.      *
13ce0 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 20  * two temporary 
13cf0 74 61 62 6c 65 73 2e 20 20 48 65 6e 63 65 20 69  tables.  Hence i
13d00 74 20 68 61 73 20 69 74 73 20 6f 77 6e 20 63 61  t has its own ca
13d10 73 65 2e 20 20 42 65 67 69 6e 0a 20 20 20 20 20  se.  Begin.     
13d20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69 6e   ** by allocatin
13d30 67 20 74 68 65 20 74 61 62 6c 65 73 20 77 65 20  g the tables we 
13d40 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20 20  will need..     
13d50 20 2a 2f 0a 20 20 20 20 20 20 74 61 62 31 20 3d   */.      tab1 =
13d60 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
13d70 0a 20 20 20 20 20 20 74 61 62 32 20 3d 20 70 50  .      tab2 = pP
13d80 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
13d90 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
13da0 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 0a 20  OrderBy==0 );.. 
13db0 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
13dc0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
13dd0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
13de0 6c 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20  l, tab1, 0);.   
13df0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64     assert( p->ad
13e00 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d  drOpenEphm[0] ==
13e10 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e   -1 );.      p->
13e20 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20  addrOpenEphm[0] 
13e30 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 66 69  = addr;.      fi
13e40 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e  ndRightmost(p)->
13e50 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55  selFlags |= SF_U
13e60 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20  sesEphemeral;.  
13e70 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
13e80 45 4c 69 73 74 20 29 3b 0a 0a 20 20 20 20 20 20  EList );..      
13e90 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45  /* Code the SELE
13ea0 43 54 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 20  CTs to our left 
13eb0 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74  into temporary t
13ec0 61 62 6c 65 20 22 74 61 62 31 22 2e 0a 20 20 20  able "tab1"..   
13ed0 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
13ee0 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
13ef0 74 28 26 69 6e 74 65 72 73 65 63 74 64 65 73 74  t(&intersectdest
13f00 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62  , SRT_Union, tab
13f10 31 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69  1);.      explai
13f20 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62  nSetInteger(iSub
13f30 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74  1, pParse->iNext
13f40 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20  SelectId);.     
13f50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
13f60 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69  ect(pParse, pPri
13f70 6f 72 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65  or, &intersectde
13f80 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  st);.      if( r
13f90 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  c ){.        got
13fa0 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
13fb0 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  nd;.      }..   
13fc0 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63     /* Code the c
13fd0 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69 6e  urrent SELECT in
13fe0 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  to temporary tab
13ff0 6c 65 20 22 74 61 62 32 22 0a 20 20 20 20 20 20  le "tab2".      
14000 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  */.      addr = 
14010 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14020 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
14030 6d 65 72 61 6c 2c 20 74 61 62 32 2c 20 30 29 3b  meral, tab2, 0);
14040 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
14050 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31  ->addrOpenEphm[1
14060 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20  ] == -1 );.     
14070 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
14080 5b 31 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20  [1] = addr;.    
14090 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
140a0 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20  .      pLimit = 
140b0 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20  p->pLimit;.     
140c0 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
140d0 20 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20        pOffset = 
140e0 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20  p->pOffset;.    
140f0 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30    p->pOffset = 0
14100 3b 0a 20 20 20 20 20 20 69 6e 74 65 72 73 65 63  ;.      intersec
14110 74 64 65 73 74 2e 69 53 44 50 61 72 6d 20 3d 20  tdest.iSDParm = 
14120 74 61 62 32 3b 0a 20 20 20 20 20 20 65 78 70 6c  tab2;.      expl
14130 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53  ainSetInteger(iS
14140 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65  ub2, pParse->iNe
14150 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  xtSelectId);.   
14160 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
14170 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
14180 20 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 29   &intersectdest)
14190 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
141a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
141b0 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65  );.      pDelete
141c0 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
141d0 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
141e0 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 69 66  pPrior;.      if
141f0 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e  ( p->nSelectRow>
14200 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52  pPrior->nSelectR
14210 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52  ow ) p->nSelectR
14220 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65  ow = pPrior->nSe
14230 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 73  lectRow;.      s
14240 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
14250 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b  (db, p->pLimit);
14260 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  .      p->pLimit
14270 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20   = pLimit;.     
14280 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f   p->pOffset = pO
14290 66 66 73 65 74 3b 0a 0a 20 20 20 20 20 20 2f 2a  ffset;..      /*
142a0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
142b0 6f 20 74 61 6b 65 20 74 68 65 20 69 6e 74 65 72  o take the inter
142c0 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 74  section of the t
142d0 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20  wo temporary.   
142e0 20 20 20 2a 2a 20 74 61 62 6c 65 73 2e 0a 20 20     ** tables..  
142f0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
14300 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
14310 3b 0a 20 20 20 20 20 20 69 66 28 20 64 65 73 74  ;.      if( dest
14320 2e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70  .eDest==SRT_Outp
14330 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 53 65  ut ){.        Se
14340 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70  lect *pFirst = p
14350 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  ;.        while(
14360 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20   pFirst->pPrior 
14370 29 20 70 46 69 72 73 74 20 3d 20 70 46 69 72 73  ) pFirst = pFirs
14380 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20  t->pPrior;.     
14390 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d     generateColum
143a0 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30  nNames(pParse, 0
143b0 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74  , pFirst->pEList
143c0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
143d0 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65   iBreak = sqlite
143e0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
143f0 29 3b 0a 20 20 20 20 20 20 69 43 6f 6e 74 20 3d  );.      iCont =
14400 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
14410 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
14420 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
14430 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c  sters(pParse, p,
14440 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
14450 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14460 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
14470 74 61 62 31 2c 20 69 42 72 65 61 6b 29 3b 20 56  tab1, iBreak); V
14480 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
14490 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
144a0 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
144b0 72 73 65 29 3b 0a 20 20 20 20 20 20 69 53 74 61  rse);.      iSta
144c0 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rt = sqlite3Vdbe
144d0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77  AddOp2(v, OP_Row
144e0 4b 65 79 2c 20 74 61 62 31 2c 20 72 31 29 3b 0a  Key, tab1, r1);.
144f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
14500 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
14510 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 62 32 2c  _NotFound, tab2,
14520 20 69 43 6f 6e 74 2c 20 72 31 2c 20 30 29 3b 20   iCont, r1, 0); 
14530 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
14540 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
14550 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
14560 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
14570 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
14580 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45  pParse, p, p->pE
14590 4c 69 73 74 2c 20 74 61 62 31 2c 0a 20 20 20 20  List, tab1,.    
145a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
145b0 20 20 30 2c 20 30 2c 20 26 64 65 73 74 2c 20 69    0, 0, &dest, i
145c0 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20  Cont, iBreak);. 
145d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
145e0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
145f0 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73 71  iCont);.      sq
14600 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
14610 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 74 61 62 31  v, OP_Next, tab1
14620 2c 20 69 53 74 61 72 74 29 3b 20 56 64 62 65 43  , iStart); VdbeC
14630 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
14640 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
14650 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72  olveLabel(v, iBr
14660 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eak);.      sqli
14670 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
14680 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32 2c   OP_Close, tab2,
14690 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
146a0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
146b0 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31 2c 20  OP_Close, tab1, 
146c0 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
146d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 65 78  .    }.  }..  ex
146e0 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 70  plainComposite(p
146f0 50 61 72 73 65 2c 20 70 2d 3e 6f 70 2c 20 69 53  Parse, p->op, iS
14700 75 62 31 2c 20 69 53 75 62 32 2c 20 70 2d 3e 6f  ub1, iSub2, p->o
14710 70 21 3d 54 4b 5f 41 4c 4c 29 3b 0a 0a 20 20 2f  p!=TK_ALL);..  /
14720 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c 6c 61 74  * Compute collat
14730 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 75 73  ing sequences us
14740 65 64 20 62 79 20 0a 20 20 2a 2a 20 74 65 6d 70  ed by .  ** temp
14750 6f 72 61 72 79 20 74 61 62 6c 65 73 20 6e 65 65  orary tables nee
14760 64 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ded to implement
14770 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65   the compound se
14780 6c 65 63 74 2e 0a 20 20 2a 2a 20 41 74 74 61 63  lect..  ** Attac
14790 68 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74  h the KeyInfo st
147a0 72 75 63 74 75 72 65 20 74 6f 20 61 6c 6c 20 74  ructure to all t
147b0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e  emporary tables.
147c0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
147d0 73 65 63 74 69 6f 6e 20 69 73 20 72 75 6e 20 62  section is run b
147e0 79 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  y the right-most
147f0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
14800 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20 53 45 4c  t only..  ** SEL
14810 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74  ECT statements t
14820 6f 20 74 68 65 20 6c 65 66 74 20 61 6c 77 61 79  o the left alway
14830 73 20 73 6b 69 70 20 74 68 69 73 20 70 61 72 74  s skip this part
14840 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  .  The right-mos
14850 74 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 6d 69  t.  ** SELECT mi
14860 67 68 74 20 61 6c 73 6f 20 73 6b 69 70 20 74 68  ght also skip th
14870 69 73 20 70 61 72 74 20 69 66 20 69 74 20 68 61  is part if it ha
14880 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c  s no ORDER BY cl
14890 61 75 73 65 20 61 6e 64 0a 20 20 2a 2a 20 6e 6f  ause and.  ** no
148a0 20 74 65 6d 70 20 74 61 62 6c 65 73 20 61 72 65   temp tables are
148b0 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a   required..  */.
148c0 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
148d0 73 20 26 20 53 46 5f 55 73 65 73 45 70 68 65 6d  s & SF_UsesEphem
148e0 65 72 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20  eral ){.    int 
148f0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
14900 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
14910 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
14920 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
14930 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  fo;            /
14940 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  * Collating sequ
14950 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72 65 73  ence for the res
14960 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20 20 53  ult set */.    S
14970 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b 20 20 20  elect *pLoop;   
14980 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14990 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f  For looping thro
149a0 75 67 68 20 53 45 4c 45 43 54 20 73 74 61 74 65  ugh SELECT state
149b0 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 43 6f 6c  ments */.    Col
149c0 6c 53 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b 20 20  lSeq **apColl;  
149d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
149e0 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67  r looping throug
149f0 68 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  h pKeyInfo->aCol
14a00 6c 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  l[] */.    int n
14a10 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
14a20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
14a30 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
14a40 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a   result set */..
14a50 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
14a60 4e 65 78 74 3d 3d 30 20 29 3b 0a 20 20 20 20 6e  Next==0 );.    n
14a70 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  Col = p->pEList-
14a80 3e 6e 45 78 70 72 3b 0a 20 20 20 20 70 4b 65 79  >nExpr;.    pKey
14a90 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65  Info = sqlite3Ke
14aa0 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e  yInfoAlloc(db, n
14ab0 43 6f 6c 2c 20 31 29 3b 0a 20 20 20 20 69 66 28  Col, 1);.    if(
14ac0 20 21 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20   !pKeyInfo ){.  
14ad0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
14ae0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
14af0 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
14b00 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  nd;.    }.    fo
14b10 72 28 69 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b  r(i=0, apColl=pK
14b20 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69  eyInfo->aColl; i
14b30 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f  <nCol; i++, apCo
14b40 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 2a 61 70  ll++){.      *ap
14b50 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65  Coll = multiSele
14b60 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ctCollSeq(pParse
14b70 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 69  , p, i);.      i
14b80 66 28 20 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b  f( 0==*apColl ){
14b90 0a 20 20 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c  .        *apColl
14ba0 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
14bb0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
14bc0 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70  .    for(pLoop=p
14bd0 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70  ; pLoop; pLoop=p
14be0 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20  Loop->pPrior){. 
14bf0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
14c00 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  2; i++){.       
14c10 20 69 6e 74 20 61 64 64 72 20 3d 20 70 4c 6f 6f   int addr = pLoo
14c20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
14c30 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i];.        if( 
14c40 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 20 20  addr<0 ){.      
14c50 20 20 20 20 2f 2a 20 49 66 20 5b 30 5d 20 69 73      /* If [0] is
14c60 20 75 6e 75 73 65 64 20 74 68 65 6e 20 5b 31 5d   unused then [1]
14c70 20 69 73 20 61 6c 73 6f 20 75 6e 75 73 65 64 2e   is also unused.
14c80 20 20 53 6f 20 77 65 20 63 61 6e 0a 20 20 20 20    So we can.    
14c90 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20        ** always 
14ca0 73 61 66 65 6c 79 20 61 62 6f 72 74 20 61 73 20  safely abort as 
14cb0 73 6f 6f 6e 20 61 73 20 74 68 65 20 66 69 72 73  soon as the firs
14cc0 74 20 75 6e 75 73 65 64 20 73 6c 6f 74 20 69 73  t unused slot is
14cd0 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20   found */.      
14ce0 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f      assert( pLoo
14cf0 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
14d00 31 5d 3c 30 20 29 3b 0a 20 20 20 20 20 20 20 20  1]<0 );.        
14d10 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
14d20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
14d30 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76  e3VdbeChangeP2(v
14d40 2c 20 61 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20  , addr, nCol);. 
14d50 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
14d60 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64  beChangeP4(v, ad
14d70 64 72 2c 20 28 63 68 61 72 2a 29 73 71 6c 69 74  dr, (char*)sqlit
14d80 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65  e3KeyInfoRef(pKe
14d90 79 49 6e 66 6f 29 2c 0a 20 20 20 20 20 20 20 20  yInfo),.        
14da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14db0 20 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b      P4_KEYINFO);
14dc0 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  .        pLoop->
14dd0 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 20  addrOpenEphm[i] 
14de0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  = -1;.      }.  
14df0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4b    }.    sqlite3K
14e00 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79  eyInfoUnref(pKey
14e10 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74  Info);.  }..mult
14e20 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20  i_select_end:.  
14e30 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 64  pDest->iSdst = d
14e40 65 73 74 2e 69 53 64 73 74 3b 0a 20 20 70 44 65  est.iSdst;.  pDe
14e50 73 74 2d 3e 6e 53 64 73 74 20 3d 20 64 65 73 74  st->nSdst = dest
14e60 2e 6e 53 64 73 74 3b 0a 20 20 73 71 6c 69 74 65  .nSdst;.  sqlite
14e70 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
14e80 2c 20 70 44 65 6c 65 74 65 29 3b 0a 20 20 72 65  , pDelete);.  re
14e90 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
14ea0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
14eb0 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
14ec0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20   */../*.** Code 
14ed0 61 6e 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75  an output subrou
14ee0 74 69 6e 65 20 66 6f 72 20 61 20 63 6f 72 6f 75  tine for a corou
14ef0 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tine implementat
14f00 69 6f 6e 20 6f 66 20 61 0a 2a 2a 20 53 45 4c 45  ion of a.** SELE
14f10 43 54 20 73 74 61 74 6d 65 6e 74 2e 0a 2a 2a 0a  CT statment..**.
14f20 2a 2a 20 54 68 65 20 64 61 74 61 20 74 6f 20 62  ** The data to b
14f30 65 20 6f 75 74 70 75 74 20 69 73 20 63 6f 6e 74  e output is cont
14f40 61 69 6e 65 64 20 69 6e 20 70 49 6e 2d 3e 69 53  ained in pIn->iS
14f50 64 73 74 2e 20 20 54 68 65 72 65 20 61 72 65 0a  dst.  There are.
14f60 2a 2a 20 70 49 6e 2d 3e 6e 53 64 73 74 20 63 6f  ** pIn->nSdst co
14f70 6c 75 6d 6e 73 20 74 6f 20 62 65 20 6f 75 74 70  lumns to be outp
14f80 75 74 2e 20 20 70 44 65 73 74 20 69 73 20 77 68  ut.  pDest is wh
14f90 65 72 65 20 74 68 65 20 6f 75 74 70 75 74 20 73  ere the output s
14fa0 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 6e 74  hould.** be sent
14fb0 2e 0a 2a 2a 0a 2a 2a 20 72 65 67 52 65 74 75 72  ..**.** regRetur
14fc0 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  n is the number 
14fd0 6f 66 20 74 68 65 20 72 65 67 69 73 74 65 72 20  of the register 
14fe0 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 75 62 72  holding the subr
14ff0 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e  outine.** return
15000 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   address..**.** 
15010 49 66 20 72 65 67 50 72 65 76 3e 30 20 74 68 65  If regPrev>0 the
15020 6e 20 69 74 20 69 73 20 74 68 65 20 66 69 72 73  n it is the firs
15030 74 20 72 65 67 69 73 74 65 72 20 69 6e 20 61 20  t register in a 
15040 76 65 63 74 6f 72 20 74 68 61 74 0a 2a 2a 20 72  vector that.** r
15050 65 63 6f 72 64 73 20 74 68 65 20 70 72 65 76 69  ecords the previ
15060 6f 75 73 20 6f 75 74 70 75 74 2e 20 20 6d 65 6d  ous output.  mem
15070 5b 72 65 67 50 72 65 76 5d 20 69 73 20 61 20 66  [regPrev] is a f
15080 6c 61 67 20 74 68 61 74 20 69 73 20 66 61 6c 73  lag that is fals
15090 65 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 68 61  e.** if there ha
150a0 73 20 62 65 65 6e 20 6e 6f 20 70 72 65 76 69 6f  s been no previo
150b0 75 73 20 6f 75 74 70 75 74 2e 20 20 49 66 20 72  us output.  If r
150c0 65 67 50 72 65 76 3e 30 20 74 68 65 6e 20 63 6f  egPrev>0 then co
150d0 64 65 20 69 73 0a 2a 2a 20 67 65 6e 65 72 61 74  de is.** generat
150e0 65 64 20 74 6f 20 73 75 70 70 72 65 73 73 20 64  ed to suppress d
150f0 75 70 6c 69 63 61 74 65 73 2e 20 20 70 4b 65 79  uplicates.  pKey
15100 49 6e 66 6f 20 69 73 20 75 73 65 64 20 66 6f 72  Info is used for
15110 20 63 6f 6d 70 61 72 69 6e 67 0a 2a 2a 20 6b 65   comparing.** ke
15120 79 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ys..**.** If the
15130 20 4c 49 4d 49 54 20 66 6f 75 6e 64 20 69 6e 20   LIMIT found in 
15140 70 2d 3e 69 4c 69 6d 69 74 20 69 73 20 72 65 61  p->iLimit is rea
15150 63 68 65 64 2c 20 6a 75 6d 70 20 69 6d 6d 65 64  ched, jump immed
15160 69 61 74 65 6c 79 20 74 6f 0a 2a 2a 20 69 42 72  iately to.** iBr
15170 65 61 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  eak..*/.static i
15180 6e 74 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75  nt generateOutpu
15190 74 53 75 62 72 6f 75 74 69 6e 65 28 0a 20 20 50  tSubroutine(.  P
151a0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
151b0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
151c0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
151d0 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
151e0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45         /* The SE
151f0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
15200 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
15210 70 49 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 43  pIn,        /* C
15220 6f 72 6f 75 74 69 6e 65 20 73 75 70 70 6c 79 69  oroutine supplyi
15230 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c  ng data */.  Sel
15240 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20  ectDest *pDest, 
15250 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f       /* Where to
15260 20 73 65 6e 64 20 74 68 65 20 64 61 74 61 20 2a   send the data *
15270 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 74 75 72  /.  int regRetur
15280 6e 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  n,          /* T
15290 68 65 20 72 65 74 75 72 6e 20 61 64 64 72 65 73  he return addres
152a0 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  s register */.  
152b0 69 6e 74 20 72 65 67 50 72 65 76 2c 20 20 20 20  int regPrev,    
152c0 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69          /* Previ
152d0 6f 75 73 20 72 65 73 75 6c 74 20 72 65 67 69 73  ous result regis
152e0 74 65 72 2e 20 20 4e 6f 20 75 6e 69 71 75 65 6e  ter.  No uniquen
152f0 65 73 73 20 69 66 20 30 20 2a 2f 0a 20 20 4b 65  ess if 0 */.  Ke
15300 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c  yInfo *pKeyInfo,
15310 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6d        /* For com
15320 70 61 72 69 6e 67 20 77 69 74 68 20 70 72 65 76  paring with prev
15330 69 6f 75 73 20 65 6e 74 72 79 20 2a 2f 0a 20 20  ious entry */.  
15340 69 6e 74 20 69 42 72 65 61 6b 20 20 20 20 20 20  int iBreak      
15350 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
15360 68 65 72 65 20 69 66 20 77 65 20 68 69 74 20 74  here if we hit t
15370 68 65 20 4c 49 4d 49 54 20 2a 2f 0a 29 7b 0a 20  he LIMIT */.){. 
15380 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
15390 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
153a0 69 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 6e 74  iContinue;.  int
153b0 20 61 64 64 72 3b 0a 0a 20 20 61 64 64 72 20 3d   addr;..  addr =
153c0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
153d0 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69 43  entAddr(v);.  iC
153e0 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65  ontinue = sqlite
153f0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
15400 29 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73  );..  /* Suppres
15410 73 20 64 75 70 6c 69 63 61 74 65 73 20 66 6f 72  s duplicates for
15420 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20   UNION, EXCEPT, 
15430 61 6e 64 20 49 4e 54 45 52 53 45 43 54 20 0a 20  and INTERSECT . 
15440 20 2a 2f 0a 20 20 69 66 28 20 72 65 67 50 72 65   */.  if( regPre
15450 76 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 31 2c  v ){.    int j1,
15460 20 6a 32 3b 0a 20 20 20 20 6a 31 20 3d 20 73 71   j2;.    j1 = sq
15470 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
15480 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67  v, OP_IfNot, reg
15490 50 72 65 76 29 3b 20 56 64 62 65 43 6f 76 65 72  Prev); VdbeCover
154a0 61 67 65 28 76 29 3b 0a 20 20 20 20 6a 32 20 3d  age(v);.    j2 =
154b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
154c0 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65  p4(v, OP_Compare
154d0 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 72 65  , pIn->iSdst, re
154e0 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53  gPrev+1, pIn->nS
154f0 64 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  dst,.           
15500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15510 20 20 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65     (char*)sqlite
15520 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79  3KeyInfoRef(pKey
15530 49 6e 66 6f 29 2c 20 50 34 5f 4b 45 59 49 4e 46  Info), P4_KEYINF
15540 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  O);.    sqlite3V
15550 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
15560 4a 75 6d 70 2c 20 6a 32 2b 32 2c 20 69 43 6f 6e  Jump, j2+2, iCon
15570 74 69 6e 75 65 2c 20 6a 32 2b 32 29 3b 20 56 64  tinue, j2+2); Vd
15580 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
15590 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
155a0 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20  mpHere(v, j1);. 
155b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
155c0 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp3(v, OP_Copy,
155d0 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 72 65 67   pIn->iSdst, reg
155e0 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64  Prev+1, pIn->nSd
155f0 73 74 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  st-1);.    sqlit
15600 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
15610 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 72  OP_Integer, 1, r
15620 65 67 50 72 65 76 29 3b 0a 20 20 7d 0a 20 20 69  egPrev);.  }.  i
15630 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  f( pParse->db->m
15640 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
15650 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 53 75  turn 0;..  /* Su
15660 70 70 72 65 73 73 20 74 68 65 20 66 69 72 73 74  ppress the first
15670 20 4f 46 46 53 45 54 20 65 6e 74 72 69 65 73 20   OFFSET entries 
15680 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  if there is an O
15690 46 46 53 45 54 20 63 6c 61 75 73 65 0a 20 20 2a  FFSET clause.  *
156a0 2f 0a 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76  /.  codeOffset(v
156b0 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43  , p->iOffset, iC
156c0 6f 6e 74 69 6e 75 65 29 3b 0a 0a 20 20 73 77 69  ontinue);..  swi
156d0 74 63 68 28 20 70 44 65 73 74 2d 3e 65 44 65 73  tch( pDest->eDes
156e0 74 20 29 7b 0a 20 20 20 20 2f 2a 20 53 74 6f 72  t ){.    /* Stor
156f0 65 20 74 68 65 20 72 65 73 75 6c 74 20 61 73 20  e the result as 
15700 64 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69  data using a uni
15710 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a  que key..    */.
15720 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62      case SRT_Tab
15730 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  le:.    case SRT
15740 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20  _EphemTab: {.   
15750 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69     int r1 = sqli
15760 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
15770 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 6e 74  arse);.      int
15780 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r2 = sqlite3Get
15790 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
157a0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
157b0 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
157c0 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20 20 20  RT_Table );.    
157d0 20 20 74 65 73 74 63 61 73 65 28 20 70 44 65 73    testcase( pDes
157e0 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70  t->eDest==SRT_Ep
157f0 68 65 6d 54 61 62 20 29 3b 0a 20 20 20 20 20 20  hemTab );.      
15800 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15810 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
15820 72 64 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  rd, pIn->iSdst, 
15830 70 49 6e 2d 3e 6e 53 64 73 74 2c 20 72 31 29 3b  pIn->nSdst, r1);
15840 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
15850 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
15860 65 77 52 6f 77 69 64 2c 20 70 44 65 73 74 2d 3e  ewRowid, pDest->
15870 69 53 44 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20  iSDParm, r2);.  
15880 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15890 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65  ddOp3(v, OP_Inse
158a0 72 74 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61  rt, pDest->iSDPa
158b0 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20  rm, r1, r2);.   
158c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
158d0 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
158e0 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20  _APPEND);.      
158f0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
15900 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 32  mpReg(pParse, r2
15910 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
15920 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
15930 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
15940 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
15950 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
15960 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
15970 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63 72   /* If we are cr
15980 65 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72  eating a set for
15990 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45   an "expr IN (SE
159a0 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74  LECT ...)" const
159b0 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65  ruct,.    ** the
159c0 6e 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62  n there should b
159d0 65 20 61 20 73 69 6e 67 6c 65 20 69 74 65 6d 20  e a single item 
159e0 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 57  on the stack.  W
159f0 72 69 74 65 20 74 68 69 73 0a 20 20 20 20 2a 2a  rite this.    **
15a00 20 69 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73   item into the s
15a10 65 74 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f  et table with bo
15a20 67 75 73 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f  gus data..    */
15a30 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65  .    case SRT_Se
15a40 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  t: {.      int r
15a50 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  1;.      assert(
15a60 20 70 49 6e 2d 3e 6e 53 64 73 74 3d 3d 31 20 29   pIn->nSdst==1 )
15a70 3b 0a 20 20 20 20 20 20 70 44 65 73 74 2d 3e 61  ;.      pDest->a
15a80 66 66 53 64 73 74 20 3d 20 0a 20 20 20 20 20 20  ffSdst = .      
15a90 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72     sqlite3Compar
15aa0 65 41 66 66 69 6e 69 74 79 28 70 2d 3e 70 45 4c  eAffinity(p->pEL
15ab0 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c  ist->a[0].pExpr,
15ac0 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 29   pDest->affSdst)
15ad0 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
15ae0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
15af0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
15b00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
15b10 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
15b20 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 31 2c  , pIn->iSdst, 1,
15b30 20 72 31 2c 20 26 70 44 65 73 74 2d 3e 61 66 66   r1, &pDest->aff
15b40 53 64 73 74 2c 31 29 3b 0a 20 20 20 20 20 20 73  Sdst,1);.      s
15b50 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
15b60 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
15b70 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74  arse, pIn->iSdst
15b80 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
15b90 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
15ba0 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70   OP_IdxInsert, p
15bb0 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72  Dest->iSDParm, r
15bc0 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
15bd0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
15be0 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
15bf0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
15c00 0a 23 69 66 20 30 20 20 2f 2a 20 4e 65 76 65 72  .#if 0  /* Never
15c10 20 6f 63 63 75 72 73 20 6f 6e 20 61 6e 20 4f 52   occurs on an OR
15c20 44 45 52 20 42 59 20 71 75 65 72 79 20 2a 2f 0a  DER BY query */.
15c30 20 20 20 20 2f 2a 20 49 66 20 61 6e 79 20 72 6f      /* If any ro
15c40 77 20 65 78 69 73 74 20 69 6e 20 74 68 65 20 72  w exist in the r
15c50 65 73 75 6c 74 20 73 65 74 2c 20 72 65 63 6f 72  esult set, recor
15c60 64 20 74 68 61 74 20 66 61 63 74 20 61 6e 64 20  d that fact and 
15c70 61 62 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  abort..    */.  
15c80 20 20 63 61 73 65 20 53 52 54 5f 45 78 69 73 74    case SRT_Exist
15c90 73 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  s: {.      sqlit
15ca0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
15cb0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 70  OP_Integer, 1, p
15cc0 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a  Dest->iSDParm);.
15cd0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d        /* The LIM
15ce0 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74  IT clause will t
15cf0 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f  erminate the loo
15d00 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
15d10 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
15d20 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66  endif..    /* If
15d30 20 74 68 69 73 20 69 73 20 61 20 73 63 61 6c 61   this is a scala
15d40 72 20 73 65 6c 65 63 74 20 74 68 61 74 20 69 73  r select that is
15d50 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72   part of an expr
15d60 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20  ession, then.   
15d70 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65   ** store the re
15d80 73 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70  sults in the app
15d90 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20  ropriate memory 
15da0 63 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f  cell and break o
15db0 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ut.    ** of the
15dc0 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20   scan loop..    
15dd0 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
15de0 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  Mem: {.      ass
15df0 65 72 74 28 20 70 49 6e 2d 3e 6e 53 64 73 74 3d  ert( pIn->nSdst=
15e00 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =1 );.      sqli
15e10 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28  te3ExprCodeMove(
15e20 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64  pParse, pIn->iSd
15e30 73 74 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61  st, pDest->iSDPa
15e40 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a  rm, 1);.      /*
15e50 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73   The LIMIT claus
15e60 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20  e will jump out 
15e70 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20  of the loop for 
15e80 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  us */.      brea
15e90 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  k;.    }.#endif 
15ea0 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /* #ifndef SQLIT
15eb0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
15ec0 2a 2f 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72  */..    /* The r
15ed0 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65  esults are store
15ee0 64 20 69 6e 20 61 20 73 65 71 75 65 6e 63 65 20  d in a sequence 
15ef0 6f 66 20 72 65 67 69 73 74 65 72 73 0a 20 20 20  of registers.   
15f00 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20   ** starting at 
15f10 70 44 65 73 74 2d 3e 69 53 64 73 74 2e 20 20 54  pDest->iSdst.  T
15f20 68 65 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74 69  hen the co-routi
15f30 6e 65 20 79 69 65 6c 64 73 2e 0a 20 20 20 20 2a  ne yields..    *
15f40 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 43  /.    case SRT_C
15f50 6f 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20 20  oroutine: {.    
15f60 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69 53 64    if( pDest->iSd
15f70 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  st==0 ){.       
15f80 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20   pDest->iSdst = 
15f90 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
15fa0 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d  nge(pParse, pIn-
15fb0 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 20  >nSdst);.       
15fc0 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20   pDest->nSdst = 
15fd0 70 49 6e 2d 3e 6e 53 64 73 74 3b 0a 20 20 20 20  pIn->nSdst;.    
15fe0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
15ff0 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50  3ExprCodeMove(pP
16000 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74  arse, pIn->iSdst
16010 2c 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2c 20  , pDest->iSdst, 
16020 70 44 65 73 74 2d 3e 6e 53 64 73 74 29 3b 0a 20  pDest->nSdst);. 
16030 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
16040 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
16050 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61  ld, pDest->iSDPa
16060 72 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  rm);.      break
16070 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
16080 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 61  If none of the a
16090 62 6f 76 65 2c 20 74 68 65 6e 20 74 68 65 20 72  bove, then the r
160a0 65 73 75 6c 74 20 64 65 73 74 69 6e 61 74 69 6f  esult destinatio
160b0 6e 20 6d 75 73 74 20 62 65 0a 20 20 20 20 2a 2a  n must be.    **
160c0 20 53 52 54 5f 4f 75 74 70 75 74 2e 20 20 54 68   SRT_Output.  Th
160d0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65  is routine is ne
160e0 76 65 72 20 63 61 6c 6c 65 64 20 77 69 74 68 20  ver called with 
160f0 61 6e 79 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a  any other.    **
16100 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6f 74 68   destination oth
16110 65 72 20 74 68 61 6e 20 74 68 65 20 6f 6e 65 73  er than the ones
16120 20 68 61 6e 64 6c 65 64 20 61 62 6f 76 65 20 6f   handled above o
16130 72 20 53 52 54 5f 4f 75 74 70 75 74 2e 0a 20 20  r SRT_Output..  
16140 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 20    **.    ** For 
16150 53 52 54 5f 4f 75 74 70 75 74 2c 20 72 65 73 75  SRT_Output, resu
16160 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64 20 69  lts are stored i
16170 6e 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20  n a sequence of 
16180 72 65 67 69 73 74 65 72 73 2e 20 20 0a 20 20 20  registers.  .   
16190 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 4f 50 5f   ** Then the OP_
161a0 52 65 73 75 6c 74 52 6f 77 20 6f 70 63 6f 64 65  ResultRow opcode
161b0 20 69 73 20 75 73 65 64 20 74 6f 20 63 61 75 73   is used to caus
161c0 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  e sqlite3_step()
161d0 20 74 6f 0a 20 20 20 20 2a 2a 20 72 65 74 75 72   to.    ** retur
161e0 6e 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 6f  n the next row o
161f0 66 20 72 65 73 75 6c 74 2e 0a 20 20 20 20 2a 2f  f result..    */
16200 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
16210 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44        assert( pD
16220 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
16230 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20  Output );.      
16240 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16250 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
16260 77 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70  w, pIn->iSdst, p
16270 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20  In->nSdst);.    
16280 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
16290 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
162a0 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53  (pParse, pIn->iS
162b0 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29  dst, pIn->nSdst)
162c0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
162d0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a     }.  }..  /* J
162e0 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ump to the end o
162f0 66 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68  f the loop if th
16300 65 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68  e LIMIT is reach
16310 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
16320 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->iLimit ){.    
16330 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16340 33 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20  3(v, OP_IfZero, 
16350 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61  p->iLimit, iBrea
16360 6b 2c 20 2d 31 29 3b 20 56 64 62 65 43 6f 76 65  k, -1); VdbeCove
16370 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20 20  rage(v);.  }..  
16380 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  /* Generate the 
16390 73 75 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72  subroutine retur
163a0 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  n.  */.  sqlite3
163b0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
163c0 28 76 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a  (v, iContinue);.
163d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
163e0 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
163f0 2c 20 72 65 67 52 65 74 75 72 6e 29 3b 0a 0a 20  , regReturn);.. 
16400 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a   return addr;.}.
16410 0a 2f 2a 0a 2a 2a 20 41 6c 74 65 72 6e 61 74 69  ./*.** Alternati
16420 76 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  ve compound sele
16430 63 74 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f  ct code generato
16440 72 20 66 6f 72 20 63 61 73 65 73 20 77 68 65 6e  r for cases when
16450 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 61 6e 20   there.** is an 
16460 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
16470 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73 73 75 6d 65  .**.** We assume
16480 20 61 20 71 75 65 72 79 20 6f 66 20 74 68 65 20   a query of the 
16490 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 3a 0a  following form:.
164a0 2a 2a 0a 2a 2a 20 20 20 20 20 20 3c 73 65 6c 65  **.**      <sele
164b0 63 74 41 3e 20 20 3c 6f 70 65 72 61 74 6f 72 3e  ctA>  <operator>
164c0 20 20 3c 73 65 6c 65 63 74 42 3e 20 20 4f 52 44    <selectB>  ORD
164d0 45 52 20 42 59 20 3c 6f 72 64 65 72 62 79 6c 69  ER BY <orderbyli
164e0 73 74 3e 0a 2a 2a 0a 2a 2a 20 3c 6f 70 65 72 61  st>.**.** <opera
164f0 74 6f 72 3e 20 69 73 20 6f 6e 65 20 6f 66 20 55  tor> is one of U
16500 4e 49 4f 4e 20 41 4c 4c 2c 20 55 4e 49 4f 4e 2c  NION ALL, UNION,
16510 20 45 58 43 45 50 54 2c 20 6f 72 20 49 4e 54 45   EXCEPT, or INTE
16520 52 53 45 43 54 2e 20 20 54 68 65 20 69 64 65 61  RSECT.  The idea
16530 0a 2a 2a 20 69 73 20 74 6f 20 63 6f 64 65 20 62  .** is to code b
16540 6f 74 68 20 3c 73 65 6c 65 63 74 41 3e 20 61 6e  oth <selectA> an
16550 64 20 3c 73 65 6c 65 63 74 42 3e 20 77 69 74 68  d <selectB> with
16560 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
16570 61 75 73 65 20 61 73 0a 2a 2a 20 63 6f 2d 72 6f  ause as.** co-ro
16580 75 74 69 6e 65 73 2e 20 20 54 68 65 6e 20 72 75  utines.  Then ru
16590 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65  n the co-routine
165a0 73 20 69 6e 20 70 61 72 61 6c 6c 65 6c 20 61 6e  s in parallel an
165b0 64 20 6d 65 72 67 65 20 74 68 65 20 72 65 73 75  d merge the resu
165c0 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20  lts.** into the 
165d0 6f 75 74 70 75 74 2e 20 20 49 6e 20 61 64 64 69  output.  In addi
165e0 74 69 6f 6e 20 74 6f 20 74 68 65 20 74 77 6f 20  tion to the two 
165f0 63 6f 72 6f 75 74 69 6e 65 73 20 28 63 61 6c 6c  coroutines (call
16600 65 64 20 73 65 6c 65 63 74 41 20 61 6e 64 0a 2a  ed selectA and.*
16610 2a 20 73 65 6c 65 63 74 42 29 20 74 68 65 72 65  * selectB) there
16620 20 61 72 65 20 37 20 73 75 62 72 6f 75 74 69 6e   are 7 subroutin
16630 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74  es:.**.**    out
16640 41 3a 20 20 20 20 4d 6f 76 65 20 74 68 65 20 6f  A:    Move the o
16650 75 74 70 75 74 20 6f 66 20 74 68 65 20 73 65 6c  utput of the sel
16660 65 63 74 41 20 63 6f 72 6f 75 74 69 6e 65 20 69  ectA coroutine i
16670 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 2a  nto the output.*
16680 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66  *             of
16690 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75   the compound qu
166a0 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75  ery..**.**    ou
166b0 74 42 3a 20 20 20 20 4d 6f 76 65 20 74 68 65 20  tB:    Move the 
166c0 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20 73 65  output of the se
166d0 6c 65 63 74 42 20 63 6f 72 6f 75 74 69 6e 65 20  lectB coroutine 
166e0 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a  into the output.
166f0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 6f  **             o
16700 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71  f the compound q
16710 75 65 72 79 2e 20 20 28 4f 6e 6c 79 20 67 65 6e  uery.  (Only gen
16720 65 72 61 74 65 64 20 66 6f 72 20 55 4e 49 4f 4e  erated for UNION
16730 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20   and.**         
16740 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 2e 20 20      UNION ALL.  
16750 45 58 43 45 50 54 20 61 6e 64 20 49 4e 53 45 52  EXCEPT and INSER
16760 54 53 45 43 54 20 6e 65 76 65 72 20 6f 75 74 70  TSECT never outp
16770 75 74 20 61 20 72 6f 77 20 74 68 61 74 0a 2a 2a  ut a row that.**
16780 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70 70               app
16790 65 61 72 73 20 6f 6e 6c 79 20 69 6e 20 42 2e 29  ears only in B.)
167a0 0a 2a 2a 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20  .**.**    AltB: 
167b0 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74     Called when t
167c0 68 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f  here is data fro
167d0 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65  m both coroutine
167e0 73 20 61 6e 64 20 41 3c 42 2e 0a 2a 2a 0a 2a 2a  s and A<B..**.**
167f0 20 20 20 20 41 65 71 42 3a 20 20 20 20 43 61 6c      AeqB:    Cal
16800 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69  led when there i
16810 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68  s data from both
16820 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20   coroutines and 
16830 41 3d 3d 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41  A==B..**.**    A
16840 67 74 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77  gtB:    Called w
16850 68 65 6e 20 74 68 65 72 65 20 69 73 20 64 61 74  hen there is dat
16860 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f  a from both coro
16870 75 74 69 6e 65 73 20 61 6e 64 20 41 3e 42 2e 0a  utines and A>B..
16880 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20 20  **.**    EofA:  
16890 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 64 61    Called when da
168a0 74 61 20 69 73 20 65 78 68 61 75 73 74 65 64 20  ta is exhausted 
168b0 66 72 6f 6d 20 73 65 6c 65 63 74 41 2e 0a 2a 2a  from selectA..**
168c0 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20 20 20 20  .**    EofB:    
168d0 43 61 6c 6c 65 64 20 77 68 65 6e 20 64 61 74 61  Called when data
168e0 20 69 73 20 65 78 68 61 75 73 74 65 64 20 66 72   is exhausted fr
168f0 6f 6d 20 73 65 6c 65 63 74 42 2e 0a 2a 2a 0a 2a  om selectB..**.*
16900 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  * The implementa
16910 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 61 74 74  tion of the latt
16920 65 72 20 66 69 76 65 20 73 75 62 72 6f 75 74 69  er five subrouti
16930 6e 65 73 20 64 65 70 65 6e 64 20 6f 6e 20 77 68  nes depend on wh
16940 69 63 68 20 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f  ich .** <operato
16950 72 3e 20 69 73 20 75 73 65 64 3a 0a 2a 2a 0a 2a  r> is used:.**.*
16960 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  *.**            
16970 20 55 4e 49 4f 4e 20 41 4c 4c 20 20 20 20 20 20   UNION ALL      
16980 20 20 20 55 4e 49 4f 4e 20 20 20 20 20 20 20 20     UNION        
16990 20 20 20 20 45 58 43 45 50 54 20 20 20 20 20 20      EXCEPT      
169a0 20 20 20 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a      INTERSECT.**
169b0 20 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d            ------
169c0 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d  -------  -------
169d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d  ----------  ----
169e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d  ----------  ----
169f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
16a00 20 20 20 41 6c 74 42 3a 20 20 20 6f 75 74 41 2c     AltB:   outA,
16a10 20 6e 65 78 74 41 20 20 20 20 20 20 6f 75 74 41   nextA      outA
16a20 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 6f 75  , nextA       ou
16a30 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20  tA, nextA       
16a40 20 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20    nextA.**.**   
16a50 41 65 71 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65  AeqB:   outA, ne
16a60 78 74 41 20 20 20 20 20 20 20 20 20 6e 65 78 74  xtA         next
16a70 41 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65  A             ne
16a80 78 74 41 20 20 20 20 20 20 20 20 20 6f 75 74 41  xtA         outA
16a90 2c 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20  , nextA.**.**   
16aa0 41 67 74 42 3a 20 20 20 6f 75 74 42 2c 20 6e 65  AgtB:   outB, ne
16ab0 78 74 42 20 20 20 20 20 20 6f 75 74 42 2c 20 6e  xtB      outB, n
16ac0 65 78 74 42 20 20 20 20 20 20 20 20 20 20 6e 65  extB          ne
16ad0 78 74 42 20 20 20 20 20 20 20 20 20 20 20 20 6e  xtB            n
16ae0 65 78 74 42 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66  extB.**.**   Eof
16af0 41 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42  A:   outB, nextB
16b00 20 20 20 20 20 20 6f 75 74 42 2c 20 6e 65 78 74        outB, next
16b10 42 20 20 20 20 20 20 20 20 20 20 68 61 6c 74 20  B          halt 
16b20 20 20 20 20 20 20 20 20 20 20 20 20 68 61 6c 74              halt
16b30 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 42 3a 20 20  .**.**   EofB:  
16b40 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
16b50 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
16b60 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20      outA, nextA 
16b70 20 20 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a          halt.**.
16b80 2a 2a 20 49 6e 20 74 68 65 20 41 6c 74 42 2c 20  ** In the AltB, 
16b90 41 65 71 42 2c 20 61 6e 64 20 41 67 74 42 20 73  AeqB, and AgtB s
16ba0 75 62 72 6f 75 74 69 6e 65 73 2c 20 61 6e 20 45  ubroutines, an E
16bb0 4f 46 20 6f 6e 20 41 20 66 6f 6c 6c 6f 77 69 6e  OF on A followin
16bc0 67 20 6e 65 78 74 41 0a 2a 2a 20 63 61 75 73 65  g nextA.** cause
16bd0 73 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a  s an immediate j
16be0 75 6d 70 20 74 6f 20 45 6f 66 41 20 61 6e 64 20  ump to EofA and 
16bf0 61 6e 20 45 4f 46 20 6f 6e 20 42 20 66 6f 6c 6c  an EOF on B foll
16c00 6f 77 69 6e 67 20 6e 65 78 74 42 20 63 61 75 73  owing nextB caus
16c10 65 73 0a 2a 2a 20 61 6e 20 69 6d 6d 65 64 69 61  es.** an immedia
16c20 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66 42 2e  te jump to EofB.
16c30 20 20 57 69 74 68 69 6e 20 45 6f 66 41 20 61 6e    Within EofA an
16c40 64 20 45 6f 66 42 2c 20 61 6e 64 20 45 4f 46 20  d EofB, and EOF 
16c50 6f 6e 20 65 6e 74 72 79 20 6f 72 0a 2a 2a 20 66  on entry or.** f
16c60 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 58 20 63  ollowing nextX c
16c70 61 75 73 65 73 20 61 20 6a 75 6d 70 20 74 6f 20  auses a jump to 
16c80 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 73  the end of the s
16c90 65 6c 65 63 74 20 70 72 6f 63 65 73 73 69 6e 67  elect processing
16ca0 2e 0a 2a 2a 0a 2a 2a 20 44 75 70 6c 69 63 61 74  ..**.** Duplicat
16cb0 65 20 72 65 6d 6f 76 61 6c 20 69 6e 20 74 68 65  e removal in the
16cc0 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20   UNION, EXCEPT, 
16cd0 61 6e 64 20 49 4e 54 45 52 53 45 43 54 20 63 61  and INTERSECT ca
16ce0 73 65 73 20 69 73 20 68 61 6e 64 6c 65 64 0a 2a  ses is handled.*
16cf0 2a 20 77 69 74 68 69 6e 20 74 68 65 20 6f 75 74  * within the out
16d00 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 2e 20  put subroutine. 
16d10 20 54 68 65 20 72 65 67 50 72 65 76 20 72 65 67   The regPrev reg
16d20 69 73 74 65 72 20 73 65 74 20 68 6f 6c 64 73 20  ister set holds 
16d30 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a  the previously.*
16d40 2a 20 6f 75 74 70 75 74 20 76 61 6c 75 65 2e 20  * output value. 
16d50 20 41 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73   A comparison is
16d60 20 6d 61 64 65 20 61 67 61 69 6e 73 74 20 74 68   made against th
16d70 69 73 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65  is value and the
16d80 20 6f 75 74 70 75 74 0a 2a 2a 20 69 73 20 73 6b   output.** is sk
16d90 69 70 70 65 64 20 69 66 20 74 68 65 20 6e 65 78  ipped if the nex
16da0 74 20 72 65 73 75 6c 74 73 20 77 6f 75 6c 64 20  t results would 
16db0 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  be the same as t
16dc0 68 65 20 70 72 65 76 69 6f 75 73 2e 0a 2a 2a 0a  he previous..**.
16dd0 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74  ** The implement
16de0 61 74 69 6f 6e 20 70 6c 61 6e 20 69 73 20 74 6f  ation plan is to
16df0 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 74   implement the t
16e00 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e  wo coroutines an
16e10 64 20 73 65 76 65 6e 0a 2a 2a 20 73 75 62 72 6f  d seven.** subro
16e20 75 74 69 6e 65 73 20 66 69 72 73 74 2c 20 74 68  utines first, th
16e30 65 6e 20 70 75 74 20 74 68 65 20 63 6f 6e 74 72  en put the contr
16e40 6f 6c 20 6c 6f 67 69 63 20 61 74 20 74 68 65 20  ol logic at the 
16e50 62 6f 74 74 6f 6d 2e 20 20 4c 69 6b 65 20 74 68  bottom.  Like th
16e60 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
16e70 20 20 20 67 6f 74 6f 20 49 6e 69 74 0a 2a 2a 20     goto Init.** 
16e80 20 20 20 20 63 6f 41 3a 20 63 6f 72 6f 75 74 69      coA: corouti
16e90 6e 65 20 66 6f 72 20 6c 65 66 74 20 71 75 65 72  ne for left quer
16ea0 79 20 28 41 29 0a 2a 2a 20 20 20 20 20 63 6f 42  y (A).**     coB
16eb0 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20  : coroutine for 
16ec0 72 69 67 68 74 20 71 75 65 72 79 20 28 42 29 0a  right query (B).
16ed0 2a 2a 20 20 20 20 6f 75 74 41 3a 20 6f 75 74 70  **    outA: outp
16ee0 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 41 0a  ut one row of A.
16ef0 2a 2a 20 20 20 20 6f 75 74 42 3a 20 6f 75 74 70  **    outB: outp
16f00 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 42 20  ut one row of B 
16f10 28 55 4e 49 4f 4e 20 61 6e 64 20 55 4e 49 4f 4e  (UNION and UNION
16f20 20 41 4c 4c 20 6f 6e 6c 79 29 0a 2a 2a 20 20 20   ALL only).**   
16f30 20 45 6f 66 41 3a 20 2e 2e 2e 0a 2a 2a 20 20 20   EofA: ....**   
16f40 20 45 6f 66 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20   EofB: ....**   
16f50 20 41 6c 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20   AltB: ....**   
16f60 20 41 65 71 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20   AeqB: ....**   
16f70 20 41 67 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20   AgtB: ....**   
16f80 20 49 6e 69 74 3a 20 69 6e 69 74 69 61 6c 69 7a   Init: initializ
16f90 65 20 63 6f 72 6f 75 74 69 6e 65 20 72 65 67 69  e coroutine regi
16fa0 73 74 65 72 73 0a 2a 2a 20 20 20 20 20 20 20 20  sters.**        
16fb0 20 20 79 69 65 6c 64 20 63 6f 41 0a 2a 2a 20 20    yield coA.**  
16fc0 20 20 20 20 20 20 20 20 69 66 20 65 6f 66 28 41          if eof(A
16fd0 29 20 67 6f 74 6f 20 45 6f 66 41 0a 2a 2a 20 20  ) goto EofA.**  
16fe0 20 20 20 20 20 20 20 20 79 69 65 6c 64 20 63 6f          yield co
16ff0 42 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 66  B.**          if
17000 20 65 6f 66 28 42 29 20 67 6f 74 6f 20 45 6f 66   eof(B) goto Eof
17010 42 0a 2a 2a 20 20 20 20 43 6d 70 72 3a 20 43 6f  B.**    Cmpr: Co
17020 6d 70 61 72 65 20 41 2c 20 42 0a 2a 2a 20 20 20  mpare A, B.**   
17030 20 20 20 20 20 20 20 4a 75 6d 70 20 41 6c 74 42         Jump AltB
17040 2c 20 41 65 71 42 2c 20 41 67 74 42 0a 2a 2a 20  , AeqB, AgtB.** 
17050 20 20 20 20 45 6e 64 3a 20 2e 2e 2e 0a 2a 2a 0a      End: ....**.
17060 2a 2a 20 57 65 20 63 61 6c 6c 20 41 6c 74 42 2c  ** We call AltB,
17070 20 41 65 71 42 2c 20 41 67 74 42 2c 20 45 6f 66   AeqB, AgtB, Eof
17080 41 2c 20 61 6e 64 20 45 6f 66 42 20 22 73 75 62  A, and EofB "sub
17090 72 6f 75 74 69 6e 65 73 22 20 62 75 74 20 74 68  routines" but th
170a0 65 79 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 63  ey are not.** ac
170b0 74 75 61 6c 6c 79 20 63 61 6c 6c 65 64 20 75 73  tually called us
170c0 69 6e 67 20 47 6f 73 75 62 20 61 6e 64 20 74 68  ing Gosub and th
170d0 65 79 20 64 6f 20 6e 6f 74 20 52 65 74 75 72 6e  ey do not Return
170e0 2e 20 20 45 6f 66 41 20 61 6e 64 20 45 6f 66 42  .  EofA and EofB
170f0 20 6c 6f 6f 70 0a 2a 2a 20 75 6e 74 69 6c 20 61   loop.** until a
17100 6c 6c 20 64 61 74 61 20 69 73 20 65 78 68 61 75  ll data is exhau
17110 73 74 65 64 20 74 68 65 6e 20 6a 75 6d 70 20 74  sted then jump t
17120 6f 20 74 68 65 20 22 65 6e 64 22 20 6c 61 62 65  o the "end" labe
17130 2e 20 20 41 6c 74 42 2c 20 41 65 71 42 2c 0a 2a  .  AltB, AeqB,.*
17140 2a 20 61 6e 64 20 41 67 74 42 20 6a 75 6d 70 20  * and AgtB jump 
17150 74 6f 20 65 69 74 68 65 72 20 4c 32 20 6f 72 20  to either L2 or 
17160 74 6f 20 6f 6e 65 20 6f 66 20 45 6f 66 41 20 6f  to one of EofA o
17170 72 20 45 6f 66 42 2e 0a 2a 2f 0a 23 69 66 6e 64  r EofB..*/.#ifnd
17180 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
17190 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 73  OMPOUND_SELECT.s
171a0 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53  tatic int multiS
171b0 65 6c 65 63 74 4f 72 64 65 72 42 79 28 0a 20 20  electOrderBy(.  
171c0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
171d0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
171e0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
171f0 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
17200 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
17210 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73  -most of SELECTs
17220 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
17230 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
17240 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20  est     /* What 
17250 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79  to do with query
17260 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20   results */.){. 
17270 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
17280 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
17290 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 53 65 6c  ounters */.  Sel
172a0 65 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20  ect *pPrior;    
172b0 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45     /* Another SE
172c0 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79  LECT immediately
172d0 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a   to our left */.
172e0 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
172f0 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
17300 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73  ate code to this
17310 20 56 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63   VDBE */.  Selec
17320 74 44 65 73 74 20 64 65 73 74 41 3b 20 20 20 20  tDest destA;    
17330 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20   /* Destination 
17340 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20 41 20  for coroutine A 
17350 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
17360 64 65 73 74 42 3b 20 20 20 20 20 2f 2a 20 44 65  destB;     /* De
17370 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f  stination for co
17380 72 6f 75 74 69 6e 65 20 42 20 2a 2f 0a 20 20 69  routine B */.  i
17390 6e 74 20 72 65 67 41 64 64 72 41 3b 20 20 20 20  nt regAddrA;    
173a0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
173b0 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c  register for sel
173c0 65 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20  ect-A coroutine 
173d0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 64 64 72  */.  int regAddr
173e0 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  B;         /* Ad
173f0 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
17400 6f 72 20 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f  or select-B coro
17410 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
17420 64 64 72 53 65 6c 65 63 74 41 3b 20 20 20 20 20  ddrSelectA;     
17430 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
17440 68 65 20 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f  he select-A coro
17450 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
17460 64 64 72 53 65 6c 65 63 74 42 3b 20 20 20 20 20  ddrSelectB;     
17470 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
17480 68 65 20 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f  he select-B coro
17490 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72  utine */.  int r
174a0 65 67 4f 75 74 41 3b 20 20 20 20 20 20 20 20 20  egOutA;         
174b0 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69   /* Address regi
174c0 73 74 65 72 20 66 6f 72 20 74 68 65 20 6f 75 74  ster for the out
174d0 70 75 74 2d 41 20 73 75 62 72 6f 75 74 69 6e 65  put-A subroutine
174e0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74   */.  int regOut
174f0 42 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  B;          /* A
17500 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
17510 66 6f 72 20 74 68 65 20 6f 75 74 70 75 74 2d 42  for the output-B
17520 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
17530 20 69 6e 74 20 61 64 64 72 4f 75 74 41 3b 20 20   int addrOutA;  
17540 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
17550 73 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2d  s of the output-
17560 41 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  A subroutine */.
17570 20 20 69 6e 74 20 61 64 64 72 4f 75 74 42 20 3d    int addrOutB =
17580 20 30 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65   0;     /* Addre
17590 73 73 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74  ss of the output
175a0 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  -B subroutine */
175b0 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66 41 3b  .  int addrEofA;
175c0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
175d0 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  ess of the selec
175e0 74 2d 41 2d 65 78 68 61 75 73 74 65 64 20 73 75  t-A-exhausted su
175f0 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
17600 74 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 3b 20  t addrEofA_noB; 
17610 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74 65      /* Alternate
17620 20 61 64 64 72 45 6f 66 41 20 69 66 20 42 20 69   addrEofA if B i
17630 73 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20  s uninitialized 
17640 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66  */.  int addrEof
17650 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  B;         /* Ad
17660 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c  dress of the sel
17670 65 63 74 2d 42 2d 65 78 68 61 75 73 74 65 64 20  ect-B-exhausted 
17680 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
17690 69 6e 74 20 61 64 64 72 41 6c 74 42 3b 20 20 20  int addrAltB;   
176a0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
176b0 20 6f 66 20 74 68 65 20 41 3c 42 20 73 75 62 72   of the A<B subr
176c0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
176d0 61 64 64 72 41 65 71 42 3b 20 20 20 20 20 20 20  addrAeqB;       
176e0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
176f0 74 68 65 20 41 3d 3d 42 20 73 75 62 72 6f 75 74  the A==B subrout
17700 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
17710 72 41 67 74 42 3b 20 20 20 20 20 20 20 20 20 2f  rAgtB;         /
17720 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
17730 20 41 3e 42 20 73 75 62 72 6f 75 74 69 6e 65 20   A>B subroutine 
17740 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69  */.  int regLimi
17750 74 41 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  tA;        /* Li
17760 6d 69 74 20 72 65 67 69 73 74 65 72 20 66 6f 72  mit register for
17770 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69   select-A */.  i
17780 6e 74 20 72 65 67 4c 69 6d 69 74 42 3b 20 20 20  nt regLimitB;   
17790 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65       /* Limit re
177a0 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63  gister for selec
177b0 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  t-A */.  int reg
177c0 50 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 2f  Prev;          /
177d0 2a 20 41 20 72 61 6e 67 65 20 6f 66 20 72 65 67  * A range of reg
177e0 69 73 74 65 72 73 20 74 6f 20 68 6f 6c 64 20 70  isters to hold p
177f0 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74 20 2a  revious output *
17800 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 4c 69 6d  /.  int savedLim
17810 69 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 61 76  it;       /* Sav
17820 65 64 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69  ed value of p->i
17830 4c 69 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20 73  Limit */.  int s
17840 61 76 65 64 4f 66 66 73 65 74 3b 20 20 20 20 20  avedOffset;     
17850 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20   /* Saved value 
17860 6f 66 20 70 2d 3e 69 4f 66 66 73 65 74 20 2a 2f  of p->iOffset */
17870 0a 20 20 69 6e 74 20 6c 61 62 65 6c 43 6d 70 72  .  int labelCmpr
17880 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65  ;        /* Labe
17890 6c 20 66 6f 72 20 74 68 65 20 73 74 61 72 74 20  l for the start 
178a0 6f 66 20 74 68 65 20 6d 65 72 67 65 20 61 6c 67  of the merge alg
178b0 6f 72 69 74 68 6d 20 2a 2f 0a 20 20 69 6e 74 20  orithm */.  int 
178c0 6c 61 62 65 6c 45 6e 64 3b 20 20 20 20 20 20 20  labelEnd;       
178d0 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74    /* Label for t
178e0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 76  he end of the ov
178f0 65 72 61 6c 6c 20 53 45 4c 45 43 54 20 73 74 6d  erall SELECT stm
17900 74 20 2a 2f 0a 20 20 69 6e 74 20 6a 31 3b 20 20  t */.  int j1;  
17910 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17920 4a 75 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e  Jump instruction
17930 73 20 74 68 61 74 20 67 65 74 20 72 65 74 61 72  s that get retar
17940 67 65 74 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  getted */.  int 
17950 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
17960 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 41    /* One of TK_A
17970 4c 4c 2c 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b  LL, TK_UNION, TK
17980 5f 45 58 43 45 50 54 2c 20 54 4b 5f 49 4e 54 45  _EXCEPT, TK_INTE
17990 52 53 45 43 54 20 2a 2f 0a 20 20 4b 65 79 49 6e  RSECT */.  KeyIn
179a0 66 6f 20 2a 70 4b 65 79 44 75 70 20 3d 20 30 3b  fo *pKeyDup = 0;
179b0 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69   /* Comparison i
179c0 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 64  nformation for d
179d0 75 70 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c  uplicate removal
179e0 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70   */.  KeyInfo *p
179f0 4b 65 79 4d 65 72 67 65 3b 20 20 20 2f 2a 20 43  KeyMerge;   /* C
17a00 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d  omparison inform
17a10 61 74 69 6f 6e 20 66 6f 72 20 6d 65 72 67 69 6e  ation for mergin
17a20 67 20 72 6f 77 73 20 2a 2f 0a 20 20 73 71 6c 69  g rows */.  sqli
17a30 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
17a40 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
17a50 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78  nnection */.  Ex
17a60 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
17a70 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52  ;   /* The ORDER
17a80 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
17a90 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 20 20 20  int nOrderBy;   
17aa0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
17ab0 6f 66 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  of terms in the 
17ac0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
17ad0 2a 2f 0a 20 20 69 6e 74 20 2a 61 50 65 72 6d 75  */.  int *aPermu
17ae0 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 61  te;        /* Ma
17af0 70 70 69 6e 67 20 66 72 6f 6d 20 4f 52 44 45 52  pping from ORDER
17b00 20 42 59 20 74 65 72 6d 73 20 74 6f 20 72 65 73   BY terms to res
17b10 75 6c 74 20 73 65 74 20 63 6f 6c 75 6d 6e 73 20  ult set columns 
17b20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
17b30 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20  E_OMIT_EXPLAIN. 
17b40 20 69 6e 74 20 69 53 75 62 31 3b 20 20 20 20 20   int iSub1;     
17b50 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64         /* EQP id
17b60 20 6f 66 20 6c 65 66 74 2d 68 61 6e 64 20 71 75   of left-hand qu
17b70 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75  ery */.  int iSu
17b80 62 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  b2;            /
17b90 2a 20 45 51 50 20 69 64 20 6f 66 20 72 69 67 68  * EQP id of righ
17ba0 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a  t-hand query */.
17bb0 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
17bc0 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30  ( p->pOrderBy!=0
17bd0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b   );.  assert( pK
17be0 65 79 44 75 70 3d 3d 30 20 29 3b 20 2f 2a 20 22  eyDup==0 ); /* "
17bf0 4d 61 6e 61 67 65 64 22 20 63 6f 64 65 20 6e 65  Managed" code ne
17c00 65 64 73 20 74 68 69 73 2e 20 20 54 69 63 6b 65  eds this.  Ticke
17c10 74 20 23 33 33 38 32 2e 20 2a 2f 0a 20 20 64 62  t #3382. */.  db
17c20 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
17c30 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64   v = pParse->pVd
17c40 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21  be;.  assert( v!
17c50 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 41  =0 );       /* A
17c60 6c 72 65 61 64 79 20 74 68 72 6f 77 6e 20 74 68  lready thrown th
17c70 65 20 65 72 72 6f 72 20 69 66 20 56 44 42 45 20  e error if VDBE 
17c80 61 6c 6c 6f 63 20 66 61 69 6c 65 64 20 2a 2f 0a  alloc failed */.
17c90 20 20 6c 61 62 65 6c 45 6e 64 20 3d 20 73 71 6c    labelEnd = sql
17ca0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
17cb0 6c 28 76 29 3b 0a 20 20 6c 61 62 65 6c 43 6d 70  l(v);.  labelCmp
17cc0 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  r = sqlite3VdbeM
17cd0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 0a 20  akeLabel(v);... 
17ce0 20 2f 2a 20 50 61 74 63 68 20 75 70 20 74 68 65   /* Patch up the
17cf0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
17d00 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 2d 3e  .  */.  op = p->
17d10 6f 70 3b 20 20 0a 20 20 70 50 72 69 6f 72 20 3d  op;  .  pPrior =
17d20 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 61 73   p->pPrior;.  as
17d30 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 4f  sert( pPrior->pO
17d40 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 70  rderBy==0 );.  p
17d50 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
17d60 64 65 72 42 79 3b 0a 20 20 61 73 73 65 72 74 28  derBy;.  assert(
17d70 20 70 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 6e   pOrderBy );.  n
17d80 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
17d90 42 79 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 2f 2a  By->nExpr;..  /*
17da0 20 46 6f 72 20 6f 70 65 72 61 74 6f 72 73 20 6f   For operators o
17db0 74 68 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20  ther than UNION 
17dc0 41 4c 4c 20 77 65 20 68 61 76 65 20 74 6f 20 6d  ALL we have to m
17dd0 61 6b 65 20 73 75 72 65 20 74 68 61 74 0a 20 20  ake sure that.  
17de0 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  ** the ORDER BY 
17df0 63 6c 61 75 73 65 20 63 6f 76 65 72 73 20 65 76  clause covers ev
17e00 65 72 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ery term of the 
17e10 72 65 73 75 6c 74 20 73 65 74 2e 20 20 41 64 64  result set.  Add
17e20 0a 20 20 2a 2a 20 74 65 72 6d 73 20 74 6f 20 74  .  ** terms to t
17e30 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
17e40 73 65 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e  se as necessary.
17e50 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 21 3d  .  */.  if( op!=
17e60 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 66 6f  TK_ALL ){.    fo
17e70 72 28 69 3d 31 3b 20 64 62 2d 3e 6d 61 6c 6c 6f  r(i=1; db->mallo
17e80 63 46 61 69 6c 65 64 3d 3d 30 20 26 26 20 69 3c  cFailed==0 && i<
17e90 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  =p->pEList->nExp
17ea0 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  r; i++){.      s
17eb0 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
17ec0 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20  tem *pItem;.    
17ed0 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d    for(j=0, pItem
17ee0 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 6a 3c  =pOrderBy->a; j<
17ef0 6e 4f 72 64 65 72 42 79 3b 20 6a 2b 2b 2c 20 70  nOrderBy; j++, p
17f00 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
17f10 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
17f20 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e  u.x.iOrderByCol>
17f30 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
17f40 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64   pItem->u.x.iOrd
17f50 65 72 42 79 43 6f 6c 3d 3d 69 20 29 20 62 72 65  erByCol==i ) bre
17f60 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
17f70 20 20 69 66 28 20 6a 3d 3d 6e 4f 72 64 65 72 42    if( j==nOrderB
17f80 79 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70  y ){.        Exp
17f90 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  r *pNew = sqlite
17fa0 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 4e 54  3Expr(db, TK_INT
17fb0 45 47 45 52 2c 20 30 29 3b 0a 20 20 20 20 20 20  EGER, 0);.      
17fc0 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
17fd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
17fe0 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  MEM;.        pNe
17ff0 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49  w->flags |= EP_I
18000 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20  ntValue;.       
18010 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20   pNew->u.iValue 
18020 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 70 4f 72  = i;.        pOr
18030 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45  derBy = sqlite3E
18040 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
18050 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20  arse, pOrderBy, 
18060 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 69  pNew);.        i
18070 66 28 20 70 4f 72 64 65 72 42 79 20 29 20 70 4f  f( pOrderBy ) pO
18080 72 64 65 72 42 79 2d 3e 61 5b 6e 4f 72 64 65 72  rderBy->a[nOrder
18090 42 79 2b 2b 5d 2e 75 2e 78 2e 69 4f 72 64 65 72  By++].u.x.iOrder
180a0 42 79 43 6f 6c 20 3d 20 28 75 31 36 29 69 3b 0a  ByCol = (u16)i;.
180b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
180c0 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  }..  /* Compute 
180d0 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 70  the comparison p
180e0 65 72 6d 75 74 61 74 69 6f 6e 20 61 6e 64 20 6b  ermutation and k
180f0 65 79 69 6e 66 6f 20 74 68 61 74 20 69 73 20 75  eyinfo that is u
18100 73 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 74 68  sed with.  ** th
18110 65 20 70 65 72 6d 75 74 61 74 69 6f 6e 20 75 73  e permutation us
18120 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
18130 69 66 20 74 68 65 20 6e 65 78 74 0a 20 20 2a 2a  if the next.  **
18140 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 73 20   row of results 
18150 63 6f 6d 65 73 20 66 72 6f 6d 20 73 65 6c 65 63  comes from selec
18160 74 41 20 6f 72 20 73 65 6c 65 63 74 42 2e 20 20  tA or selectB.  
18170 41 6c 73 6f 20 61 64 64 20 65 78 70 6c 69 63 69  Also add explici
18180 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e  t.  ** collation
18190 73 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42  s to the ORDER B
181a0 59 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 73  Y clause terms s
181b0 6f 20 74 68 61 74 20 77 68 65 6e 20 74 68 65 20  o that when the 
181c0 73 75 62 71 75 65 72 69 65 73 0a 20 20 2a 2a 20  subqueries.  ** 
181d0 74 6f 20 74 68 65 20 72 69 67 68 74 20 61 6e 64  to the right and
181e0 20 74 68 65 20 6c 65 66 74 20 61 72 65 20 65 76   the left are ev
181f0 61 6c 75 61 74 65 64 2c 20 74 68 65 79 20 75 73  aluated, they us
18200 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a 20 20  e the correct.  
18210 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 20 20  ** collation..  
18220 2a 2f 0a 20 20 61 50 65 72 6d 75 74 65 20 3d 20  */.  aPermute = 
18230 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
18240 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 69 6e  aw(db, sizeof(in
18250 74 29 2a 6e 4f 72 64 65 72 42 79 29 3b 0a 20 20  t)*nOrderBy);.  
18260 69 66 28 20 61 50 65 72 6d 75 74 65 20 29 7b 0a  if( aPermute ){.
18270 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
18280 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
18290 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49  .    for(i=0, pI
182a0 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b  tem=pOrderBy->a;
182b0 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b   i<nOrderBy; i++
182c0 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
182d0 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
182e0 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  >u.x.iOrderByCol
182f0 3e 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  >0.          && 
18300 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65  pItem->u.x.iOrde
18310 72 42 79 43 6f 6c 3c 3d 70 2d 3e 70 45 4c 69 73  rByCol<=p->pELis
18320 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20  t->nExpr );.    
18330 20 20 61 50 65 72 6d 75 74 65 5b 69 5d 20 3d 20    aPermute[i] = 
18340 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65  pItem->u.x.iOrde
18350 72 42 79 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20  rByCol - 1;.    
18360 7d 0a 20 20 20 20 70 4b 65 79 4d 65 72 67 65 20  }.    pKeyMerge 
18370 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64  = multiSelectOrd
18380 65 72 42 79 4b 65 79 49 6e 66 6f 28 70 50 61 72  erByKeyInfo(pPar
18390 73 65 2c 20 70 2c 20 31 29 3b 0a 20 20 7d 65 6c  se, p, 1);.  }el
183a0 73 65 7b 0a 20 20 20 20 70 4b 65 79 4d 65 72 67  se{.    pKeyMerg
183b0 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e = 0;.  }..  /*
183c0 20 52 65 61 74 74 61 63 68 20 74 68 65 20 4f 52   Reattach the OR
183d0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 6f  DER BY clause to
183e0 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f   the query..  */
183f0 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d  .  p->pOrderBy =
18400 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 50 72   pOrderBy;.  pPr
18410 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  ior->pOrderBy = 
18420 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
18430 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
18440 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a 0a 20 20  OrderBy, 0);..  
18450 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 72 61  /* Allocate a ra
18460 6e 67 65 20 6f 66 20 74 65 6d 70 6f 72 61 72 79  nge of temporary
18470 20 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 74   registers and t
18480 68 65 20 4b 65 79 49 6e 66 6f 20 6e 65 65 64 65  he KeyInfo neede
18490 64 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6c  d.  ** for the l
184a0 6f 67 69 63 20 74 68 61 74 20 72 65 6d 6f 76 65  ogic that remove
184b0 73 20 64 75 70 6c 69 63 61 74 65 20 72 65 73 75  s duplicate resu
184c0 6c 74 20 72 6f 77 73 20 77 68 65 6e 20 74 68 65  lt rows when the
184d0 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 20 69  .  ** operator i
184e0 73 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c  s UNION, EXCEPT,
184f0 20 6f 72 20 49 4e 54 45 52 53 45 43 54 20 28 62   or INTERSECT (b
18500 75 74 20 6e 6f 74 20 55 4e 49 4f 4e 20 41 4c 4c  ut not UNION ALL
18510 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70  )..  */.  if( op
18520 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20  ==TK_ALL ){.    
18530 72 65 67 50 72 65 76 20 3d 20 30 3b 0a 20 20 7d  regPrev = 0;.  }
18540 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 45  else{.    int nE
18550 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  xpr = p->pEList-
18560 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65  >nExpr;.    asse
18570 72 74 28 20 6e 4f 72 64 65 72 42 79 3e 3d 6e 45  rt( nOrderBy>=nE
18580 78 70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  xpr || db->mallo
18590 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72  cFailed );.    r
185a0 65 67 50 72 65 76 20 3d 20 70 50 61 72 73 65 2d  egPrev = pParse-
185b0 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61  >nMem+1;.    pPa
185c0 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 45 78  rse->nMem += nEx
185d0 70 72 2b 31 3b 0a 20 20 20 20 73 71 6c 69 74 65  pr+1;.    sqlite
185e0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
185f0 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65  P_Integer, 0, re
18600 67 50 72 65 76 29 3b 0a 20 20 20 20 70 4b 65 79  gPrev);.    pKey
18610 44 75 70 20 3d 20 73 71 6c 69 74 65 33 4b 65 79  Dup = sqlite3Key
18620 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 45  InfoAlloc(db, nE
18630 78 70 72 2c 20 31 29 3b 0a 20 20 20 20 69 66 28  xpr, 1);.    if(
18640 20 70 4b 65 79 44 75 70 20 29 7b 0a 20 20 20 20   pKeyDup ){.    
18650 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
18660 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61  3KeyInfoIsWritea
18670 62 6c 65 28 70 4b 65 79 44 75 70 29 20 29 3b 0a  ble(pKeyDup) );.
18680 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
18690 3c 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  <nExpr; i++){.  
186a0 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 61        pKeyDup->a
186b0 43 6f 6c 6c 5b 69 5d 20 3d 20 6d 75 6c 74 69 53  Coll[i] = multiS
186c0 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61  electCollSeq(pPa
186d0 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20  rse, p, i);.    
186e0 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 61 53 6f      pKeyDup->aSo
186f0 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 30 3b 0a  rtOrder[i] = 0;.
18700 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
18710 7d 0a 20 0a 20 20 2f 2a 20 53 65 70 61 72 61 74  }. .  /* Separat
18720 65 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 74  e the left and t
18730 68 65 20 72 69 67 68 74 20 71 75 65 72 79 20 66  he right query f
18740 72 6f 6d 20 6f 6e 65 20 61 6e 6f 74 68 65 72 0a  rom one another.
18750 20 20 2a 2f 0a 20 20 70 2d 3e 70 50 72 69 6f 72    */.  p->pPrior
18760 20 3d 20 30 3b 0a 20 20 70 50 72 69 6f 72 2d 3e   = 0;.  pPrior->
18770 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 73 71 6c  pNext = 0;.  sql
18780 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72  ite3ResolveOrder
18790 47 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20  GroupBy(pParse, 
187a0 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  p, p->pOrderBy, 
187b0 22 4f 52 44 45 52 22 29 3b 0a 20 20 69 66 28 20  "ORDER");.  if( 
187c0 70 50 72 69 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d  pPrior->pPrior==
187d0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
187e0 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75  ResolveOrderGrou
187f0 70 42 79 28 70 50 61 72 73 65 2c 20 70 50 72 69  pBy(pParse, pPri
18800 6f 72 2c 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64  or, pPrior->pOrd
18810 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a  erBy, "ORDER");.
18820 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74    }..  /* Comput
18830 65 20 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69  e the limit regi
18840 73 74 65 72 73 20 2a 2f 0a 20 20 63 6f 6d 70 75  sters */.  compu
18850 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
18860 28 70 50 61 72 73 65 2c 20 70 2c 20 6c 61 62 65  (pParse, p, labe
18870 6c 45 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e  lEnd);.  if( p->
18880 69 4c 69 6d 69 74 20 26 26 20 6f 70 3d 3d 54 4b  iLimit && op==TK
18890 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 4c  _ALL ){.    regL
188a0 69 6d 69 74 41 20 3d 20 2b 2b 70 50 61 72 73 65  imitA = ++pParse
188b0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 4c  ->nMem;.    regL
188c0 69 6d 69 74 42 20 3d 20 2b 2b 70 50 61 72 73 65  imitB = ++pParse
188d0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69  ->nMem;.    sqli
188e0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
188f0 20 4f 50 5f 43 6f 70 79 2c 20 70 2d 3e 69 4f 66   OP_Copy, p->iOf
18900 66 73 65 74 20 3f 20 70 2d 3e 69 4f 66 66 73 65  fset ? p->iOffse
18910 74 2b 31 20 3a 20 70 2d 3e 69 4c 69 6d 69 74 2c  t+1 : p->iLimit,
18920 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18940 20 20 20 72 65 67 4c 69 6d 69 74 41 29 3b 0a 20     regLimitA);. 
18950 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
18960 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp2(v, OP_Copy,
18970 20 72 65 67 4c 69 6d 69 74 41 2c 20 72 65 67 4c   regLimitA, regL
18980 69 6d 69 74 42 29 3b 0a 20 20 7d 65 6c 73 65 7b  imitB);.  }else{
18990 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d  .    regLimitA =
189a0 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 30 3b 0a   regLimitB = 0;.
189b0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
189c0 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  rDelete(db, p->p
189d0 4c 69 6d 69 74 29 3b 0a 20 20 70 2d 3e 70 4c 69  Limit);.  p->pLi
189e0 6d 69 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  mit = 0;.  sqlit
189f0 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
18a00 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20   p->pOffset);.  
18a10 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->pOffset = 0;.
18a20 0a 20 20 72 65 67 41 64 64 72 41 20 3d 20 2b 2b  .  regAddrA = ++
18a30 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
18a40 72 65 67 41 64 64 72 42 20 3d 20 2b 2b 70 50 61  regAddrB = ++pPa
18a50 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67  rse->nMem;.  reg
18a60 4f 75 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d  OutA = ++pParse-
18a70 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 42  >nMem;.  regOutB
18a80 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
18a90 6d 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  m;.  sqlite3Sele
18aa0 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
18ab0 41 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  A, SRT_Coroutine
18ac0 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73  , regAddrA);.  s
18ad0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
18ae0 49 6e 69 74 28 26 64 65 73 74 42 2c 20 53 52 54  Init(&destB, SRT
18af0 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41  _Coroutine, regA
18b00 64 64 72 42 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  ddrB);..  /* Gen
18b10 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e  erate a coroutin
18b20 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68  e to evaluate th
18b30 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
18b40 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6c  nt to the.  ** l
18b50 65 66 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f  eft of the compo
18b60 75 6e 64 20 6f 70 65 72 61 74 6f 72 20 2d 20 74  und operator - t
18b70 68 65 20 22 41 22 20 73 65 6c 65 63 74 2e 0a 20  he "A" select.. 
18b80 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65 63 74   */.  addrSelect
18b90 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  A = sqlite3VdbeC
18ba0 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20  urrentAddr(v) + 
18bb0 31 3b 0a 20 20 6a 31 20 3d 20 73 71 6c 69 74 65  1;.  j1 = sqlite
18bc0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
18bd0 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c  P_InitCoroutine,
18be0 20 72 65 67 41 64 64 72 41 2c 20 30 2c 20 61 64   regAddrA, 0, ad
18bf0 64 72 53 65 6c 65 63 74 41 29 3b 0a 20 20 56 64  drSelectA);.  Vd
18c00 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6c  beComment((v, "l
18c10 65 66 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 20  eft SELECT"));. 
18c20 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20   pPrior->iLimit 
18c30 3d 20 72 65 67 4c 69 6d 69 74 41 3b 0a 20 20 65  = regLimitA;.  e
18c40 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
18c50 28 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e  (iSub1, pParse->
18c60 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
18c70 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
18c80 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
18c90 26 64 65 73 74 41 29 3b 0a 20 20 73 71 6c 69 74  &destA);.  sqlit
18ca0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
18cb0 4f 50 5f 45 6e 64 43 6f 72 6f 75 74 69 6e 65 2c  OP_EndCoroutine,
18cc0 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71   regAddrA);.  sq
18cd0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
18ce0 65 28 76 2c 20 6a 31 29 3b 0a 0a 20 20 2f 2a 20  e(v, j1);..  /* 
18cf0 47 65 6e 65 72 61 74 65 20 61 20 63 6f 72 6f 75  Generate a corou
18d00 74 69 6e 65 20 74 6f 20 65 76 61 6c 75 61 74 65  tine to evaluate
18d10 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
18d20 65 6d 65 6e 74 20 6f 6e 20 0a 20 20 2a 2a 20 74  ement on .  ** t
18d30 68 65 20 72 69 67 68 74 20 2d 20 74 68 65 20 22  he right - the "
18d40 42 22 20 73 65 6c 65 63 74 0a 20 20 2a 2f 0a 20  B" select.  */. 
18d50 20 61 64 64 72 53 65 6c 65 63 74 42 20 3d 20 73   addrSelectB = s
18d60 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
18d70 74 41 64 64 72 28 76 29 20 2b 20 31 3b 0a 20 20  tAddr(v) + 1;.  
18d80 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j1 = sqlite3Vdbe
18d90 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69  AddOp3(v, OP_Ini
18da0 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41  tCoroutine, regA
18db0 64 64 72 42 2c 20 30 2c 20 61 64 64 72 53 65 6c  ddrB, 0, addrSel
18dc0 65 63 74 42 29 3b 0a 20 20 56 64 62 65 43 6f 6d  ectB);.  VdbeCom
18dd0 6d 65 6e 74 28 28 76 2c 20 22 72 69 67 68 74 20  ment((v, "right 
18de0 53 45 4c 45 43 54 22 29 29 3b 0a 20 20 73 61 76  SELECT"));.  sav
18df0 65 64 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69  edLimit = p->iLi
18e00 6d 69 74 3b 0a 20 20 73 61 76 65 64 4f 66 66 73  mit;.  savedOffs
18e10 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b  et = p->iOffset;
18e20 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 72  .  p->iLimit = r
18e30 65 67 4c 69 6d 69 74 42 3b 0a 20 20 70 2d 3e 69  egLimitB;.  p->i
18e40 4f 66 66 73 65 74 20 3d 20 30 3b 20 20 0a 20 20  Offset = 0;  .  
18e50 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
18e60 72 28 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d  r(iSub2, pParse-
18e70 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b  >iNextSelectId);
18e80 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
18e90 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73  (pParse, p, &des
18ea0 74 42 29 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74  tB);.  p->iLimit
18eb0 20 3d 20 73 61 76 65 64 4c 69 6d 69 74 3b 0a 20   = savedLimit;. 
18ec0 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 73 61   p->iOffset = sa
18ed0 76 65 64 4f 66 66 73 65 74 3b 0a 20 20 73 71 6c  vedOffset;.  sql
18ee0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
18ef0 2c 20 4f 50 5f 45 6e 64 43 6f 72 6f 75 74 69 6e  , OP_EndCoroutin
18f00 65 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 0a 20  e, regAddrB);.. 
18f10 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
18f20 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f  ubroutine that o
18f30 75 74 70 75 74 73 20 74 68 65 20 63 75 72 72 65  utputs the curre
18f40 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20 41 0a  nt row of the A.
18f50 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73 20 74    ** select as t
18f60 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74 20 72  he next output r
18f70 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75  ow of the compou
18f80 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a  nd select..  */.
18f90 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
18fa0 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20 72 6f  t((v, "Output ro
18fb0 75 74 69 6e 65 20 66 6f 72 20 41 22 29 29 3b 0a  utine for A"));.
18fc0 20 20 61 64 64 72 4f 75 74 41 20 3d 20 67 65 6e    addrOutA = gen
18fd0 65 72 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f  erateOutputSubro
18fe0 75 74 69 6e 65 28 70 50 61 72 73 65 2c 0a 20 20  utine(pParse,.  
18ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
19000 2c 20 26 64 65 73 74 41 2c 20 70 44 65 73 74 2c  , &destA, pDest,
19010 20 72 65 67 4f 75 74 41 2c 0a 20 20 20 20 20 20   regOutA,.      
19020 20 20 20 20 20 20 20 20 20 20 20 72 65 67 50 72             regPr
19030 65 76 2c 20 70 4b 65 79 44 75 70 2c 20 6c 61 62  ev, pKeyDup, lab
19040 65 6c 45 6e 64 29 3b 0a 20 20 0a 20 20 2f 2a 20  elEnd);.  .  /* 
19050 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
19060 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75  utine that outpu
19070 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  ts the current r
19080 6f 77 20 6f 66 20 74 68 65 20 42 0a 20 20 2a 2a  ow of the B.  **
19090 20 73 65 6c 65 63 74 20 61 73 20 74 68 65 20 6e   select as the n
190a0 65 78 74 20 6f 75 74 70 75 74 20 72 6f 77 20 6f  ext output row o
190b0 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  f the compound s
190c0 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  elect..  */.  if
190d0 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20  ( op==TK_ALL || 
190e0 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a  op==TK_UNION ){.
190f0 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d      VdbeNoopComm
19100 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20  ent((v, "Output 
19110 72 6f 75 74 69 6e 65 20 66 6f 72 20 42 22 29 29  routine for B"))
19120 3b 0a 20 20 20 20 61 64 64 72 4f 75 74 42 20 3d  ;.    addrOutB =
19130 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53   generateOutputS
19140 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65  ubroutine(pParse
19150 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
19160 20 20 20 70 2c 20 26 64 65 73 74 42 2c 20 70 44     p, &destB, pD
19170 65 73 74 2c 20 72 65 67 4f 75 74 42 2c 0a 20 20  est, regOutB,.  
19180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
19190 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c  egPrev, pKeyDup,
191a0 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 7d 0a   labelEnd);.  }.
191b0 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f    sqlite3KeyInfo
191c0 55 6e 72 65 66 28 70 4b 65 79 44 75 70 29 3b 0a  Unref(pKeyDup);.
191d0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
191e0 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 72   subroutine to r
191f0 75 6e 20 77 68 65 6e 20 74 68 65 20 72 65 73 75  un when the resu
19200 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 20  lts from select 
19210 41 0a 20 20 2a 2a 20 61 72 65 20 65 78 68 61 75  A.  ** are exhau
19220 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61  sted and only da
19230 74 61 20 69 6e 20 73 65 6c 65 63 74 20 42 20 72  ta in select B r
19240 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  emains..  */.  i
19250 66 28 20 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54  f( op==TK_EXCEPT
19260 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52   || op==TK_INTER
19270 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72  SECT ){.    addr
19280 45 6f 66 41 5f 6e 6f 42 20 3d 20 61 64 64 72 45  EofA_noB = addrE
19290 6f 66 41 20 3d 20 6c 61 62 65 6c 45 6e 64 3b 0a  ofA = labelEnd;.
192a0 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20 56    }else{  .    V
192b0 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
192c0 76 2c 20 22 65 6f 66 2d 41 20 73 75 62 72 6f 75  v, "eof-A subrou
192d0 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64  tine"));.    add
192e0 72 45 6f 66 41 20 3d 20 73 71 6c 69 74 65 33 56  rEofA = sqlite3V
192f0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
19300 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 42 2c 20  Gosub, regOutB, 
19310 61 64 64 72 4f 75 74 42 29 3b 0a 20 20 20 20 61  addrOutB);.    a
19320 64 64 72 45 6f 66 41 5f 6e 6f 42 20 3d 20 73 71  ddrEofA_noB = sq
19330 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
19340 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
19350 41 64 64 72 42 2c 20 6c 61 62 65 6c 45 6e 64 29  AddrB, labelEnd)
19360 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
19370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19380 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
19390 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  age(v);.    sqli
193a0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
193b0 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64   OP_Goto, 0, add
193c0 72 45 6f 66 41 29 3b 0a 20 20 20 20 70 2d 3e 6e  rEofA);.    p->n
193d0 53 65 6c 65 63 74 52 6f 77 20 2b 3d 20 70 50 72  SelectRow += pPr
193e0 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b  ior->nSelectRow;
193f0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
19400 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
19410 20 74 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65   to run when the
19420 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65   results from se
19430 6c 65 63 74 20 42 0a 20 20 2a 2a 20 61 72 65 20  lect B.  ** are 
19440 65 78 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e  exhausted and on
19450 6c 79 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63  ly data in selec
19460 74 20 41 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a  t A remains..  *
19470 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49  /.  if( op==TK_I
19480 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20  NTERSECT ){.    
19490 61 64 64 72 45 6f 66 42 20 3d 20 61 64 64 72 45  addrEofB = addrE
194a0 6f 66 41 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ofA;.    if( p->
194b0 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20 70 50 72  nSelectRow > pPr
194c0 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  ior->nSelectRow 
194d0 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  ) p->nSelectRow 
194e0 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63  = pPrior->nSelec
194f0 74 52 6f 77 3b 0a 20 20 7d 65 6c 73 65 7b 20 20  tRow;.  }else{  
19500 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  .    VdbeNoopCom
19510 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 42 20  ment((v, "eof-B 
19520 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20  subroutine"));. 
19530 20 20 20 61 64 64 72 45 6f 66 42 20 3d 20 73 71     addrEofB = sq
19540 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
19550 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
19560 4f 75 74 41 2c 20 61 64 64 72 4f 75 74 41 29 3b  OutA, addrOutA);
19570 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
19580 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65  AddOp2(v, OP_Yie
19590 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20 6c 61  ld, regAddrA, la
195a0 62 65 6c 45 6e 64 29 3b 20 56 64 62 65 43 6f 76  belEnd); VdbeCov
195b0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71  erage(v);.    sq
195c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
195d0 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61  v, OP_Goto, 0, a
195e0 64 64 72 45 6f 66 42 29 3b 0a 20 20 7d 0a 0a 20  ddrEofB);.  }.. 
195f0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
19600 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20  e to handle the 
19610 63 61 73 65 20 6f 66 20 41 3c 42 0a 20 20 2a 2f  case of A<B.  */
19620 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65  .  VdbeNoopComme
19630 6e 74 28 28 76 2c 20 22 41 2d 6c 74 2d 42 20 73  nt((v, "A-lt-B s
19640 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20  ubroutine"));.  
19650 61 64 64 72 41 6c 74 42 20 3d 20 73 71 6c 69 74  addrAltB = sqlit
19660 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
19670 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74  OP_Gosub, regOut
19680 41 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20 20  A, addrOutA);.  
19690 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
196a0 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  2(v, OP_Yield, r
196b0 65 67 41 64 64 72 41 2c 20 61 64 64 72 45 6f 66  egAddrA, addrEof
196c0 41 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  A); VdbeCoverage
196d0 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  (v);.  sqlite3Vd
196e0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
196f0 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d 70  oto, 0, labelCmp
19700 72 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  r);..  /* Genera
19710 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c  te code to handl
19720 65 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3d  e the case of A=
19730 3d 42 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70  =B.  */.  if( op
19740 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20  ==TK_ALL ){.    
19750 61 64 64 72 41 65 71 42 20 3d 20 61 64 64 72 41  addrAeqB = addrA
19760 6c 74 42 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ltB;.  }else if(
19770 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43   op==TK_INTERSEC
19780 54 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71  T ){.    addrAeq
19790 42 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20  B = addrAltB;.  
197a0 20 20 61 64 64 72 41 6c 74 42 2b 2b 3b 0a 20 20    addrAltB++;.  
197b0 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64 62 65 4e  }else{.    VdbeN
197c0 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
197d0 41 2d 65 71 2d 42 20 73 75 62 72 6f 75 74 69 6e  A-eq-B subroutin
197e0 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72 41 65  e"));.    addrAe
197f0 71 42 20 3d 0a 20 20 20 20 73 71 6c 69 74 65 33  qB =.    sqlite3
19800 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
19810 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41  _Yield, regAddrA
19820 2c 20 61 64 64 72 45 6f 66 41 29 3b 20 56 64 62  , addrEofA); Vdb
19830 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
19840 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19850 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
19860 30 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20  0, labelCmpr);. 
19870 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
19880 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65  e code to handle
19890 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3e 42   the case of A>B
198a0 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70  .  */.  VdbeNoop
198b0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 67  Comment((v, "A-g
198c0 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29  t-B subroutine")
198d0 29 3b 0a 20 20 61 64 64 72 41 67 74 42 20 3d 20  );.  addrAgtB = 
198e0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
198f0 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69 66 28  ntAddr(v);.  if(
19900 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f   op==TK_ALL || o
19910 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20  p==TK_UNION ){. 
19920 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19930 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
19940 2c 20 72 65 67 4f 75 74 42 2c 20 61 64 64 72 4f  , regOutB, addrO
19950 75 74 42 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  utB);.  }.  sqli
19960 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
19970 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
19980 64 72 42 2c 20 61 64 64 72 45 6f 66 42 29 3b 20  drB, addrEofB); 
19990 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
199a0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
199b0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
199c0 20 30 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a   0, labelCmpr);.
199d0 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20  .  /* This code 
199e0 72 75 6e 73 20 6f 6e 63 65 20 74 6f 20 69 6e 69  runs once to ini
199f0 74 69 61 6c 69 7a 65 20 65 76 65 72 79 74 68 69  tialize everythi
19a00 6e 67 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ng..  */.  sqlit
19a10 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
19a20 2c 20 6a 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  , j1);.  sqlite3
19a30 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
19a40 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41  _Yield, regAddrA
19a50 2c 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 29 3b  , addrEofA_noB);
19a60 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
19a70 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
19a80 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp2(v, OP_Yiel
19a90 64 2c 20 72 65 67 41 64 64 72 42 2c 20 61 64 64  d, regAddrB, add
19aa0 72 45 6f 66 42 29 3b 20 56 64 62 65 43 6f 76 65  rEofB); VdbeCove
19ab0 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 49  rage(v);..  /* I
19ac0 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 6d 61 69  mplement the mai
19ad0 6e 20 6d 65 72 67 65 20 6c 6f 6f 70 0a 20 20 2a  n merge loop.  *
19ae0 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
19af0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c  esolveLabel(v, l
19b00 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20 73 71 6c  abelCmpr);.  sql
19b10 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
19b20 2c 20 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e  , OP_Permutation
19b30 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72  , 0, 0, 0, (char
19b40 2a 29 61 50 65 72 6d 75 74 65 2c 20 50 34 5f 49  *)aPermute, P4_I
19b50 4e 54 41 52 52 41 59 29 3b 0a 20 20 73 71 6c 69  NTARRAY);.  sqli
19b60 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
19b70 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 64 65 73   OP_Compare, des
19b80 74 41 2e 69 53 64 73 74 2c 20 64 65 73 74 42 2e  tA.iSdst, destB.
19b90 69 53 64 73 74 2c 20 6e 4f 72 64 65 72 42 79 2c  iSdst, nOrderBy,
19ba0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19bb0 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
19bc0 29 70 4b 65 79 4d 65 72 67 65 2c 20 50 34 5f 4b  )pKeyMerge, P4_K
19bd0 45 59 49 4e 46 4f 29 3b 0a 20 20 73 71 6c 69 74  EYINFO);.  sqlit
19be0 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
19bf0 2c 20 4f 50 46 4c 41 47 5f 50 45 52 4d 55 54 45  , OPFLAG_PERMUTE
19c00 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
19c10 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d  AddOp3(v, OP_Jum
19c20 70 2c 20 61 64 64 72 41 6c 74 42 2c 20 61 64 64  p, addrAltB, add
19c30 72 41 65 71 42 2c 20 61 64 64 72 41 67 74 42 29  rAeqB, addrAgtB)
19c40 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
19c50 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f  );..  /* Jump to
19c60 20 74 68 65 20 74 68 69 73 20 70 6f 69 6e 74 20   the this point 
19c70 69 6e 20 6f 72 64 65 72 20 74 6f 20 74 65 72 6d  in order to term
19c80 69 6e 61 74 65 20 74 68 65 20 71 75 65 72 79 2e  inate the query.
19c90 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
19ca0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
19cb0 76 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 0a 20  v, labelEnd);.. 
19cc0 20 2f 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62   /* Set the numb
19cd0 65 72 20 6f 66 20 6f 75 74 70 75 74 20 63 6f 6c  er of output col
19ce0 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20  umns.  */.  if( 
19cf0 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
19d00 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20  T_Output ){.    
19d10 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d  Select *pFirst =
19d20 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 77 68 69   pPrior;.    whi
19d30 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69  le( pFirst->pPri
19d40 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20 70 46  or ) pFirst = pF
19d50 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  irst->pPrior;.  
19d60 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
19d70 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c  Names(pParse, 0,
19d80 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29   pFirst->pEList)
19d90 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 73  ;.  }..  /* Reas
19da0 73 65 6d 62 6c 79 20 74 68 65 20 63 6f 6d 70 6f  sembly the compo
19db0 75 6e 64 20 71 75 65 72 79 20 73 6f 20 74 68 61  und query so tha
19dc0 74 20 69 74 20 77 69 6c 6c 20 62 65 20 66 72 65  t it will be fre
19dd0 65 64 20 63 6f 72 72 65 63 74 6c 79 0a 20 20 2a  ed correctly.  *
19de0 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67  * by the calling
19df0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69   function */.  i
19e00 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  f( p->pPrior ){.
19e10 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
19e20 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
19e30 50 72 69 6f 72 29 3b 0a 20 20 7d 0a 20 20 70 2d  Prior);.  }.  p-
19e40 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
19e50 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78  ;.  pPrior->pNex
19e60 74 20 3d 20 70 3b 0a 0a 20 20 2f 2a 2a 2a 20 54  t = p;..  /*** T
19e70 42 44 3a 20 20 49 6e 73 65 72 74 20 73 75 62 72  BD:  Insert subr
19e80 6f 75 74 69 6e 65 20 63 61 6c 6c 73 20 74 6f 20  outine calls to 
19e90 63 6c 6f 73 65 20 63 75 72 73 6f 72 73 20 6f 6e  close cursors on
19ea0 20 69 6e 63 6f 6d 70 6c 65 74 65 0a 20 20 2a 2a   incomplete.  **
19eb0 2a 2a 20 73 75 62 71 75 65 72 69 65 73 20 2a 2a  ** subqueries **
19ec0 2a 2a 2f 0a 20 20 65 78 70 6c 61 69 6e 43 6f 6d  **/.  explainCom
19ed0 70 6f 73 69 74 65 28 70 50 61 72 73 65 2c 20 70  posite(pParse, p
19ee0 2d 3e 6f 70 2c 20 69 53 75 62 31 2c 20 69 53 75  ->op, iSub1, iSu
19ef0 62 32 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  b2, 0);.  return
19f00 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
19f10 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e  ndif..#if !defin
19f20 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
19f30 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66  UBQUERY) || !def
19f40 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
19f50 5f 56 49 45 57 29 0a 2f 2a 20 46 6f 72 77 61 72  _VIEW)./* Forwar
19f60 64 20 44 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a  d Declarations *
19f70 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  /.static void su
19f80 62 73 74 45 78 70 72 4c 69 73 74 28 73 71 6c 69  bstExprList(sqli
19f90 74 65 33 2a 2c 20 45 78 70 72 4c 69 73 74 2a 2c  te3*, ExprList*,
19fa0 20 69 6e 74 2c 20 45 78 70 72 4c 69 73 74 2a 29   int, ExprList*)
19fb0 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  ;.static void su
19fc0 62 73 74 53 65 6c 65 63 74 28 73 71 6c 69 74 65  bstSelect(sqlite
19fd0 33 2a 2c 20 53 65 6c 65 63 74 20 2a 2c 20 69 6e  3*, Select *, in
19fe0 74 2c 20 45 78 70 72 4c 69 73 74 20 2a 29 3b 0a  t, ExprList *);.
19ff0 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 72 6f  ./*.** Scan thro
1a000 75 67 68 20 74 68 65 20 65 78 70 72 65 73 73 69  ugh the expressi
1a010 6f 6e 20 70 45 78 70 72 2e 20 20 52 65 70 6c 61  on pExpr.  Repla
1a020 63 65 20 65 76 65 72 79 20 72 65 66 65 72 65 6e  ce every referen
1a030 63 65 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d  ce to.** a colum
1a040 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65  n in table numbe
1a050 72 20 69 54 61 62 6c 65 20 77 69 74 68 20 61 20  r iTable with a 
1a060 63 6f 70 79 20 6f 66 20 74 68 65 20 69 43 6f 6c  copy of the iCol
1a070 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72 79 20  umn-th.** entry 
1a080 69 6e 20 70 45 4c 69 73 74 2e 20 20 28 42 75 74  in pEList.  (But
1a090 20 6c 65 61 76 65 20 72 65 66 65 72 65 6e 63 65   leave reference
1a0a0 73 20 74 6f 20 74 68 65 20 52 4f 57 49 44 20 63  s to the ROWID c
1a0b0 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e  olumn .** unchan
1a0c0 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ged.).**.** This
1a0d0 20 72 6f 75 74 69 6e 65 20 69 73 20 70 61 72 74   routine is part
1a0e0 20 6f 66 20 74 68 65 20 66 6c 61 74 74 65 6e 69   of the flatteni
1a0f0 6e 67 20 70 72 6f 63 65 64 75 72 65 2e 20 20 41  ng procedure.  A
1a100 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 77 68 6f   subquery.** who
1a110 73 65 20 72 65 73 75 6c 74 20 73 65 74 20 69 73  se result set is
1a120 20 64 65 66 69 6e 65 64 20 62 79 20 70 45 4c 69   defined by pELi
1a130 73 74 20 61 70 70 65 61 72 73 20 61 73 20 65 6e  st appears as en
1a140 74 72 79 20 69 6e 20 74 68 65 0a 2a 2a 20 46 52  try in the.** FR
1a150 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53  OM clause of a S
1a160 45 4c 45 43 54 20 73 75 63 68 20 74 68 61 74 20  ELECT such that 
1a170 74 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  the VDBE cursor 
1a180 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 61 74  assigned to that
1a190 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61 75 73 65 20  .** FORM clause 
1a1a0 65 6e 74 72 79 20 69 73 20 69 54 61 62 6c 65 2e  entry is iTable.
1a1b0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d    This routine m
1a1c0 61 6b 65 20 74 68 65 20 6e 65 63 65 73 73 61 72  ake the necessar
1a1d0 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f  y .** changes to
1a1e0 20 70 45 78 70 72 20 73 6f 20 74 68 61 74 20 69   pExpr so that i
1a1f0 74 20 72 65 66 65 72 73 20 64 69 72 65 63 74 6c  t refers directl
1a200 79 20 74 6f 20 74 68 65 20 73 6f 75 72 63 65 20  y to the source 
1a210 74 61 62 6c 65 0a 2a 2a 20 6f 66 20 74 68 65 20  table.** of the 
1a220 73 75 62 71 75 65 72 79 20 72 61 74 68 65 72 20  subquery rather 
1a230 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
1a240 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a  f the subquery..
1a250 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72 20 2a  */.static Expr *
1a260 73 75 62 73 74 45 78 70 72 28 0a 20 20 73 71 6c  substExpr(.  sql
1a270 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
1a280 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f   /* Report mallo
1a290 63 20 65 72 72 6f 72 73 20 74 6f 20 74 68 69 73  c errors to this
1a2a0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
1a2b0 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
1a2c0 20 20 20 20 20 2f 2a 20 45 78 70 72 20 69 6e 20       /* Expr in 
1a2d0 77 68 69 63 68 20 73 75 62 73 74 69 74 75 74 69  which substituti
1a2e0 6f 6e 20 6f 63 63 75 72 73 20 2a 2f 0a 20 20 69  on occurs */.  i
1a2f0 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
1a300 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62     /* Table to b
1a310 65 20 73 75 62 73 74 69 74 75 74 65 64 20 2a 2f  e substituted */
1a320 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
1a330 69 73 74 20 20 20 20 2f 2a 20 53 75 62 73 74 69  ist    /* Substi
1a340 74 75 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73  tute expressions
1a350 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 45 78   */.){.  if( pEx
1a360 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  pr==0 ) return 0
1a370 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ;.  if( pExpr->o
1a380 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p==TK_COLUMN && 
1a390 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69  pExpr->iTable==i
1a3a0 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 66 28  Table ){.    if(
1a3b0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c   pExpr->iColumn<
1a3c0 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72  0 ){.      pExpr
1a3d0 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a  ->op = TK_NULL;.
1a3e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a3f0 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 20   Expr *pNew;.   
1a400 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73     assert( pELis
1a410 74 21 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 69  t!=0 && pExpr->i
1a420 43 6f 6c 75 6d 6e 3c 70 45 4c 69 73 74 2d 3e 6e  Column<pEList->n
1a430 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61 73  Expr );.      as
1a440 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65  sert( pExpr->pLe
1a450 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e  ft==0 && pExpr->
1a460 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20  pRight==0 );.   
1a470 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
1a480 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 4c  3ExprDup(db, pEL
1a490 69 73 74 2d 3e 61 5b 70 45 78 70 72 2d 3e 69 43  ist->a[pExpr->iC
1a4a0 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72 2c 20 30 29  olumn].pExpr, 0)
1a4b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1a4c0 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45  xprDelete(db, pE
1a4d0 78 70 72 29 3b 0a 20 20 20 20 20 20 70 45 78 70  xpr);.      pExp
1a4e0 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 7d 0a  r = pNew;.    }.
1a4f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 45 78    }else{.    pEx
1a500 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73 75 62 73  pr->pLeft = subs
1a510 74 45 78 70 72 28 64 62 2c 20 70 45 78 70 72 2d  tExpr(db, pExpr-
1a520 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c 65 2c 20  >pLeft, iTable, 
1a530 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 45 78  pEList);.    pEx
1a540 70 72 2d 3e 70 52 69 67 68 74 20 3d 20 73 75 62  pr->pRight = sub
1a550 73 74 45 78 70 72 28 64 62 2c 20 70 45 78 70 72  stExpr(db, pExpr
1a560 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62 6c 65  ->pRight, iTable
1a570 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 69  , pEList);.    i
1a580 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
1a590 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
1a5a0 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20  Select) ){.     
1a5b0 20 73 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c   substSelect(db,
1a5c0 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
1a5d0 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  t, iTable, pELis
1a5e0 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  t);.    }else{. 
1a5f0 20 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69       substExprLi
1a600 73 74 28 64 62 2c 20 70 45 78 70 72 2d 3e 78 2e  st(db, pExpr->x.
1a610 70 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70  pList, iTable, p
1a620 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  EList);.    }.  
1a630 7d 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70 72  }.  return pExpr
1a640 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
1a650 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 0a 20  substExprList(. 
1a660 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
1a670 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20        /* Report 
1a680 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 68 65  malloc errors he
1a690 72 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  re */.  ExprList
1a6a0 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20   *pList,     /* 
1a6b0 4c 69 73 74 20 74 6f 20 73 63 61 6e 20 61 6e 64  List to scan and
1a6c0 20 69 6e 20 77 68 69 63 68 20 74 6f 20 6d 61 6b   in which to mak
1a6d0 65 20 73 75 62 73 74 69 74 75 74 65 73 20 2a 2f  e substitutes */
1a6e0 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
1a6f0 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
1a700 20 74 6f 20 62 65 20 73 75 62 73 74 69 74 75 74   to be substitut
1a710 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  ed */.  ExprList
1a720 20 2a 70 45 4c 69 73 74 20 20 20 20 20 2f 2a 20   *pEList     /* 
1a730 53 75 62 73 74 69 74 75 74 65 20 76 61 6c 75 65  Substitute value
1a740 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  s */.){.  int i;
1a750 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
1a760 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
1a770 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
1a780 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  xpr; i++){.    p
1a790 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
1a7a0 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c   = substExpr(db,
1a7b0 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
1a7c0 70 72 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  pr, iTable, pELi
1a7d0 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  st);.  }.}.stati
1a7e0 63 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65  c void substSele
1a7f0 63 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ct(.  sqlite3 *d
1a800 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  b,         /* Re
1a810 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f  port malloc erro
1a820 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 53 65 6c  rs here */.  Sel
1a830 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
1a840 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74    /* SELECT stat
1a850 65 6d 65 6e 74 20 69 6e 20 77 68 69 63 68 20 74  ement in which t
1a860 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74  o make substitut
1a870 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54  ions */.  int iT
1a880 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f  able,          /
1a890 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 72 65  * Table to be re
1a8a0 70 6c 61 63 65 64 20 2a 2f 0a 20 20 45 78 70 72  placed */.  Expr
1a8b0 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20  List *pEList    
1a8c0 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 76   /* Substitute v
1a8d0 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 53 72  alues */.){.  Sr
1a8e0 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 73  cList *pSrc;.  s
1a8f0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1a900 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74  em *pItem;.  int
1a910 20 69 3b 0a 20 20 69 66 28 20 21 70 20 29 20 72   i;.  if( !p ) r
1a920 65 74 75 72 6e 3b 0a 20 20 73 75 62 73 74 45 78  eturn;.  substEx
1a930 70 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 45  prList(db, p->pE
1a940 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  List, iTable, pE
1a950 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78  List);.  substEx
1a960 70 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 47  prList(db, p->pG
1a970 72 6f 75 70 42 79 2c 20 69 54 61 62 6c 65 2c 20  roupBy, iTable, 
1a980 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74  pEList);.  subst
1a990 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e  ExprList(db, p->
1a9a0 70 4f 72 64 65 72 42 79 2c 20 69 54 61 62 6c 65  pOrderBy, iTable
1a9b0 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 70 2d 3e  , pEList);.  p->
1a9c0 70 48 61 76 69 6e 67 20 3d 20 73 75 62 73 74 45  pHaving = substE
1a9d0 78 70 72 28 64 62 2c 20 70 2d 3e 70 48 61 76 69  xpr(db, p->pHavi
1a9e0 6e 67 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  ng, iTable, pELi
1a9f0 73 74 29 3b 0a 20 20 70 2d 3e 70 57 68 65 72 65  st);.  p->pWhere
1aa00 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c   = substExpr(db,
1aa10 20 70 2d 3e 70 57 68 65 72 65 2c 20 69 54 61 62   p->pWhere, iTab
1aa20 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73  le, pEList);.  s
1aa30 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70  ubstSelect(db, p
1aa40 2d 3e 70 50 72 69 6f 72 2c 20 69 54 61 62 6c 65  ->pPrior, iTable
1aa50 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 70 53 72  , pEList);.  pSr
1aa60 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61  c = p->pSrc;.  a
1aa70 73 73 65 72 74 28 20 70 53 72 63 20 29 3b 20 20  ssert( pSrc );  
1aa80 2f 2a 20 45 76 65 6e 20 66 6f 72 20 28 53 45 4c  /* Even for (SEL
1aa90 45 43 54 20 31 29 20 77 65 20 68 61 76 65 3a 20  ECT 1) we have: 
1aaa0 70 53 72 63 21 3d 30 20 62 75 74 20 70 53 72 63  pSrc!=0 but pSrc
1aab0 2d 3e 6e 53 72 63 3d 3d 30 20 2a 2f 0a 20 20 69  ->nSrc==0 */.  i
1aac0 66 28 20 41 4c 57 41 59 53 28 70 53 72 63 29 20  f( ALWAYS(pSrc) 
1aad0 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 70 53 72  ){.    for(i=pSr
1aae0 63 2d 3e 6e 53 72 63 2c 20 70 49 74 65 6d 3d 70  c->nSrc, pItem=p
1aaf0 53 72 63 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d  Src->a; i>0; i--
1ab00 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
1ab10 20 20 73 75 62 73 74 53 65 6c 65 63 74 28 64 62    substSelect(db
1ab20 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  , pItem->pSelect
1ab30 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
1ab40 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  );.    }.  }.}.#
1ab50 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
1ab60 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
1ab70 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69  BQUERY) || !defi
1ab80 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
1ab90 56 49 45 57 29 20 2a 2f 0a 0a 23 69 66 20 21 64  VIEW) */..#if !d
1aba0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1abb0 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
1abc0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1abd0 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a  OMIT_VIEW)./*.**
1abe0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74   This routine at
1abf0 74 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65  tempts to flatte
1ac00 6e 20 73 75 62 71 75 65 72 69 65 73 20 61 73 20  n subqueries as 
1ac10 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 70  a performance op
1ac20 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 20 54  timization..** T
1ac30 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
1ac40 72 6e 73 20 31 20 69 66 20 69 74 20 6d 61 6b 65  rns 1 if it make
1ac50 73 20 63 68 61 6e 67 65 73 20 61 6e 64 20 30 20  s changes and 0 
1ac60 69 66 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67  if no flattening
1ac70 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54   occurs..**.** T
1ac80 6f 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65  o understand the
1ac90 20 63 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61 74   concept of flat
1aca0 74 65 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72  tening, consider
1acb0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   the following.*
1acc0 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20  * query:.**.**  
1acd0 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d     SELECT a FROM
1ace0 20 28 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20   (SELECT x+y AS 
1acf0 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  a FROM t1 WHERE 
1ad00 7a 3c 31 30 30 29 20 57 48 45 52 45 20 61 3e 35  z<100) WHERE a>5
1ad10 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75  .**.** The defau
1ad20 6c 74 20 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d  lt way of implem
1ad30 65 6e 74 69 6e 67 20 74 68 69 73 20 71 75 65 72  enting this quer
1ad40 79 20 69 73 20 74 6f 20 65 78 65 63 75 74 65 20  y is to execute 
1ad50 74 68 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20  the.** subquery 
1ad60 66 69 72 73 74 20 61 6e 64 20 73 74 6f 72 65 20  first and store 
1ad70 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61  the results in a
1ad80 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
1ad90 2c 20 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68  , then.** run th
1ada0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6f 6e  e outer query on
1adb0 20 74 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20   that temporary 
1adc0 74 61 62 6c 65 2e 20 20 54 68 69 73 20 72 65 71  table.  This req
1add0 75 69 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73  uires two.** pas
1ade0 73 65 73 20 6f 76 65 72 20 74 68 65 20 64 61 74  ses over the dat
1adf0 61 2e 20 20 46 75 72 74 68 65 72 6d 6f 72 65 2c  a.  Furthermore,
1ae00 20 62 65 63 61 75 73 65 20 74 68 65 20 74 65 6d   because the tem
1ae10 70 6f 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20  porary table.** 
1ae20 68 61 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20  has no indices, 
1ae30 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
1ae40 20 6f 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   on the outer qu
1ae50 65 72 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a  ery cannot be.**
1ae60 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a   optimized..**.*
1ae70 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
1ae80 74 74 65 6d 70 74 73 20 74 6f 20 72 65 77 72 69  ttempts to rewri
1ae90 74 65 20 71 75 65 72 69 65 73 20 73 75 63 68 20  te queries such 
1aea0 61 73 20 74 68 65 20 61 62 6f 76 65 20 69 6e 74  as the above int
1aeb0 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c  o.** a single fl
1aec0 61 74 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20  at select, like 
1aed0 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
1aee0 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20  SELECT x+y AS a 
1aef0 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c  FROM t1 WHERE z<
1af00 31 30 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a  100 AND a>5.**.*
1af10 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72  * The code gener
1af20 61 74 65 64 20 66 6f 72 20 74 68 69 73 20 73 69  ated for this si
1af30 6d 70 69 66 69 63 61 74 69 6f 6e 20 67 69 76 65  mpification give
1af40 73 20 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c  s the same resul
1af50 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61  t.** but only ha
1af60 73 20 74 6f 20 73 63 61 6e 20 74 68 65 20 64 61  s to scan the da
1af70 74 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65  ta once.  And be
1af80 63 61 75 73 65 20 69 6e 64 69 63 65 73 20 6d 69  cause indices mi
1af90 67 68 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e  ght .** exist on
1afa0 20 74 68 65 20 74 61 62 6c 65 20 74 31 2c 20 61   the table t1, a
1afb0 20 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f   complete scan o
1afc0 66 20 74 68 65 20 64 61 74 61 20 6d 69 67 68 74  f the data might
1afd0 20 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a   be.** avoided..
1afe0 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67  **.** Flattening
1aff0 20 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74   is only attempt
1b000 65 64 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65  ed if all of the
1b010 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74   following are t
1b020 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29  rue:.**.**   (1)
1b030 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61    The subquery a
1b040 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  nd the outer que
1b050 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75  ry do not both u
1b060 73 65 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a  se aggregates..*
1b070 2a 0a 2a 2a 20 20 20 28 32 29 20 20 54 68 65 20  *.**   (2)  The 
1b080 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
1b090 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72 20  an aggregate or 
1b0a0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1b0b0 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a  is not a join..*
1b0c0 2a 0a 2a 2a 20 20 20 28 33 29 20 20 54 68 65 20  *.**   (3)  The 
1b0d0 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
1b0e0 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  the right operan
1b0f0 64 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65  d of a left oute
1b100 72 20 6a 6f 69 6e 0a 2a 2a 20 20 20 20 20 20 20  r join.**       
1b110 20 28 4f 72 69 67 69 6e 61 6c 6c 79 20 74 69 63   (Originally tic
1b120 6b 65 74 20 23 33 30 36 2e 20 20 53 74 72 65 6e  ket #306.  Stren
1b130 67 74 68 65 6e 65 64 20 62 79 20 74 69 63 6b 65  gthened by ticke
1b140 74 20 23 33 33 30 30 29 0a 2a 2a 0a 2a 2a 20 20  t #3300).**.**  
1b150 20 28 34 29 20 20 54 68 65 20 73 75 62 71 75 65   (4)  The subque
1b160 72 79 20 69 73 20 6e 6f 74 20 44 49 53 54 49 4e  ry is not DISTIN
1b170 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20  CT..**.**  (**) 
1b180 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 72 65   At one point re
1b190 73 74 72 69 63 74 69 6f 6e 73 20 28 34 29 20 61  strictions (4) a
1b1a0 6e 64 20 28 35 29 20 64 65 66 69 6e 65 64 20 61  nd (5) defined a
1b1b0 20 73 75 62 73 65 74 20 6f 66 20 44 49 53 54 49   subset of DISTI
1b1c0 4e 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 73 75  NCT.**        su
1b1d0 62 2d 71 75 65 72 69 65 73 20 74 68 61 74 20 77  b-queries that w
1b1e0 65 72 65 20 65 78 63 6c 75 64 65 64 20 66 72 6f  ere excluded fro
1b1f0 6d 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74  m this optimizat
1b200 69 6f 6e 2e 20 52 65 73 74 72 69 63 74 69 6f 6e  ion. Restriction
1b210 20 0a 2a 2a 20 20 20 20 20 20 20 20 28 34 29 20   .**        (4) 
1b220 68 61 73 20 73 69 6e 63 65 20 62 65 65 6e 20 65  has since been e
1b230 78 70 61 6e 64 65 64 20 74 6f 20 65 78 63 6c 75  xpanded to exclu
1b240 64 65 20 61 6c 6c 20 44 49 53 54 49 4e 43 54 20  de all DISTINCT 
1b250 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 0a 2a  subqueries..**.*
1b260 2a 20 20 20 28 36 29 20 20 54 68 65 20 73 75 62  *   (6)  The sub
1b270 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
1b280 73 65 20 61 67 67 72 65 67 61 74 65 73 20 6f 72  se aggregates or
1b290 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1b2a0 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20   is not.**      
1b2b0 20 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a    DISTINCT..**.*
1b2c0 2a 20 20 20 28 37 29 20 20 54 68 65 20 73 75 62  *   (7)  The sub
1b2d0 71 75 65 72 79 20 68 61 73 20 61 20 46 52 4f 4d  query has a FROM
1b2e0 20 63 6c 61 75 73 65 2e 20 20 54 4f 44 4f 3a 20   clause.  TODO: 
1b2f0 20 46 6f 72 20 73 75 62 71 75 65 72 69 65 73 20   For subqueries 
1b300 77 69 74 68 6f 75 74 0a 2a 2a 20 20 20 20 20 20  without.**      
1b310 20 20 41 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c    A FROM clause,
1b320 20 63 6f 6e 73 69 64 65 72 20 61 64 64 69 6e 67   consider adding
1b330 20 61 20 46 52 4f 4d 20 63 6c 6f 73 65 20 77 69   a FROM close wi
1b340 74 68 20 74 68 65 20 73 70 65 63 69 61 6c 0a 2a  th the special.*
1b350 2a 20 20 20 20 20 20 20 20 74 61 62 6c 65 20 73  *        table s
1b360 71 6c 69 74 65 5f 6f 6e 63 65 20 74 68 61 74 20  qlite_once that 
1b370 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73 69  consists of a si
1b380 6e 67 6c 65 20 72 6f 77 20 63 6f 6e 74 61 69 6e  ngle row contain
1b390 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20  ing a.**        
1b3a0 73 69 6e 67 6c 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a  single NULL..**.
1b3b0 2a 2a 20 20 20 28 38 29 20 20 54 68 65 20 73 75  **   (8)  The su
1b3c0 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
1b3d0 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65  use LIMIT or the
1b3e0 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
1b3f0 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a  not a join..**.*
1b400 2a 20 20 20 28 39 29 20 20 54 68 65 20 73 75 62  *   (9)  The sub
1b410 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
1b420 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20  se LIMIT or the 
1b430 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73  outer query does
1b440 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20   not use.**     
1b450 20 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a     aggregates..*
1b460 2a 0a 2a 2a 20 20 28 31 30 29 20 20 54 68 65 20  *.**  (10)  The 
1b470 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
1b480 74 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73  t use aggregates
1b490 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
1b4a0 65 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20  ery does not.** 
1b4b0 20 20 20 20 20 20 20 75 73 65 20 4c 49 4d 49 54         use LIMIT
1b4c0 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20 54  ..**.**  (11)  T
1b4d0 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20  he subquery and 
1b4e0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1b4f0 64 6f 20 6e 6f 74 20 62 6f 74 68 20 68 61 76 65  do not both have
1b500 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1b510 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20  s..**.**  (**)  
1b520 4e 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64 2e  Not implemented.
1b530 20 20 53 75 62 73 75 6d 65 64 20 69 6e 74 6f 20    Subsumed into 
1b540 72 65 73 74 72 69 63 74 69 6f 6e 20 28 33 29 2e  restriction (3).
1b550 20 20 57 61 73 20 70 72 65 76 69 6f 75 73 6c 79    Was previously
1b560 0a 2a 2a 20 20 20 20 20 20 20 20 61 20 73 65 70  .**        a sep
1b570 61 72 61 74 65 20 72 65 73 74 72 69 63 74 69 6f  arate restrictio
1b580 6e 20 64 65 72 69 76 69 6e 67 20 66 72 6f 6d 20  n deriving from 
1b590 74 69 63 6b 65 74 20 23 33 35 30 2e 0a 2a 2a 0a  ticket #350..**.
1b5a0 2a 2a 20 20 28 31 33 29 20 20 54 68 65 20 73 75  **  (13)  The su
1b5b0 62 71 75 65 72 79 20 61 6e 64 20 6f 75 74 65 72  bquery and outer
1b5c0 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f   query do not bo
1b5d0 74 68 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a  th use LIMIT..**
1b5e0 0a 2a 2a 20 20 28 31 34 29 20 20 54 68 65 20 73  .**  (14)  The s
1b5f0 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
1b600 20 75 73 65 20 4f 46 46 53 45 54 2e 0a 2a 2a 0a   use OFFSET..**.
1b610 2a 2a 20 20 28 31 35 29 20 20 54 68 65 20 6f 75  **  (15)  The ou
1b620 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74  ter query is not
1b630 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f   part of a compo
1b640 75 6e 64 20 73 65 6c 65 63 74 20 6f 72 20 74 68  und select or th
1b650 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62 71  e.**        subq
1b660 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 68 61  uery does not ha
1b670 76 65 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73  ve a LIMIT claus
1b680 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 28 53 65  e..**        (Se
1b690 65 20 74 69 63 6b 65 74 20 23 32 33 33 39 20 61  e ticket #2339 a
1b6a0 6e 64 20 74 69 63 6b 65 74 20 5b 30 32 61 38 65  nd ticket [02a8e
1b6b0 38 31 64 34 34 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20  81d44])..**.**  
1b6c0 28 31 36 29 20 20 54 68 65 20 6f 75 74 65 72 20  (16)  The outer 
1b6d0 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20  query is not an 
1b6e0 61 67 67 72 65 67 61 74 65 20 6f 72 20 74 68 65  aggregate or the
1b6f0 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 0a 2a   subquery does.*
1b700 2a 20 20 20 20 20 20 20 20 6e 6f 74 20 63 6f 6e  *        not con
1b710 74 61 69 6e 20 4f 52 44 45 52 20 42 59 2e 20 20  tain ORDER BY.  
1b720 28 54 69 63 6b 65 74 20 23 32 39 34 32 29 20 20  (Ticket #2942)  
1b730 54 68 69 73 20 75 73 65 64 20 74 6f 20 6e 6f 74  This used to not
1b740 20 6d 61 74 74 65 72 0a 2a 2a 20 20 20 20 20 20   matter.**      
1b750 20 20 75 6e 74 69 6c 20 77 65 20 69 6e 74 72 6f    until we intro
1b760 64 75 63 65 64 20 74 68 65 20 67 72 6f 75 70 5f  duced the group_
1b770 63 6f 6e 63 61 74 28 29 20 66 75 6e 63 74 69 6f  concat() functio
1b780 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20 20 28 31 37 29  n.  .**.**  (17)
1b790 20 20 54 68 65 20 73 75 62 2d 71 75 65 72 79 20    The sub-query 
1b7a0 69 73 20 6e 6f 74 20 61 20 63 6f 6d 70 6f 75 6e  is not a compoun
1b7b0 64 20 73 65 6c 65 63 74 2c 20 6f 72 20 69 74 20  d select, or it 
1b7c0 69 73 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 0a  is a UNION ALL .
1b7d0 2a 2a 20 20 20 20 20 20 20 20 63 6f 6d 70 6f 75  **        compou
1b7e0 6e 64 20 63 6c 61 75 73 65 20 6d 61 64 65 20 75  nd clause made u
1b7f0 70 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 6e 6f  p entirely of no
1b800 6e 2d 61 67 67 72 65 67 61 74 65 20 71 75 65 72  n-aggregate quer
1b810 69 65 73 2c 20 61 6e 64 20 0a 2a 2a 20 20 20 20  ies, and .**    
1b820 20 20 20 20 74 68 65 20 70 61 72 65 6e 74 20 71      the parent q
1b830 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  uery:.**.**     
1b840 20 20 20 20 20 2a 20 69 73 20 6e 6f 74 20 69 74       * is not it
1b850 73 65 6c 66 20 70 61 72 74 20 6f 66 20 61 20 63  self part of a c
1b860 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 0a  ompound select,.
1b870 2a 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69 73  **          * is
1b880 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74   not an aggregat
1b890 65 20 6f 72 20 44 49 53 54 49 4e 43 54 20 71 75  e or DISTINCT qu
1b8a0 65 72 79 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 20  ery, and.**     
1b8b0 20 20 20 20 20 2a 20 69 73 20 6e 6f 74 20 61 20       * is not a 
1b8c0 6a 6f 69 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  join.**.**      
1b8d0 20 20 54 68 65 20 70 61 72 65 6e 74 20 61 6e 64    The parent and
1b8e0 20 73 75 62 2d 71 75 65 72 79 20 6d 61 79 20 63   sub-query may c
1b8f0 6f 6e 74 61 69 6e 20 57 48 45 52 45 20 63 6c 61  ontain WHERE cla
1b900 75 73 65 73 2e 20 53 75 62 6a 65 63 74 20 74 6f  uses. Subject to
1b910 0a 2a 2a 20 20 20 20 20 20 20 20 72 75 6c 65 73  .**        rules
1b920 20 28 31 31 29 2c 20 28 31 33 29 20 61 6e 64 20   (11), (13) and 
1b930 28 31 34 29 2c 20 74 68 65 79 20 6d 61 79 20 61  (14), they may a
1b940 6c 73 6f 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45  lso contain ORDE
1b950 52 20 42 59 2c 0a 2a 2a 20 20 20 20 20 20 20 20  R BY,.**        
1b960 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
1b970 20 63 6c 61 75 73 65 73 2e 20 20 54 68 65 20 73   clauses.  The s
1b980 75 62 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 75  ubquery cannot u
1b990 73 65 20 61 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a  se any compound.
1b9a0 2a 2a 20 20 20 20 20 20 20 20 6f 70 65 72 61 74  **        operat
1b9b0 6f 72 20 6f 74 68 65 72 20 74 68 61 6e 20 55 4e  or other than UN
1b9c0 49 4f 4e 20 41 4c 4c 20 62 65 63 61 75 73 65 20  ION ALL because 
1b9d0 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 63 6f  all the other co
1b9e0 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20  mpound.**       
1b9f0 20 6f 70 65 72 61 74 6f 72 73 20 68 61 76 65 20   operators have 
1ba00 61 6e 20 69 6d 70 6c 69 65 64 20 44 49 53 54 49  an implied DISTI
1ba10 4e 43 54 20 77 68 69 63 68 20 69 73 20 64 69 73  NCT which is dis
1ba20 61 6c 6c 6f 77 65 64 20 62 79 0a 2a 2a 20 20 20  allowed by.**   
1ba30 20 20 20 20 20 72 65 73 74 72 69 63 74 69 6f 6e       restriction
1ba40 20 28 34 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20   (4)..**.**     
1ba50 20 20 20 41 6c 73 6f 2c 20 65 61 63 68 20 63 6f     Also, each co
1ba60 6d 70 6f 6e 65 6e 74 20 6f 66 20 74 68 65 20 73  mponent of the s
1ba70 75 62 2d 71 75 65 72 79 20 6d 75 73 74 20 72 65  ub-query must re
1ba80 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20 6e 75  turn the same nu
1ba90 6d 62 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 6f  mber.**        o
1baa0 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
1bab0 2e 20 54 68 69 73 20 69 73 20 61 63 74 75 61 6c  . This is actual
1bac0 6c 79 20 61 20 72 65 71 75 69 72 65 6d 65 6e 74  ly a requirement
1bad0 20 66 6f 72 20 61 6e 79 20 63 6f 6d 70 6f 75 6e   for any compoun
1bae0 64 0a 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45  d.**        SELE
1baf0 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 75  CT statement, bu
1bb00 74 20 61 6c 6c 20 74 68 65 20 63 6f 64 65 20 68  t all the code h
1bb10 65 72 65 20 64 6f 65 73 20 69 73 20 6d 61 6b 65  ere does is make
1bb20 20 73 75 72 65 20 74 68 61 74 20 6e 6f 0a 2a 2a   sure that no.**
1bb30 20 20 20 20 20 20 20 20 73 75 63 68 20 28 69 6c          such (il
1bb40 6c 65 67 61 6c 29 20 73 75 62 2d 71 75 65 72 79  legal) sub-query
1bb50 20 69 73 20 66 6c 61 74 74 65 6e 65 64 2e 20 54   is flattened. T
1bb60 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 64  he caller will d
1bb70 65 74 65 63 74 20 74 68 65 0a 2a 2a 20 20 20 20  etect the.**    
1bb80 20 20 20 20 73 79 6e 74 61 78 20 65 72 72 6f 72      syntax error
1bb90 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 64 65   and return a de
1bba0 74 61 69 6c 65 64 20 6d 65 73 73 61 67 65 2e 0a  tailed message..
1bbb0 2a 2a 0a 2a 2a 20 20 28 31 38 29 20 20 49 66 20  **.**  (18)  If 
1bbc0 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73  the sub-query is
1bbd0 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65   a compound sele
1bbe0 63 74 2c 20 74 68 65 6e 20 61 6c 6c 20 74 65 72  ct, then all ter
1bbf0 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20  ms of the.**    
1bc00 20 20 20 20 4f 52 44 45 52 20 62 79 20 63 6c 61      ORDER by cla
1bc10 75 73 65 20 6f 66 20 74 68 65 20 70 61 72 65 6e  use of the paren
1bc20 74 20 6d 75 73 74 20 62 65 20 73 69 6d 70 6c 65  t must be simple
1bc30 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 0a   references to .
1bc40 2a 2a 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e  **        column
1bc50 73 20 6f 66 20 74 68 65 20 73 75 62 2d 71 75 65  s of the sub-que
1bc60 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 39 29 20  ry..**.**  (19) 
1bc70 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
1bc80 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54  es not use LIMIT
1bc90 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
1bca0 65 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20  ery does not.** 
1bcb0 20 20 20 20 20 20 20 68 61 76 65 20 61 20 57 48         have a WH
1bcc0 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a  ERE clause..**.*
1bcd0 2a 20 20 28 32 30 29 20 20 49 66 20 74 68 65 20  *  (20)  If the 
1bce0 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63  sub-query is a c
1bcf0 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20  ompound select, 
1bd00 74 68 65 6e 20 69 74 20 6d 75 73 74 20 6e 6f 74  then it must not
1bd10 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61   use.**        a
1bd20 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
1bd30 65 2e 20 20 54 69 63 6b 65 74 20 23 33 37 37 33  e.  Ticket #3773
1bd40 2e 20 20 57 65 20 63 6f 75 6c 64 20 72 65 6c 61  .  We could rela
1bd50 78 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e  x this constrain
1bd60 74 0a 2a 2a 20 20 20 20 20 20 20 20 73 6f 6d 65  t.**        some
1bd70 77 68 61 74 20 62 79 20 73 61 79 69 6e 67 20 74  what by saying t
1bd80 68 61 74 20 74 68 65 20 74 65 72 6d 73 20 6f 66  hat the terms of
1bd90 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
1bda0 61 75 73 65 20 6d 75 73 74 0a 2a 2a 20 20 20 20  ause must.**    
1bdb0 20 20 20 20 61 70 70 65 61 72 20 61 73 20 75 6e      appear as un
1bdc0 6d 6f 64 69 66 69 65 64 20 72 65 73 75 6c 74 20  modified result 
1bdd0 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f  columns in the o
1bde0 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 75 74  uter query.  But
1bdf0 20 77 65 0a 2a 2a 20 20 20 20 20 20 20 20 68 61   we.**        ha
1be00 76 65 20 6f 74 68 65 72 20 6f 70 74 69 6d 69 7a  ve other optimiz
1be10 61 74 69 6f 6e 73 20 69 6e 20 6d 69 6e 64 20 74  ations in mind t
1be20 6f 20 64 65 61 6c 20 77 69 74 68 20 74 68 61 74  o deal with that
1be30 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32   case..**.**  (2
1be40 31 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  1)  The subquery
1be50 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49   does not use LI
1be60 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72  MIT or the outer
1be70 20 71 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a   query is not.**
1be80 20 20 20 20 20 20 20 20 44 49 53 54 49 4e 43 54          DISTINCT
1be90 2e 20 20 28 53 65 65 20 74 69 63 6b 65 74 20 5b  .  (See ticket [
1bea0 37 35 32 65 31 36 34 36 66 63 5d 29 2e 0a 2a 2a  752e1646fc])..**
1beb0 0a 2a 2a 20 20 28 32 32 29 20 20 54 68 65 20 73  .**  (22)  The s
1bec0 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  ubquery is not a
1bed0 20 72 65 63 75 72 73 69 76 65 20 43 54 45 2e 0a   recursive CTE..
1bee0 2a 2a 0a 2a 2a 20 20 28 32 33 29 20 20 54 68 65  **.**  (23)  The
1bef0 20 70 61 72 65 6e 74 20 69 73 20 6e 6f 74 20 61   parent is not a
1bf00 20 72 65 63 75 72 73 69 76 65 20 43 54 45 2c 20   recursive CTE, 
1bf10 6f 72 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  or the sub-query
1bf20 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 20 20 20   is not a.**    
1bf30 20 20 20 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65      compound que
1bf40 72 79 2e 20 54 68 69 73 20 72 65 73 74 72 69 63  ry. This restric
1bf50 74 69 6f 6e 20 69 73 20 62 65 63 61 75 73 65 20  tion is because 
1bf60 74 72 61 6e 73 66 6f 72 6d 69 6e 67 20 74 68 65  transforming the
1bf70 0a 2a 2a 20 20 20 20 20 20 20 20 70 61 72 65 6e  .**        paren
1bf80 74 20 74 6f 20 61 20 63 6f 6d 70 6f 75 6e 64 20  t to a compound 
1bf90 71 75 65 72 79 20 63 6f 6e 66 75 73 65 73 20 74  query confuses t
1bfa0 68 65 20 63 6f 64 65 20 74 68 61 74 20 68 61 6e  he code that han
1bfb0 64 6c 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 72  dles.**        r
1bfc0 65 63 75 72 73 69 76 65 20 71 75 65 72 69 65 73  ecursive queries
1bfd0 20 69 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 28   in multiSelect(
1bfe0 29 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  )..**.**.** In t
1bff0 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65  his routine, the
1c000 20 22 70 22 20 70 61 72 61 6d 65 74 65 72 20 69   "p" parameter i
1c010 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
1c020 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a  he outer query..
1c030 2a 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20  ** The subquery 
1c040 69 73 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46  is p->pSrc->a[iF
1c050 72 6f 6d 5d 2e 20 20 69 73 41 67 67 20 69 73 20  rom].  isAgg is 
1c060 74 72 75 65 20 69 66 20 74 68 65 20 6f 75 74 65  true if the oute
1c070 72 20 71 75 65 72 79 0a 2a 2a 20 75 73 65 73 20  r query.** uses 
1c080 61 67 67 72 65 67 61 74 65 73 20 61 6e 64 20 73  aggregates and s
1c090 75 62 71 75 65 72 79 49 73 41 67 67 20 69 73 20  ubqueryIsAgg is 
1c0a0 74 72 75 65 20 69 66 20 74 68 65 20 73 75 62 71  true if the subq
1c0b0 75 65 72 79 20 75 73 65 73 20 61 67 67 72 65 67  uery uses aggreg
1c0c0 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66  ates..**.** If f
1c0d0 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74  lattening is not
1c0e0 20 61 74 74 65 6d 70 74 65 64 2c 20 74 68 69 73   attempted, this
1c0f0 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
1c100 2d 6f 70 20 61 6e 64 20 72 65 74 75 72 6e 73 20  -op and returns 
1c110 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e  0..** If flatten
1c120 69 6e 67 20 69 73 20 61 74 74 65 6d 70 74 65 64  ing is attempted
1c130 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
1c140 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41  turns 1..**.** A
1c150 6c 6c 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  ll of the expres
1c160 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75  sion analysis mu
1c170 73 74 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68  st occur on both
1c180 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1c190 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62 71   and.** the subq
1c1a0 75 65 72 79 20 62 65 66 6f 72 65 20 74 68 69 73  uery before this
1c1b0 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a   routine runs..*
1c1c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 61  /.static int fla
1c1d0 74 74 65 6e 53 75 62 71 75 65 72 79 28 0a 20 20  ttenSubquery(.  
1c1e0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
1c1f0 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
1c200 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
1c210 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
1c220 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20    /* The parent 
1c230 6f 72 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20  or outer SELECT 
1c240 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  statement */.  i
1c250 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20  nt iFrom,       
1c260 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20      /* Index in 
1c270 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20  p->pSrc->a[] of 
1c280 74 68 65 20 69 6e 6e 65 72 20 73 75 62 71 75 65  the inner subque
1c290 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67  ry */.  int isAg
1c2a0 67 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  g,           /* 
1c2b0 54 72 75 65 20 69 66 20 6f 75 74 65 72 20 53 45  True if outer SE
1c2c0 4c 45 43 54 20 75 73 65 73 20 61 67 67 72 65 67  LECT uses aggreg
1c2d0 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f  ate functions */
1c2e0 0a 20 20 69 6e 74 20 73 75 62 71 75 65 72 79 49  .  int subqueryI
1c2f0 73 41 67 67 20 20 20 20 2f 2a 20 54 72 75 65 20  sAgg    /* True 
1c300 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  if the subquery 
1c310 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66  uses aggregate f
1c320 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20  unctions */.){. 
1c330 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 61   const char *zSa
1c340 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d  vedAuthContext =
1c350 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f   pParse->zAuthCo
1c360 6e 74 65 78 74 3b 0a 20 20 53 65 6c 65 63 74 20  ntext;.  Select 
1c370 2a 70 50 61 72 65 6e 74 3b 0a 20 20 53 65 6c 65  *pParent;.  Sele
1c380 63 74 20 2a 70 53 75 62 3b 20 20 20 20 20 20 20  ct *pSub;       
1c390 2f 2a 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65  /* The inner que
1c3a0 72 79 20 6f 72 20 22 73 75 62 71 75 65 72 79 22  ry or "subquery"
1c3b0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
1c3c0 75 62 31 3b 20 20 20 20 20 20 2f 2a 20 50 6f 69  ub1;      /* Poi
1c3d0 6e 74 65 72 20 74 6f 20 74 68 65 20 72 69 67 68  nter to the righ
1c3e0 74 6d 6f 73 74 20 73 65 6c 65 63 74 20 69 6e 20  tmost select in 
1c3f0 73 75 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20 53  sub-query */.  S
1c400 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20  rcList *pSrc;   
1c410 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
1c420 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74  lause of the out
1c430 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 72  er query */.  Sr
1c440 63 4c 69 73 74 20 2a 70 53 75 62 53 72 63 3b 20  cList *pSubSrc; 
1c450 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
1c460 61 75 73 65 20 6f 66 20 74 68 65 20 73 75 62 71  ause of the subq
1c470 75 65 72 79 20 2a 2f 0a 20 20 45 78 70 72 4c 69  uery */.  ExprLi
1c480 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20 2f 2a  st *pList;    /*
1c490 20 54 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   The result set 
1c4a0 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
1c4b0 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72  ry */.  int iPar
1c4c0 65 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 56  ent;        /* V
1c4d0 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  DBE cursor numbe
1c4e0 72 20 6f 66 20 74 68 65 20 70 53 75 62 20 72 65  r of the pSub re
1c4f0 73 75 6c 74 20 73 65 74 20 74 65 6d 70 20 74 61  sult set temp ta
1c500 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ble */.  int i; 
1c510 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c520 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
1c530 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20    Expr *pWhere; 
1c540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c550 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
1c560 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
1c570 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1c580 2a 70 53 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20  *pSubitem;   /* 
1c590 54 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  The subquery */.
1c5a0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1c5b0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f  pParse->db;..  /
1c5c0 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
1c5d0 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  f flattening is 
1c5e0 70 65 72 6d 69 74 74 65 64 2e 20 20 52 65 74 75  permitted.  Retu
1c5f0 72 6e 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a  rn 0 if not..  *
1c600 2f 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  /.  assert( p!=0
1c610 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
1c620 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 20 20 2f  >pPrior==0 );  /
1c630 2a 20 55 6e 61 62 6c 65 20 74 6f 20 66 6c 61 74  * Unable to flat
1c640 74 65 6e 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  ten compound que
1c650 72 69 65 73 20 2a 2f 0a 20 20 69 66 28 20 4f 70  ries */.  if( Op
1c660 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c  timizationDisabl
1c670 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 51 75  ed(db, SQLITE_Qu
1c680 65 72 79 46 6c 61 74 74 65 6e 65 72 29 20 29 20  eryFlattener) ) 
1c690 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 53 72 63  return 0;.  pSrc
1c6a0 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73   = p->pSrc;.  as
1c6b0 73 65 72 74 28 20 70 53 72 63 20 26 26 20 69 46  sert( pSrc && iF
1c6c0 72 6f 6d 3e 3d 30 20 26 26 20 69 46 72 6f 6d 3c  rom>=0 && iFrom<
1c6d0 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20  pSrc->nSrc );.  
1c6e0 70 53 75 62 69 74 65 6d 20 3d 20 26 70 53 72 63  pSubitem = &pSrc
1c6f0 2d 3e 61 5b 69 46 72 6f 6d 5d 3b 0a 20 20 69 50  ->a[iFrom];.  iP
1c700 61 72 65 6e 74 20 3d 20 70 53 75 62 69 74 65 6d  arent = pSubitem
1c710 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70 53 75  ->iCursor;.  pSu
1c720 62 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53  b = pSubitem->pS
1c730 65 6c 65 63 74 3b 0a 20 20 61 73 73 65 72 74 28  elect;.  assert(
1c740 20 70 53 75 62 21 3d 30 20 29 3b 0a 20 20 69 66   pSub!=0 );.  if
1c750 28 20 69 73 41 67 67 20 26 26 20 73 75 62 71 75  ( isAgg && subqu
1c760 65 72 79 49 73 41 67 67 20 29 20 72 65 74 75 72  eryIsAgg ) retur
1c770 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
1c780 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1c790 69 6f 6e 20 28 31 29 20 20 2a 2f 0a 20 20 69 66  ion (1)  */.  if
1c7a0 28 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  ( subqueryIsAgg 
1c7b0 26 26 20 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20  && pSrc->nSrc>1 
1c7c0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
1c7d0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1c7e0 69 6f 6e 20 28 32 29 20 20 2a 2f 0a 20 20 70 53  ion (2)  */.  pS
1c7f0 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53  ubSrc = pSub->pS
1c800 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  rc;.  assert( pS
1c810 75 62 53 72 63 20 29 3b 0a 20 20 2f 2a 20 50 72  ubSrc );.  /* Pr
1c820 69 6f 72 20 74 6f 20 76 65 72 73 69 6f 6e 20 33  ior to version 3
1c830 2e 31 2e 32 2c 20 77 68 65 6e 20 4c 49 4d 49 54  .1.2, when LIMIT
1c840 20 61 6e 64 20 4f 46 46 53 45 54 20 68 61 64 20   and OFFSET had 
1c850 74 6f 20 62 65 20 73 69 6d 70 6c 65 20 63 6f 6e  to be simple con
1c860 73 74 61 6e 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74  stants,.  ** not
1c870 20 61 72 62 69 74 72 61 72 79 20 65 78 70 72 65   arbitrary expre
1c880 73 73 73 69 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f  sssions, we allo
1c890 77 65 64 20 73 6f 6d 65 20 63 6f 6d 62 69 6e 69  wed some combini
1c8a0 6e 67 20 6f 66 20 4c 49 4d 49 54 20 61 6e 64 20  ng of LIMIT and 
1c8b0 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61  OFFSET.  ** beca
1c8c0 75 73 65 20 74 68 65 79 20 63 6f 75 6c 64 20 62  use they could b
1c8d0 65 20 63 6f 6d 70 75 74 65 64 20 61 74 20 63 6f  e computed at co
1c8e0 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20 42 75 74  mpile-time.  But
1c8f0 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20   when LIMIT and 
1c900 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61  OFFSET.  ** beca
1c910 6d 65 20 61 72 62 69 74 72 61 72 79 20 65 78 70  me arbitrary exp
1c920 72 65 73 73 69 6f 6e 73 2c 20 77 65 20 77 65 72  ressions, we wer
1c930 65 20 66 6f 72 63 65 64 20 74 6f 20 61 64 64 20  e forced to add 
1c940 72 65 73 74 72 69 63 74 69 6f 6e 73 20 28 31 33  restrictions (13
1c950 29 0a 20 20 2a 2a 20 61 6e 64 20 28 31 34 29 2e  ).  ** and (14).
1c960 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
1c970 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 4c 69  pLimit && p->pLi
1c980 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20  mit ) return 0; 
1c990 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c9a0 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 33 29  Restriction (13)
1c9b0 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
1c9c0 70 4f 66 66 73 65 74 20 29 20 72 65 74 75 72 6e  pOffset ) return
1c9d0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1c9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c9f0 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 34 29  Restriction (14)
1ca00 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73 65   */.  if( (p->se
1ca10 6c 46 6c 61 67 73 20 26 20 53 46 5f 43 6f 6d 70  lFlags & SF_Comp
1ca20 6f 75 6e 64 29 21 3d 30 20 26 26 20 70 53 75 62  ound)!=0 && pSub
1ca30 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->pLimit ){.    
1ca40 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
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 20 20 20 20 20 20 20                  
1ca70 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1ca80 69 6f 6e 20 28 31 35 29 20 2a 2f 0a 20 20 7d 0a  ion (15) */.  }.
1ca90 20 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e    if( pSubSrc->n
1caa0 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Src==0 ) return 
1cab0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1cac0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
1cad0 72 69 63 74 69 6f 6e 20 28 37 29 20 20 2a 2f 0a  riction (7)  */.
1cae0 20 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46    if( pSub->selF
1caf0 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
1cb00 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  ct ) return 0;  
1cb10 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
1cb20 72 69 63 74 69 6f 6e 20 28 35 29 20 20 2a 2f 0a  riction (5)  */.
1cb30 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d    if( pSub->pLim
1cb40 69 74 20 26 26 20 28 70 53 72 63 2d 3e 6e 53 72  it && (pSrc->nSr
1cb50 63 3e 31 20 7c 7c 20 69 73 41 67 67 29 20 29 7b  c>1 || isAgg) ){
1cb60 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  .     return 0; 
1cb70 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1cb80 69 63 74 69 6f 6e 73 20 28 38 29 28 39 29 20 2a  ictions (8)(9) *
1cb90 2f 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e  /.  }.  if( (p->
1cba0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
1cbb0 73 74 69 6e 63 74 29 21 3d 30 20 26 26 20 73 75  stinct)!=0 && su
1cbc0 62 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20  bqueryIsAgg ){. 
1cbd0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
1cbe0 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1cbf0 74 69 6f 6e 20 28 36 29 20 20 2a 2f 0a 20 20 7d  tion (6)  */.  }
1cc00 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72  .  if( p->pOrder
1cc10 42 79 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64  By && pSub->pOrd
1cc20 65 72 42 79 20 29 7b 0a 20 20 20 20 20 72 65 74  erBy ){.     ret
1cc30 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
1cc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc60 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1cc70 28 31 31 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  (11) */.  }.  if
1cc80 28 20 69 73 41 67 67 20 26 26 20 70 53 75 62 2d  ( isAgg && pSub-
1cc90 3e 70 4f 72 64 65 72 42 79 20 29 20 72 65 74 75  >pOrderBy ) retu
1cca0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1ccb0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1ccc0 69 6f 6e 20 28 31 36 29 20 2a 2f 0a 20 20 69 66  ion (16) */.  if
1ccd0 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26  ( pSub->pLimit &
1cce0 26 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65  & p->pWhere ) re
1ccf0 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
1cd00 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1cd10 69 6f 6e 20 28 31 39 29 20 2a 2f 0a 20 20 69 66  ion (19) */.  if
1cd20 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26  ( pSub->pLimit &
1cd30 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  & (p->selFlags &
1cd40 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30   SF_Distinct)!=0
1cd50 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20   ){.     return 
1cd60 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  0;         /* Re
1cd70 73 74 72 69 63 74 69 6f 6e 20 28 32 31 29 20 2a  striction (21) *
1cd80 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62  /.  }.  if( pSub
1cd90 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
1cda0 52 65 63 75 72 73 69 76 65 20 29 20 72 65 74 75  Recursive ) retu
1cdb0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f  rn 0;          /
1cdc0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32  * Restriction (2
1cdd0 32 29 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d  2)  */.  if( (p-
1cde0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52  >selFlags & SF_R
1cdf0 65 63 75 72 73 69 76 65 29 20 26 26 20 70 53 75  ecursive) && pSu
1ce00 62 2d 3e 70 50 72 69 6f 72 20 29 20 72 65 74 75  b->pPrior ) retu
1ce10 72 6e 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 28  rn 0;       /* (
1ce20 32 33 29 20 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 42  23)  */..  /* OB
1ce30 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 20 31  SOLETE COMMENT 1
1ce40 3a 0a 20 20 2a 2a 20 52 65 73 74 72 69 63 74 69  :.  ** Restricti
1ce50 6f 6e 20 33 3a 20 20 49 66 20 74 68 65 20 73 75  on 3:  If the su
1ce60 62 71 75 65 72 79 20 69 73 20 61 20 6a 6f 69 6e  bquery is a join
1ce70 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  , make sure the 
1ce80 73 75 62 71 75 65 72 79 20 69 73 20 0a 20 20 2a  subquery is .  *
1ce90 2a 20 6e 6f 74 20 75 73 65 64 20 61 73 20 74 68  * not used as th
1cea0 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  e right operand 
1ceb0 6f 66 20 61 6e 20 6f 75 74 65 72 20 6a 6f 69 6e  of an outer join
1cec0 2e 20 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 77  .  Examples of w
1ced0 68 79 20 74 68 69 73 0a 20 20 2a 2a 20 69 73 20  hy this.  ** is 
1cee0 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a  not allowed:.  *
1cef0 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74  *.  **         t
1cf00 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  1 LEFT OUTER JOI
1cf10 4e 20 28 74 32 20 4a 4f 49 4e 20 74 33 29 0a 20  N (t2 JOIN t3). 
1cf20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66   **.  ** If we f
1cf30 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65  latten the above
1cf40 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20  , we would get. 
1cf50 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
1cf60 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20   (t1 LEFT OUTER 
1cf70 4a 4f 49 4e 20 74 32 29 20 4a 4f 49 4e 20 74 33  JOIN t2) JOIN t3
1cf80 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68  .  **.  ** which
1cf90 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 74   is not at all t
1cfa0 68 65 20 73 61 6d 65 20 74 68 69 6e 67 2e 0a 20  he same thing.. 
1cfb0 20 2a 2a 0a 20 20 2a 2a 20 4f 42 53 4f 4c 45 54   **.  ** OBSOLET
1cfc0 45 20 43 4f 4d 4d 45 4e 54 20 32 3a 0a 20 20 2a  E COMMENT 2:.  *
1cfd0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 32  * Restriction 12
1cfe0 3a 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65  :  If the subque
1cff0 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20  ry is the right 
1d000 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66  operand of a lef
1d010 74 20 6f 75 74 65 72 0a 20 20 2a 2a 20 6a 6f 69  t outer.  ** joi
1d020 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  n, make sure the
1d030 20 73 75 62 71 75 65 72 79 20 68 61 73 20 6e 6f   subquery has no
1d040 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 20   WHERE clause.. 
1d050 20 2a 2a 20 41 6e 20 65 78 61 6d 70 6c 65 73 20   ** An examples 
1d060 6f 66 20 77 68 79 20 74 68 69 73 20 69 73 20 6e  of why this is n
1d070 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a  ot allowed:.  **
1d080 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31  .  **         t1
1d090 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
1d0a0 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   (SELECT * FROM 
1d0b0 74 32 20 57 48 45 52 45 20 74 32 2e 78 3e 30 29  t2 WHERE t2.x>0)
1d0c0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65  .  **.  ** If we
1d0d0 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f   flatten the abo
1d0e0 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74  ve, we would get
1d0f0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
1d100 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45     (t1 LEFT OUTE
1d110 52 20 4a 4f 49 4e 20 74 32 29 20 57 48 45 52 45  R JOIN t2) WHERE
1d120 20 74 32 2e 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a   t2.x>0.  **.  *
1d130 2a 20 42 75 74 20 74 68 65 20 74 32 2e 78 3e 30  * But the t2.x>0
1d140 20 74 65 73 74 20 77 69 6c 6c 20 61 6c 77 61 79   test will alway
1d150 73 20 66 61 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c  s fail on a NULL
1d160 20 72 6f 77 20 6f 66 20 74 32 2c 20 77 68 69 63   row of t2, whic
1d170 68 0a 20 20 2a 2a 20 65 66 66 65 63 74 69 76 65  h.  ** effective
1d180 6c 79 20 63 6f 6e 76 65 72 74 73 20 74 68 65 20  ly converts the 
1d190 4f 55 54 45 52 20 4a 4f 49 4e 20 69 6e 74 6f 20  OUTER JOIN into 
1d1a0 61 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20  an INNER JOIN.. 
1d1b0 20 2a 2a 0a 20 20 2a 2a 20 54 48 49 53 20 4f 56   **.  ** THIS OV
1d1c0 45 52 52 49 44 45 53 20 4f 42 53 4f 4c 45 54 45  ERRIDES OBSOLETE
1d1d0 20 43 4f 4d 4d 45 4e 54 53 20 31 20 41 4e 44 20   COMMENTS 1 AND 
1d1e0 32 20 41 42 4f 56 45 3a 0a 20 20 2a 2a 20 54 69  2 ABOVE:.  ** Ti
1d1f0 63 6b 65 74 20 23 33 33 30 30 20 73 68 6f 77 73  cket #3300 shows
1d200 20 74 68 61 74 20 66 6c 61 74 74 65 6e 69 6e 67   that flattening
1d210 20 74 68 65 20 72 69 67 68 74 20 74 65 72 6d 20   the right term 
1d220 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 0a 20  of a LEFT JOIN. 
1d230 20 2a 2a 20 69 73 20 66 72 61 75 67 68 74 20 77   ** is fraught w
1d240 69 74 68 20 64 61 6e 67 65 72 2e 20 20 42 65 73  ith danger.  Bes
1d250 74 20 74 6f 20 61 76 6f 69 64 20 74 68 65 20 77  t to avoid the w
1d260 68 6f 6c 65 20 74 68 69 6e 67 2e 20 20 49 66 20  hole thing.  If 
1d270 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72  the.  ** subquer
1d280 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20 74  y is the right t
1d290 65 72 6d 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  erm of a LEFT JO
1d2a0 49 4e 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20  IN, then do not 
1d2b0 66 6c 61 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20  flatten..  */.  
1d2c0 69 66 28 20 28 70 53 75 62 69 74 65 6d 2d 3e 6a  if( (pSubitem->j
1d2d0 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54  ointype & JT_OUT
1d2e0 45 52 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  ER)!=0 ){.    re
1d2f0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
1d300 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 37  * Restriction 17
1d310 3a 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65  : If the sub-que
1d320 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ry is a compound
1d330 20 53 45 4c 45 43 54 2c 20 74 68 65 6e 20 69 74   SELECT, then it
1d340 20 6d 75 73 74 0a 20 20 2a 2a 20 75 73 65 20 6f   must.  ** use o
1d350 6e 6c 79 20 74 68 65 20 55 4e 49 4f 4e 20 41 4c  nly the UNION AL
1d360 4c 20 6f 70 65 72 61 74 6f 72 2e 20 41 6e 64 20  L operator. And 
1d370 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 69 6d 70  none of the simp
1d380 6c 65 20 73 65 6c 65 63 74 20 71 75 65 72 69 65  le select querie
1d390 73 0a 20 20 2a 2a 20 74 68 61 74 20 6d 61 6b 65  s.  ** that make
1d3a0 20 75 70 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   up the compound
1d3b0 20 53 45 4c 45 43 54 20 61 72 65 20 61 6c 6c 6f   SELECT are allo
1d3c0 77 65 64 20 74 6f 20 62 65 20 61 67 67 72 65 67  wed to be aggreg
1d3d0 61 74 65 20 6f 72 20 64 69 73 74 69 6e 63 74 0a  ate or distinct.
1d3e0 20 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20 20    ** queries..  
1d3f0 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
1d400 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66 28  Prior ){.    if(
1d410 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
1d420 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1d430 30 3b 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69  0;  /* Restricti
1d440 6f 6e 20 32 30 20 2a 2f 0a 20 20 20 20 7d 0a 20  on 20 */.    }. 
1d450 20 20 20 69 66 28 20 69 73 41 67 67 20 7c 7c 20     if( isAgg || 
1d460 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
1d470 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20 7c  F_Distinct)!=0 |
1d480 7c 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20  | pSrc->nSrc!=1 
1d490 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1d4a0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  0;.    }.    for
1d4b0 28 70 53 75 62 31 3d 70 53 75 62 3b 20 70 53 75  (pSub1=pSub; pSu
1d4c0 62 31 3b 20 70 53 75 62 31 3d 70 53 75 62 31 2d  b1; pSub1=pSub1-
1d4d0 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20  >pPrior){.      
1d4e0 74 65 73 74 63 61 73 65 28 20 28 70 53 75 62 31  testcase( (pSub1
1d4f0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
1d500 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
1d510 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73  regate))==SF_Dis
1d520 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 74  tinct );.      t
1d530 65 73 74 63 61 73 65 28 20 28 70 53 75 62 31 2d  estcase( (pSub1-
1d540 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
1d550 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
1d560 65 67 61 74 65 29 29 3d 3d 53 46 5f 41 67 67 72  egate))==SF_Aggr
1d570 65 67 61 74 65 20 29 3b 0a 20 20 20 20 20 20 61  egate );.      a
1d580 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70 53 72  ssert( pSub->pSr
1d590 63 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  c!=0 );.      if
1d5a0 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61  ( (pSub1->selFla
1d5b0 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63  gs & (SF_Distinc
1d5c0 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29  t|SF_Aggregate))
1d5d0 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 28 70  !=0.       || (p
1d5e0 53 75 62 31 2d 3e 70 50 72 69 6f 72 20 26 26 20  Sub1->pPrior && 
1d5f0 70 53 75 62 31 2d 3e 6f 70 21 3d 54 4b 5f 41 4c  pSub1->op!=TK_AL
1d600 4c 29 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 53  L) .       || pS
1d610 75 62 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3c  ub1->pSrc->nSrc<
1d620 31 0a 20 20 20 20 20 20 20 7c 7c 20 70 53 75 62  1.       || pSub
1d630 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  ->pEList->nExpr!
1d640 3d 70 53 75 62 31 2d 3e 70 45 4c 69 73 74 2d 3e  =pSub1->pEList->
1d650 6e 45 78 70 72 0a 20 20 20 20 20 20 29 7b 0a 20  nExpr.      ){. 
1d660 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
1d670 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74  .      }.      t
1d680 65 73 74 63 61 73 65 28 20 70 53 75 62 31 2d 3e  estcase( pSub1->
1d690 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 3b 0a  pSrc->nSrc>1 );.
1d6a0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
1d6b0 73 74 72 69 63 74 69 6f 6e 20 31 38 2e 20 2a 2f  striction 18. */
1d6c0 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64  .    if( p->pOrd
1d6d0 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e  erBy ){.      in
1d6e0 74 20 69 69 3b 0a 20 20 20 20 20 20 66 6f 72 28  t ii;.      for(
1d6f0 69 69 3d 30 3b 20 69 69 3c 70 2d 3e 70 4f 72 64  ii=0; ii<p->pOrd
1d700 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 69 2b  erBy->nExpr; ii+
1d710 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
1d720 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  p->pOrderBy->a[i
1d730 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  i].u.x.iOrderByC
1d740 6f 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ol==0 ) return 0
1d750 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1d760 20 20 7d 0a 0a 20 20 2f 2a 2a 2a 2a 2a 20 49 66    }..  /***** If
1d770 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
1d780 6f 69 6e 74 2c 20 66 6c 61 74 74 65 6e 69 6e 67  oint, flattening
1d790 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 2a   is permitted. *
1d7a0 2a 2a 2a 2a 2f 0a 0a 20 20 2f 2a 20 41 75 74 68  ****/..  /* Auth
1d7b0 6f 72 69 7a 65 20 74 68 65 20 73 75 62 71 75 65  orize the subque
1d7c0 72 79 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e  ry */.  pParse->
1d7d0 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70  zAuthContext = p
1d7e0 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a  Subitem->zName;.
1d7f0 20 20 54 45 53 54 4f 4e 4c 59 28 69 20 3d 29 20    TESTONLY(i =) 
1d800 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
1d810 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
1d820 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29  SELECT, 0, 0, 0)
1d830 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 69 3d  ;.  testcase( i=
1d840 3d 53 51 4c 49 54 45 5f 44 45 4e 59 20 29 3b 0a  =SQLITE_DENY );.
1d850 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43    pParse->zAuthC
1d860 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76 65 64 41  ontext = zSavedA
1d870 75 74 68 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 2f  uthContext;..  /
1d880 2a 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65  * If the sub-que
1d890 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ry is a compound
1d8a0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1d8b0 74 2c 20 74 68 65 6e 20 28 62 79 20 72 65 73 74  t, then (by rest
1d8c0 72 69 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 31 37  rictions.  ** 17
1d8d0 20 61 6e 64 20 31 38 20 61 62 6f 76 65 29 20 69   and 18 above) i
1d8e0 74 20 6d 75 73 74 20 62 65 20 61 20 55 4e 49 4f  t must be a UNIO
1d8f0 4e 20 41 4c 4c 20 61 6e 64 20 74 68 65 20 70 61  N ALL and the pa
1d900 72 65 6e 74 20 71 75 65 72 79 20 6d 75 73 74 20  rent query must 
1d910 0a 20 20 2a 2a 20 62 65 20 6f 66 20 74 68 65 20  .  ** be of the 
1d920 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  form:.  **.  ** 
1d930 20 20 20 20 53 45 4c 45 43 54 20 3c 65 78 70 72      SELECT <expr
1d940 2d 6c 69 73 74 3e 20 46 52 4f 4d 20 28 3c 73 75  -list> FROM (<su
1d950 62 2d 71 75 65 72 79 3e 29 20 3c 77 68 65 72 65  b-query>) <where
1d960 2d 63 6c 61 75 73 65 3e 20 0a 20 20 2a 2a 0a 20  -clause> .  **. 
1d970 20 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20   ** followed by 
1d980 61 6e 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49  any ORDER BY, LI
1d990 4d 49 54 20 61 6e 64 2f 6f 72 20 4f 46 46 53 45  MIT and/or OFFSE
1d9a0 54 20 63 6c 61 75 73 65 73 2e 20 54 68 69 73 20  T clauses. This 
1d9b0 62 6c 6f 63 6b 0a 20 20 2a 2a 20 63 72 65 61 74  block.  ** creat
1d9c0 65 73 20 4e 2d 31 20 63 6f 70 69 65 73 20 6f 66  es N-1 copies of
1d9d0 20 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72   the parent quer
1d9e0 79 20 77 69 74 68 6f 75 74 20 61 6e 79 20 4f 52  y without any OR
1d9f0 44 45 52 20 42 59 2c 20 4c 49 4d 49 54 20 6f 72  DER BY, LIMIT or
1da00 20 0a 20 20 2a 2a 20 4f 46 46 53 45 54 20 63 6c   .  ** OFFSET cl
1da10 61 75 73 65 73 20 61 6e 64 20 6a 6f 69 6e 73 20  auses and joins 
1da20 74 68 65 6d 20 74 6f 20 74 68 65 20 6c 65 66 74  them to the left
1da30 2d 68 61 6e 64 2d 73 69 64 65 20 6f 66 20 74 68  -hand-side of th
1da40 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20  e original.  ** 
1da50 75 73 69 6e 67 20 55 4e 49 4f 4e 20 41 4c 4c 20  using UNION ALL 
1da60 6f 70 65 72 61 74 6f 72 73 2e 20 49 6e 20 74 68  operators. In th
1da70 69 73 20 63 61 73 65 20 4e 20 69 73 20 74 68 65  is case N is the
1da80 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d 70 6c   number of simpl
1da90 65 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 73 74  e.  ** select st
1daa0 61 74 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  atements in the 
1dab0 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65  compound sub-que
1dac0 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78  ry..  **.  ** Ex
1dad0 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ample:.  **.  **
1dae0 20 20 20 20 20 53 45 4c 45 43 54 20 61 2b 31 20       SELECT a+1 
1daf0 46 52 4f 4d 20 28 0a 20 20 2a 2a 20 20 20 20 20  FROM (.  **     
1db00 20 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d     SELECT x FROM
1db10 20 74 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20   tab.  **       
1db20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20   UNION ALL.  ** 
1db30 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 79 20         SELECT y 
1db40 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20  FROM tab.  **   
1db50 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20       UNION ALL. 
1db60 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43   **        SELEC
1db70 54 20 61 62 73 28 7a 2a 32 29 20 46 52 4f 4d 20  T abs(z*2) FROM 
1db80 74 61 62 32 0a 20 20 2a 2a 20 20 20 20 20 29 20  tab2.  **     ) 
1db90 57 48 45 52 45 20 61 21 3d 35 20 4f 52 44 45 52  WHERE a!=5 ORDER
1dba0 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20   BY 1.  **.  ** 
1dbb0 54 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f  Transformed into
1dbc0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
1dbd0 53 45 4c 45 43 54 20 78 2b 31 20 46 52 4f 4d 20  SELECT x+1 FROM 
1dbe0 74 61 62 20 57 48 45 52 45 20 78 2b 31 21 3d 35  tab WHERE x+1!=5
1dbf0 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20  .  **     UNION 
1dc00 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c  ALL.  **     SEL
1dc10 45 43 54 20 79 2b 31 20 46 52 4f 4d 20 74 61 62  ECT y+1 FROM tab
1dc20 20 57 48 45 52 45 20 79 2b 31 21 3d 35 0a 20 20   WHERE y+1!=5.  
1dc30 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c  **     UNION ALL
1dc40 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
1dc50 20 61 62 73 28 7a 2a 32 29 2b 31 20 46 52 4f 4d   abs(z*2)+1 FROM
1dc60 20 74 61 62 32 20 57 48 45 52 45 20 61 62 73 28   tab2 WHERE abs(
1dc70 7a 2a 32 29 2b 31 21 3d 35 0a 20 20 2a 2a 20 20  z*2)+1!=5.  **  
1dc80 20 20 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20     ORDER BY 1.  
1dc90 2a 2a 0a 20 20 2a 2a 20 57 65 20 63 61 6c 6c 20  **.  ** We call 
1dca0 74 68 69 73 20 74 68 65 20 22 63 6f 6d 70 6f 75  this the "compou
1dcb0 6e 64 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74  nd-subquery flat
1dcc0 74 65 6e 69 6e 67 22 2e 0a 20 20 2a 2f 0a 20 20  tening"..  */.  
1dcd0 66 6f 72 28 70 53 75 62 3d 70 53 75 62 2d 3e 70  for(pSub=pSub->p
1dce0 50 72 69 6f 72 3b 20 70 53 75 62 3b 20 70 53 75  Prior; pSub; pSu
1dcf0 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b  b=pSub->pPrior){
1dd00 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4e 65  .    Select *pNe
1dd10 77 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  w;.    ExprList 
1dd20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70  *pOrderBy = p->p
1dd30 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 45 78 70  OrderBy;.    Exp
1dd40 72 20 2a 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70  r *pLimit = p->p
1dd50 4c 69 6d 69 74 3b 0a 20 20 20 20 45 78 70 72 20  Limit;.    Expr 
1dd60 2a 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f  *pOffset = p->pO
1dd70 66 66 73 65 74 3b 0a 20 20 20 20 53 65 6c 65 63  ffset;.    Selec
1dd80 74 20 2a 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70  t *pPrior = p->p
1dd90 50 72 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70 4f  Prior;.    p->pO
1dda0 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
1ddb0 70 2d 3e 70 53 72 63 20 3d 20 30 3b 0a 20 20 20  p->pSrc = 0;.   
1ddc0 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
1ddd0 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
1dde0 30 3b 0a 20 20 20 20 70 2d 3e 70 4f 66 66 73 65  0;.    p->pOffse
1ddf0 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 20  t = 0;.    pNew 
1de00 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
1de10 75 70 28 64 62 2c 20 70 2c 20 30 29 3b 0a 20 20  up(db, p, 0);.  
1de20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70    p->pOffset = p
1de30 4f 66 66 73 65 74 3b 0a 20 20 20 20 70 2d 3e 70  Offset;.    p->p
1de40 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a  Limit = pLimit;.
1de50 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
1de60 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  = pOrderBy;.    
1de70 70 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a  p->pSrc = pSrc;.
1de80 20 20 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 41      p->op = TK_A
1de90 4c 4c 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77  LL;.    if( pNew
1dea0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
1deb0 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
1dec0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1ded0 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d    pNew->pPrior =
1dee0 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 69   pPrior;.      i
1def0 66 28 20 70 50 72 69 6f 72 20 29 20 70 50 72 69  f( pPrior ) pPri
1df00 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77  or->pNext = pNew
1df10 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4e  ;.      pNew->pN
1df20 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 70  ext = p;.      p
1df30 2d 3e 70 50 72 69 6f 72 20 3d 20 70 4e 65 77 3b  ->pPrior = pNew;
1df40 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64  .    }.    if( d
1df50 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1df60 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
1df70 0a 20 20 2f 2a 20 42 65 67 69 6e 20 66 6c 61 74  .  /* Begin flat
1df80 74 65 6e 69 6e 67 20 74 68 65 20 69 46 72 6f 6d  tening the iFrom
1df90 2d 74 68 20 65 6e 74 72 79 20 6f 66 20 74 68 65  -th entry of the
1dfa0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 0a 20 20   FROM clause .  
1dfb0 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20  ** in the outer 
1dfc0 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 53  query..  */.  pS
1dfd0 75 62 20 3d 20 70 53 75 62 31 20 3d 20 70 53 75  ub = pSub1 = pSu
1dfe0 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a  bitem->pSelect;.
1dff0 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65  .  /* Delete the
1e000 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65   transient table
1e010 20 73 74 72 75 63 74 75 72 65 20 61 73 73 6f 63   structure assoc
1e020 69 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 20  iated with the. 
1e030 20 2a 2a 20 73 75 62 71 75 65 72 79 0a 20 20 2a   ** subquery.  *
1e040 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  /.  sqlite3DbFre
1e050 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e  e(db, pSubitem->
1e060 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 73 71  zDatabase);.  sq
1e070 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1e080 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 29  pSubitem->zName)
1e090 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
1e0a0 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e  e(db, pSubitem->
1e0b0 7a 41 6c 69 61 73 29 3b 0a 20 20 70 53 75 62 69  zAlias);.  pSubi
1e0c0 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d  tem->zDatabase =
1e0d0 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e   0;.  pSubitem->
1e0e0 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70 53 75  zName = 0;.  pSu
1e0f0 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20  bitem->zAlias = 
1e100 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 70  0;.  pSubitem->p
1e110 53 65 6c 65 63 74 20 3d 20 30 3b 0a 0a 20 20 2f  Select = 0;..  /
1e120 2a 20 44 65 66 65 72 20 64 65 6c 65 74 69 6e 67  * Defer deleting
1e130 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63   the Table objec
1e140 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  t associated wit
1e150 68 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75  h the.  ** subqu
1e160 65 72 79 20 75 6e 74 69 6c 20 63 6f 64 65 20 67  ery until code g
1e170 65 6e 65 72 61 74 69 6f 6e 20 69 73 0a 20 20 2a  eneration is.  *
1e180 2a 20 63 6f 6d 70 6c 65 74 65 2c 20 73 69 6e 63  * complete, sinc
1e190 65 20 74 68 65 72 65 20 6d 61 79 20 73 74 69 6c  e there may stil
1e1a0 6c 20 65 78 69 73 74 20 45 78 70 72 2e 70 54 61  l exist Expr.pTa
1e1b0 62 20 65 6e 74 72 69 65 73 20 74 68 61 74 0a 20  b entries that. 
1e1c0 20 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68 65   ** refer to the
1e1d0 20 73 75 62 71 75 65 72 79 20 65 76 65 6e 20 61   subquery even a
1e1e0 66 74 65 72 20 66 6c 61 74 74 65 6e 69 6e 67 2e  fter flattening.
1e1f0 20 20 54 69 63 6b 65 74 20 23 33 33 34 36 2e 0a    Ticket #3346..
1e200 20 20 2a 2a 0a 20 20 2a 2a 20 70 53 75 62 69 74    **.  ** pSubit
1e210 65 6d 2d 3e 70 54 61 62 20 69 73 20 61 6c 77 61  em->pTab is alwa
1e220 79 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 62 79 20 74  ys non-NULL by t
1e230 65 73 74 20 72 65 73 74 72 69 63 74 69 6f 6e 73  est restrictions
1e240 20 61 6e 64 20 74 65 73 74 73 20 61 62 6f 76 65   and tests above
1e250 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57  ..  */.  if( ALW
1e260 41 59 53 28 70 53 75 62 69 74 65 6d 2d 3e 70 54  AYS(pSubitem->pT
1e270 61 62 21 3d 30 29 20 29 7b 0a 20 20 20 20 54 61  ab!=0) ){.    Ta
1e280 62 6c 65 20 2a 70 54 61 62 54 6f 44 65 6c 20 3d  ble *pTabToDel =
1e290 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 3b   pSubitem->pTab;
1e2a0 0a 20 20 20 20 69 66 28 20 70 54 61 62 54 6f 44  .    if( pTabToD
1e2b0 65 6c 2d 3e 6e 52 65 66 3d 3d 31 20 29 7b 0a 20  el->nRef==1 ){. 
1e2c0 20 20 20 20 20 50 61 72 73 65 20 2a 70 54 6f 70       Parse *pTop
1e2d0 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50  level = sqlite3P
1e2e0 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61  arseToplevel(pPa
1e2f0 72 73 65 29 3b 0a 20 20 20 20 20 20 70 54 61 62  rse);.      pTab
1e300 54 6f 44 65 6c 2d 3e 70 4e 65 78 74 5a 6f 6d 62  ToDel->pNextZomb
1e310 69 65 20 3d 20 70 54 6f 70 6c 65 76 65 6c 2d 3e  ie = pToplevel->
1e320 70 5a 6f 6d 62 69 65 54 61 62 3b 0a 20 20 20 20  pZombieTab;.    
1e330 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f    pToplevel->pZo
1e340 6d 62 69 65 54 61 62 20 3d 20 70 54 61 62 54 6f  mbieTab = pTabTo
1e350 44 65 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Del;.    }else{.
1e360 20 20 20 20 20 20 70 54 61 62 54 6f 44 65 6c 2d        pTabToDel-
1e370 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 7d 0a 20  >nRef--;.    }. 
1e380 20 20 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61     pSubitem->pTa
1e390 62 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  b = 0;.  }..  /*
1e3a0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c   The following l
1e3b0 6f 6f 70 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f  oop runs once fo
1e3c0 72 20 65 61 63 68 20 74 65 72 6d 20 69 6e 20 61  r each term in a
1e3d0 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65   compound-subque
1e3e0 72 79 0a 20 20 2a 2a 20 66 6c 61 74 74 65 6e 69  ry.  ** flatteni
1e3f0 6e 67 20 28 61 73 20 64 65 73 63 72 69 62 65 64  ng (as described
1e400 20 61 62 6f 76 65 29 2e 20 20 49 66 20 77 65 20   above).  If we 
1e410 61 72 65 20 64 6f 69 6e 67 20 61 20 64 69 66 66  are doing a diff
1e420 65 72 65 6e 74 20 6b 69 6e 64 0a 20 20 2a 2a 20  erent kind.  ** 
1e430 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d 20  of flattening - 
1e440 61 20 66 6c 61 74 74 65 6e 69 6e 67 20 6f 74 68  a flattening oth
1e450 65 72 20 74 68 61 6e 20 61 20 63 6f 6d 70 6f 75  er than a compou
1e460 6e 64 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74  nd-subquery flat
1e470 74 65 6e 69 6e 67 20 2d 0a 20 20 2a 2a 20 74 68  tening -.  ** th
1e480 65 6e 20 74 68 69 73 20 6c 6f 6f 70 20 6f 6e 6c  en this loop onl
1e490 79 20 72 75 6e 73 20 6f 6e 63 65 2e 0a 20 20 2a  y runs once..  *
1e4a0 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70  *.  ** This loop
1e4b0 20 6d 6f 76 65 73 20 61 6c 6c 20 6f 66 20 74 68   moves all of th
1e4c0 65 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 73 20  e FROM elements 
1e4d0 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
1e4e0 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74 68  into the.  ** th
1e4f0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
1e500 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1e510 2e 20 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20  .  Before doing 
1e520 74 68 69 73 2c 20 72 65 6d 65 6d 62 65 72 0a 20  this, remember. 
1e530 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 6e   ** the cursor n
1e540 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6f 72  umber for the or
1e550 69 67 69 6e 61 6c 20 6f 75 74 65 72 20 71 75 65  iginal outer que
1e560 72 79 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 20  ry FROM element 
1e570 69 6e 0a 20 20 2a 2a 20 69 50 61 72 65 6e 74 2e  in.  ** iParent.
1e580 20 20 54 68 65 20 69 50 61 72 65 6e 74 20 63 75    The iParent cu
1e590 72 73 6f 72 20 77 69 6c 6c 20 6e 65 76 65 72 20  rsor will never 
1e5a0 62 65 20 75 73 65 64 2e 20 20 53 75 62 73 65 71  be used.  Subseq
1e5b0 75 65 6e 74 20 63 6f 64 65 0a 20 20 2a 2a 20 77  uent code.  ** w
1e5c0 69 6c 6c 20 73 63 61 6e 20 65 78 70 72 65 73 73  ill scan express
1e5d0 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  ions looking for
1e5e0 20 69 50 61 72 65 6e 74 20 72 65 66 65 72 65 6e   iParent referen
1e5f0 63 65 73 20 61 6e 64 20 72 65 70 6c 61 63 65 0a  ces and replace.
1e600 20 20 2a 2a 20 74 68 6f 73 65 20 72 65 66 65 72    ** those refer
1e610 65 6e 63 65 73 20 77 69 74 68 20 65 78 70 72 65  ences with expre
1e620 73 73 69 6f 6e 73 20 74 68 61 74 20 72 65 73 6f  ssions that reso
1e630 6c 76 65 20 74 6f 20 74 68 65 20 73 75 62 71 75  lve to the subqu
1e640 65 72 79 20 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c  ery FROM.  ** el
1e650 65 6d 65 6e 74 73 20 77 65 20 61 72 65 20 6e 6f  ements we are no
1e660 77 20 63 6f 70 79 69 6e 67 20 69 6e 2e 0a 20 20  w copying in..  
1e670 2a 2f 0a 20 20 66 6f 72 28 70 50 61 72 65 6e 74  */.  for(pParent
1e680 3d 70 3b 20 70 50 61 72 65 6e 74 3b 20 70 50 61  =p; pParent; pPa
1e690 72 65 6e 74 3d 70 50 61 72 65 6e 74 2d 3e 70 50  rent=pParent->pP
1e6a0 72 69 6f 72 2c 20 70 53 75 62 3d 70 53 75 62 2d  rior, pSub=pSub-
1e6b0 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 69 6e  >pPrior){.    in
1e6c0 74 20 6e 53 75 62 53 72 63 3b 0a 20 20 20 20 75  t nSubSrc;.    u
1e6d0 38 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a  8 jointype = 0;.
1e6e0 20 20 20 20 70 53 75 62 53 72 63 20 3d 20 70 53      pSubSrc = pS
1e6f0 75 62 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a  ub->pSrc;     /*
1e700 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
1e710 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 20 20  subquery */.    
1e720 6e 53 75 62 53 72 63 20 3d 20 70 53 75 62 53 72  nSubSrc = pSubSr
1e730 63 2d 3e 6e 53 72 63 3b 20 20 2f 2a 20 4e 75 6d  c->nSrc;  /* Num
1e740 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20  ber of terms in 
1e750 73 75 62 71 75 65 72 79 20 46 52 4f 4d 20 63 6c  subquery FROM cl
1e760 61 75 73 65 20 2a 2f 0a 20 20 20 20 70 53 72 63  ause */.    pSrc
1e770 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63   = pParent->pSrc
1e780 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c  ;     /* FROM cl
1e790 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65  ause of the oute
1e7a0 72 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 20 20  r query */..    
1e7b0 69 66 28 20 70 53 72 63 20 29 7b 0a 20 20 20 20  if( pSrc ){.    
1e7c0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
1e7d0 74 3d 3d 70 20 29 3b 20 20 2f 2a 20 46 69 72 73  t==p );  /* Firs
1e7e0 74 20 74 69 6d 65 20 74 68 72 6f 75 67 68 20 74  t time through t
1e7f0 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20  he loop */.     
1e800 20 6a 6f 69 6e 74 79 70 65 20 3d 20 70 53 75 62   jointype = pSub
1e810 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a  item->jointype;.
1e820 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e830 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
1e840 21 3d 70 20 29 3b 20 20 2f 2a 20 32 6e 64 20 61  !=p );  /* 2nd a
1e850 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20 74 69  nd subsequent ti
1e860 6d 65 73 20 74 68 72 6f 75 67 68 20 74 68 65 20  mes through the 
1e870 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 70 53  loop */.      pS
1e880 72 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 53  rc = pParent->pS
1e890 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c  rc = sqlite3SrcL
1e8a0 69 73 74 41 70 70 65 6e 64 28 64 62 2c 20 30 2c  istAppend(db, 0,
1e8b0 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   0, 0);.      if
1e8c0 28 20 70 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20  ( pSrc==0 ){.   
1e8d0 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d       assert( db-
1e8e0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
1e8f0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
1e900 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1e910 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65     /* The subque
1e920 72 79 20 75 73 65 73 20 61 20 73 69 6e 67 6c 65  ry uses a single
1e930 20 73 6c 6f 74 20 6f 66 20 74 68 65 20 46 52 4f   slot of the FRO
1e940 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
1e950 6f 75 74 65 72 0a 20 20 20 20 2a 2a 20 71 75 65  outer.    ** que
1e960 72 79 2e 20 20 49 66 20 74 68 65 20 73 75 62 71  ry.  If the subq
1e970 75 65 72 79 20 68 61 73 20 6d 6f 72 65 20 74 68  uery has more th
1e980 61 6e 20 6f 6e 65 20 65 6c 65 6d 65 6e 74 20 69  an one element i
1e990 6e 20 69 74 73 20 46 52 4f 4d 20 63 6c 61 75 73  n its FROM claus
1e9a0 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 65  e,.    ** then e
1e9b0 78 70 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20  xpand the outer 
1e9c0 71 75 65 72 79 20 74 6f 20 6d 61 6b 65 20 73 70  query to make sp
1e9d0 61 63 65 20 66 6f 72 20 69 74 20 74 6f 20 68 6f  ace for it to ho
1e9e0 6c 64 20 61 6c 6c 20 65 6c 65 6d 65 6e 74 73 0a  ld all elements.
1e9f0 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 75      ** of the su
1ea00 62 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a 0a 20  bquery..    **. 
1ea10 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20     ** Example:. 
1ea20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
1ea30 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 61  SELECT * FROM ta
1ea40 62 41 2c 20 28 53 45 4c 45 43 54 20 2a 20 46 52  bA, (SELECT * FR
1ea50 4f 4d 20 73 75 62 31 2c 20 73 75 62 32 29 2c 20  OM sub1, sub2), 
1ea60 74 61 62 42 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  tabB;.    **.   
1ea70 20 2a 2a 20 54 68 65 20 6f 75 74 65 72 20 71 75   ** The outer qu
1ea80 65 72 79 20 68 61 73 20 33 20 73 6c 6f 74 73 20  ery has 3 slots 
1ea90 69 6e 20 69 74 73 20 46 52 4f 4d 20 63 6c 61 75  in its FROM clau
1eaa0 73 65 2e 20 20 4f 6e 65 20 73 6c 6f 74 20 6f 66  se.  One slot of
1eab0 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65   the.    ** oute
1eac0 72 20 71 75 65 72 79 20 28 74 68 65 20 6d 69 64  r query (the mid
1ead0 64 6c 65 20 73 6c 6f 74 29 20 69 73 20 75 73 65  dle slot) is use
1eae0 64 20 62 79 20 74 68 65 20 73 75 62 71 75 65 72  d by the subquer
1eaf0 79 2e 20 20 54 68 65 20 6e 65 78 74 0a 20 20 20  y.  The next.   
1eb00 20 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64   ** block of cod
1eb10 65 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 74 68  e will expand th
1eb20 65 20 6f 75 74 20 71 75 65 72 79 20 74 6f 20 34  e out query to 4
1eb30 20 73 6c 6f 74 73 2e 20 20 54 68 65 20 6d 69 64   slots.  The mid
1eb40 64 6c 65 0a 20 20 20 20 2a 2a 20 73 6c 6f 74 20  dle.    ** slot 
1eb50 69 73 20 65 78 70 61 6e 64 65 64 20 74 6f 20 74  is expanded to t
1eb60 77 6f 20 73 6c 6f 74 73 20 69 6e 20 6f 72 64 65  wo slots in orde
1eb70 72 20 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 20  r to make space 
1eb80 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 74  for the.    ** t
1eb90 77 6f 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74  wo elements in t
1eba0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
1ebb0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a  f the subquery..
1ebc0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
1ebd0 53 75 62 53 72 63 3e 31 20 29 7b 0a 20 20 20 20  SubSrc>1 ){.    
1ebe0 20 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20    pParent->pSrc 
1ebf0 3d 20 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33  = pSrc = sqlite3
1ec00 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64  SrcListEnlarge(d
1ec10 62 2c 20 70 53 72 63 2c 20 6e 53 75 62 53 72 63  b, pSrc, nSubSrc
1ec20 2d 31 2c 69 46 72 6f 6d 2b 31 29 3b 0a 20 20 20  -1,iFrom+1);.   
1ec30 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
1ec40 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
1ec50 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1ec60 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
1ec70 54 72 61 6e 73 66 65 72 20 74 68 65 20 46 52 4f  Transfer the FRO
1ec80 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 66  M clause terms f
1ec90 72 6f 6d 20 74 68 65 20 73 75 62 71 75 65 72 79  rom the subquery
1eca0 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a   into the.    **
1ecb0 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20   outer query..  
1ecc0 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
1ecd0 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b  ; i<nSubSrc; i++
1ece0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1ecf0 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  IdListDelete(db,
1ed00 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d   pSrc->a[i+iFrom
1ed10 5d 2e 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 20  ].pUsing);.     
1ed20 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d   pSrc->a[i+iFrom
1ed30 5d 20 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b 69  ] = pSubSrc->a[i
1ed40 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ];.      memset(
1ed50 26 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2c 20  &pSubSrc->a[i], 
1ed60 30 2c 20 73 69 7a 65 6f 66 28 70 53 75 62 53 72  0, sizeof(pSubSr
1ed70 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20 20 20 20 7d  c->a[i]));.    }
1ed80 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 46 72  .    pSrc->a[iFr
1ed90 6f 6d 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 6a  om].jointype = j
1eda0 6f 69 6e 74 79 70 65 3b 0a 20 20 0a 20 20 20 20  ointype;.  .    
1edb0 2f 2a 20 4e 6f 77 20 62 65 67 69 6e 20 73 75 62  /* Now begin sub
1edc0 73 74 69 74 75 74 69 6e 67 20 73 75 62 71 75 65  stituting subque
1edd0 72 79 20 72 65 73 75 6c 74 20 73 65 74 20 65 78  ry result set ex
1ede0 70 72 65 73 73 69 6f 6e 73 20 66 6f 72 20 0a 20  pressions for . 
1edf0 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73     ** references
1ee00 20 74 6f 20 74 68 65 20 69 50 61 72 65 6e 74 20   to the iParent 
1ee10 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  in the outer que
1ee20 72 79 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20  ry..    ** .    
1ee30 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20  ** Example:.    
1ee40 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c 45  **.    **   SELE
1ee50 43 54 20 61 2b 35 2c 20 62 2a 31 30 20 46 52 4f  CT a+5, b*10 FRO
1ee60 4d 20 28 53 45 4c 45 43 54 20 78 2a 33 20 41 53  M (SELECT x*3 AS
1ee70 20 61 2c 20 79 2b 31 30 20 41 53 20 62 20 46 52   a, y+10 AS b FR
1ee80 4f 4d 20 74 31 29 20 57 48 45 52 45 20 61 3e 62  OM t1) WHERE a>b
1ee90 3b 0a 20 20 20 20 2a 2a 20 20 20 5c 20 20 20 20  ;.    **   \    
1eea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eeb0 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20   \_____________ 
1eec0 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f  subquery _______
1eed0 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20 20 2f 0a  ___/          /.
1eee0 20 20 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f      **    \_____
1eef0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1ef00 20 6f 75 74 65 72 20 71 75 65 72 79 20 5f 5f 5f   outer query ___
1ef10 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1ef20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20  ___________/.   
1ef30 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 65 20 6c 6f   **.    ** We lo
1ef40 6f 6b 20 61 74 20 65 76 65 72 79 20 65 78 70 72  ok at every expr
1ef50 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20 6f 75  ession in the ou
1ef60 74 65 72 20 71 75 65 72 79 20 61 6e 64 20 65 76  ter query and ev
1ef70 65 72 79 20 70 6c 61 63 65 20 77 65 20 73 65 65  ery place we see
1ef80 0a 20 20 20 20 2a 2a 20 22 61 22 20 77 65 20 73  .    ** "a" we s
1ef90 75 62 73 74 69 74 75 74 65 20 22 78 2a 33 22 20  ubstitute "x*3" 
1efa0 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65 20  and every place 
1efb0 77 65 20 73 65 65 20 22 62 22 20 77 65 20 73 75  we see "b" we su
1efc0 62 73 74 69 74 75 74 65 20 22 79 2b 31 30 22 2e  bstitute "y+10".
1efd0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 4c 69 73  .    */.    pLis
1efe0 74 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 45 4c  t = pParent->pEL
1eff0 69 73 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ist;.    for(i=0
1f000 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
1f010 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
1f020 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  ( pList->a[i].zN
1f030 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame==0 ){.      
1f040 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
1f050 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
1f060 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  db, pList->a[i].
1f070 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20 20 20 20  zSpan);.        
1f080 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a  sqlite3Dequote(z
1f090 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70  Name);.        p
1f0a0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
1f0b0 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20   = zName;.      
1f0c0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 75 62 73  }.    }.    subs
1f0d0 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 50  tExprList(db, pP
1f0e0 61 72 65 6e 74 2d 3e 70 45 4c 69 73 74 2c 20 69  arent->pEList, i
1f0f0 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
1f100 4c 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20 69  List);.    if( i
1f110 73 41 67 67 20 29 7b 0a 20 20 20 20 20 20 73 75  sAgg ){.      su
1f120 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20  bstExprList(db, 
1f130 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70 42  pParent->pGroupB
1f140 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  y, iParent, pSub
1f150 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20  ->pEList);.     
1f160 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e   pParent->pHavin
1f170 67 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62  g = substExpr(db
1f180 2c 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69  , pParent->pHavi
1f190 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  ng, iParent, pSu
1f1a0 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  b->pEList);.    
1f1b0 7d 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  }.    if( pSub->
1f1c0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
1f1d0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
1f1e0 74 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  t->pOrderBy==0 )
1f1f0 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
1f200 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 53 75 62  >pOrderBy = pSub
1f210 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  ->pOrderBy;.    
1f220 20 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79    pSub->pOrderBy
1f230 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
1f240 69 66 28 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72  if( pParent->pOr
1f250 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 73  derBy ){.      s
1f260 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c  ubstExprList(db,
1f270 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72   pParent->pOrder
1f280 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  By, iParent, pSu
1f290 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  b->pEList);.    
1f2a0 7d 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  }.    if( pSub->
1f2b0 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20 20 20  pWhere ){.      
1f2c0 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
1f2d0 45 78 70 72 44 75 70 28 64 62 2c 20 70 53 75 62  ExprDup(db, pSub
1f2e0 2d 3e 70 57 68 65 72 65 2c 20 30 29 3b 0a 20 20  ->pWhere, 0);.  
1f2f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
1f300 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 20 20 7d  Where = 0;.    }
1f310 0a 20 20 20 20 69 66 28 20 73 75 62 71 75 65 72  .    if( subquer
1f320 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20 20 20  yIsAgg ){.      
1f330 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d  assert( pParent-
1f340 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29 3b 0a 20  >pHaving==0 );. 
1f350 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 48       pParent->pH
1f360 61 76 69 6e 67 20 3d 20 70 50 61 72 65 6e 74 2d  aving = pParent-
1f370 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 20 20 70  >pWhere;.      p
1f380 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d  Parent->pWhere =
1f390 20 70 57 68 65 72 65 3b 0a 20 20 20 20 20 20 70   pWhere;.      p
1f3a0 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20  Parent->pHaving 
1f3b0 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20  = substExpr(db, 
1f3c0 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67  pParent->pHaving
1f3d0 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
1f3e0 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  >pEList);.      
1f3f0 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67  pParent->pHaving
1f400 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
1f410 64 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70  d(db, pParent->p
1f420 48 61 76 69 6e 67 2c 20 0a 20 20 20 20 20 20 20  Having, .       
1f430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f440 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1f450 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 53  e3ExprDup(db, pS
1f460 75 62 2d 3e 70 48 61 76 69 6e 67 2c 20 30 29 29  ub->pHaving, 0))
1f470 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1f480 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70 42  pParent->pGroupB
1f490 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50  y==0 );.      pP
1f4a0 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70 42 79 20  arent->pGroupBy 
1f4b0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
1f4c0 74 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70  tDup(db, pSub->p
1f4d0 47 72 6f 75 70 42 79 2c 20 30 29 3b 0a 20 20 20  GroupBy, 0);.   
1f4e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
1f4f0 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20  arent->pWhere = 
1f500 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 50  substExpr(db, pP
1f510 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 2c 20 69  arent->pWhere, i
1f520 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
1f530 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 70 50 61  List);.      pPa
1f540 72 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20 73  rent->pWhere = s
1f550 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62  qlite3ExprAnd(db
1f560 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72  , pParent->pWher
1f570 65 2c 20 70 57 68 65 72 65 29 3b 0a 20 20 20 20  e, pWhere);.    
1f580 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20  }.  .    /* The 
1f590 66 6c 61 74 74 65 6e 65 64 20 71 75 65 72 79 20  flattened query 
1f5a0 69 73 20 64 69 73 74 69 6e 63 74 20 69 66 20 65  is distinct if e
1f5b0 69 74 68 65 72 20 74 68 65 20 69 6e 6e 65 72 20  ither the inner 
1f5c0 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75  or the.    ** ou
1f5d0 74 65 72 20 71 75 65 72 79 20 69 73 20 64 69 73  ter query is dis
1f5e0 74 69 6e 63 74 2e 20 0a 20 20 20 20 2a 2f 0a 20  tinct. .    */. 
1f5f0 20 20 20 70 50 61 72 65 6e 74 2d 3e 73 65 6c 46     pParent->selF
1f600 6c 61 67 73 20 7c 3d 20 70 53 75 62 2d 3e 73 65  lags |= pSub->se
1f610 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74  lFlags & SF_Dist
1f620 69 6e 63 74 3b 0a 20 20 0a 20 20 20 20 2f 2a 0a  inct;.  .    /*.
1f630 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 2e 2e      ** SELECT ..
1f640 2e 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e  . FROM (SELECT .
1f650 2e 2e 20 4c 49 4d 49 54 20 61 20 4f 46 46 53 45  .. LIMIT a OFFSE
1f660 54 20 62 29 20 4c 49 4d 49 54 20 78 20 4f 46 46  T b) LIMIT x OFF
1f670 53 45 54 20 79 3b 0a 20 20 20 20 2a 2a 0a 20 20  SET y;.    **.  
1f680 20 20 2a 2a 20 4f 6e 65 20 69 73 20 74 65 6d 70    ** One is temp
1f690 74 65 64 20 74 6f 20 74 72 79 20 74 6f 20 61 64  ted to try to ad
1f6a0 64 20 61 20 61 6e 64 20 62 20 74 6f 20 63 6f 6d  d a and b to com
1f6b0 62 69 6e 65 20 74 68 65 20 6c 69 6d 69 74 73 2e  bine the limits.
1f6c0 20 20 42 75 74 20 74 68 69 73 0a 20 20 20 20 2a    But this.    *
1f6d0 2a 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  * does not work 
1f6e0 69 66 20 65 69 74 68 65 72 20 6c 69 6d 69 74 20  if either limit 
1f6f0 69 73 20 6e 65 67 61 74 69 76 65 2e 0a 20 20 20  is negative..   
1f700 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62   */.    if( pSub
1f710 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->pLimit ){.    
1f720 20 20 70 50 61 72 65 6e 74 2d 3e 70 4c 69 6d 69    pParent->pLimi
1f730 74 20 3d 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74  t = pSub->pLimit
1f740 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70 4c  ;.      pSub->pL
1f750 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  imit = 0;.    }.
1f760 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69 61 6c    }..  /* Finial
1f770 6c 79 2c 20 64 65 6c 65 74 65 20 77 68 61 74 20  ly, delete what 
1f780 69 73 20 6c 65 66 74 20 6f 66 20 74 68 65 20 73  is left of the s
1f790 75 62 71 75 65 72 79 20 61 6e 64 20 72 65 74 75  ubquery and retu
1f7a0 72 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 2e  rn.  ** success.
1f7b0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53  .  */.  sqlite3S
1f7c0 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
1f7d0 70 53 75 62 31 29 3b 0a 0a 20 20 72 65 74 75 72  pSub1);..  retur
1f7e0 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 1;.}.#endif /*
1f7f0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1f800 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
1f810 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
1f820 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f  TE_OMIT_VIEW) */
1f830 0a 0a 2f 2a 0a 2a 2a 20 42 61 73 65 64 20 6f 6e  ../*.** Based on
1f840 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
1f850 20 74 68 65 20 41 67 67 49 6e 66 6f 20 73 74 72   the AggInfo str
1f860 75 63 74 75 72 65 20 69 6e 64 69 63 61 74 65 64  ucture indicated
1f870 20 62 79 20 74 68 65 20 66 69 72 73 74 0a 2a 2a   by the first.**
1f880 20 61 72 67 75 6d 65 6e 74 2c 20 74 68 69 73 20   argument, this 
1f890 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20  function checks 
1f8a0 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  if the following
1f8b0 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a   are true:.**.**
1f8c0 20 20 20 20 2a 20 74 68 65 20 71 75 65 72 79 20      * the query 
1f8d0 63 6f 6e 74 61 69 6e 73 20 6a 75 73 74 20 61 20  contains just a 
1f8e0 73 69 6e 67 6c 65 20 61 67 67 72 65 67 61 74 65  single aggregate
1f8f0 20 66 75 6e 63 74 69 6f 6e 2c 0a 2a 2a 20 20 20   function,.**   
1f900 20 2a 20 74 68 65 20 61 67 67 72 65 67 61 74 65   * the aggregate
1f910 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 65 69 74   function is eit
1f920 68 65 72 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  her min() or max
1f930 28 29 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 2a 20  (), and.**    * 
1f940 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  the argument to 
1f950 74 68 65 20 61 67 67 72 65 67 61 74 65 20 66 75  the aggregate fu
1f960 6e 63 74 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75  nction is a colu
1f970 6d 6e 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20  mn value..**.** 
1f980 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 62  If all of the ab
1f990 6f 76 65 20 61 72 65 20 74 72 75 65 2c 20 74 68  ove are true, th
1f9a0 65 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59  en WHERE_ORDERBY
1f9b0 5f 4d 49 4e 20 6f 72 20 57 48 45 52 45 5f 4f 52  _MIN or WHERE_OR
1f9c0 44 45 52 42 59 5f 4d 41 58 0a 2a 2a 20 69 73 20  DERBY_MAX.** is 
1f9d0 72 65 74 75 72 6e 65 64 20 61 73 20 61 70 70 72  returned as appr
1f9e0 6f 70 72 69 61 74 65 2e 20 41 6c 73 6f 2c 20 2a  opriate. Also, *
1f9f0 70 70 4d 69 6e 4d 61 78 20 69 73 20 73 65 74 20  ppMinMax is set 
1fa00 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
1fa10 0a 2a 2a 20 6c 69 73 74 20 6f 66 20 61 72 67 75  .** list of argu
1fa20 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20  ments passed to 
1fa30 74 68 65 20 61 67 67 72 65 67 61 74 65 20 62 65  the aggregate be
1fa40 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
1fa50 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65  **.** Or, if the
1fa60 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76   conditions abov
1fa70 65 20 61 72 65 20 6e 6f 74 20 6d 65 74 2c 20 2a  e are not met, *
1fa80 70 70 4d 69 6e 4d 61 78 20 69 73 20 73 65 74 20  ppMinMax is set 
1fa90 74 6f 20 30 20 61 6e 64 0a 2a 2a 20 57 48 45 52  to 0 and.** WHER
1faa0 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c  E_ORDERBY_NORMAL
1fab0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
1fac0 0a 73 74 61 74 69 63 20 75 38 20 6d 69 6e 4d 61  .static u8 minMa
1fad0 78 51 75 65 72 79 28 41 67 67 49 6e 66 6f 20 2a  xQuery(AggInfo *
1fae0 70 41 67 67 49 6e 66 6f 2c 20 45 78 70 72 4c 69  pAggInfo, ExprLi
1faf0 73 74 20 2a 2a 70 70 4d 69 6e 4d 61 78 29 7b 0a  st **ppMinMax){.
1fb00 20 20 69 6e 74 20 65 52 65 74 20 3d 20 57 48 45    int eRet = WHE
1fb10 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41  RE_ORDERBY_NORMA
1fb20 4c 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  L;          /* R
1fb30 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a  eturn value */..
1fb40 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 30 3b    *ppMinMax = 0;
1fb50 0a 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d  .  if( pAggInfo-
1fb60 3e 6e 46 75 6e 63 3d 3d 31 20 29 7b 0a 20 20 20  >nFunc==1 ){.   
1fb70 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
1fb80 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30  AggInfo->aFunc[0
1fb90 5d 2e 70 45 78 70 72 3b 20 2f 2a 20 41 67 67 72  ].pExpr; /* Aggr
1fba0 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 2a  egate function *
1fbb0 2f 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  /.    ExprList *
1fbc0 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  pEList = pExpr->
1fbd0 78 2e 70 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a  x.pList;      /*
1fbe0 20 41 72 67 75 6d 65 6e 74 73 20 74 6f 20 61 67   Arguments to ag
1fbf0 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20  g function */.. 
1fc00 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
1fc10 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e  ->op==TK_AGG_FUN
1fc20 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 69 66 28  CTION );.    if(
1fc30 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73   pEList && pELis
1fc40 74 2d 3e 6e 45 78 70 72 3d 3d 31 20 26 26 20 70  t->nExpr==1 && p
1fc50 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
1fc60 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f  r->op==TK_AGG_CO
1fc70 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 63 6f  LUMN ){.      co
1fc80 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 20  nst char *zFunc 
1fc90 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  = pExpr->u.zToke
1fca0 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  n;.      if( sql
1fcb0 69 74 65 33 53 74 72 49 43 6d 70 28 7a 46 75 6e  ite3StrICmp(zFun
1fcc0 63 2c 20 22 6d 69 6e 22 29 3d 3d 30 20 29 7b 0a  c, "min")==0 ){.
1fcd0 20 20 20 20 20 20 20 20 65 52 65 74 20 3d 20 57          eRet = W
1fce0 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e  HERE_ORDERBY_MIN
1fcf0 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 4d 69 6e  ;.        *ppMin
1fd00 4d 61 78 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20  Max = pEList;.  
1fd10 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71      }else if( sq
1fd20 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 46 75  lite3StrICmp(zFu
1fd30 6e 63 2c 20 22 6d 61 78 22 29 3d 3d 30 20 29 7b  nc, "max")==0 ){
1fd40 0a 20 20 20 20 20 20 20 20 65 52 65 74 20 3d 20  .        eRet = 
1fd50 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41  WHERE_ORDERBY_MA
1fd60 58 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 4d 69  X;.        *ppMi
1fd70 6e 4d 61 78 20 3d 20 70 45 4c 69 73 74 3b 0a 20  nMax = pEList;. 
1fd80 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1fd90 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 70 4d  ..  assert( *ppM
1fda0 69 6e 4d 61 78 3d 3d 30 20 7c 7c 20 28 2a 70 70  inMax==0 || (*pp
1fdb0 4d 69 6e 4d 61 78 29 2d 3e 6e 45 78 70 72 3d 3d  MinMax)->nExpr==
1fdc0 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 65 52  1 );.  return eR
1fdd0 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  et;.}../*.** The
1fde0 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
1fdf0 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
1fe00 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
1fe10 73 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 71  s an aggregate q
1fe20 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 65 63  uery..** The sec
1fe30 6f 6e 64 20 61 72 67 6d 65 6e 74 20 69 73 20 74  ond argment is t
1fe40 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 61 67  he associated ag
1fe50 67 72 65 67 61 74 65 2d 69 6e 66 6f 20 6f 62 6a  gregate-info obj
1fe60 65 63 74 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75  ect. This .** fu
1fe70 6e 63 74 69 6f 6e 20 74 65 73 74 73 20 69 66 20  nction tests if 
1fe80 74 68 65 20 53 45 4c 45 43 54 20 69 73 20 6f 66  the SELECT is of
1fe90 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a   the form:.**.**
1fea0 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28     SELECT count(
1feb0 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 2a 2a  *) FROM <tbl>.**
1fec0 0a 2a 2a 20 77 68 65 72 65 20 74 61 62 6c 65 20  .** where table 
1fed0 69 73 20 61 20 64 61 74 61 62 61 73 65 20 74 61  is a database ta
1fee0 62 6c 65 2c 20 6e 6f 74 20 61 20 73 75 62 2d 73  ble, not a sub-s
1fef0 65 6c 65 63 74 20 6f 72 20 76 69 65 77 2e 20 49  elect or view. I
1ff00 66 20 74 68 65 20 71 75 65 72 79 0a 2a 2a 20 64  f the query.** d
1ff10 6f 65 73 20 6d 61 74 63 68 20 74 68 69 73 20 70  oes match this p
1ff20 61 74 74 65 72 6e 2c 20 74 68 65 6e 20 61 20 70  attern, then a p
1ff30 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 54 61  ointer to the Ta
1ff40 62 6c 65 20 6f 62 6a 65 63 74 20 72 65 70 72 65  ble object repre
1ff50 73 65 6e 74 69 6e 67 0a 2a 2a 20 3c 74 62 6c 3e  senting.** <tbl>
1ff60 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
1ff70 68 65 72 77 69 73 65 2c 20 30 20 69 73 20 72 65  herwise, 0 is re
1ff80 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
1ff90 63 20 54 61 62 6c 65 20 2a 69 73 53 69 6d 70 6c  c Table *isSimpl
1ffa0 65 43 6f 75 6e 74 28 53 65 6c 65 63 74 20 2a 70  eCount(Select *p
1ffb0 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49  , AggInfo *pAggI
1ffc0 6e 66 6f 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  nfo){.  Table *p
1ffd0 54 61 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 78  Tab;.  Expr *pEx
1ffe0 70 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21  pr;..  assert( !
1fff0 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 3b 0a 0a  p->pGroupBy );..
20000 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20    if( p->pWhere 
20010 7c 7c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  || p->pEList->nE
20020 78 70 72 21 3d 31 20 0a 20 20 20 7c 7c 20 70 2d  xpr!=1 .   || p-
20030 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 7c  >pSrc->nSrc!=1 |
20040 7c 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e  | p->pSrc->a[0].
20050 70 53 65 6c 65 63 74 0a 20 20 29 7b 0a 20 20 20  pSelect.  ){.   
20060 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
20070 20 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d   pTab = p->pSrc-
20080 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 70 45  >a[0].pTab;.  pE
20090 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  xpr = p->pEList-
200a0 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 61  >a[0].pExpr;.  a
200b0 73 73 65 72 74 28 20 70 54 61 62 20 26 26 20 21  ssert( pTab && !
200c0 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 26 26  pTab->pSelect &&
200d0 20 70 45 78 70 72 20 29 3b 0a 0a 20 20 69 66 28   pExpr );..  if(
200e0 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
200f0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
20100 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
20110 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20  _AGG_FUNCTION ) 
20120 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
20130 4e 45 56 45 52 28 70 41 67 67 49 6e 66 6f 2d 3e  NEVER(pAggInfo->
20140 6e 46 75 6e 63 3d 3d 30 29 20 29 20 72 65 74 75  nFunc==0) ) retu
20150 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 41 67  rn 0;.  if( (pAg
20160 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e  gInfo->aFunc[0].
20170 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73  pFunc->funcFlags
20180 26 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 55  &SQLITE_FUNC_COU
20190 4e 54 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  NT)==0 ) return 
201a0 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  0;.  if( pExpr->
201b0 66 6c 61 67 73 26 45 50 5f 44 69 73 74 69 6e 63  flags&EP_Distinc
201c0 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  t ) return 0;.. 
201d0 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a   return pTab;.}.
201e0 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 6f  ./*.** If the so
201f0 75 72 63 65 2d 6c 69 73 74 20 69 74 65 6d 20 70  urce-list item p
20200 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75  assed as an argu
20210 6d 65 6e 74 20 77 61 73 20 61 75 67 6d 65 6e 74  ment was augment
20220 65 64 20 77 69 74 68 20 61 6e 0a 2a 2a 20 49 4e  ed with an.** IN
20230 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c  DEXED BY clause,
20240 20 74 68 65 6e 20 74 72 79 20 74 6f 20 6c 6f 63   then try to loc
20250 61 74 65 20 74 68 65 20 73 70 65 63 69 66 69 65  ate the specifie
20260 64 20 69 6e 64 65 78 2e 20 49 66 20 74 68 65 72  d index. If ther
20270 65 0a 2a 2a 20 77 61 73 20 73 75 63 68 20 61 20  e.** was such a 
20280 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65 20 6e  clause and the n
20290 61 6d 65 64 20 69 6e 64 65 78 20 63 61 6e 6e 6f  amed index canno
202a0 74 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74 75  t be found, retu
202b0 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52  rn .** SQLITE_ER
202c0 52 4f 52 20 61 6e 64 20 6c 65 61 76 65 20 61 6e  ROR and leave an
202d0 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65   error in pParse
202e0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 70 6f 70  . Otherwise, pop
202f0 75 6c 61 74 65 20 0a 2a 2a 20 70 46 72 6f 6d 2d  ulate .** pFrom-
20300 3e 70 49 6e 64 65 78 20 61 6e 64 20 72 65 74 75  >pIndex and retu
20310 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  rn SQLITE_OK..*/
20320 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 64 65  .int sqlite3Inde
20330 78 65 64 42 79 4c 6f 6f 6b 75 70 28 50 61 72 73  xedByLookup(Pars
20340 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72 75 63  e *pParse, struc
20350 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
20360 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70 46  pFrom){.  if( pF
20370 72 6f 6d 2d 3e 70 54 61 62 20 26 26 20 70 46 72  rom->pTab && pFr
20380 6f 6d 2d 3e 7a 49 6e 64 65 78 20 29 7b 0a 20 20  om->zIndex ){.  
20390 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
203a0 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  pFrom->pTab;.   
203b0 20 63 68 61 72 20 2a 7a 49 6e 64 65 78 20 3d 20   char *zIndex = 
203c0 70 46 72 6f 6d 2d 3e 7a 49 6e 64 65 78 3b 0a 20  pFrom->zIndex;. 
203d0 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a     Index *pIdx;.
203e0 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61      for(pIdx=pTa
203f0 62 2d 3e 70 49 6e 64 65 78 3b 20 0a 20 20 20 20  b->pIndex; .    
20400 20 20 20 20 70 49 64 78 20 26 26 20 73 71 6c 69      pIdx && sqli
20410 74 65 33 53 74 72 49 43 6d 70 28 70 49 64 78 2d  te3StrICmp(pIdx-
20420 3e 7a 4e 61 6d 65 2c 20 7a 49 6e 64 65 78 29 3b  >zName, zIndex);
20430 20 0a 20 20 20 20 20 20 20 20 70 49 64 78 3d 70   .        pIdx=p
20440 49 64 78 2d 3e 70 4e 65 78 74 0a 20 20 20 20 29  Idx->pNext.    )
20450 3b 0a 20 20 20 20 69 66 28 20 21 70 49 64 78 20  ;.    if( !pIdx 
20460 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
20470 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
20480 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a   "no such index:
20490 20 25 73 22 2c 20 7a 49 6e 64 65 78 2c 20 30 29   %s", zIndex, 0)
204a0 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
204b0 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b  checkSchema = 1;
204c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
204d0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
204e0 7d 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 49 6e  }.    pFrom->pIn
204f0 64 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 7d 0a  dex = pIdx;.  }.
20500 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
20510 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 44 65 74 65  OK;.}./*.** Dete
20520 63 74 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  ct compound SELE
20530 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68  CT statements th
20540 61 74 20 75 73 65 20 61 6e 20 4f 52 44 45 52 20  at use an ORDER 
20550 42 59 20 63 6c 61 75 73 65 20 77 69 74 68 20 0a  BY clause with .
20560 2a 2a 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76  ** an alternativ
20570 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
20580 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53  ence..**.**    S
20590 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74  ELECT ... FROM t
205a0 31 20 45 58 43 45 50 54 20 53 45 4c 45 43 54 20  1 EXCEPT SELECT 
205b0 2e 2e 2e 20 46 52 4f 4d 20 74 32 20 4f 52 44 45  ... FROM t2 ORDE
205c0 52 20 42 59 20 2e 2e 20 43 4f 4c 4c 41 54 45 20  R BY .. COLLATE 
205d0 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20  ....**.** These 
205e0 61 72 65 20 72 65 77 72 69 74 74 65 6e 20 61 73  are rewritten as
205f0 20 61 20 73 75 62 71 75 65 72 79 3a 0a 2a 2a 0a   a subquery:.**.
20600 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  **    SELECT * F
20610 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20  ROM (SELECT ... 
20620 46 52 4f 4d 20 74 31 20 45 58 43 45 50 54 20 53  FROM t1 EXCEPT S
20630 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74  ELECT ... FROM t
20640 32 29 0a 2a 2a 20 20 20 20 20 4f 52 44 45 52 20  2).**     ORDER 
20650 42 59 20 2e 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e  BY ... COLLATE .
20660 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 74 72  ...**.** This tr
20670 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20  ansformation is 
20680 6e 65 63 65 73 73 61 72 79 20 62 65 63 61 75 73  necessary becaus
20690 65 20 74 68 65 20 6d 75 6c 74 69 53 65 6c 65 63  e the multiSelec
206a0 74 4f 72 64 65 72 42 79 28 29 20 72 6f 75 74 69  tOrderBy() routi
206b0 6e 65 0a 2a 2a 20 61 62 6f 76 65 20 74 68 61 74  ne.** above that
206c0 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63   generates the c
206d0 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d 70 6f 75  ode for a compou
206e0 6e 64 20 53 45 4c 45 43 54 20 77 69 74 68 20 61  nd SELECT with a
206f0 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
20700 65 0a 2a 2a 20 75 73 65 73 20 61 20 6d 65 72 67  e.** uses a merg
20710 65 20 61 6c 67 6f 72 69 74 68 6d 20 74 68 61 74  e algorithm that
20720 20 72 65 71 75 69 72 65 73 20 74 68 65 20 73 61   requires the sa
20730 6d 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  me collating seq
20740 75 65 6e 63 65 20 6f 6e 20 74 68 65 0a 2a 2a 20  uence on the.** 
20750 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 61  result columns a
20760 73 20 6f 6e 20 74 68 65 20 4f 52 44 45 52 20 42  s on the ORDER B
20770 59 20 63 6c 61 75 73 65 2e 20 20 53 65 65 20 74  Y clause.  See t
20780 69 63 6b 65 74 0a 2a 2a 20 68 74 74 70 3a 2f 2f  icket.** http://
20790 77 77 77 2e 73 71 6c 69 74 65 2e 6f 72 67 2f 73  www.sqlite.org/s
207a0 72 63 2f 69 6e 66 6f 2f 36 37 30 39 35 37 34 64  rc/info/6709574d
207b0 32 61 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 74 72  2a.**.** This tr
207c0 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20  ansformation is 
207d0 6f 6e 6c 79 20 6e 65 65 64 65 64 20 66 6f 72 20  only needed for 
207e0 45 58 43 45 50 54 2c 20 49 4e 54 45 52 53 45 43  EXCEPT, INTERSEC
207f0 54 2c 20 61 6e 64 20 55 4e 49 4f 4e 2e 0a 2a 2a  T, and UNION..**
20800 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f   The UNION ALL o
20810 70 65 72 61 74 6f 72 20 77 6f 72 6b 73 20 66 69  perator works fi
20820 6e 65 20 77 69 74 68 20 6d 75 6c 74 69 53 65 6c  ne with multiSel
20830 65 63 74 4f 72 64 65 72 42 79 28 29 20 65 76 65  ectOrderBy() eve
20840 6e 20 77 68 65 6e 0a 2a 2a 20 74 68 65 72 65 20  n when.** there 
20850 61 72 65 20 43 4f 4c 4c 41 54 45 20 74 65 72 6d  are COLLATE term
20860 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42  s in the ORDER B
20870 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  Y..*/.static int
20880 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64   convertCompound
20890 53 65 6c 65 63 74 54 6f 53 75 62 71 75 65 72 79  SelectToSubquery
208a0 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
208b0 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
208c0 69 6e 74 20 69 3b 0a 20 20 53 65 6c 65 63 74 20  int i;.  Select 
208d0 2a 70 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74 20  *pNew;.  Select 
208e0 2a 70 58 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  *pX;.  sqlite3 *
208f0 64 62 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70  db;.  struct Exp
20900 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20  rList_item *a;. 
20910 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 53 72   SrcList *pNewSr
20920 63 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  c;.  Parse *pPar
20930 73 65 3b 0a 20 20 54 6f 6b 65 6e 20 64 75 6d 6d  se;.  Token dumm
20940 79 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 50 72  y;..  if( p->pPr
20950 69 6f 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ior==0 ) return 
20960 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
20970 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d  if( p->pOrderBy=
20980 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
20990 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 66 6f 72 28  Continue;.  for(
209a0 70 58 3d 70 3b 20 70 58 20 26 26 20 28 70 58 2d  pX=p; pX && (pX-
209b0 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70  >op==TK_ALL || p
209c0 58 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  X->op==TK_SELECT
209d0 29 3b 20 70 58 3d 70 58 2d 3e 70 50 72 69 6f 72  ); pX=pX->pPrior
209e0 29 7b 7d 0a 20 20 69 66 28 20 70 58 3d 3d 30 20  ){}.  if( pX==0 
209f0 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e  ) return WRC_Con
20a00 74 69 6e 75 65 3b 0a 20 20 61 20 3d 20 70 2d 3e  tinue;.  a = p->
20a10 70 4f 72 64 65 72 42 79 2d 3e 61 3b 0a 20 20 66  pOrderBy->a;.  f
20a20 6f 72 28 69 3d 70 2d 3e 70 4f 72 64 65 72 42 79  or(i=p->pOrderBy
20a30 2d 3e 6e 45 78 70 72 2d 31 3b 20 69 3e 3d 30 3b  ->nExpr-1; i>=0;
20a40 20 69 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20 61   i--){.    if( a
20a50 5b 69 5d 2e 70 45 78 70 72 2d 3e 66 6c 61 67 73  [i].pExpr->flags
20a60 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 20   & EP_Collate ) 
20a70 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28  break;.  }.  if(
20a80 20 69 3c 30 20 29 20 72 65 74 75 72 6e 20 57 52   i<0 ) return WR
20a90 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 2f  C_Continue;..  /
20aa0 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68  * If we reach th
20ab0 69 73 20 70 6f 69 6e 74 2c 20 74 68 61 74 20 6d  is point, that m
20ac0 65 61 6e 73 20 74 68 65 20 74 72 61 6e 73 66 6f  eans the transfo
20ad0 72 6d 61 74 69 6f 6e 20 69 73 20 72 65 71 75 69  rmation is requi
20ae0 72 65 64 2e 20 2a 2f 0a 0a 20 20 70 50 61 72 73  red. */..  pPars
20af0 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61  e = pWalker->pPa
20b00 72 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  rse;.  db = pPar
20b10 73 65 2d 3e 64 62 3b 0a 20 20 70 4e 65 77 20 3d  se->db;.  pNew =
20b20 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
20b30 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
20b40 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20  *pNew) );.  if( 
20b50 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
20b60 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 6d 65   WRC_Abort;.  me
20b70 6d 73 65 74 28 26 64 75 6d 6d 79 2c 20 30 2c 20  mset(&dummy, 0, 
20b80 73 69 7a 65 6f 66 28 64 75 6d 6d 79 29 29 3b 0a  sizeof(dummy));.
20b90 20 20 70 4e 65 77 53 72 63 20 3d 20 73 71 6c 69    pNewSrc = sqli
20ba0 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
20bb0 46 72 6f 6d 54 65 72 6d 28 70 50 61 72 73 65 2c  FromTerm(pParse,
20bc0 30 2c 30 2c 30 2c 26 64 75 6d 6d 79 2c 70 4e 65  0,0,0,&dummy,pNe
20bd0 77 2c 30 2c 30 29 3b 0a 20 20 69 66 28 20 70 4e  w,0,0);.  if( pN
20be0 65 77 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72  ewSrc==0 ) retur
20bf0 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 2a  n WRC_Abort;.  *
20c00 70 4e 65 77 20 3d 20 2a 70 3b 0a 20 20 70 2d 3e  pNew = *p;.  p->
20c10 70 53 72 63 20 3d 20 70 4e 65 77 53 72 63 3b 0a  pSrc = pNewSrc;.
20c20 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71    p->pEList = sq
20c30 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
20c40 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 73  end(pParse, 0, s
20c50 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54  qlite3Expr(db, T
20c60 4b 5f 41 4c 4c 2c 20 30 29 29 3b 0a 20 20 70 2d  K_ALL, 0));.  p-
20c70 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b  >op = TK_SELECT;
20c80 0a 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 30  .  p->pWhere = 0
20c90 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70  ;.  pNew->pGroup
20ca0 42 79 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  By = 0;.  pNew->
20cb0 70 48 61 76 69 6e 67 20 3d 20 30 3b 0a 20 20 70  pHaving = 0;.  p
20cc0 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  New->pOrderBy = 
20cd0 30 3b 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d  0;.  p->pPrior =
20ce0 20 30 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d   0;.  p->pNext =
20cf0 20 30 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67   0;.  p->selFlag
20d00 73 20 26 3d 20 7e 53 46 5f 43 6f 6d 70 6f 75 6e  s &= ~SF_Compoun
20d10 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65  d;.  assert( pNe
20d20 77 2d 3e 70 50 72 69 6f 72 21 3d 30 20 29 3b 0a  w->pPrior!=0 );.
20d30 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 2d 3e    pNew->pPrior->
20d40 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20  pNext = pNew;.  
20d50 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 30  pNew->pLimit = 0
20d60 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65  ;.  pNew->pOffse
20d70 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  t = 0;.  return 
20d80 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
20d90 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
20da0 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 41  OMIT_CTE./*.** A
20db0 72 67 75 6d 65 6e 74 20 70 57 69 74 68 20 28 77  rgument pWith (w
20dc0 68 69 63 68 20 6d 61 79 20 62 65 20 4e 55 4c 4c  hich may be NULL
20dd0 29 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 6c 69  ) points to a li
20de0 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6e 65 73  nked list of nes
20df0 74 65 64 20 0a 2a 2a 20 57 49 54 48 20 63 6f 6e  ted .** WITH con
20e00 74 65 78 74 73 2c 20 66 72 6f 6d 20 69 6e 6e 65  texts, from inne
20e10 72 20 74 6f 20 6f 75 74 65 72 6d 6f 73 74 2e 20  r to outermost. 
20e20 49 66 20 74 68 65 20 74 61 62 6c 65 20 69 64 65  If the table ide
20e30 6e 74 69 66 69 65 64 20 62 79 20 0a 2a 2a 20 46  ntified by .** F
20e40 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65  ROM clause eleme
20e50 6e 74 20 70 49 74 65 6d 20 69 73 20 72 65 61 6c  nt pItem is real
20e60 6c 79 20 61 20 63 6f 6d 6d 6f 6e 2d 74 61 62 6c  ly a common-tabl
20e70 65 2d 65 78 70 72 65 73 73 69 6f 6e 20 28 43 54  e-expression (CT
20e80 45 29 20 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75  E) .** then retu
20e90 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
20ea0 74 68 65 20 43 54 45 20 64 65 66 69 6e 69 74 69  the CTE definiti
20eb0 6f 6e 20 66 6f 72 20 74 68 61 74 20 74 61 62 6c  on for that tabl
20ec0 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20  e. Otherwise.** 
20ed0 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a  return NULL..**.
20ee0 2a 2a 20 49 66 20 61 20 6e 6f 6e 2d 4e 55 4c 4c  ** If a non-NULL
20ef0 20 76 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e   value is return
20f00 65 64 2c 20 73 65 74 20 2a 70 70 43 6f 6e 74 65  ed, set *ppConte
20f10 78 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  xt to point to t
20f20 68 65 20 57 69 74 68 0a 2a 2a 20 6f 62 6a 65 63  he With.** objec
20f30 74 20 74 68 61 74 20 74 68 65 20 72 65 74 75 72  t that the retur
20f40 6e 65 64 20 43 54 45 20 62 65 6c 6f 6e 67 73 20  ned CTE belongs 
20f50 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74  to..*/.static st
20f60 72 75 63 74 20 43 74 65 20 2a 73 65 61 72 63 68  ruct Cte *search
20f70 57 69 74 68 28 0a 20 20 57 69 74 68 20 2a 70 57  With(.  With *pW
20f80 69 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  ith,            
20f90 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
20fa0 6e 74 20 6f 75 74 65 72 6d 6f 73 74 20 57 49 54  nt outermost WIT
20fb0 48 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74  H clause */.  st
20fc0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
20fd0 6d 20 2a 70 49 74 65 6d 2c 20 20 20 20 20 2f 2a  m *pItem,     /*
20fe0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65   FROM clause ele
20ff0 6d 65 6e 74 20 74 6f 20 72 65 73 6f 6c 76 65 20  ment to resolve 
21000 2a 2f 0a 20 20 57 69 74 68 20 2a 2a 70 70 43 6f  */.  With **ppCo
21010 6e 74 65 78 74 20 20 20 20 20 20 20 20 20 20 20  ntext           
21020 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 57 49 54       /* OUT: WIT
21030 48 20 63 6c 61 75 73 65 20 72 65 74 75 72 6e 20  H clause return 
21040 76 61 6c 75 65 20 62 65 6c 6f 6e 67 73 20 74 6f  value belongs to
21050 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63   */.){.  const c
21060 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66  har *zName;.  if
21070 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  ( pItem->zDataba
21080 73 65 3d 3d 30 20 26 26 20 28 7a 4e 61 6d 65 20  se==0 && (zName 
21090 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 21  = pItem->zName)!
210a0 3d 30 20 29 7b 0a 20 20 20 20 57 69 74 68 20 2a  =0 ){.    With *
210b0 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 57 69  p;.    for(p=pWi
210c0 74 68 3b 20 70 3b 20 70 3d 70 2d 3e 70 4f 75 74  th; p; p=p->pOut
210d0 65 72 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  er){.      int i
210e0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
210f0 20 69 3c 70 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29   i<p->nCte; i++)
21100 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
21110 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 4e 61  lite3StrICmp(zNa
21120 6d 65 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  me, p->a[i].zNam
21130 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
21140 20 20 20 2a 70 70 43 6f 6e 74 65 78 74 20 3d 20     *ppContext = 
21150 70 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  p;.          ret
21160 75 72 6e 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20  urn &p->a[i];.  
21170 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
21180 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
21190 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20  rn 0;.}../* The 
211a0 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 6d  code generator m
211b0 61 69 6e 74 61 69 6e 73 20 61 20 73 74 61 63 6b  aintains a stack
211c0 20 6f 66 20 61 63 74 69 76 65 20 57 49 54 48 20   of active WITH 
211d0 63 6c 61 75 73 65 73 0a 2a 2a 20 77 69 74 68 20  clauses.** with 
211e0 74 68 65 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 57  the inner-most W
211f0 49 54 48 20 63 6c 61 75 73 65 20 62 65 69 6e 67  ITH clause being
21200 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74   at the top of t
21210 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  he stack..**.** 
21220 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70 75 73  This routine pus
21230 68 65 73 20 74 68 65 20 57 49 54 48 20 63 6c 61  hes the WITH cla
21240 75 73 65 20 70 61 73 73 65 64 20 61 73 20 74 68  use passed as th
21250 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
21260 74 0a 2a 2a 20 6f 6e 74 6f 20 74 68 65 20 74 6f  t.** onto the to
21270 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 20  p of the stack. 
21280 49 66 20 61 72 67 75 6d 65 6e 74 20 62 46 72 65  If argument bFre
21290 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  e is true, then 
212a0 74 68 69 73 0a 2a 2a 20 57 49 54 48 20 63 6c 61  this.** WITH cla
212b0 75 73 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  use will never b
212c0 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68  e popped from th
212d0 65 20 73 74 61 63 6b 2e 20 49 6e 20 74 68 69 73  e stack. In this
212e0 20 63 61 73 65 20 69 74 0a 2a 2a 20 73 68 6f 75   case it.** shou
212f0 6c 64 20 62 65 20 66 72 65 65 64 20 61 6c 6f 6e  ld be freed alon
21300 67 20 77 69 74 68 20 74 68 65 20 50 61 72 73 65  g with the Parse
21310 20 6f 62 6a 65 63 74 2e 20 49 6e 20 6f 74 68 65   object. In othe
21320 72 20 63 61 73 65 73 2c 20 77 68 65 6e 0a 2a 2a  r cases, when.**
21330 20 62 46 72 65 65 3d 3d 30 2c 20 74 68 65 20 57   bFree==0, the W
21340 69 74 68 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20  ith object will 
21350 62 65 20 66 72 65 65 64 20 61 6c 6f 6e 67 20 77  be freed along w
21360 69 74 68 20 74 68 65 20 53 45 4c 45 43 54 20 0a  ith the SELECT .
21370 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 69 74  ** statement wit
21380 68 20 77 68 69 63 68 20 69 74 20 69 73 20 61 73  h which it is as
21390 73 6f 63 69 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69  sociated..*/.voi
213a0 64 20 73 71 6c 69 74 65 33 57 69 74 68 50 75 73  d sqlite3WithPus
213b0 68 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  h(Parse *pParse,
213c0 20 57 69 74 68 20 2a 70 57 69 74 68 2c 20 75 38   With *pWith, u8
213d0 20 62 46 72 65 65 29 7b 0a 20 20 61 73 73 65 72   bFree){.  asser
213e0 74 28 20 62 46 72 65 65 3d 3d 30 20 7c 7c 20 70  t( bFree==0 || p
213f0 50 61 72 73 65 2d 3e 70 57 69 74 68 3d 3d 30 20  Parse->pWith==0 
21400 29 3b 0a 20 20 69 66 28 20 70 57 69 74 68 20 29  );.  if( pWith )
21410 7b 0a 20 20 20 20 70 57 69 74 68 2d 3e 70 4f 75  {.    pWith->pOu
21420 74 65 72 20 3d 20 70 50 61 72 73 65 2d 3e 70 57  ter = pParse->pW
21430 69 74 68 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  ith;.    pParse-
21440 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68 3b 0a  >pWith = pWith;.
21450 20 20 20 20 70 50 61 72 73 65 2d 3e 62 46 72 65      pParse->bFre
21460 65 57 69 74 68 20 3d 20 62 46 72 65 65 3b 0a 20  eWith = bFree;. 
21470 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
21480 20 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73   function checks
21490 20 69 66 20 61 72 67 75 6d 65 6e 74 20 70 46 72   if argument pFr
214a0 6f 6d 20 72 65 66 65 72 73 20 74 6f 20 61 20 43  om refers to a C
214b0 54 45 20 64 65 63 6c 61 72 65 64 20 62 79 20 0a  TE declared by .
214c0 2a 2a 20 61 20 57 49 54 48 20 63 6c 61 75 73 65  ** a WITH clause
214d0 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 20 63 75   on the stack cu
214e0 72 72 65 6e 74 6c 79 20 6d 61 69 6e 74 61 69 6e  rrently maintain
214f0 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
21500 2e 20 41 6e 64 2c 0a 2a 2a 20 69 66 20 63 75 72  . And,.** if cur
21510 72 65 6e 74 6c 79 20 70 72 6f 63 65 73 73 69 6e  rently processin
21520 67 20 61 20 43 54 45 20 65 78 70 72 65 73 73 69  g a CTE expressi
21530 6f 6e 2c 20 69 66 20 69 74 20 69 73 20 61 20 72  on, if it is a r
21540 65 63 75 72 73 69 76 65 0a 2a 2a 20 72 65 66 65  ecursive.** refe
21550 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63 75 72  rence to the cur
21560 72 65 6e 74 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20  rent CTE..**.** 
21570 49 66 20 70 46 72 6f 6d 20 66 61 6c 6c 73 20 69  If pFrom falls i
21580 6e 74 6f 20 65 69 74 68 65 72 20 6f 66 20 74 68  nto either of th
21590 65 20 74 77 6f 20 63 61 74 65 67 6f 72 69 65 73  e two categories
215a0 20 61 62 6f 76 65 2c 20 70 46 72 6f 6d 2d 3e 70   above, pFrom->p
215b0 54 61 62 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72  Tab.** and other
215c0 20 66 69 65 6c 64 73 20 61 72 65 20 70 6f 70 75   fields are popu
215d0 6c 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c  lated accordingl
215e0 79 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 73 68  y. The caller sh
215f0 6f 75 6c 64 20 63 68 65 63 6b 0a 2a 2a 20 28 70  ould check.** (p
21600 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 29 20 74  From->pTab!=0) t
21610 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74  o determine whet
21620 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 73 75 63  her or not a suc
21630 63 65 73 73 66 75 6c 20 6d 61 74 63 68 0a 2a 2a  cessful match.**
21640 20 77 61 73 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a   was found..**.*
21650 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  * Whether or not
21660 20 61 20 6d 61 74 63 68 20 69 73 20 66 6f 75 6e   a match is foun
21670 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  d, SQLITE_OK is 
21680 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65  returned if no e
21690 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 2e 20  rror.** occurs. 
216a0 49 66 20 61 6e 20 65 72 72 6f 72 20 64 6f 65 73  If an error does
216b0 20 6f 63 63 75 72 2c 20 61 6e 20 65 72 72 6f 72   occur, an error
216c0 20 6d 65 73 73 61 67 65 20 69 73 20 73 74 6f 72   message is stor
216d0 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 70 61 72  ed in the.** par
216e0 73 65 72 20 61 6e 64 20 73 6f 6d 65 20 65 72 72  ser and some err
216f0 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 20 74 68  or code other th
21700 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  an SQLITE_OK ret
21710 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
21720 20 69 6e 74 20 77 69 74 68 45 78 70 61 6e 64 28   int withExpand(
21730 0a 20 20 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  .  Walker *pWalk
21740 65 72 2c 20 0a 20 20 73 74 72 75 63 74 20 53 72  er, .  struct Sr
21750 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f  cList_item *pFro
21760 6d 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  m.){.  Parse *pP
21770 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  arse = pWalker->
21780 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65  pParse;.  sqlite
21790 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
217a0 64 62 3b 0a 20 20 73 74 72 75 63 74 20 43 74 65  db;.  struct Cte
217b0 20 2a 70 43 74 65 3b 20 20 20 20 20 20 20 20 20   *pCte;         
217c0 20 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 65 64        /* Matched
217d0 20 43 54 45 20 28 6f 72 20 4e 55 4c 4c 20 69 66   CTE (or NULL if
217e0 20 6e 6f 20 6d 61 74 63 68 29 20 2a 2f 0a 20 20   no match) */.  
217f0 57 69 74 68 20 2a 70 57 69 74 68 3b 20 20 20 20  With *pWith;    
21800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21810 2f 2a 20 57 49 54 48 20 63 6c 61 75 73 65 20 74  /* WITH clause t
21820 68 61 74 20 70 43 74 65 20 62 65 6c 6f 6e 67 73  hat pCte belongs
21830 20 74 6f 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74   to */..  assert
21840 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30  ( pFrom->pTab==0
21850 20 29 3b 0a 0a 20 20 70 43 74 65 20 3d 20 73 65   );..  pCte = se
21860 61 72 63 68 57 69 74 68 28 70 50 61 72 73 65 2d  archWith(pParse-
21870 3e 70 57 69 74 68 2c 20 70 46 72 6f 6d 2c 20 26  >pWith, pFrom, &
21880 70 57 69 74 68 29 3b 0a 20 20 69 66 28 20 70 43  pWith);.  if( pC
21890 74 65 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  te ){.    Table 
218a0 2a 70 54 61 62 3b 0a 20 20 20 20 45 78 70 72 4c  *pTab;.    ExprL
218b0 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20  ist *pEList;.   
218c0 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 20   Select *pSel;. 
218d0 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 65 66 74     Select *pLeft
218e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
218f0 20 2f 2a 20 4c 65 66 74 2d 6d 6f 73 74 20 53 45   /* Left-most SE
21900 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
21910 2f 0a 20 20 20 20 69 6e 74 20 62 4d 61 79 52 65  /.    int bMayRe
21920 63 75 72 73 69 76 65 3b 20 20 20 20 20 20 20 20  cursive;        
21930 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63      /* True if c
21940 6f 6d 70 6f 75 6e 64 20 6a 6f 69 6e 65 64 20 62  ompound joined b
21950 79 20 55 4e 49 4f 4e 20 5b 41 4c 4c 5d 20 2a 2f  y UNION [ALL] */
21960 0a 20 20 20 20 57 69 74 68 20 2a 70 53 61 76 65  .    With *pSave
21970 64 57 69 74 68 3b 20 20 20 20 20 20 20 20 20 20  dWith;          
21980 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 76 61     /* Initial va
21990 6c 75 65 20 6f 66 20 70 50 61 72 73 65 2d 3e 70  lue of pParse->p
219a0 57 69 74 68 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  With */..    /* 
219b0 49 66 20 70 43 74 65 2d 3e 7a 45 72 72 20 69 73  If pCte->zErr is
219c0 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 74 20 74 68 69   non-NULL at thi
219d0 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 74 68  s point, then th
219e0 69 73 20 69 73 20 61 6e 20 69 6c 6c 65 67 61 6c  is is an illegal
219f0 0a 20 20 20 20 2a 2a 20 72 65 63 75 72 73 69 76  .    ** recursiv
21a00 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 43  e reference to C
21a10 54 45 20 70 43 74 65 2e 20 4c 65 61 76 65 20 61  TE pCte. Leave a
21a20 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73  n error in pPars
21a30 65 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 20  e and return.   
21a40 20 2a 2a 20 65 61 72 6c 79 2e 20 49 66 20 70 43   ** early. If pC
21a50 74 65 2d 3e 7a 45 72 72 20 69 73 20 4e 55 4c 4c  te->zErr is NULL
21a60 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 6e  , then this is n
21a70 6f 74 20 61 20 72 65 63 75 72 73 69 76 65 20 72  ot a recursive r
21a80 65 66 65 72 65 6e 63 65 2e 0a 20 20 20 20 2a 2a  eference..    **
21a90 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 70   In this case, p
21aa0 72 6f 63 65 65 64 2e 20 20 2a 2f 0a 20 20 20 20  roceed.  */.    
21ab0 69 66 28 20 70 43 74 65 2d 3e 7a 45 72 72 20 29  if( pCte->zErr )
21ac0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
21ad0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
21ae0 70 43 74 65 2d 3e 7a 45 72 72 2c 20 70 43 74 65  pCte->zErr, pCte
21af0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
21b00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
21b10 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
21b20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
21b30 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 70 46  Tab==0 );.    pF
21b40 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62  rom->pTab = pTab
21b50 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
21b60 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
21b70 66 28 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 69  f(Table));.    i
21b80 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74  f( pTab==0 ) ret
21b90 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
21ba0 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20     pTab->nRef = 
21bb0 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61  1;.    pTab->zNa
21bc0 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
21bd0 72 44 75 70 28 64 62 2c 20 70 43 74 65 2d 3e 7a  rDup(db, pCte->z
21be0 4e 61 6d 65 29 3b 0a 20 20 20 20 70 54 61 62 2d  Name);.    pTab-
21bf0 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20  >iPKey = -1;.   
21c00 20 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74 20 3d   pTab->nRowEst =
21c10 20 31 30 34 38 35 37 36 3b 0a 20 20 20 20 70 54   1048576;.    pT
21c20 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20  ab->tabFlags |= 
21c30 54 46 5f 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20  TF_Ephemeral;.  
21c40 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74    pFrom->pSelect
21c50 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
21c60 44 75 70 28 64 62 2c 20 70 43 74 65 2d 3e 70 53  Dup(db, pCte->pS
21c70 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 69  elect, 0);.    i
21c80 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
21c90 6c 65 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c  led ) return SQL
21ca0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 61  ITE_NOMEM;.    a
21cb0 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53  ssert( pFrom->pS
21cc0 65 6c 65 63 74 20 29 3b 0a 0a 20 20 20 20 2f 2a  elect );..    /*
21cd0 20 43 68 65 63 6b 20 69 66 20 74 68 69 73 20 69   Check if this i
21ce0 73 20 61 20 72 65 63 75 72 73 69 76 65 20 43 54  s a recursive CT
21cf0 45 2e 20 2a 2f 0a 20 20 20 20 70 53 65 6c 20 3d  E. */.    pSel =
21d00 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b   pFrom->pSelect;
21d10 0a 20 20 20 20 62 4d 61 79 52 65 63 75 72 73 69  .    bMayRecursi
21d20 76 65 20 3d 20 28 20 70 53 65 6c 2d 3e 6f 70 3d  ve = ( pSel->op=
21d30 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 53 65 6c 2d  =TK_ALL || pSel-
21d40 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b  >op==TK_UNION );
21d50 0a 20 20 20 20 69 66 28 20 62 4d 61 79 52 65 63  .    if( bMayRec
21d60 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20  ursive ){.      
21d70 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 53 72 63  int i;.      Src
21d80 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70 46 72  List *pSrc = pFr
21d90 6f 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72  om->pSelect->pSr
21da0 63 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  c;.      for(i=0
21db0 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20  ; i<pSrc->nSrc; 
21dc0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 74  i++){.        st
21dd0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
21de0 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 53 72 63  m *pItem = &pSrc
21df0 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  ->a[i];.        
21e00 69 66 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61  if( pItem->zData
21e10 62 61 73 65 3d 3d 30 20 0a 20 20 20 20 20 20 20  base==0 .       
21e20 20 20 26 26 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d    && pItem->zNam
21e30 65 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20 26  e!=0 .         &
21e40 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49  & 0==sqlite3StrI
21e50 43 6d 70 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  Cmp(pItem->zName
21e60 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 0a 20  , pCte->zName). 
21e70 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
21e80 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61        pItem->pTa
21e90 62 20 3d 20 70 54 61 62 3b 0a 20 20 20 20 20 20  b = pTab;.      
21ea0 20 20 20 20 70 49 74 65 6d 2d 3e 69 73 52 65 63      pItem->isRec
21eb0 75 72 73 69 76 65 20 3d 20 31 3b 0a 20 20 20 20  ursive = 1;.    
21ec0 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66        pTab->nRef
21ed0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53  ++;.          pS
21ee0 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20  el->selFlags |= 
21ef0 53 46 5f 52 65 63 75 72 73 69 76 65 3b 0a 20 20  SF_Recursive;.  
21f00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
21f10 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 6e      }..    /* On
21f20 6c 79 20 6f 6e 65 20 72 65 63 75 72 73 69 76 65  ly one recursive
21f30 20 72 65 66 65 72 65 6e 63 65 20 69 73 20 70 65   reference is pe
21f40 72 6d 69 74 74 65 64 2e 20 2a 2f 20 0a 20 20 20  rmitted. */ .   
21f50 20 69 66 28 20 70 54 61 62 2d 3e 6e 52 65 66 3e   if( pTab->nRef>
21f60 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  2 ){.      sqlit
21f70 65 33 45 72 72 6f 72 4d 73 67 28 0a 20 20 20 20  e3ErrorMsg(.    
21f80 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 22 6d        pParse, "m
21f90 75 6c 74 69 70 6c 65 20 72 65 66 65 72 65 6e 63  ultiple referenc
21fa0 65 73 20 74 6f 20 72 65 63 75 72 73 69 76 65 20  es to recursive 
21fb0 74 61 62 6c 65 3a 20 25 73 22 2c 20 70 43 74 65  table: %s", pCte
21fc0 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b  ->zName.      );
21fd0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
21fe0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
21ff0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  }.    assert( pT
22000 61 62 2d 3e 6e 52 65 66 3d 3d 31 20 7c 7c 20 28  ab->nRef==1 || (
22010 28 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 26  (pSel->selFlags&
22020 53 46 5f 52 65 63 75 72 73 69 76 65 29 20 26 26  SF_Recursive) &&
22030 20 70 54 61 62 2d 3e 6e 52 65 66 3d 3d 32 20 29   pTab->nRef==2 )
22040 29 3b 0a 0a 20 20 20 20 70 43 74 65 2d 3e 7a 45  );..    pCte->zE
22050 72 72 20 3d 20 22 63 69 72 63 75 6c 61 72 20 72  rr = "circular r
22060 65 66 65 72 65 6e 63 65 3a 20 25 73 22 3b 0a 20  eference: %s";. 
22070 20 20 20 70 53 61 76 65 64 57 69 74 68 20 3d 20     pSavedWith = 
22080 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3b 0a 20  pParse->pWith;. 
22090 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68     pParse->pWith
220a0 20 3d 20 70 57 69 74 68 3b 0a 20 20 20 20 73 71   = pWith;.    sq
220b0 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28  lite3WalkSelect(
220c0 70 57 61 6c 6b 65 72 2c 20 62 4d 61 79 52 65 63  pWalker, bMayRec
220d0 75 72 73 69 76 65 20 3f 20 70 53 65 6c 2d 3e 70  ursive ? pSel->p
220e0 50 72 69 6f 72 20 3a 20 70 53 65 6c 29 3b 0a 0a  Prior : pSel);..
220f0 20 20 20 20 66 6f 72 28 70 4c 65 66 74 3d 70 53      for(pLeft=pS
22100 65 6c 3b 20 70 4c 65 66 74 2d 3e 70 50 72 69 6f  el; pLeft->pPrio
22110 72 3b 20 70 4c 65 66 74 3d 70 4c 65 66 74 2d 3e  r; pLeft=pLeft->
22120 70 50 72 69 6f 72 29 3b 0a 20 20 20 20 70 45 4c  pPrior);.    pEL
22130 69 73 74 20 3d 20 70 4c 65 66 74 2d 3e 70 45 4c  ist = pLeft->pEL
22140 69 73 74 3b 0a 20 20 20 20 69 66 28 20 70 43 74  ist;.    if( pCt
22150 65 2d 3e 70 43 6f 6c 73 20 29 7b 0a 20 20 20 20  e->pCols ){.    
22160 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45    if( pEList->nE
22170 78 70 72 21 3d 70 43 74 65 2d 3e 70 43 6f 6c 73  xpr!=pCte->pCols
22180 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->nExpr ){.     
22190 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
221a0 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c  sg(pParse, "tabl
221b0 65 20 25 73 20 68 61 73 20 25 64 20 76 61 6c 75  e %s has %d valu
221c0 65 73 20 66 6f 72 20 25 64 20 63 6f 6c 75 6d 6e  es for %d column
221d0 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
221e0 70 43 74 65 2d 3e 7a 4e 61 6d 65 2c 20 70 45 4c  pCte->zName, pEL
221f0 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 43 74 65  ist->nExpr, pCte
22200 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78 70 72 0a 20  ->pCols->nExpr. 
22210 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
22220 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20    pParse->pWith 
22230 3d 20 70 53 61 76 65 64 57 69 74 68 3b 0a 20 20  = pSavedWith;.  
22240 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
22250 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
22260 20 7d 0a 20 20 20 20 20 20 70 45 4c 69 73 74 20   }.      pEList 
22270 3d 20 70 43 74 65 2d 3e 70 43 6f 6c 73 3b 0a 20  = pCte->pCols;. 
22280 20 20 20 7d 0a 0a 20 20 20 20 73 65 6c 65 63 74     }..    select
22290 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c  ColumnsFromExprL
222a0 69 73 74 28 70 50 61 72 73 65 2c 20 70 45 4c 69  ist(pParse, pELi
222b0 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c  st, &pTab->nCol,
222c0 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20   &pTab->aCol);. 
222d0 20 20 20 69 66 28 20 62 4d 61 79 52 65 63 75 72     if( bMayRecur
222e0 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 69 66  sive ){.      if
222f0 28 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73  ( pSel->selFlags
22300 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 20   & SF_Recursive 
22310 29 7b 0a 20 20 20 20 20 20 20 20 70 43 74 65 2d  ){.        pCte-
22320 3e 7a 45 72 72 20 3d 20 22 6d 75 6c 74 69 70 6c  >zErr = "multipl
22330 65 20 72 65 63 75 72 73 69 76 65 20 72 65 66 65  e recursive refe
22340 72 65 6e 63 65 73 3a 20 25 73 22 3b 0a 20 20 20  rences: %s";.   
22350 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
22360 20 20 70 43 74 65 2d 3e 7a 45 72 72 20 3d 20 22    pCte->zErr = "
22370 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65  recursive refere
22380 6e 63 65 20 69 6e 20 61 20 73 75 62 71 75 65 72  nce in a subquer
22390 79 3a 20 25 73 22 3b 0a 20 20 20 20 20 20 7d 0a  y: %s";.      }.
223a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c        sqlite3Wal
223b0 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c  kSelect(pWalker,
223c0 20 70 53 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20   pSel);.    }.  
223d0 20 20 70 43 74 65 2d 3e 7a 45 72 72 20 3d 20 30    pCte->zErr = 0
223e0 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57  ;.    pParse->pW
223f0 69 74 68 20 3d 20 70 53 61 76 65 64 57 69 74 68  ith = pSavedWith
22400 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
22410 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
22420 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
22430 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a  ITE_OMIT_CTE./*.
22440 2a 2a 20 49 66 20 74 68 65 20 53 45 4c 45 43 54  ** If the SELECT
22450 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
22460 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 68  econd argument h
22470 61 73 20 61 6e 20 61 73 73 6f 63 69 61 74 65 64  as an associated
22480 20 57 49 54 48 20 0a 2a 2a 20 63 6c 61 75 73 65   WITH .** clause
22490 2c 20 70 6f 70 20 69 74 20 66 72 6f 6d 20 74 68  , pop it from th
224a0 65 20 73 74 61 63 6b 20 73 74 6f 72 65 64 20 61  e stack stored a
224b0 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 50 61  s part of the Pa
224c0 72 73 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a  rse object..**.*
224d0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
224e0 69 73 20 75 73 65 64 20 61 73 20 74 68 65 20 78  is used as the x
224f0 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 28  SelectCallback2(
22500 29 20 63 61 6c 6c 62 61 63 6b 20 62 79 0a 2a 2a  ) callback by.**
22510 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
22520 70 61 6e 64 28 29 20 77 68 65 6e 20 77 61 6c 6b  pand() when walk
22530 69 6e 67 20 61 20 53 45 4c 45 43 54 20 74 72 65  ing a SELECT tre
22540 65 20 74 6f 20 72 65 73 6f 6c 76 65 20 74 61 62  e to resolve tab
22550 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20 61 6e 64 20  le.** names and 
22560 6f 74 68 65 72 20 46 52 4f 4d 20 63 6c 61 75 73  other FROM claus
22570 65 20 65 6c 65 6d 65 6e 74 73 2e 20 0a 2a 2f 0a  e elements. .*/.
22580 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65  static void sele
22590 63 74 50 6f 70 57 69 74 68 28 57 61 6c 6b 65 72  ctPopWith(Walker
225a0 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63   *pWalker, Selec
225b0 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a  t *p){.  Parse *
225c0 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72  pParse = pWalker
225d0 2d 3e 70 50 61 72 73 65 3b 0a 20 20 57 69 74 68  ->pParse;.  With
225e0 20 2a 70 57 69 74 68 20 3d 20 66 69 6e 64 52 69   *pWith = findRi
225f0 67 68 74 6d 6f 73 74 28 70 29 2d 3e 70 57 69 74  ghtmost(p)->pWit
22600 68 3b 0a 20 20 69 66 28 20 70 57 69 74 68 21 3d  h;.  if( pWith!=
22610 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
22620 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3d 3d   pParse->pWith==
22630 70 57 69 74 68 20 29 3b 0a 20 20 20 20 70 50 61  pWith );.    pPa
22640 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69  rse->pWith = pWi
22650 74 68 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 7d 0a  th->pOuter;.  }.
22660 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  }.#else.#define 
22670 73 65 6c 65 63 74 50 6f 70 57 69 74 68 20 30 0a  selectPopWith 0.
22680 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
22690 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
226a0 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20  Walker callback 
226b0 66 6f 72 20 22 65 78 70 61 6e 64 69 6e 67 22 20  for "expanding" 
226c0 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
226d0 6e 74 2e 0a 2a 2a 20 22 45 78 70 61 6e 64 69 6e  nt..** "Expandin
226e0 67 22 20 6d 65 61 6e 73 20 74 6f 20 64 6f 20 74  g" means to do t
226f0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
22700 0a 2a 2a 20 20 20 20 28 31 29 20 20 4d 61 6b 65  .**    (1)  Make
22710 20 73 75 72 65 20 56 44 42 45 20 63 75 72 73 6f   sure VDBE curso
22720 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62  r numbers have b
22730 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20  een assigned to 
22740 65 76 65 72 79 0a 2a 2a 20 20 20 20 20 20 20 20  every.**        
22750 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
22760 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  FROM clause..**.
22770 2a 2a 20 20 20 20 28 32 29 20 20 46 69 6c 6c 20  **    (2)  Fill 
22780 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74 2d  in the pTabList-
22790 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64 73  >a[].pTab fields
227a0 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20   in the SrcList 
227b0 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 20 20  that .**        
227c0 20 64 65 66 69 6e 65 73 20 46 52 4f 4d 20 63 6c   defines FROM cl
227d0 61 75 73 65 2e 20 20 57 68 65 6e 20 76 69 65 77  ause.  When view
227e0 73 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20  s appear in the 
227f0 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a 2a 20  FROM clause,.** 
22800 20 20 20 20 20 20 20 20 66 69 6c 6c 20 70 54 61          fill pTa
22810 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65  bList->a[].pSele
22820 63 74 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f  ct with a copy o
22830 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  f the SELECT sta
22840 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20  tement.**       
22850 20 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74    that implement
22860 73 20 74 68 65 20 76 69 65 77 2e 20 20 41 20 63  s the view.  A c
22870 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20 74  opy is made of t
22880 68 65 20 76 69 65 77 27 73 20 53 45 4c 45 43 54  he view's SELECT
22890 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 74 61 74  .**         stat
228a0 65 6d 65 6e 74 20 73 6f 20 74 68 61 74 20 77 65  ement so that we
228b0 20 63 61 6e 20 66 72 65 65 6c 79 20 6d 6f 64 69   can freely modi
228c0 66 79 20 6f 72 20 64 65 6c 65 74 65 20 74 68 61  fy or delete tha
228d0 74 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20  t statement.**  
228e0 20 20 20 20 20 20 20 77 69 74 68 6f 75 74 20 77         without w
228f0 6f 72 72 79 69 6e 67 20 61 62 6f 75 74 20 6d 65  orrying about me
22900 73 73 69 6e 67 20 75 70 20 74 68 65 20 70 72 65  ssing up the pre
22910 73 69 73 74 65 6e 74 20 72 65 70 72 65 73 65 6e  sistent represen
22920 74 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20  tation.**       
22930 20 20 6f 66 20 74 68 65 20 76 69 65 77 2e 0a 2a    of the view..*
22940 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20 41 64 64  *.**    (3)  Add
22950 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 57 48   terms to the WH
22960 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 61 63  ERE clause to ac
22970 63 6f 6d 6f 64 61 74 65 20 74 68 65 20 4e 41 54  comodate the NAT
22980 55 52 41 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a 20  URAL keyword.** 
22990 20 20 20 20 20 20 20 20 6f 6e 20 6a 6f 69 6e 73          on joins
229a0 20 61 6e 64 20 74 68 65 20 4f 4e 20 61 6e 64 20   and the ON and 
229b0 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20  USING clause of 
229c0 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  joins..**.**    
229d0 28 34 29 20 20 53 63 61 6e 20 74 68 65 20 6c 69  (4)  Scan the li
229e0 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  st of columns in
229f0 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
22a00 28 70 45 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e 67  (pEList) looking
22a10 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 6f 72 20  .**         for 
22a20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65  instances of the
22a30 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 20 6f 72   "*" operator or
22a40 20 74 68 65 20 54 41 42 4c 45 2e 2a 20 6f 70 65   the TABLE.* ope
22a50 72 61 74 6f 72 2e 0a 2a 2a 20 20 20 20 20 20 20  rator..**       
22a60 20 20 49 66 20 66 6f 75 6e 64 2c 20 65 78 70 61    If found, expa
22a70 6e 64 20 65 61 63 68 20 22 2a 22 20 74 6f 20 62  nd each "*" to b
22a80 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69  e every column i
22a90 6e 20 65 76 65 72 79 20 74 61 62 6c 65 0a 2a 2a  n every table.**
22aa0 20 20 20 20 20 20 20 20 20 61 6e 64 20 54 41 42           and TAB
22ab0 4c 45 2e 2a 20 74 6f 20 62 65 20 65 76 65 72 79  LE.* to be every
22ac0 20 63 6f 6c 75 6d 6e 20 69 6e 20 54 41 42 4c 45   column in TABLE
22ad0 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ..**.*/.static i
22ae0 6e 74 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65  nt selectExpande
22af0 72 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  r(Walker *pWalke
22b00 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  r, Select *p){. 
22b10 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
22b20 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65   pWalker->pParse
22b30 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b  ;.  int i, j, k;
22b40 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
22b50 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73 74  List;.  ExprList
22b60 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73 74 72 75   *pEList;.  stru
22b70 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
22b80 2a 70 46 72 6f 6d 3b 0a 20 20 73 71 6c 69 74 65  *pFrom;.  sqlite
22b90 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
22ba0 64 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 2c 20  db;.  Expr *pE, 
22bb0 2a 70 52 69 67 68 74 2c 20 2a 70 45 78 70 72 3b  *pRight, *pExpr;
22bc0 0a 20 20 75 31 36 20 73 65 6c 46 6c 61 67 73 20  .  u16 selFlags 
22bd0 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 3b 0a 0a  = p->selFlags;..
22be0 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d    p->selFlags |=
22bf0 20 53 46 5f 45 78 70 61 6e 64 65 64 3b 0a 20 20   SF_Expanded;.  
22c00 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
22c10 69 6c 65 64 20 20 29 7b 0a 20 20 20 20 72 65 74  iled  ){.    ret
22c20 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
22c30 20 7d 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70   }.  if( NEVER(p
22c40 2d 3e 70 53 72 63 3d 3d 30 29 20 7c 7c 20 28 73  ->pSrc==0) || (s
22c50 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 45 78 70  elFlags & SF_Exp
22c60 61 6e 64 65 64 29 21 3d 30 20 29 7b 0a 20 20 20  anded)!=0 ){.   
22c70 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   return WRC_Prun
22c80 65 3b 0a 20 20 7d 0a 20 20 70 54 61 62 4c 69 73  e;.  }.  pTabLis
22c90 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70  t = p->pSrc;.  p
22ca0 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  EList = p->pELis
22cb0 74 3b 0a 20 20 73 71 6c 69 74 65 33 57 69 74 68  t;.  sqlite3With
22cc0 50 75 73 68 28 70 50 61 72 73 65 2c 20 66 69 6e  Push(pParse, fin
22cd0 64 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e 70  dRightmost(p)->p
22ce0 57 69 74 68 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20  With, 0);..  /* 
22cf0 4d 61 6b 65 20 73 75 72 65 20 63 75 72 73 6f 72  Make sure cursor
22d00 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62 65   numbers have be
22d10 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61  en assigned to a
22d20 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20  ll entries in.  
22d30 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  ** the FROM clau
22d40 73 65 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  se of the SELECT
22d50 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f   statement..  */
22d60 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
22d70 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70  tAssignCursors(p
22d80 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 29  Parse, pTabList)
22d90 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20  ;..  /* Look up 
22da0 65 76 65 72 79 20 74 61 62 6c 65 20 6e 61 6d 65  every table name
22db0 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  d in the FROM cl
22dc0 61 75 73 65 20 6f 66 20 74 68 65 20 73 65 6c 65  ause of the sele
22dd0 63 74 2e 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20  ct.  If.  ** an 
22de0 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f  entry of the FRO
22df0 4d 20 63 6c 61 75 73 65 20 69 73 20 61 20 73 75  M clause is a su
22e00 62 71 75 65 72 79 20 69 6e 73 74 65 61 64 20 6f  bquery instead o
22e10 66 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65  f a table or vie
22e20 77 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 63 72 65  w,.  ** then cre
22e30 61 74 65 20 61 20 74 72 61 6e 73 69 65 6e 74 20  ate a transient 
22e40 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  table structure 
22e50 74 6f 20 64 65 73 63 72 69 62 65 20 74 68 65 20  to describe the 
22e60 73 75 62 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  subquery..  */. 
22e70 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d   for(i=0, pFrom=
22e80 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70  pTabList->a; i<p
22e90 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
22ea0 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20  ++, pFrom++){.  
22eb0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
22ec0 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
22ed0 2d 3e 69 73 52 65 63 75 72 73 69 76 65 3d 3d 30  ->isRecursive==0
22ee0 20 7c 7c 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20   || pFrom->pTab 
22ef0 29 3b 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d  );.    if( pFrom
22f00 2d 3e 69 73 52 65 63 75 72 73 69 76 65 20 29 20  ->isRecursive ) 
22f10 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
22f20 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30  ( pFrom->pTab!=0
22f30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
22f40 73 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20  s statement has 
22f50 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 72 65  already been pre
22f60 70 61 72 65 64 2e 20 20 54 68 65 72 65 20 69 73  pared.  There is
22f70 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 20 20 2a   no need.      *
22f80 2a 20 74 6f 20 67 6f 20 66 75 72 74 68 65 72 2e  * to go further.
22f90 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
22fa0 28 20 69 3d 3d 30 20 29 3b 0a 23 69 66 6e 64 65  ( i==0 );.#ifnde
22fb0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  f SQLITE_OMIT_CT
22fc0 45 0a 20 20 20 20 20 20 73 65 6c 65 63 74 50 6f  E.      selectPo
22fd0 70 57 69 74 68 28 70 57 61 6c 6b 65 72 2c 20 70  pWith(pWalker, p
22fe0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
22ff0 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
23000 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
23010 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
23020 20 20 20 20 69 66 28 20 77 69 74 68 45 78 70 61      if( withExpa
23030 6e 64 28 70 57 61 6c 6b 65 72 2c 20 70 46 72 6f  nd(pWalker, pFro
23040 6d 29 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  m) ) return WRC_
23050 41 62 6f 72 74 3b 0a 20 20 20 20 69 66 28 20 70  Abort;.    if( p
23060 46 72 6f 6d 2d 3e 70 54 61 62 20 29 20 7b 7d 20  From->pTab ) {} 
23070 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
23080 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65  if( pFrom->zName
23090 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  ==0 ){.#ifndef S
230a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
230b0 45 52 59 0a 20 20 20 20 20 20 53 65 6c 65 63 74  ERY.      Select
230c0 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e   *pSel = pFrom->
230d0 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 2f  pSelect;.      /
230e0 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e  * A sub-query in
230f0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
23100 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a   of a SELECT */.
23110 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
23120 65 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  el!=0 );.      a
23130 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54  ssert( pFrom->pT
23140 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ab==0 );.      s
23150 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
23160 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b  (pWalker, pSel);
23170 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54  .      pFrom->pT
23180 61 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69  ab = pTab = sqli
23190 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
231a0 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65  db, sizeof(Table
231b0 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  ));.      if( pT
231c0 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57  ab==0 ) return W
231d0 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  RC_Abort;.      
231e0 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a  pTab->nRef = 1;.
231f0 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d        pTab->zNam
23200 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
23210 74 66 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 73  tf(db, "sqlite_s
23220 71 5f 25 70 22 2c 20 28 76 6f 69 64 2a 29 70 54  q_%p", (void*)pT
23230 61 62 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  ab);.      while
23240 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29  ( pSel->pPrior )
23250 7b 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70  { pSel = pSel->p
23260 50 72 69 6f 72 3b 20 7d 0a 20 20 20 20 20 20 73  Prior; }.      s
23270 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d  electColumnsFrom
23280 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
23290 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 2c 20 26   pSel->pEList, &
232a0 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61  pTab->nCol, &pTa
232b0 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 20 20  b->aCol);.      
232c0 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31  pTab->iPKey = -1
232d0 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52  ;.      pTab->nR
232e0 6f 77 45 73 74 20 3d 20 31 30 34 38 35 37 36 3b  owEst = 1048576;
232f0 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74 61 62  .      pTab->tab
23300 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70 68 65  Flags |= TF_Ephe
23310 6d 65 72 61 6c 3b 0a 23 65 6e 64 69 66 0a 20 20  meral;.#endif.  
23320 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
23330 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79 20 74 61  * An ordinary ta
23340 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65  ble or view name
23350 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
23360 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  use */.      ass
23370 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ert( pFrom->pTab
23380 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 46 72  ==0 );.      pFr
23390 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20  om->pTab = pTab 
233a0 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  = sqlite3LocateT
233b0 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c  ableItem(pParse,
233c0 20 30 2c 20 70 46 72 6f 6d 29 3b 0a 20 20 20 20   0, pFrom);.    
233d0 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20    if( pTab==0 ) 
233e0 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
233f0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ;.      if( pTab
23400 2d 3e 6e 52 65 66 3d 3d 30 78 66 66 66 66 20 29  ->nRef==0xffff )
23410 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
23420 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
23430 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 72 65 66 65  , "too many refe
23440 72 65 6e 63 65 73 20 74 6f 20 5c 22 25 73 5c 22  rences to \"%s\"
23450 3a 20 6d 61 78 20 36 35 35 33 35 22 2c 0a 20 20  : max 65535",.  
23460 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a           pTab->z
23470 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70  Name);.        p
23480 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a  From->pTab = 0;.
23490 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57          return W
234a0 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  RC_Abort;.      
234b0 7d 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52  }.      pTab->nR
234c0 65 66 2b 2b 3b 0a 23 69 66 20 21 64 65 66 69 6e  ef++;.#if !defin
234d0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
234e0 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  IEW) || !defined
234f0 20 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49   (SQLITE_OMIT_VI
23500 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 20 20  RTUALTABLE).    
23510 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c    if( pTab->pSel
23520 65 63 74 20 7c 7c 20 49 73 56 69 72 74 75 61 6c  ect || IsVirtual
23530 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
23540 20 20 2f 2a 20 57 65 20 72 65 61 63 68 20 68 65    /* We reach he
23550 72 65 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20  re if the named 
23560 74 61 62 6c 65 20 69 73 20 61 20 72 65 61 6c 6c  table is a reall
23570 79 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 20 20  y a view */.    
23580 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56      if( sqlite3V
23590 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
235a0 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 20  s(pParse, pTab) 
235b0 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
235c0 72 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  rt;.        asse
235d0 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  rt( pFrom->pSele
235e0 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ct==0 );.       
235f0 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20   pFrom->pSelect 
23600 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
23610 75 70 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 65  up(db, pTab->pSe
23620 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  lect, 0);.      
23630 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
23640 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 46 72  ect(pWalker, pFr
23650 6f 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  om->pSelect);.  
23660 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
23670 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 61 74   }..    /* Locat
23680 65 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65  e the index name
23690 64 20 62 79 20 74 68 65 20 49 4e 44 45 58 45 44  d by the INDEXED
236a0 20 42 59 20 63 6c 61 75 73 65 2c 20 69 66 20 61   BY clause, if a
236b0 6e 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  ny. */.    if( s
236c0 71 6c 69 74 65 33 49 6e 64 65 78 65 64 42 79 4c  qlite3IndexedByL
236d0 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70 46  ookup(pParse, pF
236e0 72 6f 6d 29 20 29 7b 0a 20 20 20 20 20 20 72 65  rom) ){.      re
236f0 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
23700 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
23710 50 72 6f 63 65 73 73 20 4e 41 54 55 52 41 4c 20  Process NATURAL 
23720 6b 65 79 77 6f 72 64 73 2c 20 61 6e 64 20 4f 4e  keywords, and ON
23730 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
23740 65 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a  es of joins..  *
23750 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  /.  if( db->mall
23760 6f 63 46 61 69 6c 65 64 20 7c 7c 20 73 71 6c 69  ocFailed || sqli
23770 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70 50  teProcessJoin(pP
23780 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20  arse, p) ){.    
23790 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
237a0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20  ;.  }..  /* For 
237b0 65 76 65 72 79 20 22 2a 22 20 74 68 61 74 20 6f  every "*" that o
237c0 63 63 75 72 73 20 69 6e 20 74 68 65 20 63 6f 6c  ccurs in the col
237d0 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72 74  umn list, insert
237e0 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20 20   the names of.  
237f0 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69  ** all columns i
23800 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20 41  n all tables.  A
23810 6e 64 20 66 6f 72 20 65 76 65 72 79 20 54 41 42  nd for every TAB
23820 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74 68 65 20  LE.* insert the 
23830 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61 6c  names.  ** of al
23840 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41 42  l columns in TAB
23850 4c 45 2e 20 20 54 68 65 20 70 61 72 73 65 72 20  LE.  The parser 
23860 69 6e 73 65 72 74 65 64 20 61 20 73 70 65 63 69  inserted a speci
23870 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  al expression.  
23880 2a 2a 20 77 69 74 68 20 74 68 65 20 54 4b 5f 41  ** with the TK_A
23890 4c 4c 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20  LL operator for 
238a0 65 61 63 68 20 22 2a 22 20 74 68 61 74 20 69 74  each "*" that it
238b0 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 63 6f   found in the co
238c0 6c 75 6d 6e 20 6c 69 73 74 2e 0a 20 20 2a 2a 20  lumn list..  ** 
238d0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  The following co
238e0 64 65 20 6a 75 73 74 20 68 61 73 20 74 6f 20 6c  de just has to l
238f0 6f 63 61 74 65 20 74 68 65 20 54 4b 5f 41 4c 4c  ocate the TK_ALL
23900 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 6e 64   expressions and
23910 20 65 78 70 61 6e 64 0a 20 20 2a 2a 20 65 61 63   expand.  ** eac
23920 68 20 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69 73  h one to the lis
23930 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73  t of all columns
23940 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a   in all tables..
23950 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69    **.  ** The fi
23960 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63 68  rst loop just ch
23970 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 74  ecks to see if t
23980 68 65 72 65 20 61 72 65 20 61 6e 79 20 22 2a 22  here are any "*"
23990 20 6f 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a 20   operators.  ** 
239a0 74 68 61 74 20 6e 65 65 64 20 65 78 70 61 6e 64  that need expand
239b0 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ing..  */.  for(
239c0 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e  k=0; k<pEList->n
239d0 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  Expr; k++){.    
239e0 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6b  pE = pEList->a[k
239f0 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ].pExpr;.    if(
23a00 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20   pE->op==TK_ALL 
23a10 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 61 73 73  ) break;.    ass
23a20 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f  ert( pE->op!=TK_
23a30 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68  DOT || pE->pRigh
23a40 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  t!=0 );.    asse
23a50 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44  rt( pE->op!=TK_D
23a60 4f 54 20 7c 7c 20 28 70 45 2d 3e 70 4c 65 66 74  OT || (pE->pLeft
23a70 21 3d 30 20 26 26 20 70 45 2d 3e 70 4c 65 66 74  !=0 && pE->pLeft
23a80 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 29 20 29 3b 0a  ->op==TK_ID) );.
23a90 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d      if( pE->op==
23aa0 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70 52  TK_DOT && pE->pR
23ab0 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c  ight->op==TK_ALL
23ac0 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
23ad0 69 66 28 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45  if( k<pEList->nE
23ae0 78 70 72 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20  xpr ){.    /*.  
23af0 20 20 2a 2a 20 49 66 20 77 65 20 67 65 74 20 68    ** If we get h
23b00 65 72 65 20 69 74 20 6d 65 61 6e 73 20 74 68 65  ere it means the
23b10 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6e 74   result set cont
23b20 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ains one or more
23b30 20 22 2a 22 0a 20 20 20 20 2a 2a 20 6f 70 65 72   "*".    ** oper
23b40 61 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20  ators that need 
23b50 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 20  to be expanded. 
23b60 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61   Loop through ea
23b70 63 68 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  ch expression.  
23b80 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75    ** in the resu
23b90 6c 74 20 73 65 74 20 61 6e 64 20 65 78 70 61 6e  lt set and expan
23ba0 64 20 74 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e  d them one by on
23bb0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74  e..    */.    st
23bc0 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
23bd0 65 6d 20 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e  em *a = pEList->
23be0 61 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  a;.    ExprList 
23bf0 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 69  *pNew = 0;.    i
23c00 6e 74 20 66 6c 61 67 73 20 3d 20 70 50 61 72 73  nt flags = pPars
23c10 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20  e->db->flags;.  
23c20 20 20 69 6e 74 20 6c 6f 6e 67 4e 61 6d 65 73 20    int longNames 
23c30 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
23c40 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21  E_FullColNames)!
23c50 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  =0.             
23c60 20 20 20 20 20 20 20 20 20 26 26 20 28 66 6c 61           && (fla
23c70 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72  gs & SQLITE_Shor
23c80 74 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a  tColNames)==0;..
23c90 20 20 20 20 2f 2a 20 57 68 65 6e 20 70 72 6f 63      /* When proc
23ca0 65 73 73 69 6e 67 20 46 52 4f 4d 2d 63 6c 61 75  essing FROM-clau
23cb0 73 65 20 73 75 62 71 75 65 72 69 65 73 2c 20 69  se subqueries, i
23cc0 74 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20  t is always the 
23cd0 63 61 73 65 0a 20 20 20 20 2a 2a 20 74 68 61 74  case.    ** that
23ce0 20 66 75 6c 6c 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d   full_column_nam
23cf0 65 73 3d 4f 46 46 20 61 6e 64 20 73 68 6f 72 74  es=OFF and short
23d00 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 3d 4f 4e  _column_names=ON
23d10 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 73 71  .  The.    ** sq
23d20 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
23d30 53 65 6c 65 63 74 28 29 20 72 6f 75 74 69 6e 65  Select() routine
23d40 20 6d 61 6b 65 73 20 69 74 20 73 6f 2e 20 2a 2f   makes it so. */
23d50 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 2d  .    assert( (p-
23d60 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e  >selFlags & SF_N
23d70 65 73 74 65 64 46 72 6f 6d 29 3d 3d 30 0a 20 20  estedFrom)==0.  
23d80 20 20 20 20 20 20 20 20 7c 7c 20 28 28 66 6c 61          || ((fla
23d90 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c  gs & SQLITE_Full
23da0 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30 20 26 26 0a  ColNames)==0 &&.
23db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 66                (f
23dc0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68  lags & SQLITE_Sh
23dd0 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 29  ortColNames)!=0)
23de0 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28 6b 3d 30   );..    for(k=0
23df0 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; k<pEList->nExp
23e00 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 70  r; k++){.      p
23e10 45 20 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a  E = a[k].pExpr;.
23e20 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70        pRight = p
23e30 45 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  E->pRight;.     
23e40 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21   assert( pE->op!
23e50 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67 68  =TK_DOT || pRigh
23e60 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  t!=0 );.      if
23e70 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c  ( pE->op!=TK_ALL
23e80 20 26 26 20 28 70 45 2d 3e 6f 70 21 3d 54 4b 5f   && (pE->op!=TK_
23e90 44 4f 54 20 7c 7c 20 70 52 69 67 68 74 2d 3e 6f  DOT || pRight->o
23ea0 70 21 3d 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20  p!=TK_ALL) ){.  
23eb0 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 70 61        /* This pa
23ec0 72 74 69 63 75 6c 61 72 20 65 78 70 72 65 73 73  rticular express
23ed0 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  ion does not nee
23ee0 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64  d to be expanded
23ef0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
23f00 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69       pNew = sqli
23f10 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
23f20 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20  d(pParse, pNew, 
23f30 61 5b 6b 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[k].pExpr);.   
23f40 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b       if( pNew ){
23f50 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
23f60 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31  >a[pNew->nExpr-1
23f70 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a  ].zName = a[k].z
23f80 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
23f90 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45  pNew->a[pNew->nE
23fa0 78 70 72 2d 31 5d 2e 7a 53 70 61 6e 20 3d 20 61  xpr-1].zSpan = a
23fb0 5b 6b 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20  [k].zSpan;.     
23fc0 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20       a[k].zName 
23fd0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61  = 0;.          a
23fe0 5b 6b 5d 2e 7a 53 70 61 6e 20 3d 20 30 3b 0a 20  [k].zSpan = 0;. 
23ff0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
24000 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b   a[k].pExpr = 0;
24010 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
24020 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 65 78        /* This ex
24030 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 22 2a  pression is a "*
24040 22 20 6f 72 20 61 20 22 54 41 42 4c 45 2e 2a 22  " or a "TABLE.*"
24050 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65   and needs to be
24060 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 61  .        ** expa
24070 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20  nded. */.       
24080 20 69 6e 74 20 74 61 62 6c 65 53 65 65 6e 20 3d   int tableSeen =
24090 20 30 3b 20 20 20 20 20 20 2f 2a 20 53 65 74 20   0;      /* Set 
240a0 74 6f 20 31 20 77 68 65 6e 20 54 41 42 4c 45 20  to 1 when TABLE 
240b0 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20 20 20 20  matches */.     
240c0 20 20 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65 20     char *zTName 
240d0 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 74 65  = 0;       /* te
240e0 78 74 20 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41  xt of name of TA
240f0 42 4c 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  BLE */.        i
24100 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f  f( pE->op==TK_DO
24110 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  T ){.          a
24120 73 73 65 72 74 28 20 70 45 2d 3e 70 4c 65 66 74  ssert( pE->pLeft
24130 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  !=0 );.         
24140 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
24150 73 50 72 6f 70 65 72 74 79 28 70 45 2d 3e 70 4c  sProperty(pE->pL
24160 65 66 74 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  eft, EP_IntValue
24170 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  ) );.          z
24180 54 4e 61 6d 65 20 3d 20 70 45 2d 3e 70 4c 65 66  TName = pE->pLef
24190 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20  t->u.zToken;.   
241a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66       }.        f
241b0 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54  or(i=0, pFrom=pT
241c0 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61  abList->a; i<pTa
241d0 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
241e0 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20  , pFrom++){.    
241f0 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
24200 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b  b = pFrom->pTab;
24210 0a 20 20 20 20 20 20 20 20 20 20 53 65 6c 65 63  .          Selec
24220 74 20 2a 70 53 75 62 20 3d 20 70 46 72 6f 6d 2d  t *pSub = pFrom-
24230 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  >pSelect;.      
24240 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61      char *zTabNa
24250 6d 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69  me = pFrom->zAli
24260 61 73 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f  as;.          co
24270 6e 73 74 20 63 68 61 72 20 2a 7a 53 63 68 65 6d  nst char *zSchem
24280 61 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  aName = 0;.     
24290 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20       int iDb;.  
242a0 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62          if( zTab
242b0 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Name==0 ){.     
242c0 20 20 20 20 20 20 20 7a 54 61 62 4e 61 6d 65 20         zTabName 
242d0 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20  = pTab->zName;. 
242e0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
242f0 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c       if( db->mal
24300 6c 6f 63 46 61 69 6c 65 64 20 29 20 62 72 65 61  locFailed ) brea
24310 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  k;.          if(
24320 20 70 53 75 62 3d 3d 30 20 7c 7c 20 28 70 53 75   pSub==0 || (pSu
24330 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  b->selFlags & SF
24340 5f 4e 65 73 74 65 64 46 72 6f 6d 29 3d 3d 30 20  _NestedFrom)==0 
24350 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
24360 53 75 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Sub = 0;.       
24370 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20       if( zTName 
24380 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
24390 70 28 7a 54 4e 61 6d 65 2c 20 7a 54 61 62 4e 61  p(zTName, zTabNa
243a0 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)!=0 ){.      
243b0 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
243c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
243d0 20 20 20 20 20 20 20 20 20 20 20 20 69 44 62 20              iDb 
243e0 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
243f0 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d  oIndex(db, pTab-
24400 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20  >pSchema);.     
24410 20 20 20 20 20 20 20 7a 53 63 68 65 6d 61 4e 61         zSchemaNa
24420 6d 65 20 3d 20 69 44 62 3e 3d 30 20 3f 20 64 62  me = iDb>=0 ? db
24430 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
24440 20 3a 20 22 2a 22 3b 0a 20 20 20 20 20 20 20 20   : "*";.        
24450 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66 6f    }.          fo
24460 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e  r(j=0; j<pTab->n
24470 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
24480 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61         char *zNa
24490 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  me = pTab->aCol[
244a0 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  j].zName;.      
244b0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c        char *zCol
244c0 6e 61 6d 65 3b 20 20 2f 2a 20 54 68 65 20 63 6f  name;  /* The co
244d0 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61  mputed column na
244e0 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  me */.          
244f0 20 20 63 68 61 72 20 2a 7a 54 6f 46 72 65 65 3b    char *zToFree;
24500 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65 64 20 73     /* Malloced s
24510 74 72 69 6e 67 20 74 68 61 74 20 6e 65 65 64 73  tring that needs
24520 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a   to be freed */.
24530 20 20 20 20 20 20 20 20 20 20 20 20 54 6f 6b 65              Toke
24540 6e 20 73 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20  n sColname;  /* 
24550 43 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20  Computed column 
24560 6e 61 6d 65 20 61 73 20 61 20 74 6f 6b 65 6e 20  name as a token 
24570 2a 2f 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20  */..            
24580 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 20 29 3b  assert( zName );
24590 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
245a0 20 7a 54 4e 61 6d 65 20 26 26 20 70 53 75 62 0a   zTName && pSub.
245b0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
245c0 73 71 6c 69 74 65 33 4d 61 74 63 68 53 70 61 6e  sqlite3MatchSpan
245d0 4e 61 6d 65 28 70 53 75 62 2d 3e 70 45 4c 69 73  Name(pSub->pELis
245e0 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 2c 20 30  t->a[j].zSpan, 0
245f0 2c 20 7a 54 4e 61 6d 65 2c 20 30 29 3d 3d 30 0a  , zTName, 0)==0.
24600 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20              ){. 
24610 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
24620 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
24630 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20     }..          
24640 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c 75 6d 6e    /* If a column
24650 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 27 68   is marked as 'h
24660 69 64 64 65 6e 27 20 28 63 75 72 72 65 6e 74 6c  idden' (currentl
24670 79 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 0a  y only possible.
24680 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66              ** f
24690 6f 72 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  or virtual table
246a0 73 29 2c 20 64 6f 20 6e 6f 74 20 69 6e 63 6c 75  s), do not inclu
246b0 64 65 20 69 74 20 69 6e 20 74 68 65 20 65 78 70  de it in the exp
246c0 61 6e 64 65 64 0a 20 20 20 20 20 20 20 20 20 20  anded.          
246d0 20 20 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20    ** result-set 
246e0 6c 69 73 74 2e 0a 20 20 20 20 20 20 20 20 20 20  list..          
246f0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
24700 20 69 66 28 20 49 73 48 69 64 64 65 6e 43 6f 6c   if( IsHiddenCol
24710 75 6d 6e 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b  umn(&pTab->aCol[
24720 6a 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  j]) ){.         
24730 20 20 20 20 20 61 73 73 65 72 74 28 49 73 56 69       assert(IsVi
24740 72 74 75 61 6c 28 70 54 61 62 29 29 3b 0a 20 20  rtual(pTab));.  
24750 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
24760 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
24770 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
24780 74 61 62 6c 65 53 65 65 6e 20 3d 20 31 3b 0a 0a  tableSeen = 1;..
24790 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
247a0 69 3e 30 20 26 26 20 7a 54 4e 61 6d 65 3d 3d 30  i>0 && zTName==0
247b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
247c0 20 20 69 66 28 20 28 70 46 72 6f 6d 2d 3e 6a 6f    if( (pFrom->jo
247d0 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55  intype & JT_NATU
247e0 52 41 4c 29 21 3d 30 0a 20 20 20 20 20 20 20 20  RAL)!=0.        
247f0 20 20 20 20 20 20 20 20 26 26 20 74 61 62 6c 65          && table
24800 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70  AndColumnIndex(p
24810 54 61 62 4c 69 73 74 2c 20 69 2c 20 7a 4e 61 6d  TabList, i, zNam
24820 65 2c 20 30 2c 20 30 29 0a 20 20 20 20 20 20 20  e, 0, 0).       
24830 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
24840 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20            /* In 
24850 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c 20  a NATURAL join, 
24860 6f 6d 69 74 20 74 68 65 20 6a 6f 69 6e 20 63 6f  omit the join co
24870 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 0a  lumns from the .
24880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24890 2a 2a 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20  ** table to the 
248a0 72 69 67 68 74 20 6f 66 20 74 68 65 20 6a 6f 69  right of the joi
248b0 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  n */.           
248c0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
248d0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
248e0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
248f0 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e   sqlite3IdListIn
24900 64 65 78 28 70 46 72 6f 6d 2d 3e 70 55 73 69 6e  dex(pFrom->pUsin
24910 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a  g, zName)>=0 ){.
24920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24930 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74  /* In a join wit
24940 68 20 61 20 55 53 49 4e 47 20 63 6c 61 75 73 65  h a USING clause
24950 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69  , omit columns i
24960 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  n the.          
24970 20 20 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 63        ** using c
24980 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20 74  lause from the t
24990 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68  able on the righ
249a0 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  t. */.          
249b0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
249c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
249d0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
249e0 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74            pRight
249f0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64   = sqlite3Expr(d
24a00 62 2c 20 54 4b 5f 49 44 2c 20 7a 4e 61 6d 65 29  b, TK_ID, zName)
24a10 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 43  ;.            zC
24a20 6f 6c 6e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a  olname = zName;.
24a30 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 6f 46              zToF
24a40 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ree = 0;.       
24a50 20 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d       if( longNam
24a60 65 73 20 7c 7c 20 70 54 61 62 4c 69 73 74 2d 3e  es || pTabList->
24a70 6e 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20  nSrc>1 ){.      
24a80 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c          Expr *pL
24a90 65 66 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eft;.           
24aa0 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74     pLeft = sqlit
24ab0 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44  e3Expr(db, TK_ID
24ac0 2c 20 7a 54 61 62 4e 61 6d 65 29 3b 0a 20 20 20  , zTabName);.   
24ad0 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
24ae0 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
24af0 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20  pParse, TK_DOT, 
24b00 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 30  pLeft, pRight, 0
24b10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
24b20 20 69 66 28 20 7a 53 63 68 65 6d 61 4e 61 6d 65   if( zSchemaName
24b30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
24b40 20 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c 69      pLeft = sqli
24b50 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49  te3Expr(db, TK_I
24b60 44 2c 20 7a 53 63 68 65 6d 61 4e 61 6d 65 29 3b  D, zSchemaName);
24b70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24b80 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33   pExpr = sqlite3
24b90 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
24ba0 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 45 78  _DOT, pLeft, pEx
24bb0 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  pr, 0);.        
24bc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
24bd0 20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61        if( longNa
24be0 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  mes ){.         
24bf0 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65 20         zColname 
24c00 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
24c10 28 64 62 2c 20 22 25 73 2e 25 73 22 2c 20 7a 54  (db, "%s.%s", zT
24c20 61 62 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a  abName, zName);.
24c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c40 7a 54 6f 46 72 65 65 20 3d 20 7a 43 6f 6c 6e 61  zToFree = zColna
24c50 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  me;.            
24c60 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
24c70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
24c80 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 52 69       pExpr = pRi
24c90 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ght;.           
24ca0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70   }.            p
24cb0 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
24cc0 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
24cd0 73 65 2c 20 70 4e 65 77 2c 20 70 45 78 70 72 29  se, pNew, pExpr)
24ce0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 43  ;.            sC
24cf0 6f 6c 6e 61 6d 65 2e 7a 20 3d 20 7a 43 6f 6c 6e  olname.z = zColn
24d00 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ame;.           
24d10 20 73 43 6f 6c 6e 61 6d 65 2e 6e 20 3d 20 73 71   sColname.n = sq
24d20 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 43  lite3Strlen30(zC
24d30 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  olname);.       
24d40 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
24d50 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50 61 72  ListSetName(pPar
24d60 73 65 2c 20 70 4e 65 77 2c 20 26 73 43 6f 6c 6e  se, pNew, &sColn
24d70 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ame, 0);.       
24d80 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 26 26       if( pNew &&
24d90 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
24da0 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29 21 3d  SF_NestedFrom)!=
24db0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
24dc0 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
24dd0 73 74 5f 69 74 65 6d 20 2a 70 58 20 3d 20 26 70  st_item *pX = &p
24de0 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78  New->a[pNew->nEx
24df0 70 72 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20 20  pr-1];.         
24e00 20 20 20 20 20 69 66 28 20 70 53 75 62 20 29 7b       if( pSub ){
24e10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24e20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c   pX->zSpan = sql
24e30 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
24e40 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 61   pSub->pEList->a
24e50 5b 6a 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20  [j].zSpan);.    
24e60 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
24e70 63 61 73 65 28 20 70 58 2d 3e 7a 53 70 61 6e 3d  case( pX->zSpan=
24e80 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
24e90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
24ea0 20 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e 7a             pX->z
24eb0 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 4d 50  Span = sqlite3MP
24ec0 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73  rintf(db, "%s.%s
24ed0 2e 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20  .%s",.          
24ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f00 20 7a 53 63 68 65 6d 61 4e 61 6d 65 2c 20 7a 54   zSchemaName, zT
24f10 61 62 4e 61 6d 65 2c 20 7a 43 6f 6c 6e 61 6d 65  abName, zColname
24f20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
24f30 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58 2d     testcase( pX-
24f40 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a 20 20 20  >zSpan==0 );.   
24f50 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
24f60 20 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e 62             pX->b
24f70 53 70 61 6e 49 73 54 61 62 20 3d 20 31 3b 0a 20  SpanIsTab = 1;. 
24f80 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
24f90 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
24fa0 44 62 46 72 65 65 28 64 62 2c 20 7a 54 6f 46 72  DbFree(db, zToFr
24fb0 65 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ee);.          }
24fc0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
24fd0 20 20 20 69 66 28 20 21 74 61 62 6c 65 53 65 65     if( !tableSee
24fe0 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  n ){.          i
24ff0 66 28 20 7a 54 4e 61 6d 65 20 29 7b 0a 20 20 20  f( zTName ){.   
25000 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
25010 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
25020 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a   "no such table:
25030 20 25 73 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20   %s", zTName);. 
25040 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
25050 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
25060 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
25070 73 65 2c 20 22 6e 6f 20 74 61 62 6c 65 73 20 73  se, "no tables s
25080 70 65 63 69 66 69 65 64 22 29 3b 0a 20 20 20 20  pecified");.    
25090 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
250a0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
250b0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
250c0 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 45  istDelete(db, pE
250d0 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 45  List);.    p->pE
250e0 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d  List = pNew;.  }
250f0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
25100 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70 2d 3e  COLUMN.  if( p->
25110 70 45 4c 69 73 74 20 26 26 20 70 2d 3e 70 45 4c  pEList && p->pEL
25120 69 73 74 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e 61  ist->nExpr>db->a
25130 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
25140 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20  IT_COLUMN] ){.  
25150 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
25160 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d  g(pParse, "too m
25170 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72  any columns in r
25180 65 73 75 6c 74 20 73 65 74 22 29 3b 0a 20 20 7d  esult set");.  }
25190 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
251a0 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
251b0 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 72 6f  ../*.** No-op ro
251c0 75 74 69 6e 65 20 66 6f 72 20 74 68 65 20 70 61  utine for the pa
251d0 72 73 65 2d 74 72 65 65 20 77 61 6c 6b 65 72 2e  rse-tree walker.
251e0 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
251f0 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20   routine is the 
25200 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c  Walker.xExprCall
25210 62 61 63 6b 20 74 68 65 6e 20 65 78 70 72 65 73  back then expres
25220 73 69 6f 6e 20 74 72 65 65 73 0a 2a 2a 20 61 72  sion trees.** ar
25230 65 20 77 61 6c 6b 65 64 20 77 69 74 68 6f 75 74  e walked without
25240 20 61 6e 79 20 61 63 74 69 6f 6e 73 20 62 65 69   any actions bei
25250 6e 67 20 74 61 6b 65 6e 20 61 74 20 65 61 63 68  ng taken at each
25260 20 6e 6f 64 65 2e 20 20 50 72 65 73 75 6d 61 62   node.  Presumab
25270 6c 79 2c 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73  ly,.** when this
25280 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
25290 20 66 6f 72 20 57 61 6c 6b 65 72 2e 78 45 78 70   for Walker.xExp
252a0 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20 0a  rCallback then .
252b0 2a 2a 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63  ** Walker.xSelec
252c0 74 43 61 6c 6c 62 61 63 6b 20 69 73 20 73 65 74  tCallback is set
252d0 20 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67   to do something
252e0 20 75 73 65 66 75 6c 20 66 6f 72 20 65 76 65 72   useful for ever
252f0 79 20 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 69  y .** subquery i
25300 6e 20 74 68 65 20 70 61 72 73 65 72 20 74 72 65  n the parser tre
25310 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
25320 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 28 57 61   exprWalkNoop(Wa
25330 6c 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20 45  lker *NotUsed, E
25340 78 70 72 20 2a 4e 6f 74 55 73 65 64 32 29 7b 0a  xpr *NotUsed2){.
25350 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
25360 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74  ER2(NotUsed, Not
25370 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e  Used2);.  return
25380 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
25390 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
253a0 74 69 6e 65 20 22 65 78 70 61 6e 64 73 22 20 61  tine "expands" a
253b0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
253c0 74 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73  t and all of its
253d0 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20   subqueries..** 
253e0 46 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  For additional i
253f0 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 77 68  nformation on wh
25400 61 74 20 69 74 20 6d 65 61 6e 73 20 74 6f 20 22  at it means to "
25410 65 78 70 61 6e 64 22 20 61 20 53 45 4c 45 43 54  expand" a SELECT
25420 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2c 20 73  .** statement, s
25430 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f  ee the comment o
25440 6e 20 74 68 65 20 73 65 6c 65 63 74 45 78 70 61  n the selectExpa
25450 6e 64 20 77 6f 72 6b 65 72 20 63 61 6c 6c 62 61  nd worker callba
25460 63 6b 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20  ck above..**.** 
25470 45 78 70 61 6e 64 69 6e 67 20 61 20 53 45 4c 45  Expanding a SELE
25480 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  CT statement is 
25490 74 68 65 20 66 69 72 73 74 20 73 74 65 70 20 69  the first step i
254a0 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 0a 2a  n processing a.*
254b0 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
254c0 6e 74 2e 20 20 54 68 65 20 53 45 4c 45 43 54 20  nt.  The SELECT 
254d0 73 74 61 74 65 6d 65 6e 74 20 6d 75 73 74 20 62  statement must b
254e0 65 20 65 78 70 61 6e 64 65 64 20 62 65 66 6f 72  e expanded befor
254f0 65 0a 2a 2a 20 6e 61 6d 65 20 72 65 73 6f 6c 75  e.** name resolu
25500 74 69 6f 6e 20 69 73 20 70 65 72 66 6f 72 6d 65  tion is performe
25510 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 74  d..**.** If anyt
25520 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c  hing goes wrong,
25530 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
25540 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  e is written int
25550 6f 20 70 50 61 72 73 65 2e 0a 2a 2a 20 54 68 65  o pParse..** The
25560 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
25570 6e 20 63 61 6e 20 64 65 74 65 63 74 20 74 68 65  n can detect the
25580 20 70 72 6f 62 6c 65 6d 20 62 79 20 6c 6f 6f 6b   problem by look
25590 69 6e 67 20 61 74 20 70 50 61 72 73 65 2d 3e 6e  ing at pParse->n
255a0 45 72 72 0a 2a 2a 20 61 6e 64 2f 6f 72 20 70 50  Err.** and/or pP
255b0 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
255c0 46 61 69 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  Failed..*/.stati
255d0 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65  c void sqlite3Se
255e0 6c 65 63 74 45 78 70 61 6e 64 28 50 61 72 73 65  lectExpand(Parse
255f0 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
25600 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 57 61   *pSelect){.  Wa
25610 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74  lker w;.  memset
25620 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77  (&w, 0, sizeof(w
25630 29 29 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c  ));.  w.xExprCal
25640 6c 62 61 63 6b 20 3d 20 65 78 70 72 57 61 6c 6b  lback = exprWalk
25650 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73 65  Noop;.  w.pParse
25660 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 69 66 28   = pParse;.  if(
25670 20 70 50 61 72 73 65 2d 3e 68 61 73 43 6f 6d 70   pParse->hasComp
25680 6f 75 6e 64 20 29 7b 0a 20 20 20 20 77 2e 78 53  ound ){.    w.xS
25690 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
256a0 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53  convertCompoundS
256b0 65 6c 65 63 74 54 6f 53 75 62 71 75 65 72 79 3b  electToSubquery;
256c0 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  .    sqlite3Walk
256d0 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65  Select(&w, pSele
256e0 63 74 29 3b 0a 20 20 7d 0a 20 20 77 2e 78 53 65  ct);.  }.  w.xSe
256f0 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73  lectCallback = s
25700 65 6c 65 63 74 45 78 70 61 6e 64 65 72 3b 0a 20  electExpander;. 
25710 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
25720 63 6b 32 20 3d 20 73 65 6c 65 63 74 50 6f 70 57  ck2 = selectPopW
25730 69 74 68 3b 0a 20 20 73 71 6c 69 74 65 33 57 61  ith;.  sqlite3Wa
25740 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65  lkSelect(&w, pSe
25750 6c 65 63 74 29 3b 0a 7d 0a 0a 0a 23 69 66 6e 64  lect);.}...#ifnd
25760 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
25770 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68  UBQUERY./*.** Th
25780 69 73 20 69 73 20 61 20 57 61 6c 6b 65 72 2e 78  is is a Walker.x
25790 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 63  SelectCallback c
257a0 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68 65 20  allback for the 
257b0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 79 70  sqlite3SelectTyp
257c0 65 49 6e 66 6f 28 29 0a 2a 2a 20 69 6e 74 65 72  eInfo().** inter
257d0 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  face..**.** For 
257e0 65 61 63 68 20 46 52 4f 4d 2d 63 6c 61 75 73 65  each FROM-clause
257f0 20 73 75 62 71 75 65 72 79 2c 20 61 64 64 20 43   subquery, add C
25800 6f 6c 75 6d 6e 2e 7a 54 79 70 65 20 61 6e 64 20  olumn.zType and 
25810 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 0a 2a 2a 20  Column.zColl.** 
25820 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74  information to t
25830 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  he Table structu
25840 72 65 20 74 68 61 74 20 72 65 70 72 65 73 65 6e  re that represen
25850 74 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ts the result se
25860 74 0a 2a 2a 20 6f 66 20 74 68 61 74 20 73 75 62  t.** of that sub
25870 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  query..**.** The
25880 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
25890 20 74 68 61 74 20 72 65 70 72 65 73 65 6e 74 73   that represents
258a0 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
258b0 77 61 73 20 63 6f 6e 73 74 72 75 63 74 65 64 0a  was constructed.
258c0 2a 2a 20 62 79 20 73 65 6c 65 63 74 45 78 70 61  ** by selectExpa
258d0 6e 64 65 72 28 29 20 62 75 74 20 74 68 65 20 74  nder() but the t
258e0 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f  ype and collatio
258f0 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 61  n information wa
25900 73 20 6f 6d 69 74 74 65 64 0a 2a 2a 20 61 74 20  s omitted.** at 
25910 74 68 61 74 20 70 6f 69 6e 74 20 62 65 63 61 75  that point becau
25920 73 65 20 69 64 65 6e 74 69 66 69 65 72 73 20 68  se identifiers h
25930 61 64 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  ad not yet been 
25940 72 65 73 6f 6c 76 65 64 2e 20 20 54 68 69 73 0a  resolved.  This.
25950 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  ** routine is ca
25960 6c 6c 65 64 20 61 66 74 65 72 20 69 64 65 6e 74  lled after ident
25970 69 66 69 65 72 20 72 65 73 6f 6c 75 74 69 6f 6e  ifier resolution
25980 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
25990 20 73 65 6c 65 63 74 41 64 64 53 75 62 71 75 65   selectAddSubque
259a0 72 79 54 79 70 65 49 6e 66 6f 28 57 61 6c 6b 65  ryTypeInfo(Walke
259b0 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65  r *pWalker, Sele
259c0 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20  ct *p){.  Parse 
259d0 2a 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 69  *pParse;.  int i
259e0 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  ;.  SrcList *pTa
259f0 62 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20  bList;.  struct 
25a00 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46  SrcList_item *pF
25a10 72 6f 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  rom;..  assert( 
25a20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
25a30 5f 52 65 73 6f 6c 76 65 64 20 29 3b 0a 20 20 69  _Resolved );.  i
25a40 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  f( (p->selFlags 
25a50 26 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f  & SF_HasTypeInfo
25a60 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 73  )==0 ){.    p->s
25a70 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 48 61  elFlags |= SF_Ha
25a80 73 54 79 70 65 49 6e 66 6f 3b 0a 20 20 20 20 70  sTypeInfo;.    p
25a90 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d  Parse = pWalker-
25aa0 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 70 54 61  >pParse;.    pTa
25ab0 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
25ac0 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 46  .    for(i=0, pF
25ad0 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b  rom=pTabList->a;
25ae0 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
25af0 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29  c; i++, pFrom++)
25b00 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  {.      Table *p
25b10 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61  Tab = pFrom->pTa
25b20 62 3b 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57  b;.      if( ALW
25b30 41 59 53 28 70 54 61 62 21 3d 30 29 20 26 26 20  AYS(pTab!=0) && 
25b40 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20  (pTab->tabFlags 
25b50 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 21  & TF_Ephemeral)!
25b60 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
25b70 20 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20   A sub-query in 
25b80 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
25b90 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20  of a SELECT */. 
25ba0 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70         Select *p
25bb0 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65  Sel = pFrom->pSe
25bc0 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 69 66  lect;.        if
25bd0 28 20 70 53 65 6c 20 29 7b 0a 20 20 20 20 20 20  ( pSel ){.      
25be0 20 20 20 20 77 68 69 6c 65 28 20 70 53 65 6c 2d      while( pSel-
25bf0 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c 20 3d  >pPrior ) pSel =
25c00 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20   pSel->pPrior;. 
25c10 20 20 20 20 20 20 20 20 20 73 65 6c 65 63 74 41           selectA
25c20 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43  ddColumnTypeAndC
25c30 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  ollation(pParse,
25c40 20 70 54 61 62 2c 20 70 53 65 6c 29 3b 0a 20 20   pTab, pSel);.  
25c50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
25c60 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64      }.  }.}.#end
25c70 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  if.../*.** This 
25c80 72 6f 75 74 69 6e 65 20 61 64 64 73 20 64 61 74  routine adds dat
25c90 61 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74  atype and collat
25ca0 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 6e 66  ing sequence inf
25cb0 6f 72 6d 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 74  ormation to.** t
25cc0 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  he Table structu
25cd0 72 65 73 20 6f 66 20 61 6c 6c 20 46 52 4f 4d 2d  res of all FROM-
25ce0 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 69 65  clause subquerie
25cf0 73 20 69 6e 20 61 0a 2a 2a 20 53 45 4c 45 43 54  s in a.** SELECT
25d00 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
25d10 2a 20 55 73 65 20 74 68 69 73 20 72 6f 75 74 69  * Use this routi
25d20 6e 65 20 61 66 74 65 72 20 6e 61 6d 65 20 72 65  ne after name re
25d30 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  solution..*/.sta
25d40 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
25d50 53 65 6c 65 63 74 41 64 64 54 79 70 65 49 6e 66  SelectAddTypeInf
25d60 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  o(Parse *pParse,
25d70 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
25d80 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
25d90 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
25da0 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65    Walker w;.  me
25db0 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65  mset(&w, 0, size
25dc0 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78 53 65 6c  of(w));.  w.xSel
25dd0 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73  ectCallback2 = s
25de0 65 6c 65 63 74 41 64 64 53 75 62 71 75 65 72 79  electAddSubquery
25df0 54 79 70 65 49 6e 66 6f 3b 0a 20 20 77 2e 78 45  TypeInfo;.  w.xE
25e00 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78  xprCallback = ex
25e10 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e  prWalkNoop;.  w.
25e20 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
25e30 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65  .  sqlite3WalkSe
25e40 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74  lect(&w, pSelect
25e50 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a  );.#endif.}.../*
25e60 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
25e70 20 73 65 74 73 20 75 70 20 61 20 53 45 4c 45 43   sets up a SELEC
25e80 54 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20  T statement for 
25e90 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 54 68 65  processing.  The
25ea0 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  .** following is
25eb0 20 61 63 63 6f 6d 70 6c 69 73 68 65 64 3a 0a 2a   accomplished:.*
25ec0 2a 0a 2a 2a 20 20 20 20 20 2a 20 20 56 44 42 45  *.**     *  VDBE
25ed0 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   Cursor numbers 
25ee0 61 72 65 20 61 73 73 69 67 6e 65 64 20 74 6f 20  are assigned to 
25ef0 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20  all FROM-clause 
25f00 74 65 72 6d 73 2e 0a 2a 2a 20 20 20 20 20 2a 20  terms..**     * 
25f10 20 45 70 68 65 6d 65 72 61 6c 20 54 61 62 6c 65   Ephemeral Table
25f20 20 6f 62 6a 65 63 74 73 20 61 72 65 20 63 72 65   objects are cre
25f30 61 74 65 64 20 66 6f 72 20 61 6c 6c 20 46 52 4f  ated for all FRO
25f40 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72  M-clause subquer
25f50 69 65 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 4f  ies..**     *  O
25f60 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
25f70 73 65 73 20 61 72 65 20 73 68 69 66 74 65 64 20  ses are shifted 
25f80 69 6e 74 6f 20 57 48 45 52 45 20 73 74 61 74 65  into WHERE state
25f90 6d 65 6e 74 73 0a 2a 2a 20 20 20 20 20 2a 20 20  ments.**     *  
25fa0 57 69 6c 64 63 61 72 64 73 20 22 2a 22 20 61 6e  Wildcards "*" an
25fb0 64 20 22 54 41 42 4c 45 2e 2a 22 20 69 6e 20 72  d "TABLE.*" in r
25fc0 65 73 75 6c 74 20 73 65 74 73 20 61 72 65 20 65  esult sets are e
25fd0 78 70 61 6e 64 65 64 2e 0a 2a 2a 20 20 20 20 20  xpanded..**     
25fe0 2a 20 20 49 64 65 6e 74 69 66 69 65 72 73 20 69  *  Identifiers i
25ff0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 72 65  n expression are
26000 20 6d 61 74 63 68 65 64 20 74 6f 20 74 61 62 6c   matched to tabl
26010 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  es..**.** This r
26020 6f 75 74 69 6e 65 20 61 63 74 73 20 72 65 63 75  outine acts recu
26030 72 73 69 76 65 6c 79 20 6f 6e 20 61 6c 6c 20 73  rsively on all s
26040 75 62 71 75 65 72 69 65 73 20 77 69 74 68 69 6e  ubqueries within
26050 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a   the SELECT..*/.
26060 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65  void sqlite3Sele
26070 63 74 50 72 65 70 28 0a 20 20 50 61 72 73 65 20  ctPrep(.  Parse 
26080 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
26090 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
260a0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
260b0 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
260c0 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
260d0 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
260e0 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d   coded. */.  Nam
260f0 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65 72  eContext *pOuter
26100 4e 43 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74  NC  /* Name cont
26110 65 78 74 20 66 6f 72 20 63 6f 6e 74 61 69 6e 65  ext for containe
26120 72 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  r */.){.  sqlite
26130 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 4e 45 56  3 *db;.  if( NEV
26140 45 52 28 70 3d 3d 30 29 20 29 20 72 65 74 75 72  ER(p==0) ) retur
26150 6e 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  n;.  db = pParse
26160 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e  ->db;.  if( db->
26170 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
26180 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e  eturn;.  if( p->
26190 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 48 61  selFlags & SF_Ha
261a0 73 54 79 70 65 49 6e 66 6f 20 29 20 72 65 74 75  sTypeInfo ) retu
261b0 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  rn;.  sqlite3Sel
261c0 65 63 74 45 78 70 61 6e 64 28 70 50 61 72 73 65  ectExpand(pParse
261d0 2c 20 70 29 3b 0a 20 20 69 66 28 20 70 50 61 72  , p);.  if( pPar
261e0 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e  se->nErr || db->
261f0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
26200 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
26210 52 65 73 6f 6c 76 65 53 65 6c 65 63 74 4e 61 6d  ResolveSelectNam
26220 65 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4f  es(pParse, p, pO
26230 75 74 65 72 4e 43 29 3b 0a 20 20 69 66 28 20 70  uterNC);.  if( p
26240 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64  Parse->nErr || d
26250 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
26260 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69  ) return;.  sqli
26270 74 65 33 53 65 6c 65 63 74 41 64 64 54 79 70 65  te3SelectAddType
26280 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 29 3b  Info(pParse, p);
26290 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20  .}../*.** Reset 
262a0 74 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63  the aggregate ac
262b0 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a  cumulator..**.**
262c0 20 54 68 65 20 61 67 67 72 65 67 61 74 65 20 61   The aggregate a
262d0 63 63 75 6d 75 6c 61 74 6f 72 20 69 73 20 61 20  ccumulator is a 
262e0 73 65 74 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65  set of memory ce
262f0 6c 6c 73 20 74 68 61 74 20 68 6f 6c 64 0a 2a 2a  lls that hold.**
26300 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65   intermediate re
26310 73 75 6c 74 73 20 77 68 69 6c 65 20 63 61 6c 63  sults while calc
26320 75 6c 61 74 69 6e 67 20 61 6e 20 61 67 67 72 65  ulating an aggre
26330 67 61 74 65 2e 20 20 54 68 69 73 0a 2a 2a 20 72  gate.  This.** r
26340 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
26350 20 63 6f 64 65 20 74 68 61 74 20 73 74 6f 72 65   code that store
26360 73 20 4e 55 4c 4c 73 20 69 6e 20 61 6c 6c 20 6f  s NULLs in all o
26370 66 20 74 68 6f 73 65 20 6d 65 6d 6f 72 79 0a 2a  f those memory.*
26380 2a 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74  * cells..*/.stat
26390 69 63 20 76 6f 69 64 20 72 65 73 65 74 41 63 63  ic void resetAcc
263a0 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a  umulator(Parse *
263b0 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20  pParse, AggInfo 
263c0 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64  *pAggInfo){.  Vd
263d0 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
263e0 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
263f0 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
26400 5f 66 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20  _func *pFunc;.  
26410 69 6e 74 20 6e 52 65 67 20 3d 20 70 41 67 67 49  int nReg = pAggI
26420 6e 66 6f 2d 3e 6e 46 75 6e 63 20 2b 20 70 41 67  nfo->nFunc + pAg
26430 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a  gInfo->nColumn;.
26440 20 20 69 66 28 20 6e 52 65 67 3d 3d 30 20 29 20    if( nReg==0 ) 
26450 72 65 74 75 72 6e 3b 0a 23 69 66 64 65 66 20 53  return;.#ifdef S
26460 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
26470 20 56 65 72 69 66 79 20 74 68 61 74 20 61 6c 6c   Verify that all
26480 20 41 67 67 49 6e 66 6f 20 72 65 67 69 73 74 65   AggInfo registe
26490 72 73 20 61 72 65 20 77 69 74 68 69 6e 20 74 68  rs are within th
264a0 65 20 72 61 6e 67 65 20 73 70 65 63 69 66 69 65  e range specifie
264b0 64 20 62 79 0a 20 20 2a 2a 20 41 67 67 49 6e 66  d by.  ** AggInf
264c0 6f 2e 6d 6e 52 65 67 2e 2e 41 67 67 49 6e 66 6f  o.mnReg..AggInfo
264d0 2e 6d 78 52 65 67 20 2a 2f 0a 20 20 61 73 73 65  .mxReg */.  asse
264e0 72 74 28 20 6e 52 65 67 3d 3d 70 41 67 67 49 6e  rt( nReg==pAggIn
264f0 66 6f 2d 3e 6d 78 52 65 67 2d 70 41 67 67 49 6e  fo->mxReg-pAggIn
26500 66 6f 2d 3e 6d 6e 52 65 67 2b 31 20 29 3b 0a 20  fo->mnReg+1 );. 
26510 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67   for(i=0; i<pAgg
26520 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  Info->nColumn; i
26530 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ++){.    assert(
26540 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b   pAggInfo->aCol[
26550 69 5d 2e 69 4d 65 6d 3e 3d 70 41 67 67 49 6e 66  i].iMem>=pAggInf
26560 6f 2d 3e 6d 6e 52 65 67 0a 20 20 20 20 20 20 20  o->mnReg.       
26570 20 20 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 61    && pAggInfo->a
26580 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67  Col[i].iMem<=pAg
26590 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a  gInfo->mxReg );.
265a0 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
265b0 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  <pAggInfo->nFunc
265c0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  ; i++){.    asse
265d0 72 74 28 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46  rt( pAggInfo->aF
265e0 75 6e 63 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41 67  unc[i].iMem>=pAg
265f0 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20 20  gInfo->mnReg.   
26600 20 20 20 20 20 20 26 26 20 70 41 67 67 49 6e 66        && pAggInf
26610 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d  o->aFunc[i].iMem
26620 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65  <=pAggInfo->mxRe
26630 67 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  g );.  }.#endif.
26640 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
26650 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op3(v, OP_Null, 
26660 30 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52  0, pAggInfo->mnR
26670 65 67 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 6d 78  eg, pAggInfo->mx
26680 52 65 67 29 3b 0a 20 20 66 6f 72 28 70 46 75 6e  Reg);.  for(pFun
26690 63 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  c=pAggInfo->aFun
266a0 63 2c 20 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e  c, i=0; i<pAggIn
266b0 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20  fo->nFunc; i++, 
266c0 70 46 75 6e 63 2b 2b 29 7b 0a 20 20 20 20 69 66  pFunc++){.    if
266d0 28 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e  ( pFunc->iDistin
266e0 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 45  ct>=0 ){.      E
266f0 78 70 72 20 2a 70 45 20 3d 20 70 46 75 6e 63 2d  xpr *pE = pFunc-
26700 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73  >pExpr;.      as
26710 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
26720 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f 78 49  operty(pE, EP_xI
26730 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
26740 20 20 69 66 28 20 70 45 2d 3e 78 2e 70 4c 69 73    if( pE->x.pLis
26750 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 78 2e 70 4c  t==0 || pE->x.pL
26760 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b  ist->nExpr!=1 ){
26770 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
26780 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
26790 20 22 44 49 53 54 49 4e 43 54 20 61 67 67 72 65   "DISTINCT aggre
267a0 67 61 74 65 73 20 6d 75 73 74 20 68 61 76 65 20  gates must have 
267b0 65 78 61 63 74 6c 79 20 6f 6e 65 20 22 0a 20 20  exactly one ".  
267c0 20 20 20 20 20 20 20 20 20 22 61 72 67 75 6d 65           "argume
267d0 6e 74 22 29 3b 0a 20 20 20 20 20 20 20 20 70 46  nt");.        pF
267e0 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d  unc->iDistinct =
267f0 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   -1;.      }else
26800 7b 0a 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66  {.        KeyInf
26810 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65  o *pKeyInfo = ke
26820 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
26830 74 28 70 50 61 72 73 65 2c 20 70 45 2d 3e 78 2e  t(pParse, pE->x.
26840 70 4c 69 73 74 2c 20 30 2c 20 30 29 3b 0a 20 20  pList, 0, 0);.  
26850 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
26860 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
26870 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 46 75  enEphemeral, pFu
26880 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 30  nc->iDistinct, 0
26890 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
268a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
268b0 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
268c0 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P4_KEYINFO);.   
268d0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
268e0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74  ../*.** Invoke t
268f0 68 65 20 4f 50 5f 41 67 67 46 69 6e 61 6c 69 7a  he OP_AggFinaliz
26900 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 65 76 65  e opcode for eve
26910 72 79 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  ry aggregate fun
26920 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20  ction.** in the 
26930 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72  AggInfo structur
26940 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
26950 64 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e  d finalizeAggFun
26960 63 74 69 6f 6e 73 28 50 61 72 73 65 20 2a 70 50  ctions(Parse *pP
26970 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70  arse, AggInfo *p
26980 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65  AggInfo){.  Vdbe
26990 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
269a0 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
269b0 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66  struct AggInfo_f
269c0 75 6e 63 20 2a 70 46 3b 0a 20 20 66 6f 72 28 69  unc *pF;.  for(i
269d0 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d  =0, pF=pAggInfo-
269e0 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e  >aFunc; i<pAggIn
269f0 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20  fo->nFunc; i++, 
26a00 70 46 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 4c  pF++){.    ExprL
26a10 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d  ist *pList = pF-
26a20 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b  >pExpr->x.pList;
26a30 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
26a40 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 46  prHasProperty(pF
26a50 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  ->pExpr, EP_xIsS
26a60 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 73 71  elect) );.    sq
26a70 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
26a80 76 2c 20 4f 50 5f 41 67 67 46 69 6e 61 6c 2c 20  v, OP_AggFinal, 
26a90 70 46 2d 3e 69 4d 65 6d 2c 20 70 4c 69 73 74 20  pF->iMem, pList 
26aa0 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a  ? pList->nExpr :
26ab0 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20   0, 0,.         
26ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f               (vo
26ad0 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50  id*)pF->pFunc, P
26ae0 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 7d 0a  4_FUNCDEF);.  }.
26af0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20  }../*.** Update 
26b00 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  the accumulator 
26b10 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72  memory cells for
26b20 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 62 61   an aggregate ba
26b30 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 75  sed on.** the cu
26b40 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73  rrent cursor pos
26b50 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ition..*/.static
26b60 20 76 6f 69 64 20 75 70 64 61 74 65 41 63 63 75   void updateAccu
26b70 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70  mulator(Parse *p
26b80 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a  Parse, AggInfo *
26b90 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62  pAggInfo){.  Vdb
26ba0 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
26bb0 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vdbe;.  int i;. 
26bc0 20 69 6e 74 20 72 65 67 48 69 74 20 3d 20 30 3b   int regHit = 0;
26bd0 0a 20 20 69 6e 74 20 61 64 64 72 48 69 74 54 65  .  int addrHitTe
26be0 73 74 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74  st = 0;.  struct
26bf0 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70   AggInfo_func *p
26c00 46 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49  F;.  struct AggI
26c10 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20  nfo_col *pC;..  
26c20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74  pAggInfo->direct
26c30 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 66 6f 72 28  Mode = 1;.  for(
26c40 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f  i=0, pF=pAggInfo
26c50 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49  ->aFunc; i<pAggI
26c60 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c  nfo->nFunc; i++,
26c70 20 70 46 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20   pF++){.    int 
26c80 6e 41 72 67 3b 0a 20 20 20 20 69 6e 74 20 61 64  nArg;.    int ad
26c90 64 72 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  drNext = 0;.    
26ca0 69 6e 74 20 72 65 67 41 67 67 3b 0a 20 20 20 20  int regAgg;.    
26cb0 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
26cc0 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70  = pF->pExpr->x.p
26cd0 4c 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74  List;.    assert
26ce0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
26cf0 74 79 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50  ty(pF->pExpr, EP
26d00 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
26d10 20 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a     if( pList ){.
26d20 20 20 20 20 20 20 6e 41 72 67 20 3d 20 70 4c 69        nArg = pLi
26d30 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  st->nExpr;.     
26d40 20 72 65 67 41 67 67 20 3d 20 73 71 6c 69 74 65   regAgg = sqlite
26d50 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
26d60 61 72 73 65 2c 20 6e 41 72 67 29 3b 0a 20 20 20  arse, nArg);.   
26d70 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
26d80 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  deExprList(pPars
26d90 65 2c 20 70 4c 69 73 74 2c 20 72 65 67 41 67 67  e, pList, regAgg
26da0 2c 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55  , SQLITE_ECEL_DU
26db0 50 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  P);.    }else{. 
26dc0 20 20 20 20 20 6e 41 72 67 20 3d 20 30 3b 0a 20       nArg = 0;. 
26dd0 20 20 20 20 20 72 65 67 41 67 67 20 3d 20 30 3b       regAgg = 0;
26de0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
26df0 46 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20  F->iDistinct>=0 
26e00 29 7b 0a 20 20 20 20 20 20 61 64 64 72 4e 65 78  ){.      addrNex
26e10 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
26e20 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
26e30 20 20 20 61 73 73 65 72 74 28 20 6e 41 72 67 3d     assert( nArg=
26e40 3d 31 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  =1 );.      code
26e50 44 69 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c  Distinct(pParse,
26e60 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20   pF->iDistinct, 
26e70 61 64 64 72 4e 65 78 74 2c 20 31 2c 20 72 65 67  addrNext, 1, reg
26e80 41 67 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Agg);.    }.    
26e90 69 66 28 20 70 46 2d 3e 70 46 75 6e 63 2d 3e 66  if( pF->pFunc->f
26ea0 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
26eb0 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20  E_FUNC_NEEDCOLL 
26ec0 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  ){.      CollSeq
26ed0 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20   *pColl = 0;.   
26ee0 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
26ef0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
26f00 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
26f10 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
26f20 21 3d 30 20 29 3b 20 20 2f 2a 20 70 4c 69 73 74  !=0 );  /* pList
26f30 21 3d 30 20 69 66 20 70 46 2d 3e 70 46 75 6e 63  !=0 if pF->pFunc
26f40 20 68 61 73 20 4e 45 45 44 43 4f 4c 4c 20 2a 2f   has NEEDCOLL */
26f50 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20  .      for(j=0, 
26f60 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20  pItem=pList->a; 
26f70 21 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72 67  !pColl && j<nArg
26f80 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; j++, pItem++){
26f90 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
26fa0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
26fb0 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 74 65  Seq(pParse, pIte
26fc0 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  m->pExpr);.     
26fd0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 43   }.      if( !pC
26fe0 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70  oll ){.        p
26ff0 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64  Coll = pParse->d
27000 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
27010 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
27020 72 65 67 48 69 74 3d 3d 30 20 26 26 20 70 41 67  regHit==0 && pAg
27030 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61  gInfo->nAccumula
27040 74 6f 72 20 29 20 72 65 67 48 69 74 20 3d 20 2b  tor ) regHit = +
27050 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
27060 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
27070 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp4(v, OP_Col
27080 6c 53 65 71 2c 20 72 65 67 48 69 74 2c 20 30 2c  lSeq, regHit, 0,
27090 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c   0, (char *)pCol
270a0 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a  l, P4_COLLSEQ);.
270b0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
270c0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
270d0 50 5f 41 67 67 53 74 65 70 2c 20 30 2c 20 72 65  P_AggStep, 0, re
270e0 67 41 67 67 2c 20 70 46 2d 3e 69 4d 65 6d 2c 0a  gAgg, pF->iMem,.
270f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27100 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 46 2d        (void*)pF-
27110 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44  >pFunc, P4_FUNCD
27120 45 46 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  EF);.    sqlite3
27130 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
27140 28 75 38 29 6e 41 72 67 29 3b 0a 20 20 20 20 73  (u8)nArg);.    s
27150 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
27160 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
27170 61 72 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41  arse, regAgg, nA
27180 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rg);.    sqlite3
27190 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
271a0 28 70 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c  (pParse, regAgg,
271b0 20 6e 41 72 67 29 3b 0a 20 20 20 20 69 66 28 20   nArg);.    if( 
271c0 61 64 64 72 4e 65 78 74 20 29 7b 0a 20 20 20 20  addrNext ){.    
271d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
271e0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
271f0 72 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 73 71  rNext);.      sq
27200 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
27210 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ear(pParse);.   
27220 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66   }.  }..  /* Bef
27230 6f 72 65 20 70 6f 70 75 6c 61 74 69 6e 67 20 74  ore populating t
27240 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72  he accumulator r
27250 65 67 69 73 74 65 72 73 2c 20 63 6c 65 61 72 20  egisters, clear 
27260 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
27270 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65  ..  ** Otherwise
27280 2c 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20  , if any of the 
27290 72 65 71 75 69 72 65 64 20 63 6f 6c 75 6d 6e 20  required column 
272a0 76 61 6c 75 65 73 20 61 72 65 20 61 6c 72 65 61  values are alrea
272b0 64 79 20 70 72 65 73 65 6e 74 20 0a 20 20 2a 2a  dy present .  **
272c0 20 69 6e 20 72 65 67 69 73 74 65 72 73 2c 20 73   in registers, s
272d0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 29  qlite3ExprCode()
272e0 20 6d 61 79 20 75 73 65 20 4f 50 5f 53 43 6f 70   may use OP_SCop
272f0 79 20 74 6f 20 63 6f 70 79 20 74 68 65 20 76 61  y to copy the va
27300 6c 75 65 0a 20 20 2a 2a 20 74 6f 20 70 43 2d 3e  lue.  ** to pC->
27310 69 4d 65 6d 2e 20 42 75 74 20 62 79 20 74 68 65  iMem. But by the
27320 20 74 69 6d 65 20 74 68 65 20 76 61 6c 75 65 20   time the value 
27330 69 73 20 75 73 65 64 2c 20 74 68 65 20 6f 72 69  is used, the ori
27340 67 69 6e 61 6c 20 72 65 67 69 73 74 65 72 0a 20  ginal register. 
27350 20 2a 2a 20 6d 61 79 20 68 61 76 65 20 62 65 65   ** may have bee
27360 6e 20 75 73 65 64 2c 20 69 6e 76 61 6c 69 64 61  n used, invalida
27370 74 69 6e 67 20 74 68 65 20 75 6e 64 65 72 6c 79  ting the underly
27380 69 6e 67 20 62 75 66 66 65 72 20 68 6f 6c 64 69  ing buffer holdi
27390 6e 67 20 74 68 65 0a 20 20 2a 2a 20 74 65 78 74  ng the.  ** text
273a0 20 6f 72 20 62 6c 6f 62 20 76 61 6c 75 65 2e 20   or blob value. 
273b0 53 65 65 20 74 69 63 6b 65 74 20 5b 38 38 33 30  See ticket [8830
273c0 33 34 64 63 62 35 5d 2e 0a 20 20 2a 2a 0a 20 20  34dcb5]..  **.  
273d0 2a 2a 20 41 6e 6f 74 68 65 72 20 73 6f 6c 75 74  ** Another solut
273e0 69 6f 6e 20 77 6f 75 6c 64 20 62 65 20 74 6f 20  ion would be to 
273f0 63 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 53 43  change the OP_SC
27400 6f 70 79 20 75 73 65 64 20 74 6f 20 63 6f 70 79  opy used to copy
27410 20 63 61 63 68 65 64 0a 20 20 2a 2a 20 76 61 6c   cached.  ** val
27420 75 65 73 20 74 6f 20 61 6e 20 4f 50 5f 43 6f 70  ues to an OP_Cop
27430 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65  y..  */.  if( re
27440 67 48 69 74 20 29 7b 0a 20 20 20 20 61 64 64 72  gHit ){.    addr
27450 48 69 74 54 65 73 74 20 3d 20 73 71 6c 69 74 65  HitTest = sqlite
27460 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
27470 50 5f 49 66 2c 20 72 65 67 48 69 74 29 3b 20 56  P_If, regHit); V
27480 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
27490 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
274a0 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
274b0 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  se);.  for(i=0, 
274c0 70 43 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  pC=pAggInfo->aCo
274d0 6c 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  l; i<pAggInfo->n
274e0 41 63 63 75 6d 75 6c 61 74 6f 72 3b 20 69 2b 2b  Accumulator; i++
274f0 2c 20 70 43 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  , pC++){.    sql
27500 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
27510 72 73 65 2c 20 70 43 2d 3e 70 45 78 70 72 2c 20  rse, pC->pExpr, 
27520 70 43 2d 3e 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20  pC->iMem);.  }. 
27530 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63   pAggInfo->direc
27540 74 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 73 71 6c  tMode = 0;.  sql
27550 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
27560 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  ar(pParse);.  if
27570 28 20 61 64 64 72 48 69 74 54 65 73 74 20 29 7b  ( addrHitTest ){
27580 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
27590 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
275a0 48 69 74 54 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a  HitTest);.  }.}.
275b0 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e  ./*.** Add a sin
275c0 67 6c 65 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69  gle OP_Explain i
275d0 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 68  nstruction to th
275e0 65 20 56 44 42 45 20 74 6f 20 65 78 70 6c 61 69  e VDBE to explai
275f0 6e 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 63 6f  n a simple.** co
27600 75 6e 74 28 2a 29 20 71 75 65 72 79 20 28 22 53  unt(*) query ("S
27610 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
27620 52 4f 4d 20 70 54 61 62 22 29 2e 0a 2a 2f 0a 23  ROM pTab")..*/.#
27630 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
27640 49 54 5f 45 58 50 4c 41 49 4e 0a 73 74 61 74 69  IT_EXPLAIN.stati
27650 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 53 69  c void explainSi
27660 6d 70 6c 65 43 6f 75 6e 74 28 0a 20 20 50 61 72  mpleCount(.  Par
27670 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
27680 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27690 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f  Parse context */
276a0 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  .  Table *pTab, 
276b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
276c0 20 20 20 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e     /* Table bein
276d0 67 20 71 75 65 72 69 65 64 20 2a 2f 0a 20 20 49  g queried */.  I
276e0 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20  ndex *pIdx      
276f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27700 2a 20 49 6e 64 65 78 20 75 73 65 64 20 74 6f 20  * Index used to 
27710 6f 70 74 69 6d 69 7a 65 20 73 63 61 6e 2c 20 6f  optimize scan, o
27720 72 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69  r NULL */.){.  i
27730 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  f( pParse->expla
27740 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 63 68 61  in==2 ){.    cha
27750 72 20 2a 7a 45 71 70 20 3d 20 73 71 6c 69 74 65  r *zEqp = sqlite
27760 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d  3MPrintf(pParse-
27770 3e 64 62 2c 20 22 53 43 41 4e 20 54 41 42 4c 45  >db, "SCAN TABLE
27780 20 25 73 25 73 25 73 22 2c 0a 20 20 20 20 20 20   %s%s%s",.      
27790 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 0a    pTab->zName, .
277a0 20 20 20 20 20 20 20 20 70 49 64 78 20 3f 20 22          pIdx ? "
277b0 20 55 53 49 4e 47 20 43 4f 56 45 52 49 4e 47 20   USING COVERING 
277c0 49 4e 44 45 58 20 22 20 3a 20 22 22 2c 0a 20 20  INDEX " : "",.  
277d0 20 20 20 20 20 20 70 49 64 78 20 3f 20 70 49 64        pIdx ? pId
277e0 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 22 0a 20 20  x->zName : "".  
277f0 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33    );.    sqlite3
27800 56 64 62 65 41 64 64 4f 70 34 28 0a 20 20 20 20  VdbeAddOp4(.    
27810 20 20 20 20 70 50 61 72 73 65 2d 3e 70 56 64 62      pParse->pVdb
27820 65 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70  e, OP_Explain, p
27830 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64  Parse->iSelectId
27840 2c 20 30 2c 20 30 2c 20 7a 45 71 70 2c 20 50 34  , 0, 0, zEqp, P4
27850 5f 44 59 4e 41 4d 49 43 0a 20 20 20 20 29 3b 0a  _DYNAMIC.    );.
27860 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65    }.}.#else.# de
27870 66 69 6e 65 20 65 78 70 6c 61 69 6e 53 69 6d 70  fine explainSimp
27880 6c 65 43 6f 75 6e 74 28 61 2c 62 2c 63 29 0a 23  leCount(a,b,c).#
27890 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  endif../*.** Gen
278a0 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74  erate code for t
278b0 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
278c0 65 6e 74 20 67 69 76 65 6e 20 69 6e 20 74 68 65  ent given in the
278d0 20 70 20 61 72 67 75 6d 65 6e 74 2e 20 20 0a 2a   p argument.  .*
278e0 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73  *.** The results
278f0 20 61 72 65 20 72 65 74 75 72 6e 65 64 20 61 63   are returned ac
27900 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 53  cording to the S
27910 65 6c 65 63 74 44 65 73 74 20 73 74 72 75 63 74  electDest struct
27920 75 72 65 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d  ure..** See comm
27930 65 6e 74 73 20 69 6e 20 73 71 6c 69 74 65 49 6e  ents in sqliteIn
27940 74 2e 68 20 66 6f 72 20 66 75 72 74 68 65 72 20  t.h for further 
27950 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a  information..**.
27960 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
27970 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62  returns the numb
27980 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49  er of errors.  I
27990 66 20 61 6e 79 20 65 72 72 6f 72 73 20 61 72 65  f any errors are
279a0 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c  .** encountered,
279b0 20 74 68 65 6e 20 61 6e 20 61 70 70 72 6f 70 72   then an appropr
279c0 69 61 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61  iate error messa
279d0 67 65 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a 2a  ge is left in.**
279e0 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67   pParse->zErrMsg
279f0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
27a00 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66 72  tine does NOT fr
27a10 65 65 20 74 68 65 20 53 65 6c 65 63 74 20 73 74  ee the Select st
27a20 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20 69  ructure passed i
27a30 6e 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69  n.  The.** calli
27a40 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65 64  ng function need
27a50 73 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f  s to do that..*/
27a60 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65  .int sqlite3Sele
27a70 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ct(.  Parse *pPa
27a80 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rse,         /* 
27a90 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65  The parser conte
27aa0 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
27ab0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
27ac0 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61  * The SELECT sta
27ad0 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64  tement being cod
27ae0 65 64 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ed. */.  SelectD
27af0 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 20  est *pDest      
27b00 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
27b10 74 68 20 74 68 65 20 71 75 65 72 79 20 72 65 73  th the query res
27b20 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ults */.){.  int
27b30 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20   i, j;          
27b40 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
27b50 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 49  ters */.  WhereI
27b60 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20  nfo *pWInfo;    
27b70 20 2f 2a 20 52 65 74 75 72 6e 20 66 72 6f 6d 20   /* Return from 
27b80 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
27b90 6e 28 29 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  n() */.  Vdbe *v
27ba0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27bb0 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 6d  /* The virtual m
27bc0 61 63 68 69 6e 65 20 75 6e 64 65 72 20 63 6f 6e  achine under con
27bd0 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  struction */.  i
27be0 6e 74 20 69 73 41 67 67 3b 20 20 20 20 20 20 20  nt isAgg;       
27bf0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
27c00 72 20 73 65 6c 65 63 74 20 6c 69 73 74 73 20 6c  r select lists l
27c10 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22 20 2a  ike "count(*)" *
27c20 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
27c30 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69  List;      /* Li
27c40 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f  st of columns to
27c50 20 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20 53   extract. */.  S
27c60 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
27c70 3b 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66  ;     /* List of
27c80 20 74 61 62 6c 65 73 20 74 6f 20 73 65 6c 65 63   tables to selec
27c90 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72  t from */.  Expr
27ca0 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20 20   *pWhere;       
27cb0 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
27cc0 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20  clause.  May be 
27cd0 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69  NULL */.  ExprLi
27ce0 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20 20  st *pGroupBy;   
27cf0 20 2f 2a 20 54 68 65 20 47 52 4f 55 50 20 42 59   /* The GROUP BY
27d00 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
27d10 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20   NULL */.  Expr 
27d20 2a 70 48 61 76 69 6e 67 3b 20 20 20 20 20 20 20  *pHaving;       
27d30 20 20 2f 2a 20 54 68 65 20 48 41 56 49 4e 47 20    /* The HAVING 
27d40 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20  clause.  May be 
27d50 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 72 63  NULL */.  int rc
27d60 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
27d70 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74   /* Value to ret
27d80 75 72 6e 20 66 72 6f 6d 20 74 68 69 73 20 66 75  urn from this fu
27d90 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 44 69 73 74  nction */.  Dist
27da0 69 6e 63 74 43 74 78 20 73 44 69 73 74 69 6e 63  inctCtx sDistinc
27db0 74 3b 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f  t; /* Info on ho
27dc0 77 20 74 6f 20 63 6f 64 65 20 74 68 65 20 44 49  w to code the DI
27dd0 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 2a  STINCT keyword *
27de0 2f 0a 20 20 53 6f 72 74 43 74 78 20 73 53 6f 72  /.  SortCtx sSor
27df0 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  t;         /* In
27e00 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 63 6f 64  fo on how to cod
27e10 65 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  e the ORDER BY c
27e20 6c 61 75 73 65 20 2a 2f 0a 20 20 41 67 67 49 6e  lause */.  AggIn
27e30 66 6f 20 73 41 67 67 49 6e 66 6f 3b 20 20 20 20  fo sAggInfo;    
27e40 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e    /* Information
27e50 20 75 73 65 64 20 62 79 20 61 67 67 72 65 67 61   used by aggrega
27e60 74 65 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20  te queries */.  
27e70 69 6e 74 20 69 45 6e 64 3b 20 20 20 20 20 20 20  int iEnd;       
27e80 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
27e90 73 20 6f 66 20 74 68 65 20 65 6e 64 20 6f 66 20  s of the end of 
27ea0 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 73  the query */.  s
27eb0 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
27ec0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
27ed0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
27ee0 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
27ef0 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
27f00 0a 20 20 69 6e 74 20 69 52 65 73 74 6f 72 65 53  .  int iRestoreS
27f10 65 6c 65 63 74 49 64 20 3d 20 70 50 61 72 73 65  electId = pParse
27f20 2d 3e 69 53 65 6c 65 63 74 49 64 3b 0a 20 20 70  ->iSelectId;.  p
27f30 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64  Parse->iSelectId
27f40 20 3d 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74   = pParse->iNext
27f50 53 65 6c 65 63 74 49 64 2b 2b 3b 0a 23 65 6e 64  SelectId++;.#end
27f60 69 66 0a 0a 20 20 64 62 20 3d 20 70 50 61 72 73  if..  db = pPars
27f70 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 3d 3d  e->db;.  if( p==
27f80 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  0 || db->mallocF
27f90 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d  ailed || pParse-
27fa0 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 72 65 74  >nErr ){.    ret
27fb0 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 1;.  }.  if(
27fc0 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
27fd0 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
27fe0 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30  _SELECT, 0, 0, 0
27ff0 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
28000 6d 65 6d 73 65 74 28 26 73 41 67 67 49 6e 66 6f  memset(&sAggInfo
28010 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 67 67  , 0, sizeof(sAgg
28020 49 6e 66 6f 29 29 3b 0a 0a 20 20 61 73 73 65 72  Info));..  asser
28030 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  t( p->pOrderBy==
28040 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73  0 || pDest->eDes
28050 74 21 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20  t!=SRT_DistFifo 
28060 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
28070 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70  pOrderBy==0 || p
28080 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54  Dest->eDest!=SRT
28090 5f 46 69 66 6f 20 29 3b 0a 20 20 61 73 73 65 72  _Fifo );.  asser
280a0 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  t( p->pOrderBy==
280b0 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73  0 || pDest->eDes
280c0 74 21 3d 53 52 54 5f 44 69 73 74 51 75 65 75 65  t!=SRT_DistQueue
280d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
280e0 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20  >pOrderBy==0 || 
280f0 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52  pDest->eDest!=SR
28100 54 5f 51 75 65 75 65 20 29 3b 0a 20 20 69 66 28  T_Queue );.  if(
28110 20 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62   IgnorableOrderb
28120 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20  y(pDest) ){.    
28130 61 73 73 65 72 74 28 70 44 65 73 74 2d 3e 65 44  assert(pDest->eD
28140 65 73 74 3d 3d 53 52 54 5f 45 78 69 73 74 73 20  est==SRT_Exists 
28150 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  || pDest->eDest=
28160 3d 53 52 54 5f 55 6e 69 6f 6e 20 7c 7c 20 0a 20  =SRT_Union || . 
28170 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2d            pDest-
28180 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 63 65  >eDest==SRT_Exce
28190 70 74 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65  pt || pDest->eDe
281a0 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20  st==SRT_Discard 
281b0 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 70 44  ||.           pD
281c0 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
281d0 51 75 65 75 65 20 20 7c 7c 20 70 44 65 73 74 2d  Queue  || pDest-
281e0 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74  >eDest==SRT_Dist
281f0 46 69 66 6f 20 7c 7c 0a 20 20 20 20 20 20 20 20  Fifo ||.        
28200 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d     pDest->eDest=
28210 3d 53 52 54 5f 44 69 73 74 51 75 65 75 65 20 7c  =SRT_DistQueue |
28220 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  | pDest->eDest==
28230 53 52 54 5f 46 69 66 6f 29 3b 0a 20 20 20 20 2f  SRT_Fifo);.    /
28240 2a 20 49 66 20 4f 52 44 45 52 20 42 59 20 6d 61  * If ORDER BY ma
28250 6b 65 73 20 6e 6f 20 64 69 66 66 65 72 65 6e 63  kes no differenc
28260 65 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20  e in the output 
28270 74 68 65 6e 20 6e 65 69 74 68 65 72 20 64 6f 65  then neither doe
28280 73 0a 20 20 20 20 2a 2a 20 44 49 53 54 49 4e 43  s.    ** DISTINC
28290 54 20 73 6f 20 69 74 20 63 61 6e 20 62 65 20 72  T so it can be r
282a0 65 6d 6f 76 65 64 20 74 6f 6f 2e 20 2a 2f 0a 20  emoved too. */. 
282b0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
282c0 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  stDelete(db, p->
282d0 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 70  pOrderBy);.    p
282e0 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
282f0 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20      p->selFlags 
28300 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b  &= ~SF_Distinct;
28310 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 65  .  }.  sqlite3Se
28320 6c 65 63 74 50 72 65 70 28 70 50 61 72 73 65 2c  lectPrep(pParse,
28330 20 70 2c 20 30 29 3b 0a 20 20 6d 65 6d 73 65 74   p, 0);.  memset
28340 28 26 73 53 6f 72 74 2c 20 30 2c 20 73 69 7a 65  (&sSort, 0, size
28350 6f 66 28 73 53 6f 72 74 29 29 3b 0a 20 20 73 53  of(sSort));.  sS
28360 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 70  ort.pOrderBy = p
28370 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 54  ->pOrderBy;.  pT
28380 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63  abList = p->pSrc
28390 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e  ;.  pEList = p->
283a0 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 50  pEList;.  if( pP
283b0 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62  arse->nErr || db
283c0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
283d0 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63  {.    goto selec
283e0 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 73 41  t_end;.  }.  isA
283f0 67 67 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67  gg = (p->selFlag
28400 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65  s & SF_Aggregate
28410 29 21 3d 30 3b 0a 20 20 61 73 73 65 72 74 28 20  )!=0;.  assert( 
28420 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 0a 20 20  pEList!=0 );..  
28430 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74  /* Begin generat
28440 69 6e 67 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20  ing code..  */. 
28450 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
28460 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
28470 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 73  f( v==0 ) goto s
28480 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a  elect_end;..  /*
28490 20 49 66 20 77 72 69 74 69 6e 67 20 74 6f 20 6d   If writing to m
284a0 65 6d 6f 72 79 20 6f 72 20 67 65 6e 65 72 61 74  emory or generat
284b0 69 6e 67 20 61 20 73 65 74 0a 20 20 2a 2a 20 6f  ing a set.  ** o
284c0 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c  nly a single col
284d0 75 6d 6e 20 6d 61 79 20 62 65 20 6f 75 74 70 75  umn may be outpu
284e0 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  t..  */.#ifndef 
284f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
28500 55 45 52 59 0a 20 20 69 66 28 20 63 68 65 63 6b  UERY.  if( check
28510 46 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53 65  ForMultiColumnSe
28520 6c 65 63 74 45 72 72 6f 72 28 70 50 61 72 73 65  lectError(pParse
28530 2c 20 70 44 65 73 74 2c 20 70 45 4c 69 73 74 2d  , pDest, pEList-
28540 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20 67  >nExpr) ){.    g
28550 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
28560 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
28570 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
28580 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75 65 72 69  or all sub-queri
28590 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  es in the FROM c
285a0 6c 61 75 73 65 0a 20 20 2a 2f 0a 23 69 66 20 21  lause.  */.#if !
285b0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
285c0 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
285d0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
285e0 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 66 6f  _OMIT_VIEW).  fo
285f0 72 28 69 3d 30 3b 20 21 70 2d 3e 70 50 72 69 6f  r(i=0; !p->pPrio
28600 72 20 26 26 20 69 3c 70 54 61 62 4c 69 73 74 2d  r && i<pTabList-
28610 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
28620 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
28630 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
28640 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20  TabList->a[i];. 
28650 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65     SelectDest de
28660 73 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a  st;.    Select *
28670 70 53 75 62 20 3d 20 70 49 74 65 6d 2d 3e 70 53  pSub = pItem->pS
28680 65 6c 65 63 74 3b 0a 20 20 20 20 69 6e 74 20 69  elect;.    int i
28690 73 41 67 67 53 75 62 3b 0a 0a 20 20 20 20 69 66  sAggSub;..    if
286a0 28 20 70 53 75 62 3d 3d 30 20 29 20 63 6f 6e 74  ( pSub==0 ) cont
286b0 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 53 6f  inue;..    /* So
286c0 6d 65 74 69 6d 65 73 20 74 68 65 20 63 6f 64 65  metimes the code
286d0 20 66 6f 72 20 61 20 73 75 62 71 75 65 72 79 20   for a subquery 
286e0 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74 65  will be generate
286f0 64 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20  d more than.    
28700 2a 2a 20 6f 6e 63 65 2c 20 69 66 20 74 68 65 20  ** once, if the 
28710 73 75 62 71 75 65 72 79 20 69 73 20 70 61 72 74  subquery is part
28720 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
28730 61 75 73 65 20 69 6e 20 61 20 4c 45 46 54 20 4a  ause in a LEFT J
28740 4f 49 4e 2c 0a 20 20 20 20 2a 2a 20 66 6f 72 20  OIN,.    ** for 
28750 65 78 61 6d 70 6c 65 2e 20 20 49 6e 20 74 68 61  example.  In tha
28760 74 20 63 61 73 65 2c 20 64 6f 20 6e 6f 74 20 72  t case, do not r
28770 65 67 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f  egenerate the co
28780 64 65 20 74 6f 20 6d 61 6e 69 66 65 73 74 0a 20  de to manifest. 
28790 20 20 20 2a 2a 20 61 20 76 69 65 77 20 6f 72 20     ** a view or 
287a0 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74  the co-routine t
287b0 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 76 69  o implement a vi
287c0 65 77 2e 20 20 54 68 65 20 66 69 72 73 74 20 69  ew.  The first i
287d0 6e 73 74 61 6e 63 65 0a 20 20 20 20 2a 2a 20 69  nstance.    ** i
287e0 73 20 73 75 66 66 69 63 69 65 6e 74 2c 20 74 68  s sufficient, th
287f0 6f 75 67 68 20 74 68 65 20 73 75 62 72 6f 75 74  ough the subrout
28800 69 6e 65 20 74 6f 20 6d 61 6e 69 66 65 73 74 20  ine to manifest 
28810 74 68 65 20 76 69 65 77 20 64 6f 65 73 20 6e 65  the view does ne
28820 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20  ed.    ** to be 
28830 69 6e 76 6f 6b 65 64 20 61 67 61 69 6e 2e 20 2a  invoked again. *
28840 2f 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d  /.    if( pItem-
28850 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 29 7b 0a  >addrFillSub ){.
28860 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
28870 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65 3d 3d 30  >viaCoroutine==0
28880 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
28890 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
288a0 20 4f 50 5f 47 6f 73 75 62 2c 20 70 49 74 65 6d   OP_Gosub, pItem
288b0 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 49 74  ->regReturn, pIt
288c0 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 29  em->addrFillSub)
288d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
288e0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
288f0 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e  .    /* Incremen
28900 74 20 50 61 72 73 65 2e 6e 48 65 69 67 68 74 20  t Parse.nHeight 
28910 62 79 20 74 68 65 20 68 65 69 67 68 74 20 6f 66  by the height of
28920 20 74 68 65 20 6c 61 72 67 65 73 74 20 65 78 70   the largest exp
28930 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 74  ression.    ** t
28940 72 65 65 20 72 65 66 65 72 72 65 64 20 74 6f 20  ree referred to 
28950 62 79 20 74 68 69 73 2c 20 74 68 65 20 70 61 72  by this, the par
28960 65 6e 74 20 73 65 6c 65 63 74 2e 20 54 68 65 20  ent select. The 
28970 63 68 69 6c 64 20 73 65 6c 65 63 74 0a 20 20 20  child select.   
28980 20 2a 2a 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20   ** may contain 
28990 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73  expression trees
289a0 20 6f 66 20 61 74 20 6d 6f 73 74 0a 20 20 20 20   of at most.    
289b0 2a 2a 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f 45  ** (SQLITE_MAX_E
289c0 58 50 52 5f 44 45 50 54 48 2d 50 61 72 73 65 2e  XPR_DEPTH-Parse.
289d0 6e 48 65 69 67 68 74 29 20 68 65 69 67 68 74 2e  nHeight) height.
289e0 20 54 68 69 73 20 69 73 20 61 20 62 69 74 0a 20   This is a bit. 
289f0 20 20 20 2a 2a 20 6d 6f 72 65 20 63 6f 6e 73 65     ** more conse
28a00 72 76 61 74 69 76 65 20 74 68 61 6e 20 6e 65 63  rvative than nec
28a10 65 73 73 61 72 79 2c 20 62 75 74 20 6d 75 63 68  essary, but much
28a20 20 65 61 73 69 65 72 20 74 68 61 6e 20 65 6e 66   easier than enf
28a30 6f 72 63 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e  orcing.    ** an
28a40 20 65 78 61 63 74 20 6c 69 6d 69 74 2e 0a 20 20   exact limit..  
28a50 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d    */.    pParse-
28a60 3e 6e 48 65 69 67 68 74 20 2b 3d 20 73 71 6c 69  >nHeight += sqli
28a70 74 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69  te3SelectExprHei
28a80 67 68 74 28 70 29 3b 0a 0a 20 20 20 20 69 73 41  ght(p);..    isA
28a90 67 67 53 75 62 20 3d 20 28 70 53 75 62 2d 3e 73  ggSub = (pSub->s
28aa0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67  elFlags & SF_Agg
28ab0 72 65 67 61 74 65 29 21 3d 30 3b 0a 20 20 20 20  regate)!=0;.    
28ac0 69 66 28 20 66 6c 61 74 74 65 6e 53 75 62 71 75  if( flattenSubqu
28ad0 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20 69  ery(pParse, p, i
28ae0 2c 20 69 73 41 67 67 2c 20 69 73 41 67 67 53 75  , isAgg, isAggSu
28af0 62 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  b) ){.      /* T
28b00 68 69 73 20 73 75 62 71 75 65 72 79 20 63 61 6e  his subquery can
28b10 20 62 65 20 61 62 73 6f 72 62 65 64 20 69 6e 74   be absorbed int
28b20 6f 20 69 74 73 20 70 61 72 65 6e 74 2e 20 2a 2f  o its parent. */
28b30 0a 20 20 20 20 20 20 69 66 28 20 69 73 41 67 67  .      if( isAgg
28b40 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Sub ){.        i
28b50 73 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 20 20  sAgg = 1;.      
28b60 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d    p->selFlags |=
28b70 20 53 46 5f 41 67 67 72 65 67 61 74 65 3b 0a 20   SF_Aggregate;. 
28b80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 20 3d       }.      i =
28b90 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69   -1;.    }else i
28ba0 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  f( pTabList->nSr
28bb0 63 3d 3d 31 0a 20 20 20 20 20 20 20 20 20 20 20  c==1.           
28bc0 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45  && OptimizationE
28bd0 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54  nabled(db, SQLIT
28be0 45 5f 53 75 62 71 43 6f 72 6f 75 74 69 6e 65 29  E_SubqCoroutine)
28bf0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
28c00 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 63 6f 2d   Implement a co-
28c10 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c  routine that wil
28c20 6c 20 72 65 74 75 72 6e 20 61 20 73 69 6e 67 6c  l return a singl
28c30 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73  e row of the res
28c40 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 74  ult.      ** set
28c50 20 6f 6e 20 65 61 63 68 20 69 6e 76 6f 63 61 74   on each invocat
28c60 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
28c70 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70 20      int addrTop 
28c80 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
28c90 72 65 6e 74 41 64 64 72 28 76 29 2b 31 3b 0a 20  rentAddr(v)+1;. 
28ca0 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 67 52       pItem->regR
28cb0 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65  eturn = ++pParse
28cc0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71  ->nMem;.      sq
28cd0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
28ce0 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74  v, OP_InitCorout
28cf0 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52  ine, pItem->regR
28d00 65 74 75 72 6e 2c 20 30 2c 20 61 64 64 72 54 6f  eturn, 0, addrTo
28d10 70 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  p);.      VdbeCo
28d20 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20  mment((v, "%s", 
28d30 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61  pItem->pTab->zNa
28d40 6d 65 29 29 3b 0a 20 20 20 20 20 20 70 49 74 65  me));.      pIte
28d50 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d  m->addrFillSub =
28d60 20 61 64 64 72 54 6f 70 3b 0a 20 20 20 20 20 20   addrTop;.      
28d70 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
28d80 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54  tInit(&dest, SRT
28d90 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 70 49 74 65  _Coroutine, pIte
28da0 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20  m->regReturn);. 
28db0 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49       explainSetI
28dc0 6e 74 65 67 65 72 28 70 49 74 65 6d 2d 3e 69 53  nteger(pItem->iS
28dd0 65 6c 65 63 74 49 64 2c 20 28 75 38 29 70 50 61  electId, (u8)pPa
28de0 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
28df0 49 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Id);.      sqlit
28e00 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
28e10 20 70 53 75 62 2c 20 26 64 65 73 74 29 3b 0a 20   pSub, &dest);. 
28e20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62       pItem->pTab
28e30 2d 3e 6e 52 6f 77 45 73 74 20 3d 20 28 75 6e 73  ->nRowEst = (uns
28e40 69 67 6e 65 64 29 70 53 75 62 2d 3e 6e 53 65 6c  igned)pSub->nSel
28e50 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 70 49  ectRow;.      pI
28e60 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e  tem->viaCoroutin
28e70 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 49 74  e = 1;.      pIt
28e80 65 6d 2d 3e 72 65 67 52 65 73 75 6c 74 20 3d 20  em->regResult = 
28e90 64 65 73 74 2e 69 53 64 73 74 3b 0a 20 20 20 20  dest.iSdst;.    
28ea0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
28eb0 4f 70 31 28 76 2c 20 4f 50 5f 45 6e 64 43 6f 72  Op1(v, OP_EndCor
28ec0 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72  outine, pItem->r
28ed0 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20  egReturn);.     
28ee0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
28ef0 48 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70 2d  Here(v, addrTop-
28f00 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
28f10 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63  3ClearTempRegCac
28f20 68 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  he(pParse);.    
28f30 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
28f40 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
28f50 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20  utine that will 
28f60 66 69 6c 6c 20 61 6e 20 65 70 68 65 6d 65 72 61  fill an ephemera
28f70 6c 20 74 61 62 6c 65 20 77 69 74 68 0a 20 20 20  l table with.   
28f80 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e     ** the conten
28f90 74 20 6f 66 20 74 68 69 73 20 73 75 62 71 75 65  t of this subque
28fa0 72 79 2e 20 20 70 49 74 65 6d 2d 3e 61 64 64 72  ry.  pItem->addr
28fb0 46 69 6c 6c 53 75 62 20 77 69 6c 6c 20 70 6f 69  FillSub will poi
28fc0 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74  nt.      ** to t
28fd0 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  he address of th
28fe0 65 20 67 65 6e 65 72 61 74 65 64 20 73 75 62 72  e generated subr
28ff0 6f 75 74 69 6e 65 2e 20 20 70 49 74 65 6d 2d 3e  outine.  pItem->
29000 72 65 67 52 65 74 75 72 6e 0a 20 20 20 20 20 20  regReturn.      
29010 2a 2a 20 69 73 20 61 20 72 65 67 69 73 74 65 72  ** is a register
29020 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 68 6f   allocated to ho
29030 6c 64 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  ld the subroutin
29040 65 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73  e return address
29050 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
29060 69 6e 74 20 74 6f 70 41 64 64 72 3b 0a 20 20 20  int topAddr;.   
29070 20 20 20 69 6e 74 20 6f 6e 63 65 41 64 64 72 20     int onceAddr 
29080 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 72  = 0;.      int r
29090 65 74 41 64 64 72 3b 0a 20 20 20 20 20 20 61 73  etAddr;.      as
290a0 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 61 64 64  sert( pItem->add
290b0 72 46 69 6c 6c 53 75 62 3d 3d 30 20 29 3b 0a 20  rFillSub==0 );. 
290c0 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 67 52       pItem->regR
290d0 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65  eturn = ++pParse
290e0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 74 6f  ->nMem;.      to
290f0 70 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56  pAddr = sqlite3V
29100 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
29110 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 49 74 65  Integer, 0, pIte
29120 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20  m->regReturn);. 
29130 20 20 20 20 20 70 49 74 65 6d 2d 3e 61 64 64 72       pItem->addr
29140 46 69 6c 6c 53 75 62 20 3d 20 74 6f 70 41 64 64  FillSub = topAdd
29150 72 2b 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70  r+1;.      if( p
29160 49 74 65 6d 2d 3e 69 73 43 6f 72 72 65 6c 61 74  Item->isCorrelat
29170 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ed==0 ){.       
29180 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62 71 75   /* If the subqu
29190 65 72 79 20 69 73 20 6e 6f 74 20 63 6f 72 72 65  ery is not corre
291a0 6c 61 74 65 64 20 61 6e 64 20 69 66 20 77 65 20  lated and if we 
291b0 61 72 65 20 6e 6f 74 20 69 6e 73 69 64 65 20 6f  are not inside o
291c0 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 74  f.        ** a t
291d0 72 69 67 67 65 72 2c 20 74 68 65 6e 20 77 65 20  rigger, then we 
291e0 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20 63 6f 6d  only need to com
291f0 70 75 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f  pute the value o
29200 66 20 74 68 65 20 73 75 62 71 75 65 72 79 0a 20  f the subquery. 
29210 20 20 20 20 20 20 20 2a 2a 20 6f 6e 63 65 2e 20         ** once. 
29220 2a 2f 0a 20 20 20 20 20 20 20 20 6f 6e 63 65 41  */.        onceA
29230 64 64 72 20 3d 20 73 71 6c 69 74 65 33 43 6f 64  ddr = sqlite3Cod
29240 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 20 56  eOnce(pParse); V
29250 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
29260 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
29270 65 6e 74 28 28 76 2c 20 22 6d 61 74 65 72 69 61  ent((v, "materia
29280 6c 69 7a 65 20 5c 22 25 73 5c 22 22 2c 20 70 49  lize \"%s\"", pI
29290 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  tem->pTab->zName
292a0 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ));.      }else{
292b0 0a 20 20 20 20 20 20 20 20 56 64 62 65 4e 6f 6f  .        VdbeNoo
292c0 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6d 61  pComment((v, "ma
292d0 74 65 72 69 61 6c 69 7a 65 20 5c 22 25 73 5c 22  terialize \"%s\"
292e0 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  ", pItem->pTab->
292f0 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 7d  zName));.      }
29300 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
29310 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65  lectDestInit(&de
29320 73 74 2c 20 53 52 54 5f 45 70 68 65 6d 54 61 62  st, SRT_EphemTab
29330 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  , pItem->iCursor
29340 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e  );.      explain
29350 53 65 74 49 6e 74 65 67 65 72 28 70 49 74 65 6d  SetInteger(pItem
29360 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 28 75 38  ->iSelectId, (u8
29370 29 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65  )pParse->iNextSe
29380 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 73  lectId);.      s
29390 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
293a0 72 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74  rse, pSub, &dest
293b0 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  );.      pItem->
293c0 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74 20 3d 20  pTab->nRowEst = 
293d0 28 75 6e 73 69 67 6e 65 64 29 70 53 75 62 2d 3e  (unsigned)pSub->
293e0 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20  nSelectRow;.    
293f0 20 20 69 66 28 20 6f 6e 63 65 41 64 64 72 20 29    if( onceAddr )
29400 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
29410 48 65 72 65 28 76 2c 20 6f 6e 63 65 41 64 64 72  Here(v, onceAddr
29420 29 3b 0a 20 20 20 20 20 20 72 65 74 41 64 64 72  );.      retAddr
29430 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
29440 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
29450 6e 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74  n, pItem->regRet
29460 75 72 6e 29 3b 0a 20 20 20 20 20 20 56 64 62 65  urn);.      Vdbe
29470 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64  Comment((v, "end
29480 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61   %s", pItem->pTa
29490 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  b->zName));.    
294a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
294b0 6e 67 65 50 31 28 76 2c 20 74 6f 70 41 64 64 72  ngeP1(v, topAddr
294c0 2c 20 72 65 74 41 64 64 72 29 3b 0a 20 20 20 20  , retAddr);.    
294d0 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65    sqlite3ClearTe
294e0 6d 70 52 65 67 43 61 63 68 65 28 70 50 61 72 73  mpRegCache(pPars
294f0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
29500 28 20 2f 2a 70 50 61 72 73 65 2d 3e 6e 45 72 72  ( /*pParse->nErr
29510 20 7c 7c 2a 2f 20 64 62 2d 3e 6d 61 6c 6c 6f 63   ||*/ db->malloc
29520 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
29530 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
29540 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73  .    }.    pPars
29550 65 2d 3e 6e 48 65 69 67 68 74 20 2d 3d 20 73 71  e->nHeight -= sq
29560 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72 48  lite3SelectExprH
29570 65 69 67 68 74 28 70 29 3b 0a 20 20 20 20 70 54  eight(p);.    pT
29580 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63  abList = p->pSrc
29590 3b 0a 20 20 20 20 69 66 28 20 21 49 67 6e 6f 72  ;.    if( !Ignor
295a0 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73  ableOrderby(pDes
295b0 74 29 20 29 7b 0a 20 20 20 20 20 20 73 53 6f 72  t) ){.      sSor
295c0 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e  t.pOrderBy = p->
295d0 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a  pOrderBy;.    }.
295e0 20 20 7d 0a 20 20 70 45 4c 69 73 74 20 3d 20 70    }.  pEList = p
295f0 2d 3e 70 45 4c 69 73 74 3b 0a 23 65 6e 64 69 66  ->pEList;.#endif
29600 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70  .  pWhere = p->p
29610 57 68 65 72 65 3b 0a 20 20 70 47 72 6f 75 70 42  Where;.  pGroupB
29620 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b  y = p->pGroupBy;
29630 0a 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e  .  pHaving = p->
29640 70 48 61 76 69 6e 67 3b 0a 20 20 73 44 69 73 74  pHaving;.  sDist
29650 69 6e 63 74 2e 69 73 54 6e 63 74 20 3d 20 28 70  inct.isTnct = (p
29660 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
29670 44 69 73 74 69 6e 63 74 29 21 3d 30 3b 0a 0a 23  Distinct)!=0;..#
29680 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
29690 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
296a0 43 54 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  CT.  /* If there
296b0 20 69 73 20 61 72 65 20 61 20 73 65 71 75 65 6e   is are a sequen
296c0 63 65 20 6f 66 20 71 75 65 72 69 65 73 2c 20 64  ce of queries, d
296d0 6f 20 74 68 65 20 65 61 72 6c 69 65 72 20 6f 6e  o the earlier on
296e0 65 73 20 66 69 72 73 74 2e 0a 20 20 2a 2f 0a 20  es first..  */. 
296f0 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29   if( p->pPrior )
29700 7b 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c 74 69  {.    rc = multi
29710 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
29720 2c 20 70 44 65 73 74 29 3b 0a 20 20 20 20 65 78  , pDest);.    ex
29730 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
29740 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49  pParse->iSelectI
29750 64 2c 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63  d, iRestoreSelec
29760 74 49 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  tId);.    return
29770 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   rc;.  }.#endif.
29780 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
29790 73 20 62 6f 74 68 20 61 20 47 52 4f 55 50 20 42  s both a GROUP B
297a0 59 20 61 6e 64 20 61 6e 20 4f 52 44 45 52 20 42  Y and an ORDER B
297b0 59 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65  Y clause and the
297c0 79 20 61 72 65 0a 20 20 2a 2a 20 69 64 65 6e 74  y are.  ** ident
297d0 69 63 61 6c 2c 20 74 68 65 6e 20 64 69 73 61 62  ical, then disab
297e0 6c 65 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  le the ORDER BY 
297f0 63 6c 61 75 73 65 20 73 69 6e 63 65 20 74 68 65  clause since the
29800 20 47 52 4f 55 50 20 42 59 0a 20 20 2a 2a 20 77   GROUP BY.  ** w
29810 69 6c 6c 20 63 61 75 73 65 20 65 6c 65 6d 65 6e  ill cause elemen
29820 74 73 20 74 6f 20 63 6f 6d 65 20 6f 75 74 20 69  ts to come out i
29830 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f 72  n the correct or
29840 64 65 72 2e 20 20 54 68 69 73 20 69 73 0a 20 20  der.  This is.  
29850 2a 2a 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  ** an optimizati
29860 6f 6e 20 2d 20 74 68 65 20 63 6f 72 72 65 63 74  on - the correct
29870 20 61 6e 73 77 65 72 20 73 68 6f 75 6c 64 20 72   answer should r
29880 65 73 75 6c 74 20 72 65 67 61 72 64 6c 65 73 73  esult regardless
29890 2e 0a 20 20 2a 2a 20 55 73 65 20 74 68 65 20 53  ..  ** Use the S
298a0 51 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f 72 64  QLITE_GroupByOrd
298b0 65 72 20 66 6c 61 67 20 77 69 74 68 20 53 51 4c  er flag with SQL
298c0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54  ITE_TESTCTRL_OPT
298d0 49 4d 49 5a 45 52 0a 20 20 2a 2a 20 74 6f 20 64  IMIZER.  ** to d
298e0 69 73 61 62 6c 65 20 74 68 69 73 20 6f 70 74 69  isable this opti
298f0 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74 65 73  mization for tes
29900 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 0a 20  ting purposes.. 
29910 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
29920 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65  3ExprListCompare
29930 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 73 53  (p->pGroupBy, sS
29940 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 2d 31  ort.pOrderBy, -1
29950 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26  )==0.         &&
29960 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61   OptimizationEna
29970 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f  bled(db, SQLITE_
29980 47 72 6f 75 70 42 79 4f 72 64 65 72 29 20 29 7b  GroupByOrder) ){
29990 0a 20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64 65  .    sSort.pOrde
299a0 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  rBy = 0;.  }..  
299b0 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20  /* If the query 
299c0 69 73 20 44 49 53 54 49 4e 43 54 20 77 69 74 68  is DISTINCT with
299d0 20 61 6e 20 4f 52 44 45 52 20 42 59 20 62 75 74   an ORDER BY but
299e0 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65   is not an aggre
299f0 67 61 74 65 2c 20 61 6e 64 20 0a 20 20 2a 2a 20  gate, and .  ** 
29a00 69 66 20 74 68 65 20 73 65 6c 65 63 74 2d 6c 69  if the select-li
29a10 73 74 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  st is the same a
29a20 73 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 6c  s the ORDER BY l
29a30 69 73 74 2c 20 74 68 65 6e 20 74 68 69 73 20 71  ist, then this q
29a40 75 65 72 79 0a 20 20 2a 2a 20 63 61 6e 20 62 65  uery.  ** can be
29a50 20 72 65 77 72 69 74 74 65 6e 20 61 73 20 61 20   rewritten as a 
29a60 47 52 4f 55 50 20 42 59 2e 20 49 6e 20 6f 74 68  GROUP BY. In oth
29a70 65 72 20 77 6f 72 64 73 2c 20 74 68 69 73 3a 0a  er words, this:.
29a80 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45    **.  **     SE
29a90 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 78 79  LECT DISTINCT xy
29aa0 7a 20 46 52 4f 4d 20 2e 2e 2e 20 4f 52 44 45 52  z FROM ... ORDER
29ab0 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a   BY xyz.  **.  *
29ac0 2a 20 69 73 20 74 72 61 6e 73 66 6f 72 6d 65 64  * is transformed
29ad0 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   to:.  **.  **  
29ae0 20 20 20 53 45 4c 45 43 54 20 78 79 7a 20 46 52     SELECT xyz FR
29af0 4f 4d 20 2e 2e 2e 20 47 52 4f 55 50 20 42 59 20  OM ... GROUP BY 
29b00 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  xyz.  **.  ** Th
29b10 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69 73  e second form is
29b20 20 70 72 65 66 65 72 72 65 64 20 61 73 20 61 20   preferred as a 
29b30 73 69 6e 67 6c 65 20 69 6e 64 65 78 20 28 6f 72  single index (or
29b40 20 74 65 6d 70 2d 74 61 62 6c 65 29 20 6d 61 79   temp-table) may
29b50 20 62 65 20 0a 20 20 2a 2a 20 75 73 65 64 20 66   be .  ** used f
29b60 6f 72 20 62 6f 74 68 20 74 68 65 20 4f 52 44 45  or both the ORDE
29b70 52 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43  R BY and DISTINC
29b80 54 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 41 73  T processing. As
29b90 20 6f 72 69 67 69 6e 61 6c 6c 79 20 0a 20 20 2a   originally .  *
29ba0 2a 20 77 72 69 74 74 65 6e 20 74 68 65 20 71 75  * written the qu
29bb0 65 72 79 20 6d 75 73 74 20 75 73 65 20 61 20 74  ery must use a t
29bc0 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20 61 74  emp-table for at
29bd0 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 74 68   least one of th
29be0 65 20 4f 52 44 45 52 20 0a 20 20 2a 2a 20 42 59  e ORDER .  ** BY
29bf0 20 61 6e 64 20 44 49 53 54 49 4e 43 54 2c 20 61   and DISTINCT, a
29c00 6e 64 20 61 6e 20 69 6e 64 65 78 20 6f 72 20 73  nd an index or s
29c10 65 70 61 72 61 74 65 20 74 65 6d 70 2d 74 61 62  eparate temp-tab
29c20 6c 65 20 66 6f 72 20 74 68 65 20 6f 74 68 65 72  le for the other
29c30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d  ..  */.  if( (p-
29c40 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
29c50 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
29c60 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74  egate))==SF_Dist
29c70 69 6e 63 74 20 0a 20 20 20 26 26 20 73 71 6c 69  inct .   && sqli
29c80 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61  te3ExprListCompa
29c90 72 65 28 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  re(sSort.pOrderB
29ca0 79 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 2d 31  y, p->pEList, -1
29cb0 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 70 2d  )==0.  ){.    p-
29cc0 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46  >selFlags &= ~SF
29cd0 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 20 20 70  _Distinct;.    p
29ce0 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c  ->pGroupBy = sql
29cf0 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
29d00 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30  db, p->pEList, 0
29d10 29 3b 0a 20 20 20 20 70 47 72 6f 75 70 42 79 20  );.    pGroupBy 
29d20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20  = p->pGroupBy;. 
29d30 20 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42     sSort.pOrderB
29d40 79 20 3d 20 30 3b 0a 20 20 20 20 2f 2a 20 4e 6f  y = 0;.    /* No
29d50 74 69 63 65 20 74 68 61 74 20 65 76 65 6e 20 74  tice that even t
29d60 68 6f 75 67 68 74 20 53 46 5f 44 69 73 74 69 6e  hought SF_Distin
29d70 63 74 20 68 61 73 20 62 65 65 6e 20 63 6c 65 61  ct has been clea
29d80 72 65 64 20 66 72 6f 6d 20 70 2d 3e 73 65 6c 46  red from p->selF
29d90 6c 61 67 73 2c 0a 20 20 20 20 2a 2a 20 74 68 65  lags,.    ** the
29da0 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63   sDistinct.isTnc
29db0 74 20 69 73 20 73 74 69 6c 6c 20 73 65 74 2e 20  t is still set. 
29dc0 20 48 65 6e 63 65 2c 20 69 73 54 6e 63 74 20 72   Hence, isTnct r
29dd0 65 70 72 65 73 65 6e 74 73 20 74 68 65 0a 20 20  epresents the.  
29de0 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 73 65    ** original se
29df0 74 74 69 6e 67 20 6f 66 20 74 68 65 20 53 46 5f  tting of the SF_
29e00 44 69 73 74 69 6e 63 74 20 66 6c 61 67 2c 20 6e  Distinct flag, n
29e10 6f 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ot the current s
29e20 65 74 74 69 6e 67 20 2a 2f 0a 20 20 20 20 61 73  etting */.    as
29e30 73 65 72 74 28 20 73 44 69 73 74 69 6e 63 74 2e  sert( sDistinct.
29e40 69 73 54 6e 63 74 20 29 3b 0a 20 20 7d 0a 0a 20  isTnct );.  }.. 
29e50 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
29e60 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
29e70 73 65 2c 20 74 68 65 6e 20 74 68 69 73 20 73 6f  se, then this so
29e80 72 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78  rting.  ** index
29e90 20 6d 69 67 68 74 20 65 6e 64 20 75 70 20 62 65   might end up be
29ea0 69 6e 67 20 75 6e 75 73 65 64 20 69 66 20 74 68  ing unused if th
29eb0 65 20 64 61 74 61 20 63 61 6e 20 62 65 20 0a 20  e data can be . 
29ec0 20 2a 2a 20 65 78 74 72 61 63 74 65 64 20 69 6e   ** extracted in
29ed0 20 70 72 65 2d 73 6f 72 74 65 64 20 6f 72 64 65   pre-sorted orde
29ee0 72 2e 20 20 49 66 20 74 68 61 74 20 69 73 20 74  r.  If that is t
29ef0 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68  he case, then th
29f00 65 0a 20 20 2a 2a 20 4f 50 5f 4f 70 65 6e 45 70  e.  ** OP_OpenEp
29f10 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74  hemeral instruct
29f20 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 68 61 6e  ion will be chan
29f30 67 65 64 20 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f  ged to an OP_Noo
29f40 70 20 6f 6e 63 65 0a 20 20 2a 2a 20 77 65 20 66  p once.  ** we f
29f50 69 67 75 72 65 20 6f 75 74 20 74 68 61 74 20 74  igure out that t
29f60 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  he sorting index
29f70 20 69 73 20 6e 6f 74 20 6e 65 65 64 65 64 2e 20   is not needed. 
29f80 20 54 68 65 20 61 64 64 72 53 6f 72 74 49 6e 64   The addrSortInd
29f90 65 78 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65  ex.  ** variable
29fa0 20 69 73 20 75 73 65 64 20 74 6f 20 66 61 63 69   is used to faci
29fb0 6c 69 74 61 74 65 20 74 68 61 74 20 63 68 61 6e  litate that chan
29fc0 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  ge..  */.  if( s
29fd0 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 29 7b  Sort.pOrderBy ){
29fe0 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
29ff0 65 79 49 6e 66 6f 3b 0a 20 20 20 20 70 4b 65 79  eyInfo;.    pKey
2a000 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72  Info = keyInfoFr
2a010 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
2a020 65 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  e, sSort.pOrderB
2a030 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 53  y, 0, 0);.    sS
2a040 6f 72 74 2e 69 45 43 75 72 73 6f 72 20 3d 20 70  ort.iECursor = p
2a050 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
2a060 20 20 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72     sSort.addrSor
2a070 74 49 6e 64 65 78 20 3d 0a 20 20 20 20 20 20 73  tIndex =.      s
2a080 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
2a090 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
2a0a0 65 72 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  eral,.          
2a0b0 73 53 6f 72 74 2e 69 45 43 75 72 73 6f 72 2c 20  sSort.iECursor, 
2a0c0 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2d 3e  sSort.pOrderBy->
2a0d0 6e 45 78 70 72 2b 31 2b 70 45 4c 69 73 74 2d 3e  nExpr+1+pEList->
2a0e0 6e 45 78 70 72 2c 20 30 2c 0a 20 20 20 20 20 20  nExpr, 0,.      
2a0f0 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49      (char*)pKeyI
2a100 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 0a  nfo, P4_KEYINFO.
2a110 20 20 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65        );.  }else
2a120 7b 0a 20 20 20 20 73 53 6f 72 74 2e 61 64 64 72  {.    sSort.addr
2a130 53 6f 72 74 49 6e 64 65 78 20 3d 20 2d 31 3b 0a  SortIndex = -1;.
2a140 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
2a150 20 6f 75 74 70 75 74 20 69 73 20 64 65 73 74 69   output is desti
2a160 6e 65 64 20 66 6f 72 20 61 20 74 65 6d 70 6f 72  ned for a tempor
2a170 61 72 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20  ary table, open 
2a180 74 68 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f  that table..  */
2a190 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44  .  if( pDest->eD
2a1a0 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61  est==SRT_EphemTa
2a1b0 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  b ){.    sqlite3
2a1c0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2a1d0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
2a1e0 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20  pDest->iSDParm, 
2a1f0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
2a200 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68    }..  /* Set th
2a210 65 20 6c 69 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a  e limiter..  */.
2a220 20 20 69 45 6e 64 20 3d 20 73 71 6c 69 74 65 33    iEnd = sqlite3
2a230 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
2a240 3b 0a 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  ;.  p->nSelectRo
2a250 77 20 3d 20 4c 41 52 47 45 53 54 5f 49 4e 54 36  w = LARGEST_INT6
2a260 34 3b 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69  4;.  computeLimi
2a270 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73  tRegisters(pPars
2a280 65 2c 20 70 2c 20 69 45 6e 64 29 3b 0a 20 20 69  e, p, iEnd);.  i
2a290 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3d 3d 30 20  f( p->iLimit==0 
2a2a0 26 26 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72  && sSort.addrSor
2a2b0 74 49 6e 64 65 78 3e 3d 30 20 29 7b 0a 20 20 20  tIndex>=0 ){.   
2a2c0 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f   sqlite3VdbeGetO
2a2d0 70 28 76 2c 20 73 53 6f 72 74 2e 61 64 64 72 53  p(v, sSort.addrS
2a2e0 6f 72 74 49 6e 64 65 78 29 2d 3e 6f 70 63 6f 64  ortIndex)->opcod
2a2f0 65 20 3d 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65  e = OP_SorterOpe
2a300 6e 3b 0a 20 20 20 20 73 53 6f 72 74 2e 73 6f 72  n;.    sSort.sor
2a310 74 46 6c 61 67 73 20 7c 3d 20 53 4f 52 54 46 4c  tFlags |= SORTFL
2a320 41 47 5f 55 73 65 53 6f 72 74 65 72 3b 0a 20 20  AG_UseSorter;.  
2a330 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 20 76  }..  /* Open a v
2a340 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 20  irtual index to 
2a350 75 73 65 20 66 6f 72 20 74 68 65 20 64 69 73 74  use for the dist
2a360 69 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20  inct set..  */. 
2a370 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73   if( p->selFlags
2a380 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29   & SF_Distinct )
2a390 7b 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e  {.    sDistinct.
2a3a0 74 61 62 54 6e 63 74 20 3d 20 70 50 61 72 73 65  tabTnct = pParse
2a3b0 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 44  ->nTab++;.    sD
2a3c0 69 73 74 69 6e 63 74 2e 61 64 64 72 54 6e 63 74  istinct.addrTnct
2a3d0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
2a3e0 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp4(v, OP_OpenE
2a3f0 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20  phemeral,.      
2a400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a410 20 20 20 20 20 20 20 20 20 20 73 44 69 73 74 69            sDisti
2a420 6e 63 74 2e 74 61 62 54 6e 63 74 2c 20 30 2c 20  nct.tabTnct, 0, 
2a430 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
2a440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a450 20 20 20 28 63 68 61 72 2a 29 6b 65 79 49 6e 66     (char*)keyInf
2a460 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  oFromExprList(pP
2a470 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  arse, p->pEList,
2a480 30 2c 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20  0,0),.          
2a490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a4a0 20 20 20 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f        P4_KEYINFO
2a4b0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
2a4c0 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 42 54  beChangeP5(v, BT
2a4d0 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b 0a  REE_UNORDERED);.
2a4e0 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54      sDistinct.eT
2a4f0 6e 63 74 54 79 70 65 20 3d 20 57 48 45 52 45 5f  nctType = WHERE_
2a500 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52  DISTINCT_UNORDER
2a510 45 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ED;.  }else{.   
2a520 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74   sDistinct.eTnct
2a530 54 79 70 65 20 3d 20 57 48 45 52 45 5f 44 49 53  Type = WHERE_DIS
2a540 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a  TINCT_NOOP;.  }.
2a550 0a 20 20 69 66 28 20 21 69 73 41 67 67 20 26 26  .  if( !isAgg &&
2a560 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a   pGroupBy==0 ){.
2a570 20 20 20 20 2f 2a 20 4e 6f 20 61 67 67 72 65 67      /* No aggreg
2a580 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e  ate functions an
2a590 64 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c  d no GROUP BY cl
2a5a0 61 75 73 65 20 2a 2f 0a 20 20 20 20 75 31 36 20  ause */.    u16 
2a5b0 77 63 74 72 6c 46 6c 61 67 73 20 3d 20 28 73 44  wctrlFlags = (sD
2a5c0 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 3f  istinct.isTnct ?
2a5d0 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54   WHERE_WANT_DIST
2a5e0 49 4e 43 54 20 3a 20 30 29 3b 0a 0a 20 20 20 20  INCT : 0);..    
2a5f0 2f 2a 20 42 65 67 69 6e 20 74 68 65 20 64 61 74  /* Begin the dat
2a600 61 62 61 73 65 20 73 63 61 6e 2e 20 2a 2f 0a 20  abase scan. */. 
2a610 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69     pWInfo = sqli
2a620 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50  te3WhereBegin(pP
2a630 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
2a640 70 57 68 65 72 65 2c 20 73 53 6f 72 74 2e 70 4f  pWhere, sSort.pO
2a650 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20  rderBy,.        
2a660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a670 20 20 20 20 20 20 20 70 2d 3e 70 45 4c 69 73 74         p->pEList
2a680 2c 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 30 29  , wctrlFlags, 0)
2a690 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  ;.    if( pWInfo
2a6a0 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  ==0 ) goto selec
2a6b0 74 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 73  t_end;.    if( s
2a6c0 71 6c 69 74 65 33 57 68 65 72 65 4f 75 74 70 75  qlite3WhereOutpu
2a6d0 74 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66 6f  tRowCount(pWInfo
2a6e0 29 20 3c 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  ) < p->nSelectRo
2a6f0 77 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 53  w ){.      p->nS
2a700 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74  electRow = sqlit
2a710 65 33 57 68 65 72 65 4f 75 74 70 75 74 52 6f 77  e3WhereOutputRow
2a720 43 6f 75 6e 74 28 70 57 49 6e 66 6f 29 3b 0a 20  Count(pWInfo);. 
2a730 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 44 69     }.    if( sDi
2a740 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 26 26  stinct.isTnct &&
2a750 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 44   sqlite3WhereIsD
2a760 69 73 74 69 6e 63 74 28 70 57 49 6e 66 6f 29 20  istinct(pWInfo) 
2a770 29 7b 0a 20 20 20 20 20 20 73 44 69 73 74 69 6e  ){.      sDistin
2a780 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 73  ct.eTnctType = s
2a790 71 6c 69 74 65 33 57 68 65 72 65 49 73 44 69 73  qlite3WhereIsDis
2a7a0 74 69 6e 63 74 28 70 57 49 6e 66 6f 29 3b 0a 20  tinct(pWInfo);. 
2a7b0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 53 6f     }.    if( sSo
2a7c0 72 74 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  rt.pOrderBy ){. 
2a7d0 20 20 20 20 20 73 53 6f 72 74 2e 6e 4f 42 53 61       sSort.nOBSa
2a7e0 74 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  t = sqlite3Where
2a7f0 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e 66 6f  IsOrdered(pWInfo
2a800 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 53 6f  );.      if( sSo
2a810 72 74 2e 6e 4f 42 53 61 74 3d 3d 73 53 6f 72 74  rt.nOBSat==sSort
2a820 2e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  .pOrderBy->nExpr
2a830 20 29 7b 0a 20 20 20 20 20 20 20 20 73 53 6f 72   ){.        sSor
2a840 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  t.pOrderBy = 0;.
2a850 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
2a860 20 20 20 2f 2a 20 49 66 20 73 6f 72 74 69 6e 67     /* If sorting
2a870 20 69 6e 64 65 78 20 74 68 61 74 20 77 61 73 20   index that was 
2a880 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 69  created by a pri
2a890 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  or OP_OpenEpheme
2a8a0 72 61 6c 20 0a 20 20 20 20 2a 2a 20 69 6e 73 74  ral .    ** inst
2a8b0 72 75 63 74 69 6f 6e 20 65 6e 64 65 64 20 75 70  ruction ended up
2a8c0 20 6e 6f 74 20 62 65 69 6e 67 20 6e 65 65 64 65   not being neede
2a8d0 64 2c 20 74 68 65 6e 20 63 68 61 6e 67 65 20 74  d, then change t
2a8e0 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  he OP_OpenEpheme
2a8f0 72 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20  ral.    ** into 
2a900 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a 20 20 20 20  an OP_Noop..    
2a910 2a 2f 0a 20 20 20 20 69 66 28 20 73 53 6f 72 74  */.    if( sSort
2a920 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d  .addrSortIndex>=
2a930 30 20 26 26 20 73 53 6f 72 74 2e 70 4f 72 64 65  0 && sSort.pOrde
2a940 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  rBy==0 ){.      
2a950 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
2a960 65 54 6f 4e 6f 6f 70 28 76 2c 20 73 53 6f 72 74  eToNoop(v, sSort
2a970 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29 3b  .addrSortIndex);
2a980 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55  .    }..    /* U
2a990 73 65 20 74 68 65 20 73 74 61 6e 64 61 72 64 20  se the standard 
2a9a0 69 6e 6e 65 72 20 6c 6f 6f 70 2e 20 2a 2f 0a 20  inner loop. */. 
2a9b0 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f     selectInnerLo
2a9c0 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45  op(pParse, p, pE
2a9d0 4c 69 73 74 2c 20 2d 31 2c 20 26 73 53 6f 72 74  List, -1, &sSort
2a9e0 2c 20 26 73 44 69 73 74 69 6e 63 74 2c 20 70 44  , &sDistinct, pD
2a9f0 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  est,.           
2aa00 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2aa10 57 68 65 72 65 43 6f 6e 74 69 6e 75 65 4c 61 62  WhereContinueLab
2aa20 65 6c 28 70 57 49 6e 66 6f 29 2c 0a 20 20 20 20  el(pWInfo),.    
2aa30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa40 73 71 6c 69 74 65 33 57 68 65 72 65 42 72 65 61  sqlite3WhereBrea
2aa50 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 29 3b  kLabel(pWInfo));
2aa60 0a 0a 20 20 20 20 2f 2a 20 45 6e 64 20 74 68 65  ..    /* End the
2aa70 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 20 6c   database scan l
2aa80 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oop..    */.    
2aa90 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
2aaa0 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65  pWInfo);.  }else
2aab0 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61  {.    /* This ca
2aac0 73 65 20 77 68 65 6e 20 74 68 65 72 65 20 65 78  se when there ex
2aad0 69 73 74 20 61 67 67 72 65 67 61 74 65 20 66 75  ist aggregate fu
2aae0 6e 63 74 69 6f 6e 73 20 6f 72 20 61 20 47 52 4f  nctions or a GRO
2aaf0 55 50 20 42 59 20 63 6c 61 75 73 65 0a 20 20 20  UP BY clause.   
2ab00 20 2a 2a 20 6f 72 20 62 6f 74 68 20 2a 2f 0a 20   ** or both */. 
2ab10 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73     NameContext s
2ab20 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63  NC;    /* Name c
2ab30 6f 6e 74 65 78 74 20 66 6f 72 20 70 72 6f 63 65  ontext for proce
2ab40 73 73 69 6e 67 20 61 67 67 72 65 67 61 74 65 20  ssing aggregate 
2ab50 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20  information */. 
2ab60 20 20 20 69 6e 74 20 69 41 4d 65 6d 3b 20 20 20     int iAMem;   
2ab70 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
2ab80 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20  Mem address for 
2ab90 73 74 6f 72 69 6e 67 20 63 75 72 72 65 6e 74 20  storing current 
2aba0 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20  GROUP BY */.    
2abb0 69 6e 74 20 69 42 4d 65 6d 3b 20 20 20 20 20 20  int iBMem;      
2abc0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d      /* First Mem
2abd0 20 61 64 64 72 65 73 73 20 66 6f 72 20 70 72 65   address for pre
2abe0 76 69 6f 75 73 20 47 52 4f 55 50 20 42 59 20 2a  vious GROUP BY *
2abf0 2f 0a 20 20 20 20 69 6e 74 20 69 55 73 65 46 6c  /.    int iUseFl
2ac00 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d  ag;       /* Mem
2ac10 20 61 64 64 72 65 73 73 20 68 6f 6c 64 69 6e 67   address holding
2ac20 20 66 6c 61 67 20 69 6e 64 69 63 61 74 69 6e 67   flag indicating
2ac30 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 0a 20   that at least. 
2ac40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac50 20 20 20 20 20 20 20 2a 2a 20 6f 6e 65 20 72 6f         ** one ro
2ac60 77 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 74  w of the input t
2ac70 6f 20 74 68 65 20 61 67 67 72 65 67 61 74 6f 72  o the aggregator
2ac80 20 68 61 73 20 62 65 65 6e 0a 20 20 20 20 20 20   has been.      
2ac90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aca0 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 2a    ** processed *
2acb0 2f 0a 20 20 20 20 69 6e 74 20 69 41 62 6f 72 74  /.    int iAbort
2acc0 46 6c 61 67 3b 20 20 20 20 20 2f 2a 20 4d 65 6d  Flag;     /* Mem
2acd0 20 61 64 64 72 65 73 73 20 77 68 69 63 68 20 63   address which c
2ace0 61 75 73 65 73 20 71 75 65 72 79 20 61 62 6f 72  auses query abor
2acf0 74 20 69 66 20 70 6f 73 69 74 69 76 65 20 2a 2f  t if positive */
2ad00 0a 20 20 20 20 69 6e 74 20 67 72 6f 75 70 42 79  .    int groupBy
2ad10 53 6f 72 74 3b 20 20 20 20 2f 2a 20 52 6f 77 73  Sort;    /* Rows
2ad20 20 63 6f 6d 65 20 66 72 6f 6d 20 73 6f 75 72 63   come from sourc
2ad30 65 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72  e in GROUP BY or
2ad40 64 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61  der */.    int a
2ad50 64 64 72 45 6e 64 3b 20 20 20 20 20 20 20 20 2f  ddrEnd;        /
2ad60 2a 20 45 6e 64 20 6f 66 20 70 72 6f 63 65 73 73  * End of process
2ad70 69 6e 67 20 66 6f 72 20 74 68 69 73 20 53 45 4c  ing for this SEL
2ad80 45 43 54 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  ECT */.    int s
2ad90 6f 72 74 50 54 61 62 20 3d 20 30 3b 20 20 20 2f  ortPTab = 0;   /
2ada0 2a 20 50 73 65 75 64 6f 74 61 62 6c 65 20 75 73  * Pseudotable us
2adb0 65 64 20 74 6f 20 64 65 63 6f 64 65 20 73 6f 72  ed to decode sor
2adc0 74 69 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a  ting results */.
2add0 20 20 20 20 69 6e 74 20 73 6f 72 74 4f 75 74 20      int sortOut 
2ade0 3d 20 30 3b 20 20 20 20 2f 2a 20 4f 75 74 70 75  = 0;    /* Outpu
2adf0 74 20 72 65 67 69 73 74 65 72 20 66 72 6f 6d 20  t register from 
2ae00 74 68 65 20 73 6f 72 74 65 72 20 2a 2f 0a 0a 20  the sorter */.. 
2ae10 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79     /* Remove any
2ae20 20 61 6e 64 20 61 6c 6c 20 61 6c 69 61 73 65 73   and all aliases
2ae30 20 62 65 74 77 65 65 6e 20 74 68 65 20 72 65 73   between the res
2ae40 75 6c 74 20 73 65 74 20 61 6e 64 20 74 68 65 0a  ult set and the.
2ae50 20 20 20 20 2a 2a 20 47 52 4f 55 50 20 42 59 20      ** GROUP BY 
2ae60 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  clause..    */. 
2ae70 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20     if( pGroupBy 
2ae80 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 20  ){.      int k; 
2ae90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aea0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
2aeb0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  ounter */.      
2aec0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
2aed0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20 2f 2a  item *pItem;  /*
2aee0 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
2aef0 72 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  r expression in 
2af00 61 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 20 20 20  a list */..     
2af10 20 66 6f 72 28 6b 3d 70 2d 3e 70 45 4c 69 73 74   for(k=p->pEList
2af20 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70  ->nExpr, pItem=p
2af30 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 20 6b 3e 30  ->pEList->a; k>0
2af40 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; k--, pItem++){
2af50 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  .        pItem->
2af60 75 2e 78 2e 69 41 6c 69 61 73 20 3d 20 30 3b 0a  u.x.iAlias = 0;.
2af70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
2af80 72 28 6b 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45  r(k=pGroupBy->nE
2af90 78 70 72 2c 20 70 49 74 65 6d 3d 70 47 72 6f 75  xpr, pItem=pGrou
2afa0 70 42 79 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d  pBy->a; k>0; k--
2afb0 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
2afc0 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69      pItem->u.x.i
2afd0 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20  Alias = 0;.     
2afe0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   }.      if( p->
2aff0 6e 53 65 6c 65 63 74 52 6f 77 3e 31 30 30 20 29  nSelectRow>100 )
2b000 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
2b010 20 31 30 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   100;.    }else{
2b020 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63  .      p->nSelec
2b030 74 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  tRow = 1;.    }.
2b040 0a 20 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  . .    /* Create
2b050 20 61 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70   a label to jump
2b060 20 74 6f 20 77 68 65 6e 20 77 65 20 77 61 6e 74   to when we want
2b070 20 74 6f 20 61 62 6f 72 74 20 74 68 65 20 71 75   to abort the qu
2b080 65 72 79 20 2a 2f 0a 20 20 20 20 61 64 64 72 45  ery */.    addrE
2b090 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nd = sqlite3Vdbe
2b0a0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20  MakeLabel(v);.. 
2b0b0 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 54 4b     /* Convert TK
2b0c0 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 69 6e  _COLUMN nodes in
2b0d0 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  to TK_AGG_COLUMN
2b0e0 20 61 6e 64 20 6d 61 6b 65 20 65 6e 74 72 69 65   and make entrie
2b0f0 73 20 69 6e 0a 20 20 20 20 2a 2a 20 73 41 67 67  s in.    ** sAgg
2b100 49 6e 66 6f 20 66 6f 72 20 61 6c 6c 20 54 4b 5f  Info for all TK_
2b110 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64  AGG_FUNCTION nod
2b120 65 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e  es in expression
2b130 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  s of the.    ** 
2b140 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
2b150 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d  ..    */.    mem
2b160 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a  set(&sNC, 0, siz
2b170 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 73  eof(sNC));.    s
2b180 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72  NC.pParse = pPar
2b190 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72 63  se;.    sNC.pSrc
2b1a0 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b  List = pTabList;
2b1b0 0a 20 20 20 20 73 4e 43 2e 70 41 67 67 49 6e 66  .    sNC.pAggInf
2b1c0 6f 20 3d 20 26 73 41 67 67 49 6e 66 6f 3b 0a 20  o = &sAggInfo;. 
2b1d0 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d 6e 52 65     sAggInfo.mnRe
2b1e0 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  g = pParse->nMem
2b1f0 2b 31 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f  +1;.    sAggInfo
2b200 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 20  .nSortingColumn 
2b210 3d 20 70 47 72 6f 75 70 42 79 20 3f 20 70 47 72  = pGroupBy ? pGr
2b220 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2b 31 20 3a  oupBy->nExpr+1 :
2b230 20 30 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f   0;.    sAggInfo
2b240 2e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f  .pGroupBy = pGro
2b250 75 70 42 79 3b 0a 20 20 20 20 73 71 6c 69 74 65  upBy;.    sqlite
2b260 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c  3ExprAnalyzeAggL
2b270 69 73 74 28 26 73 4e 43 2c 20 70 45 4c 69 73 74  ist(&sNC, pEList
2b280 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
2b290 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74  prAnalyzeAggList
2b2a0 28 26 73 4e 43 2c 20 73 53 6f 72 74 2e 70 4f 72  (&sNC, sSort.pOr
2b2b0 64 65 72 42 79 29 3b 0a 20 20 20 20 69 66 28 20  derBy);.    if( 
2b2c0 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20  pHaving ){.     
2b2d0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
2b2e0 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 26 73  yzeAggregates(&s
2b2f0 4e 43 2c 20 70 48 61 76 69 6e 67 29 3b 0a 20 20  NC, pHaving);.  
2b300 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e 66 6f    }.    sAggInfo
2b310 2e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 3d 20  .nAccumulator = 
2b320 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e  sAggInfo.nColumn
2b330 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
2b340 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b  <sAggInfo.nFunc;
2b350 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73   i++){.      ass
2b360 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
2b370 70 65 72 74 79 28 73 41 67 67 49 6e 66 6f 2e 61  perty(sAggInfo.a
2b380 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2c 20 45  Func[i].pExpr, E
2b390 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
2b3a0 20 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67        sNC.ncFlag
2b3b0 73 20 7c 3d 20 4e 43 5f 49 6e 41 67 67 46 75 6e  s |= NC_InAggFun
2b3c0 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  c;.      sqlite3
2b3d0 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69  ExprAnalyzeAggLi
2b3e0 73 74 28 26 73 4e 43 2c 20 73 41 67 67 49 6e 66  st(&sNC, sAggInf
2b3f0 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72  o.aFunc[i].pExpr
2b400 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20  ->x.pList);.    
2b410 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 26 3d    sNC.ncFlags &=
2b420 20 7e 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a   ~NC_InAggFunc;.
2b430 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e      }.    sAggIn
2b440 66 6f 2e 6d 78 52 65 67 20 3d 20 70 50 61 72 73  fo.mxReg = pPars
2b450 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 66 28  e->nMem;.    if(
2b460 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
2b470 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  d ) goto select_
2b480 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f  end;..    /* Pro
2b490 63 65 73 73 69 6e 67 20 66 6f 72 20 61 67 67 72  cessing for aggr
2b4a0 65 67 61 74 65 73 20 77 69 74 68 20 47 52 4f 55  egates with GROU
2b4b0 50 20 42 59 20 69 73 20 76 65 72 79 20 64 69 66  P BY is very dif
2b4c0 66 65 72 65 6e 74 20 61 6e 64 0a 20 20 20 20 2a  ferent and.    *
2b4d0 2a 20 6d 75 63 68 20 6d 6f 72 65 20 63 6f 6d 70  * much more comp
2b4e0 6c 65 78 20 74 68 61 6e 20 61 67 67 72 65 67 61  lex than aggrega
2b4f0 74 65 73 20 77 69 74 68 6f 75 74 20 61 20 47 52  tes without a GR
2b500 4f 55 50 20 42 59 2e 0a 20 20 20 20 2a 2f 0a 20  OUP BY..    */. 
2b510 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20     if( pGroupBy 
2b520 29 7b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f  ){.      KeyInfo
2b530 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a 20   *pKeyInfo;  /* 
2b540 4b 65 79 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  Keying informati
2b550 6f 6e 20 66 6f 72 20 74 68 65 20 67 72 6f 75 70  on for the group
2b560 20 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   by clause */.  
2b570 20 20 20 20 69 6e 74 20 6a 31 3b 20 20 20 20 20      int j1;     
2b580 20 20 20 20 20 20 20 20 2f 2a 20 41 2d 76 73 2d          /* A-vs-
2b590 42 20 63 6f 6d 70 61 72 69 73 69 6f 6e 20 6a 75  B comparision ju
2b5a0 6d 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  mp */.      int 
2b5b0 61 64 64 72 4f 75 74 70 75 74 52 6f 77 3b 20 20  addrOutputRow;  
2b5c0 2f 2a 20 53 74 61 72 74 20 6f 66 20 73 75 62 72  /* Start of subr
2b5d0 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70  outine that outp
2b5e0 75 74 73 20 61 20 72 65 73 75 6c 74 20 72 6f 77  uts a result row
2b5f0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65   */.      int re
2b600 67 4f 75 74 70 75 74 52 6f 77 3b 20 20 20 2f 2a  gOutputRow;   /*
2b610 20 52 65 74 75 72 6e 20 61 64 64 72 65 73 73 20   Return address 
2b620 72 65 67 69 73 74 65 72 20 66 6f 72 20 6f 75 74  register for out
2b630 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  put subroutine *
2b640 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
2b650 53 65 74 41 62 6f 72 74 3b 20 20 20 2f 2a 20 53  SetAbort;   /* S
2b660 65 74 20 74 68 65 20 61 62 6f 72 74 20 66 6c 61  et the abort fla
2b670 67 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a  g and return */.
2b680 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f        int addrTo
2b690 70 4f 66 4c 6f 6f 70 3b 20 20 2f 2a 20 54 6f 70  pOfLoop;  /* Top
2b6a0 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 6c 6f   of the input lo
2b6b0 6f 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  op */.      int 
2b6c0 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 3b 20  addrSortingIdx; 
2b6d0 2f 2a 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70  /* The OP_OpenEp
2b6e0 68 65 6d 65 72 61 6c 20 66 6f 72 20 74 68 65 20  hemeral for the 
2b6f0 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 2a 2f  sorting index */
2b700 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 52  .      int addrR
2b710 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53 75  eset;      /* Su
2b720 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 65 73  broutine for res
2b730 65 74 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d  etting the accum
2b740 75 6c 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20  ulator */.      
2b750 69 6e 74 20 72 65 67 52 65 73 65 74 3b 20 20 20  int regReset;   
2b760 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64      /* Return ad
2b770 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
2b780 6f 72 20 72 65 73 65 74 20 73 75 62 72 6f 75 74  or reset subrout
2b790 69 6e 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a  ine */..      /*
2b7a0 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 47   If there is a G
2b7b0 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 77  ROUP BY clause w
2b7c0 65 20 6d 69 67 68 74 20 6e 65 65 64 20 61 20 73  e might need a s
2b7d0 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 6f 0a  orting index to.
2b7e0 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65        ** impleme
2b7f0 6e 74 20 69 74 2e 20 20 41 6c 6c 6f 63 61 74 65  nt it.  Allocate
2b800 20 74 68 61 74 20 73 6f 72 74 69 6e 67 20 69 6e   that sorting in
2b810 64 65 78 20 6e 6f 77 2e 20 20 49 66 20 69 74 20  dex now.  If it 
2b820 74 75 72 6e 73 20 6f 75 74 0a 20 20 20 20 20 20  turns out.      
2b830 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  ** that we do no
2b840 74 20 6e 65 65 64 20 69 74 20 61 66 74 65 72 20  t need it after 
2b850 61 6c 6c 2c 20 74 68 65 20 4f 50 5f 53 6f 72 74  all, the OP_Sort
2b860 65 72 4f 70 65 6e 20 69 6e 73 74 72 75 63 74 69  erOpen instructi
2b870 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c  on.      ** will
2b880 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e   be converted in
2b890 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a 20 20 20  to a Noop.  .   
2b8a0 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 41 67 67     */.      sAgg
2b8b0 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 20  Info.sortingIdx 
2b8c0 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
2b8d0 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f  ;.      pKeyInfo
2b8e0 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78   = keyInfoFromEx
2b8f0 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
2b900 47 72 6f 75 70 42 79 2c 20 30 2c 20 30 29 3b 0a  GroupBy, 0, 0);.
2b910 20 20 20 20 20 20 61 64 64 72 53 6f 72 74 69 6e        addrSortin
2b920 67 49 64 78 20 3d 20 73 71 6c 69 74 65 33 56 64  gIdx = sqlite3Vd
2b930 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53  beAddOp4(v, OP_S
2b940 6f 72 74 65 72 4f 70 65 6e 2c 20 0a 20 20 20 20  orterOpen, .    
2b950 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73        sAggInfo.s
2b960 6f 72 74 69 6e 67 49 64 78 2c 20 73 41 67 67 49  ortingIdx, sAggI
2b970 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75  nfo.nSortingColu
2b980 6d 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 30  mn, .          0
2b990 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66  , (char*)pKeyInf
2b9a0 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  o, P4_KEYINFO);.
2b9b0 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61  .      /* Initia
2b9c0 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  lize memory loca
2b9d0 74 69 6f 6e 73 20 75 73 65 64 20 62 79 20 47 52  tions used by GR
2b9e0 4f 55 50 20 42 59 20 61 67 67 72 65 67 61 74 65  OUP BY aggregate
2b9f0 20 70 72 6f 63 65 73 73 69 6e 67 0a 20 20 20 20   processing.    
2ba00 20 20 2a 2f 0a 20 20 20 20 20 20 69 55 73 65 46    */.      iUseF
2ba10 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  lag = ++pParse->
2ba20 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69 41 62 6f  nMem;.      iAbo
2ba30 72 74 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73  rtFlag = ++pPars
2ba40 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72  e->nMem;.      r
2ba50 65 67 4f 75 74 70 75 74 52 6f 77 20 3d 20 2b 2b  egOutputRow = ++
2ba60 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
2ba70 20 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f      addrOutputRo
2ba80 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  w = sqlite3VdbeM
2ba90 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
2baa0 20 20 20 72 65 67 52 65 73 65 74 20 3d 20 2b 2b     regReset = ++
2bab0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
2bac0 20 20 20 20 61 64 64 72 52 65 73 65 74 20 3d 20      addrReset = 
2bad0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
2bae0 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69  abel(v);.      i
2baf0 41 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  AMem = pParse->n
2bb00 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70  Mem + 1;.      p
2bb10 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70  Parse->nMem += p
2bb20 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a  GroupBy->nExpr;.
2bb30 20 20 20 20 20 20 69 42 4d 65 6d 20 3d 20 70 50        iBMem = pP
2bb40 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a  arse->nMem + 1;.
2bb50 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
2bb60 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e  em += pGroupBy->
2bb70 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c  nExpr;.      sql
2bb80 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2bb90 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
2bba0 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20   iAbortFlag);.  
2bbb0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
2bbc0 28 76 2c 20 22 63 6c 65 61 72 20 61 62 6f 72 74  (v, "clear abort
2bbd0 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20   flag"));.      
2bbe0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2bbf0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
2bc00 20 30 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20   0, iUseFlag);. 
2bc10 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
2bc20 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20 61  ((v, "indicate a
2bc30 63 63 75 6d 75 6c 61 74 6f 72 20 65 6d 70 74 79  ccumulator empty
2bc40 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
2bc50 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
2bc60 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 41 4d 65  OP_Null, 0, iAMe
2bc70 6d 2c 20 69 41 4d 65 6d 2b 70 47 72 6f 75 70 42  m, iAMem+pGroupB
2bc80 79 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 0a 20 20  y->nExpr-1);..  
2bc90 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 61 20 6c      /* Begin a l
2bca0 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 65 78  oop that will ex
2bcb0 74 72 61 63 74 20 61 6c 6c 20 73 6f 75 72 63 65  tract all source
2bcc0 20 72 6f 77 73 20 69 6e 20 47 52 4f 55 50 20 42   rows in GROUP B
2bcd0 59 20 6f 72 64 65 72 2e 0a 20 20 20 20 20 20 2a  Y order..      *
2bce0 2a 20 54 68 69 73 20 6d 69 67 68 74 20 69 6e 76  * This might inv
2bcf0 6f 6c 76 65 20 74 77 6f 20 73 65 70 61 72 61 74  olve two separat
2bd00 65 20 6c 6f 6f 70 73 20 77 69 74 68 20 61 6e 20  e loops with an 
2bd10 4f 50 5f 53 6f 72 74 20 69 6e 20 62 65 74 77 65  OP_Sort in betwe
2bd20 65 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20  en, or.      ** 
2bd30 69 74 20 6d 69 67 68 74 20 62 65 20 61 20 73 69  it might be a si
2bd40 6e 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74 20 75  ngle loop that u
2bd50 73 65 73 20 61 6e 20 69 6e 64 65 78 20 74 6f 20  ses an index to 
2bd60 65 78 74 72 61 63 74 20 69 6e 66 6f 72 6d 61 74  extract informat
2bd70 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20  ion.      ** in 
2bd80 74 68 65 20 72 69 67 68 74 20 6f 72 64 65 72 20  the right order 
2bd90 74 6f 20 62 65 67 69 6e 20 77 69 74 68 2e 0a 20  to begin with.. 
2bda0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
2bdb0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2bdc0 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
2bdd0 52 65 73 65 74 2c 20 61 64 64 72 52 65 73 65 74  Reset, addrReset
2bde0 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 20  );.      pWInfo 
2bdf0 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  = sqlite3WhereBe
2be00 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  gin(pParse, pTab
2be10 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 70 47  List, pWhere, pG
2be20 72 6f 75 70 42 79 2c 20 30 2c 0a 20 20 20 20 20  roupBy, 0,.     
2be30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2be40 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45 52              WHER
2be50 45 5f 47 52 4f 55 50 42 59 2c 20 30 29 3b 0a 20  E_GROUPBY, 0);. 
2be60 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d       if( pWInfo=
2be70 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  =0 ) goto select
2be80 5f 65 6e 64 3b 0a 20 20 20 20 20 20 69 66 28 20  _end;.      if( 
2be90 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 4f 72  sqlite3WhereIsOr
2bea0 64 65 72 65 64 28 70 57 49 6e 66 6f 29 3d 3d 70  dered(pWInfo)==p
2beb0 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 20 29  GroupBy->nExpr )
2bec0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
2bed0 20 6f 70 74 69 6d 69 7a 65 72 20 69 73 20 61 62   optimizer is ab
2bee0 6c 65 20 74 6f 20 64 65 6c 69 76 65 72 20 72 6f  le to deliver ro
2bef0 77 73 20 69 6e 20 67 72 6f 75 70 20 62 79 20 6f  ws in group by o
2bf00 72 64 65 72 20 73 6f 0a 20 20 20 20 20 20 20 20  rder so.        
2bf10 2a 2a 20 77 65 20 64 6f 20 6e 6f 74 20 68 61 76  ** we do not hav
2bf20 65 20 74 6f 20 73 6f 72 74 2e 20 20 54 68 65 20  e to sort.  The 
2bf30 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
2bf40 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65 0a 20   table will be. 
2bf50 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 63 65 6c         ** cancel
2bf60 6c 65 64 20 6c 61 74 65 72 20 62 65 63 61 75 73  led later becaus
2bf70 65 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20  e we still need 
2bf80 74 6f 20 75 73 65 20 74 68 65 20 70 4b 65 79 49  to use the pKeyI
2bf90 6e 66 6f 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  nfo.        */. 
2bfa0 20 20 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f         groupBySo
2bfb0 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  rt = 0;.      }e
2bfc0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
2bfd0 52 6f 77 73 20 61 72 65 20 63 6f 6d 69 6e 67 20  Rows are coming 
2bfe0 6f 75 74 20 69 6e 20 75 6e 64 65 74 65 72 6d 69  out in undetermi
2bff0 6e 65 64 20 6f 72 64 65 72 2e 20 20 57 65 20 68  ned order.  We h
2c000 61 76 65 20 74 6f 20 70 75 73 68 0a 20 20 20 20  ave to push.    
2c010 20 20 20 20 2a 2a 20 65 61 63 68 20 72 6f 77 20      ** each row 
2c020 69 6e 74 6f 20 61 20 73 6f 72 74 69 6e 67 20 69  into a sorting i
2c030 6e 64 65 78 2c 20 74 65 72 6d 69 6e 61 74 65 20  ndex, terminate 
2c040 74 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 2c 0a  the first loop,.
2c050 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
2c060 6c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 73 6f  loop over the so
2c070 72 74 69 6e 67 20 69 6e 64 65 78 20 69 6e 20 6f  rting index in o
2c080 72 64 65 72 20 74 6f 20 67 65 74 20 74 68 65 20  rder to get the 
2c090 6f 75 74 70 75 74 0a 20 20 20 20 20 20 20 20 2a  output.        *
2c0a0 2a 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65  * in sorted orde
2c0b0 72 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  r.        */.   
2c0c0 20 20 20 20 20 69 6e 74 20 72 65 67 42 61 73 65       int regBase
2c0d0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65  ;.        int re
2c0e0 67 52 65 63 6f 72 64 3b 0a 20 20 20 20 20 20 20  gRecord;.       
2c0f0 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20   int nCol;.     
2c100 20 20 20 69 6e 74 20 6e 47 72 6f 75 70 42 79 3b     int nGroupBy;
2c110 0a 0a 20 20 20 20 20 20 20 20 65 78 70 6c 61 69  ..        explai
2c120 6e 54 65 6d 70 54 61 62 6c 65 28 70 50 61 72 73  nTempTable(pPars
2c130 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e, .            
2c140 28 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63  (sDistinct.isTnc
2c150 74 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67  t && (p->selFlag
2c160 73 26 53 46 5f 44 69 73 74 69 6e 63 74 29 3d 3d  s&SF_Distinct)==
2c170 30 29 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20  0) ?.           
2c180 20 20 20 20 20 20 20 20 20 22 44 49 53 54 49 4e           "DISTIN
2c190 43 54 22 20 3a 20 22 47 52 4f 55 50 20 42 59 22  CT" : "GROUP BY"
2c1a0 29 3b 0a 0a 20 20 20 20 20 20 20 20 67 72 6f 75  );..        grou
2c1b0 70 42 79 53 6f 72 74 20 3d 20 31 3b 0a 20 20 20  pBySort = 1;.   
2c1c0 20 20 20 20 20 6e 47 72 6f 75 70 42 79 20 3d 20       nGroupBy = 
2c1d0 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b  pGroupBy->nExpr;
2c1e0 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20  .        nCol = 
2c1f0 6e 47 72 6f 75 70 42 79 20 2b 20 31 3b 0a 20 20  nGroupBy + 1;.  
2c200 20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70        j = nGroup
2c210 42 79 2b 31 3b 0a 20 20 20 20 20 20 20 20 66 6f  By+1;.        fo
2c220 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66  r(i=0; i<sAggInf
2c230 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  o.nColumn; i++){
2c240 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
2c250 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 2e  AggInfo.aCol[i].
2c260 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a  iSorterColumn>=j
2c270 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2c280 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nCol++;.        
2c290 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20      j++;.       
2c2a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2c2b0 20 20 20 20 20 20 20 72 65 67 42 61 73 65 20 3d         regBase =
2c2c0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
2c2d0 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f  ange(pParse, nCo
2c2e0 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
2c2f0 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
2c300 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  r(pParse);.     
2c310 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
2c320 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  deExprList(pPars
2c330 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 72 65 67  e, pGroupBy, reg
2c340 42 61 73 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Base, 0);.      
2c350 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2c360 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e  Op2(v, OP_Sequen
2c370 63 65 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72  ce, sAggInfo.sor
2c380 74 69 6e 67 49 64 78 2c 72 65 67 42 61 73 65 2b  tingIdx,regBase+
2c390 6e 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 20  nGroupBy);.     
2c3a0 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 2b     j = nGroupBy+
2c3b0 31 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  1;.        for(i
2c3c0 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e  =0; i<sAggInfo.n
2c3d0 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
2c3e0 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41          struct A
2c3f0 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c  ggInfo_col *pCol
2c400 20 3d 20 26 73 41 67 67 49 6e 66 6f 2e 61 43 6f   = &sAggInfo.aCo
2c410 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  l[i];.          
2c420 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65  if( pCol->iSorte
2c430 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20  rColumn>=j ){.  
2c440 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 31            int r1
2c450 20 3d 20 6a 20 2b 20 72 65 67 42 61 73 65 3b 0a   = j + regBase;.
2c460 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
2c470 72 32 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20  r2;..           
2c480 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
2c490 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70  rCodeGetColumn(p
2c4a0 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
2c4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c4c0 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61         pCol->pTa
2c4d0 62 2c 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e  b, pCol->iColumn
2c4e0 2c 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20  , pCol->iTable, 
2c4f0 72 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  r1, 0);.        
2c500 20 20 20 20 69 66 28 20 72 31 21 3d 72 32 20 29      if( r1!=r2 )
2c510 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2c520 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2c530 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72  2(v, OP_SCopy, r
2c540 32 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20  2, r1);.        
2c550 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2c560 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20    j++;.         
2c570 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2c580 20 20 20 20 20 72 65 67 52 65 63 6f 72 64 20 3d       regRecord =
2c590 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
2c5a0 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
2c5b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2c5c0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
2c5d0 52 65 63 6f 72 64 2c 20 72 65 67 42 61 73 65 2c  Record, regBase,
2c5e0 20 6e 43 6f 6c 2c 20 72 65 67 52 65 63 6f 72 64   nCol, regRecord
2c5f0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2c600 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2c610 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 2c  OP_SorterInsert,
2c620 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
2c630 67 49 64 78 2c 20 72 65 67 52 65 63 6f 72 64 29  gIdx, regRecord)
2c640 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2c650 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
2c660 70 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72  pParse, regRecor
2c670 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  d);.        sqli
2c680 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
2c690 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 42  nge(pParse, regB
2c6a0 61 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20  ase, nCol);.    
2c6b0 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
2c6c0 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  End(pWInfo);.   
2c6d0 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f       sAggInfo.so
2c6e0 72 74 69 6e 67 49 64 78 50 54 61 62 20 3d 20 73  rtingIdxPTab = s
2c6f0 6f 72 74 50 54 61 62 20 3d 20 70 50 61 72 73 65  ortPTab = pParse
2c700 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
2c710 20 20 73 6f 72 74 4f 75 74 20 3d 20 73 71 6c 69    sortOut = sqli
2c720 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
2c730 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
2c740 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
2c750 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64  (v, OP_OpenPseud
2c760 6f 2c 20 73 6f 72 74 50 54 61 62 2c 20 73 6f 72  o, sortPTab, sor
2c770 74 4f 75 74 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20  tOut, nCol);.   
2c780 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2c790 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
2c7a0 74 65 72 53 6f 72 74 2c 20 73 41 67 67 49 6e 66  terSort, sAggInf
2c7b0 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64  o.sortingIdx, ad
2c7c0 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 20 20  drEnd);.        
2c7d0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
2c7e0 22 47 52 4f 55 50 20 42 59 20 73 6f 72 74 22 29  "GROUP BY sort")
2c7f0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
2c800 76 29 3b 0a 20 20 20 20 20 20 20 20 73 41 67 67  v);.        sAgg
2c810 49 6e 66 6f 2e 75 73 65 53 6f 72 74 69 6e 67 49  Info.useSortingI
2c820 64 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  dx = 1;.        
2c830 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
2c840 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
2c850 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
2c860 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 63 75   Evaluate the cu
2c870 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74  rrent GROUP BY t
2c880 65 72 6d 73 20 61 6e 64 20 73 74 6f 72 65 20 69  erms and store i
2c890 6e 20 62 30 2c 20 62 31 2c 20 62 32 2e 2e 2e 0a  n b0, b1, b2....
2c8a0 20 20 20 20 20 20 2a 2a 20 28 62 30 20 69 73 20        ** (b0 is 
2c8b0 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20  memory location 
2c8c0 69 42 4d 65 6d 2b 30 2c 20 62 31 20 69 73 20 69  iBMem+0, b1 is i
2c8d0 42 4d 65 6d 2b 31 2c 20 61 6e 64 20 73 6f 20 66  BMem+1, and so f
2c8e0 6f 72 74 68 29 0a 20 20 20 20 20 20 2a 2a 20 54  orth).      ** T
2c8f0 68 65 6e 20 63 6f 6d 70 61 72 65 20 74 68 65 20  hen compare the 
2c900 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59  current GROUP BY
2c910 20 74 65 72 6d 73 20 61 67 61 69 6e 73 74 20 74   terms against t
2c920 68 65 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d  he GROUP BY term
2c930 73 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20  s.      ** from 
2c940 74 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77  the previous row
2c950 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65   currently store
2c960 64 20 69 6e 20 61 30 2c 20 61 31 2c 20 61 32 2e  d in a0, a1, a2.
2c970 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ...      */.    
2c980 20 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 20    addrTopOfLoop 
2c990 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
2c9a0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
2c9b0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
2c9c0 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
2c9d0 3b 0a 20 20 20 20 20 20 69 66 28 20 67 72 6f 75  ;.      if( grou
2c9e0 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20  pBySort ){.     
2c9f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2ca00 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
2ca10 72 44 61 74 61 2c 20 73 41 67 67 49 6e 66 6f 2e  rData, sAggInfo.
2ca20 73 6f 72 74 69 6e 67 49 64 78 2c 20 73 6f 72 74  sortingIdx, sort
2ca30 4f 75 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Out);.      }.  
2ca40 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
2ca50 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20  GroupBy->nExpr; 
2ca60 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
2ca70 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b  ( groupBySort ){
2ca80 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2ca90 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
2caa0 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 6f 72 74 50  OP_Column, sortP
2cab0 54 61 62 2c 20 6a 2c 20 69 42 4d 65 6d 2b 6a 29  Tab, j, iBMem+j)
2cac0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2cad0 6a 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64  j==0 ) sqlite3Vd
2cae0 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
2caf0 46 4c 41 47 5f 43 4c 45 41 52 43 41 43 48 45 29  FLAG_CLEARCACHE)
2cb00 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
2cb10 0a 20 20 20 20 20 20 20 20 20 20 73 41 67 67 49  .          sAggI
2cb20 6e 66 6f 2e 64 69 72 65 63 74 4d 6f 64 65 20 3d  nfo.directMode =
2cb30 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71   1;.          sq
2cb40 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
2cb50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e  arse, pGroupBy->
2cb60 61 5b 6a 5d 2e 70 45 78 70 72 2c 20 69 42 4d 65  a[j].pExpr, iBMe
2cb70 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  m+j);.        }.
2cb80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
2cb90 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
2cba0 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 69  v, OP_Compare, i
2cbb0 41 4d 65 6d 2c 20 69 42 4d 65 6d 2c 20 70 47 72  AMem, iBMem, pGr
2cbc0 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c 0a 20 20  oupBy->nExpr,.  
2cbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cbe0 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 73          (char*)s
2cbf0 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66  qlite3KeyInfoRef
2cc00 28 70 4b 65 79 49 6e 66 6f 29 2c 20 50 34 5f 4b  (pKeyInfo), P4_K
2cc10 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 6a  EYINFO);.      j
2cc20 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  1 = sqlite3VdbeC
2cc30 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
2cc40 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2cc50 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d  AddOp3(v, OP_Jum
2cc60 70 2c 20 6a 31 2b 31 2c 20 30 2c 20 6a 31 2b 31  p, j1+1, 0, j1+1
2cc70 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
2cc80 76 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65  v);..      /* Ge
2cc90 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
2cca0 20 72 75 6e 73 20 77 68 65 6e 65 76 65 72 20 74   runs whenever t
2ccb0 68 65 20 47 52 4f 55 50 20 42 59 20 63 68 61 6e  he GROUP BY chan
2ccc0 67 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68  ges..      ** Ch
2ccd0 61 6e 67 65 73 20 69 6e 20 74 68 65 20 47 52 4f  anges in the GRO
2cce0 55 50 20 42 59 20 61 72 65 20 64 65 74 65 63 74  UP BY are detect
2ccf0 65 64 20 62 79 20 74 68 65 20 70 72 65 76 69 6f  ed by the previo
2cd00 75 73 20 63 6f 64 65 0a 20 20 20 20 20 20 2a 2a  us code.      **
2cd10 20 62 6c 6f 63 6b 2e 20 20 49 66 20 74 68 65 72   block.  If ther
2cd20 65 20 77 65 72 65 20 6e 6f 20 63 68 61 6e 67 65  e were no change
2cd30 73 2c 20 74 68 69 73 20 62 6c 6f 63 6b 20 69 73  s, this block is
2cd40 20 73 6b 69 70 70 65 64 2e 0a 20 20 20 20 20 20   skipped..      
2cd50 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73  **.      ** This
2cd60 20 63 6f 64 65 20 63 6f 70 69 65 73 20 63 75 72   code copies cur
2cd70 72 65 6e 74 20 67 72 6f 75 70 20 62 79 20 74 65  rent group by te
2cd80 72 6d 73 20 69 6e 20 62 30 2c 62 31 2c 62 32 2c  rms in b0,b1,b2,
2cd90 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65  ....      ** ove
2cda0 72 20 74 6f 20 61 30 2c 61 31 2c 61 32 2e 20 20  r to a0,a1,a2.  
2cdb0 49 74 20 74 68 65 6e 20 63 61 6c 6c 73 20 74 68  It then calls th
2cdc0 65 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74  e output subrout
2cdd0 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64  ine.      ** and
2cde0 20 72 65 73 65 74 73 20 74 68 65 20 61 67 67 72   resets the aggr
2cdf0 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  egate accumulato
2ce00 72 20 72 65 67 69 73 74 65 72 73 20 69 6e 20 70  r registers in p
2ce10 72 65 70 61 72 61 74 69 6f 6e 0a 20 20 20 20 20  reparation.     
2ce20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65 78 74   ** for the next
2ce30 20 47 52 4f 55 50 20 42 59 20 62 61 74 63 68 2e   GROUP BY batch.
2ce40 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2ce50 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
2ce60 6f 76 65 28 70 50 61 72 73 65 2c 20 69 42 4d 65  ove(pParse, iBMe
2ce70 6d 2c 20 69 41 4d 65 6d 2c 20 70 47 72 6f 75 70  m, iAMem, pGroup
2ce80 42 79 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20  By->nExpr);.    
2ce90 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2cea0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
2ceb0 20 72 65 67 4f 75 74 70 75 74 52 6f 77 2c 20 61   regOutputRow, a
2cec0 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  ddrOutputRow);. 
2ced0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
2cee0 28 28 76 2c 20 22 6f 75 74 70 75 74 20 6f 6e 65  ((v, "output one
2cef0 20 72 6f 77 22 29 29 3b 0a 20 20 20 20 20 20 73   row"));.      s
2cf00 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2cf10 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 41  (v, OP_IfPos, iA
2cf20 62 6f 72 74 46 6c 61 67 2c 20 61 64 64 72 45 6e  bortFlag, addrEn
2cf30 64 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  d); VdbeCoverage
2cf40 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  (v);.      VdbeC
2cf50 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 68 65 63  omment((v, "chec
2cf60 6b 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b  k abort flag"));
2cf70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2cf80 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
2cf90 6f 73 75 62 2c 20 72 65 67 52 65 73 65 74 2c 20  osub, regReset, 
2cfa0 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20  addrReset);.    
2cfb0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
2cfc0 2c 20 22 72 65 73 65 74 20 61 63 63 75 6d 75 6c  , "reset accumul
2cfd0 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20  ator"));..      
2cfe0 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 67  /* Update the ag
2cff0 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61  gregate accumula
2d000 74 6f 72 73 20 62 61 73 65 64 20 6f 6e 20 74 68  tors based on th
2d010 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 20 20 20  e content of.   
2d020 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e     ** the curren
2d030 74 20 72 6f 77 0a 20 20 20 20 20 20 2a 2f 0a 20  t row.      */. 
2d040 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2d050 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b  JumpHere(v, j1);
2d060 0a 20 20 20 20 20 20 75 70 64 61 74 65 41 63 63  .      updateAcc
2d070 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c  umulator(pParse,
2d080 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
2d090 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2d0a0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
2d0b0 65 72 2c 20 31 2c 20 69 55 73 65 46 6c 61 67 29  er, 1, iUseFlag)
2d0c0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
2d0d0 65 6e 74 28 28 76 2c 20 22 69 6e 64 69 63 61 74  ent((v, "indicat
2d0e0 65 20 64 61 74 61 20 69 6e 20 61 63 63 75 6d 75  e data in accumu
2d0f0 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20  lator"));..     
2d100 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6c   /* End of the l
2d110 6f 6f 70 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  oop.      */.   
2d120 20 20 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f     if( groupBySo
2d130 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  rt ){.        sq
2d140 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2d150 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74  v, OP_SorterNext
2d160 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69  , sAggInfo.sorti
2d170 6e 67 49 64 78 2c 20 61 64 64 72 54 6f 70 4f 66  ngIdx, addrTopOf
2d180 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 56  Loop);.        V
2d190 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
2d1a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2d1b0 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
2d1c0 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20  eEnd(pWInfo);.  
2d1d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2d1e0 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c  eChangeToNoop(v,
2d1f0 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 29   addrSortingIdx)
2d200 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
2d210 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 66   /* Output the f
2d220 69 6e 61 6c 20 72 6f 77 20 6f 66 20 72 65 73 75  inal row of resu
2d230 6c 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  lt.      */.    
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 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
2d260 20 72 65 67 4f 75 74 70 75 74 52 6f 77 2c 20 61   regOutputRow, a
2d270 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  ddrOutputRow);. 
2d280 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
2d290 28 28 76 2c 20 22 6f 75 74 70 75 74 20 66 69 6e  ((v, "output fin
2d2a0 61 6c 20 72 6f 77 22 29 29 3b 0a 0a 20 20 20 20  al row"));..    
2d2b0 20 20 2f 2a 20 4a 75 6d 70 20 6f 76 65 72 20 74    /* Jump over t
2d2c0 68 65 20 73 75 62 72 6f 75 74 69 6e 65 73 0a 20  he subroutines. 
2d2d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
2d2e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2d2f0 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61  v, OP_Goto, 0, a
2d300 64 64 72 45 6e 64 29 3b 0a 0a 20 20 20 20 20 20  ddrEnd);..      
2d310 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
2d320 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75  broutine that ou
2d330 74 70 75 74 73 20 61 20 73 69 6e 67 6c 65 20 72  tputs a single r
2d340 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  ow of the result
2d350 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 2e 20 20  .      ** set.  
2d360 54 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20  This subroutine 
2d370 66 69 72 73 74 20 6c 6f 6f 6b 73 20 61 74 20 74  first looks at t
2d380 68 65 20 69 55 73 65 46 6c 61 67 2e 20 20 49 66  he iUseFlag.  If
2d390 20 69 55 73 65 46 6c 61 67 0a 20 20 20 20 20 20   iUseFlag.      
2d3a0 2a 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ** is less than 
2d3b0 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f  or equal to zero
2d3c0 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  , the subroutine
2d3d0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66   is a no-op.  If
2d3e0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72  .      ** the pr
2d3f0 6f 63 65 73 73 69 6e 67 20 63 61 6c 6c 73 20 66  ocessing calls f
2d400 6f 72 20 74 68 65 20 71 75 65 72 79 20 74 6f 20  or the query to 
2d410 61 62 6f 72 74 2c 20 74 68 69 73 20 73 75 62 72  abort, this subr
2d420 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20  outine.      ** 
2d430 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20 69  increments the i
2d440 41 62 6f 72 74 46 6c 61 67 20 6d 65 6d 6f 72 79  AbortFlag memory
2d450 20 6c 6f 63 61 74 69 6f 6e 20 62 65 66 6f 72 65   location before
2d460 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 0a 20 20   returning in.  
2d470 20 20 20 20 2a 2a 20 6f 72 64 65 72 20 74 6f 20      ** order to 
2d480 73 69 67 6e 61 6c 20 74 68 65 20 63 61 6c 6c 65  signal the calle
2d490 72 20 74 6f 20 61 62 6f 72 74 2e 0a 20 20 20 20  r to abort..    
2d4a0 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 53    */.      addrS
2d4b0 65 74 41 62 6f 72 74 20 3d 20 73 71 6c 69 74 65  etAbort = sqlite
2d4c0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
2d4d0 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
2d4e0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2d4f0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69  OP_Integer, 1, i
2d500 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20  AbortFlag);.    
2d510 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
2d520 2c 20 22 73 65 74 20 61 62 6f 72 74 20 66 6c 61  , "set abort fla
2d530 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  g"));.      sqli
2d540 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
2d550 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f   OP_Return, regO
2d560 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
2d570 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
2d580 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
2d590 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
2d5a0 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20    addrOutputRow 
2d5b0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
2d5c0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
2d5d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2d5e0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73  dOp2(v, OP_IfPos
2d5f0 2c 20 69 55 73 65 46 6c 61 67 2c 20 61 64 64 72  , iUseFlag, addr
2d600 4f 75 74 70 75 74 52 6f 77 2b 32 29 3b 20 56 64  OutputRow+2); Vd
2d610 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
2d620 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
2d630 28 28 76 2c 20 22 47 72 6f 75 70 62 79 20 72 65  ((v, "Groupby re
2d640 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 20 65  sult generator e
2d650 6e 74 72 79 20 70 6f 69 6e 74 22 29 29 3b 0a 20  ntry point"));. 
2d660 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2d670 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74  AddOp1(v, OP_Ret
2d680 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f  urn, regOutputRo
2d690 77 29 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c 69  w);.      finali
2d6a0 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70  zeAggFunctions(p
2d6b0 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
2d6c0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2d6d0 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
2d6e0 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64  se, pHaving, add
2d6f0 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 53 51  rOutputRow+1, SQ
2d700 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
2d710 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e  ;.      selectIn
2d720 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
2d730 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 2d 31  p, p->pEList, -1
2d740 2c 20 26 73 53 6f 72 74 2c 0a 20 20 20 20 20 20  , &sSort,.      
2d750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d760 26 73 44 69 73 74 69 6e 63 74 2c 20 70 44 65 73  &sDistinct, pDes
2d770 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
2d780 20 20 20 20 20 20 20 20 20 61 64 64 72 4f 75 74           addrOut
2d790 70 75 74 52 6f 77 2b 31 2c 20 61 64 64 72 53 65  putRow+1, addrSe
2d7a0 74 41 62 6f 72 74 29 3b 0a 20 20 20 20 20 20 73  tAbort);.      s
2d7b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
2d7c0 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72  (v, OP_Return, r
2d7d0 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  egOutputRow);.  
2d7e0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
2d7f0 28 76 2c 20 22 65 6e 64 20 67 72 6f 75 70 62 79  (v, "end groupby
2d800 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f   result generato
2d810 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  r"));..      /* 
2d820 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
2d830 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20  utine that will 
2d840 72 65 73 65 74 20 74 68 65 20 67 72 6f 75 70 2d  reset the group-
2d850 62 79 20 61 63 63 75 6d 75 6c 61 74 6f 72 0a 20  by accumulator. 
2d860 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
2d870 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
2d880 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 52 65 73  Label(v, addrRes
2d890 65 74 29 3b 0a 20 20 20 20 20 20 72 65 73 65 74  et);.      reset
2d8a0 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72  Accumulator(pPar
2d8b0 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
2d8c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2d8d0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
2d8e0 74 75 72 6e 2c 20 72 65 67 52 65 73 65 74 29 3b  turn, regReset);
2d8f0 0a 20 20 20 20 20 0a 20 20 20 20 7d 20 2f 2a 20  .     .    } /* 
2d900 65 6e 64 69 66 20 70 47 72 6f 75 70 42 79 2e 20  endif pGroupBy. 
2d910 20 42 65 67 69 6e 20 61 67 67 72 65 67 61 74 65   Begin aggregate
2d920 20 71 75 65 72 69 65 73 20 77 69 74 68 6f 75 74   queries without
2d930 20 47 52 4f 55 50 20 42 59 3a 20 2a 2f 0a 20 20   GROUP BY: */.  
2d940 20 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 45    else {.      E
2d950 78 70 72 4c 69 73 74 20 2a 70 44 65 6c 20 3d 20  xprList *pDel = 
2d960 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
2d970 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e  E_OMIT_BTREECOUN
2d980 54 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  T.      Table *p
2d990 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 28  Tab;.      if( (
2d9a0 70 54 61 62 20 3d 20 69 73 53 69 6d 70 6c 65 43  pTab = isSimpleC
2d9b0 6f 75 6e 74 28 70 2c 20 26 73 41 67 67 49 6e 66  ount(p, &sAggInf
2d9c0 6f 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  o))!=0 ){.      
2d9d0 20 20 2f 2a 20 49 66 20 69 73 53 69 6d 70 6c 65    /* If isSimple
2d9e0 43 6f 75 6e 74 28 29 20 72 65 74 75 72 6e 73 20  Count() returns 
2d9f0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 54  a pointer to a T
2da00 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 2c 20  able structure, 
2da10 74 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  then.        ** 
2da20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
2da30 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  t is of the form
2da40 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  :.        **.   
2da50 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54       **   SELECT
2da60 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c   count(*) FROM <
2da70 74 62 6c 3e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  tbl>.        **.
2da80 20 20 20 20 20 20 20 20 2a 2a 20 77 68 65 72 65          ** where
2da90 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63   the Table struc
2daa0 74 75 72 65 20 72 65 74 75 72 6e 65 64 20 72 65  ture returned re
2dab0 70 72 65 73 65 6e 74 73 20 74 61 62 6c 65 20 3c  presents table <
2dac0 74 62 6c 3e 2e 0a 20 20 20 20 20 20 20 20 2a 2a  tbl>..        **
2dad0 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73  .        ** This
2dae0 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73 6f   statement is so
2daf0 20 63 6f 6d 6d 6f 6e 20 74 68 61 74 20 69 74 20   common that it 
2db00 69 73 20 6f 70 74 69 6d 69 7a 65 64 20 73 70 65  is optimized spe
2db10 63 69 61 6c 6c 79 2e 20 54 68 65 0a 20 20 20 20  cially. The.    
2db20 20 20 20 20 2a 2a 20 4f 50 5f 43 6f 75 6e 74 20      ** OP_Count 
2db30 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 65  instruction is e
2db40 78 65 63 75 74 65 64 20 65 69 74 68 65 72 20 6f  xecuted either o
2db50 6e 20 74 68 65 20 69 6e 74 6b 65 79 20 74 61 62  n the intkey tab
2db60 6c 65 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  le that.        
2db70 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ** contains the 
2db80 64 61 74 61 20 66 6f 72 20 74 61 62 6c 65 20 3c  data for table <
2db90 74 62 6c 3e 20 6f 72 20 6f 6e 20 6f 6e 65 20 6f  tbl> or on one o
2dba0 66 20 69 74 73 20 69 6e 64 65 78 65 73 2e 20 49  f its indexes. I
2dbb0 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20  t.        ** is 
2dbc0 62 65 74 74 65 72 20 74 6f 20 65 78 65 63 75 74  better to execut
2dbd0 65 20 74 68 65 20 6f 70 20 6f 6e 20 61 6e 20 69  e the op on an i
2dbe0 6e 64 65 78 2c 20 61 73 20 69 6e 64 65 78 65 73  ndex, as indexes
2dbf0 20 61 72 65 20 61 6c 6d 6f 73 74 0a 20 20 20 20   are almost.    
2dc00 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 70      ** always sp
2dc10 72 65 61 64 20 61 63 72 6f 73 73 20 6c 65 73 73  read across less
2dc20 20 70 61 67 65 73 20 74 68 61 6e 20 74 68 65 69   pages than thei
2dc30 72 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  r corresponding 
2dc40 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 20 20  tables..        
2dc50 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  */.        const
2dc60 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
2dc70 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
2dc80 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
2dc90 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
2dca0 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 43      const int iC
2dcb0 73 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  sr = pParse->nTa
2dcc0 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 43 75 72 73  b++;     /* Curs
2dcd0 6f 72 20 74 6f 20 73 63 61 6e 20 62 2d 74 72 65  or to scan b-tre
2dce0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e 64  e */.        Ind
2dcf0 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20  ex *pIdx;       
2dd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dd10 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61    /* Iterator va
2dd20 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20  riable */.      
2dd30 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
2dd40 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 20  nfo = 0;        
2dd50 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 69 6e 66         /* Keyinf
2dd60 6f 20 66 6f 72 20 73 63 61 6e 6e 65 64 20 69 6e  o for scanned in
2dd70 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 49  dex */.        I
2dd80 6e 64 65 78 20 2a 70 42 65 73 74 20 3d 20 30 3b  ndex *pBest = 0;
2dd90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dda0 20 20 20 20 2f 2a 20 42 65 73 74 20 69 6e 64 65      /* Best inde
2ddb0 78 20 66 6f 75 6e 64 20 73 6f 20 66 61 72 20 2a  x found so far *
2ddc0 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 52  /.        int iR
2ddd0 6f 6f 74 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d  oot = pTab->tnum
2dde0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2ddf0 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 73  * Root page of s
2de00 63 61 6e 6e 65 64 20 62 2d 74 72 65 65 20 2a 2f  canned b-tree */
2de10 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ..        sqlite
2de20 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
2de30 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
2de40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54          sqlite3T
2de50 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c  ableLock(pParse,
2de60 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d   iDb, pTab->tnum
2de70 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  , 0, pTab->zName
2de80 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 53  );..        /* S
2de90 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 69 6e  earch for the in
2dea0 64 65 78 20 74 68 61 74 20 68 61 73 20 74 68 65  dex that has the
2deb0 20 6c 6f 77 65 73 74 20 73 63 61 6e 20 63 6f 73   lowest scan cos
2dec0 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  t..        **.  
2ded0 20 20 20 20 20 20 2a 2a 20 28 32 30 31 31 2d 30        ** (2011-0
2dee0 34 2d 31 35 29 20 44 6f 20 6e 6f 74 20 64 6f 20  4-15) Do not do 
2def0 61 20 66 75 6c 6c 20 73 63 61 6e 20 6f 66 20 61  a full scan of a
2df00 6e 20 75 6e 6f 72 64 65 72 65 64 20 69 6e 64 65  n unordered inde
2df10 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  x..        **.  
2df20 20 20 20 20 20 20 2a 2a 20 28 32 30 31 33 2d 31        ** (2013-1
2df30 30 2d 30 33 29 20 44 6f 20 6e 6f 74 20 63 6f 75  0-03) Do not cou
2df40 6e 74 20 74 68 65 20 65 6e 74 72 69 65 73 20 69  nt the entries i
2df50 6e 20 61 20 70 61 72 74 69 61 6c 20 69 6e 64 65  n a partial inde
2df60 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  x..        **.  
2df70 20 20 20 20 20 20 2a 2a 20 49 6e 20 70 72 61 63        ** In prac
2df80 74 69 63 65 20 74 68 65 20 4b 65 79 49 6e 66 6f  tice the KeyInfo
2df90 20 73 74 72 75 63 74 75 72 65 20 77 69 6c 6c 20   structure will 
2dfa0 6e 6f 74 20 62 65 20 75 73 65 64 2e 20 49 74 20  not be used. It 
2dfb0 69 73 20 6f 6e 6c 79 20 0a 20 20 20 20 20 20 20  is only .       
2dfc0 20 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 6b 65   ** passed to ke
2dfd0 65 70 20 4f 50 5f 4f 70 65 6e 52 65 61 64 20 68  ep OP_OpenRead h
2dfe0 61 70 70 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f  appy..        */
2dff0 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 48 61  .        if( !Ha
2e000 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 20 70  sRowid(pTab) ) p
2e010 42 65 73 74 20 3d 20 73 71 6c 69 74 65 33 50 72  Best = sqlite3Pr
2e020 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54  imaryKeyIndex(pT
2e030 61 62 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  ab);.        for
2e040 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
2e050 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
2e060 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
2e070 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
2e080 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d 30 0a 20  >bUnordered==0. 
2e090 20 20 20 20 20 20 20 20 20 20 26 26 20 70 49 64            && pId
2e0a0 78 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 54 61 62  x->szIdxRow<pTab
2e0b0 2d 3e 73 7a 54 61 62 52 6f 77 0a 20 20 20 20 20  ->szTabRow.     
2e0c0 20 20 20 20 20 20 26 26 20 70 49 64 78 2d 3e 70        && pIdx->p
2e0d0 50 61 72 74 49 64 78 57 68 65 72 65 3d 3d 30 0a  PartIdxWhere==0.
2e0e0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 21             && (!
2e0f0 70 42 65 73 74 20 7c 7c 20 70 49 64 78 2d 3e 73  pBest || pIdx->s
2e100 7a 49 64 78 52 6f 77 3c 70 42 65 73 74 2d 3e 73  zIdxRow<pBest->s
2e110 7a 49 64 78 52 6f 77 29 0a 20 20 20 20 20 20 20  zIdxRow).       
2e120 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
2e130 20 20 70 42 65 73 74 20 3d 20 70 49 64 78 3b 0a    pBest = pIdx;.
2e140 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2e150 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
2e160 28 20 70 42 65 73 74 20 29 7b 0a 20 20 20 20 20  ( pBest ){.     
2e170 20 20 20 20 20 69 52 6f 6f 74 20 3d 20 70 42 65       iRoot = pBe
2e180 73 74 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20  st->tnum;.      
2e190 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73      pKeyInfo = s
2e1a0 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49  qlite3KeyInfoOfI
2e1b0 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 42 65  ndex(pParse, pBe
2e1c0 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  st);.        }..
2e1d0 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
2e1e0 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73  a read-only curs
2e1f0 6f 72 2c 20 65 78 65 63 75 74 65 20 74 68 65 20  or, execute the 
2e200 4f 50 5f 43 6f 75 6e 74 2c 20 63 6c 6f 73 65 20  OP_Count, close 
2e210 74 68 65 20 63 75 72 73 6f 72 2e 20 2a 2f 0a 20  the cursor. */. 
2e220 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2e230 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
2e240 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 43 73 72  P_OpenRead, iCsr
2e250 2c 20 69 52 6f 6f 74 2c 20 69 44 62 2c 20 31 29  , iRoot, iDb, 1)
2e260 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4b  ;.        if( pK
2e270 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20  eyInfo ){.      
2e280 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
2e290 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28  hangeP4(v, -1, (
2e2a0 63 68 61 72 20 2a 29 70 4b 65 79 49 6e 66 6f 2c  char *)pKeyInfo,
2e2b0 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
2e2c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2e2d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2e2e0 32 28 76 2c 20 4f 50 5f 43 6f 75 6e 74 2c 20 69  2(v, OP_Count, i
2e2f0 43 73 72 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46  Csr, sAggInfo.aF
2e300 75 6e 63 5b 30 5d 2e 69 4d 65 6d 29 3b 0a 20 20  unc[0].iMem);.  
2e310 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2e320 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c  eAddOp1(v, OP_Cl
2e330 6f 73 65 2c 20 69 43 73 72 29 3b 0a 20 20 20 20  ose, iCsr);.    
2e340 20 20 20 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c      explainSimpl
2e350 65 43 6f 75 6e 74 28 70 50 61 72 73 65 2c 20 70  eCount(pParse, p
2e360 54 61 62 2c 20 70 42 65 73 74 29 3b 0a 20 20 20  Tab, pBest);.   
2e370 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20     }else.#endif 
2e380 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42  /* SQLITE_OMIT_B
2e390 54 52 45 45 43 4f 55 4e 54 20 2a 2f 0a 20 20 20  TREECOUNT */.   
2e3a0 20 20 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20     {.        /* 
2e3b0 43 68 65 63 6b 20 69 66 20 74 68 65 20 71 75 65  Check if the que
2e3c0 72 79 20 69 73 20 6f 66 20 6f 6e 65 20 6f 66 20  ry is of one of 
2e3d0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f  the following fo
2e3e0 72 6d 73 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a  rms:.        **.
2e3f0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c          **   SEL
2e400 45 43 54 20 6d 69 6e 28 78 29 20 46 52 4f 4d 20  ECT min(x) FROM 
2e410 2e 2e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  ....        **  
2e420 20 53 45 4c 45 43 54 20 6d 61 78 28 78 29 20 46   SELECT max(x) F
2e430 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 20 20  ROM ....        
2e440 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 66  **.        ** If
2e450 20 69 74 20 69 73 2c 20 74 68 65 6e 20 61 73 6b   it is, then ask
2e460 20 74 68 65 20 63 6f 64 65 20 69 6e 20 77 68 65   the code in whe
2e470 72 65 2e 63 20 74 6f 20 61 74 74 65 6d 70 74 20  re.c to attempt 
2e480 74 6f 20 73 6f 72 74 20 72 65 73 75 6c 74 73 0a  to sort results.
2e490 20 20 20 20 20 20 20 20 2a 2a 20 61 73 20 69 66          ** as if
2e4a0 20 74 68 65 72 65 20 77 61 73 20 61 6e 20 22 4f   there was an "O
2e4b0 52 44 45 52 20 4f 4e 20 78 22 20 6f 72 20 22 4f  RDER ON x" or "O
2e4c0 52 44 45 52 20 4f 4e 20 78 20 44 45 53 43 22 20  RDER ON x DESC" 
2e4d0 63 6c 61 75 73 65 2e 20 0a 20 20 20 20 20 20 20  clause. .       
2e4e0 20 2a 2a 20 49 66 20 77 68 65 72 65 2e 63 20 69   ** If where.c i
2e4f0 73 20 61 62 6c 65 20 74 6f 20 70 72 6f 64 75 63  s able to produc
2e500 65 20 72 65 73 75 6c 74 73 20 73 6f 72 74 65 64  e results sorted
2e510 20 69 6e 20 74 68 69 73 20 6f 72 64 65 72 2c 20   in this order, 
2e520 74 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  then.        ** 
2e530 61 64 64 20 76 64 62 65 20 63 6f 64 65 20 74 6f  add vdbe code to
2e540 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68   break out of th
2e550 65 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 6f  e processing loo
2e560 70 20 61 66 74 65 72 20 74 68 65 20 0a 20 20 20  p after the .   
2e570 20 20 20 20 20 2a 2a 20 66 69 72 73 74 20 69 74       ** first it
2e580 65 72 61 74 69 6f 6e 20 28 73 69 6e 63 65 20 74  eration (since t
2e590 68 65 20 66 69 72 73 74 20 69 74 65 72 61 74 69  he first iterati
2e5a0 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69  on of the loop i
2e5b0 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 67 75  s .        ** gu
2e5c0 61 72 61 6e 74 65 65 64 20 74 6f 20 6f 70 65 72  aranteed to oper
2e5d0 61 74 65 20 6f 6e 20 74 68 65 20 72 6f 77 20 77  ate on the row w
2e5e0 69 74 68 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20  ith the minimum 
2e5f0 6f 72 20 6d 61 78 69 6d 75 6d 20 0a 20 20 20 20  or maximum .    
2e600 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20      ** value of 
2e610 78 2c 20 74 68 65 20 6f 6e 6c 79 20 72 6f 77 20  x, the only row 
2e620 72 65 71 75 69 72 65 64 29 2e 0a 20 20 20 20 20  required)..     
2e630 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
2e640 20 41 20 73 70 65 63 69 61 6c 20 66 6c 61 67 20   A special flag 
2e650 6d 75 73 74 20 62 65 20 70 61 73 73 65 64 20 74  must be passed t
2e660 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  o sqlite3WhereBe
2e670 67 69 6e 28 29 20 74 6f 20 73 6c 69 67 68 74 6c  gin() to slightl
2e680 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64  y.        ** mod
2e690 69 66 79 20 62 65 68 61 76 69 6f 72 20 61 73 20  ify behavior as 
2e6a0 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20 20  follows:.       
2e6b0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   **.        **  
2e6c0 20 2b 20 49 66 20 74 68 65 20 71 75 65 72 79 20   + If the query 
2e6d0 69 73 20 61 20 22 53 45 4c 45 43 54 20 6d 69 6e  is a "SELECT min
2e6e0 28 78 29 22 2c 20 74 68 65 6e 20 74 68 65 20 6c  (x)", then the l
2e6f0 6f 6f 70 20 63 6f 64 65 64 20 62 79 0a 20 20 20  oop coded by.   
2e700 20 20 20 20 20 2a 2a 20 20 20 20 20 77 68 65 72       **     wher
2e710 65 2e 63 20 73 68 6f 75 6c 64 20 6e 6f 74 20 69  e.c should not i
2e720 74 65 72 61 74 65 20 6f 76 65 72 20 61 6e 79 20  terate over any 
2e730 76 61 6c 75 65 73 20 77 69 74 68 20 61 20 4e 55  values with a NU
2e740 4c 4c 20 76 61 6c 75 65 0a 20 20 20 20 20 20 20  LL value.       
2e750 20 2a 2a 20 20 20 20 20 66 6f 72 20 78 2e 0a 20   **     for x.. 
2e760 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
2e770 20 20 2a 2a 20 20 20 2b 20 54 68 65 20 6f 70 74    **   + The opt
2e780 69 6d 69 7a 65 72 20 63 6f 64 65 20 69 6e 20 77  imizer code in w
2e790 68 65 72 65 2e 63 20 28 74 68 65 20 74 68 69 6e  here.c (the thin
2e7a0 67 20 74 68 61 74 20 64 65 63 69 64 65 73 20 77  g that decides w
2e7b0 68 69 63 68 0a 20 20 20 20 20 20 20 20 2a 2a 20  hich.        ** 
2e7c0 20 20 20 20 69 6e 64 65 78 20 6f 72 20 69 6e 64      index or ind
2e7d0 69 63 65 73 20 74 6f 20 75 73 65 29 20 73 68 6f  ices to use) sho
2e7e0 75 6c 64 20 70 6c 61 63 65 20 61 20 64 69 66 66  uld place a diff
2e7f0 65 72 65 6e 74 20 70 72 69 6f 72 69 74 79 20 6f  erent priority o
2e800 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  n .        **   
2e810 20 20 73 61 74 69 73 66 79 69 6e 67 20 74 68 65    satisfying the
2e820 20 27 4f 52 44 45 52 20 42 59 27 20 63 6c 61 75   'ORDER BY' clau
2e830 73 65 20 74 68 61 6e 20 69 74 20 64 6f 65 73 20  se than it does 
2e840 69 6e 20 6f 74 68 65 72 20 63 61 73 65 73 2e 0a  in other cases..
2e850 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 52          **     R
2e860 65 66 65 72 20 74 6f 20 63 6f 64 65 20 61 6e 64  efer to code and
2e870 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 77 68 65   comments in whe
2e880 72 65 2e 63 20 66 6f 72 20 64 65 74 61 69 6c 73  re.c for details
2e890 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
2e8a0 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
2e8b0 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a 20 20 20 20  MinMax = 0;.    
2e8c0 20 20 20 20 75 38 20 66 6c 61 67 20 3d 20 57 48      u8 flag = WH
2e8d0 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d  ERE_ORDERBY_NORM
2e8e0 41 4c 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20  AL;.        .   
2e8f0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
2e900 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20  pGroupBy==0 );. 
2e910 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 66         assert( f
2e920 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  lag==0 );.      
2e930 20 20 69 66 28 20 70 2d 3e 70 48 61 76 69 6e 67    if( p->pHaving
2e940 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2e950 20 66 6c 61 67 20 3d 20 6d 69 6e 4d 61 78 51 75   flag = minMaxQu
2e960 65 72 79 28 26 73 41 67 67 49 6e 66 6f 2c 20 26  ery(&sAggInfo, &
2e970 70 4d 69 6e 4d 61 78 29 3b 0a 20 20 20 20 20 20  pMinMax);.      
2e980 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
2e990 72 74 28 20 66 6c 61 67 3d 3d 30 20 7c 7c 20 28  rt( flag==0 || (
2e9a0 70 4d 69 6e 4d 61 78 21 3d 30 20 26 26 20 70 4d  pMinMax!=0 && pM
2e9b0 69 6e 4d 61 78 2d 3e 6e 45 78 70 72 3d 3d 31 29  inMax->nExpr==1)
2e9c0 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28   );..        if(
2e9d0 20 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20   flag ){.       
2e9e0 20 20 20 70 4d 69 6e 4d 61 78 20 3d 20 73 71 6c     pMinMax = sql
2e9f0 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
2ea00 64 62 2c 20 70 4d 69 6e 4d 61 78 2c 20 30 29 3b  db, pMinMax, 0);
2ea10 0a 20 20 20 20 20 20 20 20 20 20 70 44 65 6c 20  .          pDel 
2ea20 3d 20 70 4d 69 6e 4d 61 78 3b 0a 20 20 20 20 20  = pMinMax;.     
2ea30 20 20 20 20 20 69 66 28 20 70 4d 69 6e 4d 61 78       if( pMinMax
2ea40 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46   && !db->mallocF
2ea50 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20  ailed ){.       
2ea60 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b       pMinMax->a[
2ea70 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 66  0].sortOrder = f
2ea80 6c 61 67 21 3d 57 48 45 52 45 5f 4f 52 44 45 52  lag!=WHERE_ORDER
2ea90 42 59 5f 4d 49 4e 20 3f 31 3a 30 3b 0a 20 20 20  BY_MIN ?1:0;.   
2eaa0 20 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78           pMinMax
2eab0 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70  ->a[0].pExpr->op
2eac0 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20   = TK_COLUMN;.  
2ead0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2eae0 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 2f    }.  .        /
2eaf0 2a 20 54 68 69 73 20 63 61 73 65 20 72 75 6e 73  * This case runs
2eb00 20 69 66 20 74 68 65 20 61 67 67 72 65 67 61 74   if the aggregat
2eb10 65 20 68 61 73 20 6e 6f 20 47 52 4f 55 50 20 42  e has no GROUP B
2eb20 59 20 63 6c 61 75 73 65 2e 20 20 54 68 65 0a 20  Y clause.  The. 
2eb30 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73         ** proces
2eb40 73 69 6e 67 20 69 73 20 6d 75 63 68 20 73 69 6d  sing is much sim
2eb50 70 6c 65 72 20 73 69 6e 63 65 20 74 68 65 72 65  pler since there
2eb60 20 69 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c   is only a singl
2eb70 65 20 72 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a  e row.        **
2eb80 20 6f 66 20 6f 75 74 70 75 74 2e 0a 20 20 20 20   of output..    
2eb90 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72      */.        r
2eba0 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28  esetAccumulator(
2ebb0 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
2ebc0 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 57 49 6e  o);.        pWIn
2ebd0 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  fo = sqlite3Wher
2ebe0 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70  eBegin(pParse, p
2ebf0 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c  TabList, pWhere,
2ec00 20 70 4d 69 6e 4d 61 78 2c 30 2c 66 6c 61 67 2c   pMinMax,0,flag,
2ec10 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
2ec20 70 57 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20  pWInfo==0 ){.   
2ec30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
2ec40 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
2ec50 20 70 44 65 6c 29 3b 0a 20 20 20 20 20 20 20 20   pDel);.        
2ec60 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
2ec70 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
2ec80 20 20 20 20 20 75 70 64 61 74 65 41 63 63 75 6d       updateAccum
2ec90 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26  ulator(pParse, &
2eca0 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
2ecb0 20 20 20 61 73 73 65 72 74 28 20 70 4d 69 6e 4d     assert( pMinM
2ecc0 61 78 3d 3d 30 20 7c 7c 20 70 4d 69 6e 4d 61 78  ax==0 || pMinMax
2ecd0 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20  ->nExpr==1 );.  
2ece0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
2ecf0 33 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28  3WhereIsOrdered(
2ed00 70 57 49 6e 66 6f 29 3e 30 20 29 7b 0a 20 20 20  pWInfo)>0 ){.   
2ed10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2ed20 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
2ed30 6f 74 6f 2c 20 30 2c 20 73 71 6c 69 74 65 33 57  oto, 0, sqlite3W
2ed40 68 65 72 65 42 72 65 61 6b 4c 61 62 65 6c 28 70  hereBreakLabel(p
2ed50 57 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20 20  WInfo));.       
2ed60 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
2ed70 76 2c 20 22 25 73 28 29 20 62 79 20 69 6e 64 65  v, "%s() by inde
2ed80 78 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  x",.            
2ed90 20 20 20 20 28 66 6c 61 67 3d 3d 57 48 45 52 45      (flag==WHERE
2eda0 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3f 22 6d 69  _ORDERBY_MIN?"mi
2edb0 6e 22 3a 22 6d 61 78 22 29 29 29 3b 0a 20 20 20  n":"max")));.   
2edc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
2edd0 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
2ede0 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  WInfo);.        
2edf0 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74  finalizeAggFunct
2ee00 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41  ions(pParse, &sA
2ee10 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 7d  ggInfo);.      }
2ee20 0a 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f  ..      sSort.pO
2ee30 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
2ee40 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
2ee50 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48 61  alse(pParse, pHa
2ee60 76 69 6e 67 2c 20 61 64 64 72 45 6e 64 2c 20 53  ving, addrEnd, S
2ee70 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
2ee80 29 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49  );.      selectI
2ee90 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
2eea0 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 2d   p, p->pEList, -
2eeb0 31 2c 20 30 2c 20 30 2c 20 0a 20 20 20 20 20 20  1, 0, 0, .      
2eec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eed0 70 44 65 73 74 2c 20 61 64 64 72 45 6e 64 2c 20  pDest, addrEnd, 
2eee0 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20  addrEnd);.      
2eef0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
2ef00 65 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 29 3b  elete(db, pDel);
2ef10 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
2ef20 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
2ef30 65 6c 28 76 2c 20 61 64 64 72 45 6e 64 29 3b 0a  el(v, addrEnd);.
2ef40 20 20 20 20 0a 20 20 7d 20 2f 2a 20 65 6e 64 69      .  } /* endi
2ef50 66 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  f aggregate quer
2ef60 79 20 2a 2f 0a 0a 20 20 69 66 28 20 73 44 69 73  y */..  if( sDis
2ef70 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 3d  tinct.eTnctType=
2ef80 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f  =WHERE_DISTINCT_
2ef90 55 4e 4f 52 44 45 52 45 44 20 29 7b 0a 20 20 20  UNORDERED ){.   
2efa0 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c   explainTempTabl
2efb0 65 28 70 50 61 72 73 65 2c 20 22 44 49 53 54 49  e(pParse, "DISTI
2efc0 4e 43 54 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  NCT");.  }..  /*
2efd0 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   If there is an 
2efe0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
2eff0 20 74 68 65 6e 20 77 65 20 6e 65 65 64 20 74 6f   then we need to
2f000 20 73 6f 72 74 20 74 68 65 20 72 65 73 75 6c 74   sort the result
2f010 73 0a 20 20 2a 2a 20 61 6e 64 20 73 65 6e 64 20  s.  ** and send 
2f020 74 68 65 6d 20 74 6f 20 74 68 65 20 63 61 6c 6c  them to the call
2f030 62 61 63 6b 20 6f 6e 65 20 62 79 20 6f 6e 65 2e  back one by one.
2f040 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 53 6f 72  .  */.  if( sSor
2f050 74 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  t.pOrderBy ){.  
2f060 20 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62    explainTempTab
2f070 6c 65 28 70 50 61 72 73 65 2c 20 73 53 6f 72 74  le(pParse, sSort
2f080 2e 6e 4f 42 53 61 74 3e 30 20 3f 20 22 52 49 47  .nOBSat>0 ? "RIG
2f090 48 54 20 50 41 52 54 20 4f 46 20 4f 52 44 45 52  HT PART OF ORDER
2f0a0 20 42 59 22 3a 22 4f 52 44 45 52 20 42 59 22 29   BY":"ORDER BY")
2f0b0 3b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f  ;.    generateSo
2f0c0 72 74 54 61 69 6c 28 70 50 61 72 73 65 2c 20 70  rtTail(pParse, p
2f0d0 2c 20 26 73 53 6f 72 74 2c 20 70 45 4c 69 73 74  , &sSort, pEList
2f0e0 2d 3e 6e 45 78 70 72 2c 20 70 44 65 73 74 29 3b  ->nExpr, pDest);
2f0f0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  .  }..  /* Jump 
2f100 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68 69  here to skip thi
2f110 73 20 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73  s query.  */.  s
2f120 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
2f130 65 4c 61 62 65 6c 28 76 2c 20 69 45 6e 64 29 3b  eLabel(v, iEnd);
2f140 0a 0a 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43  ..  /* The SELEC
2f150 54 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  T was successful
2f160 6c 79 20 63 6f 64 65 64 2e 20 20 20 53 65 74 20  ly coded.   Set 
2f170 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  the return code 
2f180 74 6f 20 30 0a 20 20 2a 2a 20 74 6f 20 69 6e 64  to 0.  ** to ind
2f190 69 63 61 74 65 20 6e 6f 20 65 72 72 6f 72 73 2e  icate no errors.
2f1a0 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 30 3b 0a  .  */.  rc = 0;.
2f1b0 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75  .  /* Control ju
2f1c0 6d 70 73 20 74 6f 20 68 65 72 65 20 69 66 20 61  mps to here if a
2f1d0 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  n error is encou
2f1e0 6e 74 65 72 65 64 20 61 62 6f 76 65 2c 20 6f 72  ntered above, or
2f1f0 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63 65   upon.  ** succe
2f200 73 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66 20  ssful coding of 
2f210 74 68 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2f  the SELECT..  */
2f220 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 65  .select_end:.  e
2f230 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
2f240 28 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74  (pParse->iSelect
2f250 49 64 2c 20 69 52 65 73 74 6f 72 65 53 65 6c 65  Id, iRestoreSele
2f260 63 74 49 64 29 3b 0a 0a 20 20 2f 2a 20 49 64 65  ctId);..  /* Ide
2f270 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d  ntify column nam
2f280 65 73 20 69 66 20 72 65 73 75 6c 74 73 20 6f 66  es if results of
2f290 20 74 68 65 20 53 45 4c 45 43 54 20 61 72 65 20   the SELECT are 
2f2a0 74 6f 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20  to be output..  
2f2b0 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
2f2c0 49 54 45 5f 4f 4b 20 26 26 20 70 44 65 73 74 2d  ITE_OK && pDest-
2f2d0 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70  >eDest==SRT_Outp
2f2e0 75 74 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61  ut ){.    genera
2f2f0 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  teColumnNames(pP
2f300 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
2f310 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20  pEList);.  }..  
2f320 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
2f330 2c 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 29  , sAggInfo.aCol)
2f340 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
2f350 65 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61  e(db, sAggInfo.a
2f360 46 75 6e 63 29 3b 0a 20 20 72 65 74 75 72 6e 20  Func);.  return 
2f370 72 63 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e  rc;.}..#if defin
2f380 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
2f390 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 29 0a 2f  _TREE_EXPLAIN)./
2f3a0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20  *.** Generate a 
2f3b0 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 64  human-readable d
2f3c0 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 61 20  escription of a 
2f3d0 74 68 65 20 53 65 6c 65 63 74 20 6f 62 6a 65 63  the Select objec
2f3e0 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
2f3f0 64 20 65 78 70 6c 61 69 6e 4f 6e 65 53 65 6c 65  d explainOneSele
2f400 63 74 28 56 64 62 65 20 2a 70 56 64 62 65 2c 20  ct(Vdbe *pVdbe, 
2f410 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 73 71  Select *p){.  sq
2f420 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
2f430 74 66 28 70 56 64 62 65 2c 20 22 53 45 4c 45 43  tf(pVdbe, "SELEC
2f440 54 20 22 29 3b 0a 20 20 69 66 28 20 70 2d 3e 73  T ");.  if( p->s
2f450 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69  elFlags & (SF_Di
2f460 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67  stinct|SF_Aggreg
2f470 61 74 65 29 20 29 7b 0a 20 20 20 20 69 66 28 20  ate) ){.    if( 
2f480 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
2f490 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  _Distinct ){.   
2f4a0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2f4b0 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22  nPrintf(pVdbe, "
2f4c0 44 49 53 54 49 4e 43 54 20 22 29 3b 0a 20 20 20  DISTINCT ");.   
2f4d0 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 65   }.    if( p->se
2f4e0 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72  lFlags & SF_Aggr
2f4f0 65 67 61 74 65 20 29 7b 0a 20 20 20 20 20 20 73  egate ){.      s
2f500 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
2f510 6e 74 66 28 70 56 64 62 65 2c 20 22 61 67 67 5f  ntf(pVdbe, "agg_
2f520 66 6c 61 67 20 22 29 3b 0a 20 20 20 20 7d 0a 20  flag ");.    }. 
2f530 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2f540 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 20 20  nNL(pVdbe);.    
2f550 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
2f560 69 6e 74 66 28 70 56 64 62 65 2c 20 22 20 20 20  intf(pVdbe, "   
2f570 22 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ");.  }.  sqlite
2f580 33 45 78 70 6c 61 69 6e 45 78 70 72 4c 69 73 74  3ExplainExprList
2f590 28 70 56 64 62 65 2c 20 70 2d 3e 70 45 4c 69 73  (pVdbe, p->pELis
2f5a0 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  t);.  sqlite3Exp
2f5b0 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20  lainNL(pVdbe);. 
2f5c0 20 69 66 28 20 70 2d 3e 70 53 72 63 20 26 26 20   if( p->pSrc && 
2f5d0 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 20 29 7b  p->pSrc->nSrc ){
2f5e0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
2f5f0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
2f600 69 6e 74 66 28 70 56 64 62 65 2c 20 22 46 52 4f  intf(pVdbe, "FRO
2f610 4d 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  M ");.    sqlite
2f620 33 45 78 70 6c 61 69 6e 50 75 73 68 28 70 56 64  3ExplainPush(pVd
2f630 62 65 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  be);.    for(i=0
2f640 3b 20 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53 72  ; i<p->pSrc->nSr
2f650 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  c; i++){.      s
2f660 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
2f670 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e  em *pItem = &p->
2f680 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  pSrc->a[i];.    
2f690 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2f6a0 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 7b  Printf(pVdbe, "{
2f6b0 25 64 2c 2a 7d 20 3d 20 22 2c 20 70 49 74 65 6d  %d,*} = ", pItem
2f6c0 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ->iCursor);.    
2f6d0 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65    if( pItem->pSe
2f6e0 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  lect ){.        
2f6f0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 53 65  sqlite3ExplainSe
2f700 6c 65 63 74 28 70 56 64 62 65 2c 20 70 49 74 65  lect(pVdbe, pIte
2f710 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  m->pSelect);.   
2f720 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
2f730 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20  pTab ){.        
2f740 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2f750 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 20  Printf(pVdbe, " 
2f760 28 74 61 62 6e 61 6d 65 3d 25 73 29 22 2c 20 70  (tabname=%s)", p
2f770 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  Item->pTab->zNam
2f780 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
2f790 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 49      }else if( pI
2f7a0 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20  tem->zName ){.  
2f7b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2f7c0 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65  lainPrintf(pVdbe
2f7d0 2c 20 22 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a  , "%s", pItem->z
2f7e0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
2f7f0 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
2f800 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20  zAlias ){.      
2f810 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2f820 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 20  Printf(pVdbe, " 
2f830 28 41 53 20 25 73 29 22 2c 20 70 49 74 65 6d 2d  (AS %s)", pItem-
2f840 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 20 20  >zAlias);.      
2f850 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  }.      if( pIte
2f860 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  m->jointype & JT
2f870 5f 4c 45 46 54 20 29 7b 0a 20 20 20 20 20 20 20  _LEFT ){.       
2f880 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
2f890 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 20 4c  rintf(pVdbe, " L
2f8a0 45 46 54 2d 4a 4f 49 4e 22 29 3b 0a 20 20 20 20  EFT-JOIN");.    
2f8b0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
2f8c0 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65  3ExplainNL(pVdbe
2f8d0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
2f8e0 69 74 65 33 45 78 70 6c 61 69 6e 50 6f 70 28 70  ite3ExplainPop(p
2f8f0 56 64 62 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Vdbe);.  }.  if(
2f900 20 70 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20 20   p->pWhere ){.  
2f910 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2f920 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 57  Printf(pVdbe, "W
2f930 48 45 52 45 20 22 29 3b 0a 20 20 20 20 73 71 6c  HERE ");.    sql
2f940 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28  ite3ExplainExpr(
2f950 70 56 64 62 65 2c 20 70 2d 3e 70 57 68 65 72 65  pVdbe, p->pWhere
2f960 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
2f970 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a  plainNL(pVdbe);.
2f980 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 47 72    }.  if( p->pGr
2f990 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 73 71 6c  oupBy ){.    sql
2f9a0 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
2f9b0 66 28 70 56 64 62 65 2c 20 22 47 52 4f 55 50 42  f(pVdbe, "GROUPB
2f9c0 59 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Y ");.    sqlite
2f9d0 33 45 78 70 6c 61 69 6e 45 78 70 72 4c 69 73 74  3ExplainExprList
2f9e0 28 70 56 64 62 65 2c 20 70 2d 3e 70 47 72 6f 75  (pVdbe, p->pGrou
2f9f0 70 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBy);.    sqlite
2fa00 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65  3ExplainNL(pVdbe
2fa10 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
2fa20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 73  pHaving ){.    s
2fa30 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
2fa40 6e 74 66 28 70 56 64 62 65 2c 20 22 48 41 56 49  ntf(pVdbe, "HAVI
2fa50 4e 47 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  NG ");.    sqlit
2fa60 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70 56  e3ExplainExpr(pV
2fa70 64 62 65 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29  dbe, p->pHaving)
2fa80 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
2fa90 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20  lainNL(pVdbe);. 
2faa0 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64   }.  if( p->pOrd
2fab0 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  erBy ){.    sqli
2fac0 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
2fad0 28 70 56 64 62 65 2c 20 22 4f 52 44 45 52 42 59  (pVdbe, "ORDERBY
2fae0 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   ");.    sqlite3
2faf0 45 78 70 6c 61 69 6e 45 78 70 72 4c 69 73 74 28  ExplainExprList(
2fb00 70 56 64 62 65 2c 20 70 2d 3e 70 4f 72 64 65 72  pVdbe, p->pOrder
2fb10 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  By);.    sqlite3
2fb20 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29  ExplainNL(pVdbe)
2fb30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
2fb40 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  Limit ){.    sql
2fb50 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
2fb60 66 28 70 56 64 62 65 2c 20 22 4c 49 4d 49 54 20  f(pVdbe, "LIMIT 
2fb70 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  ");.    sqlite3E
2fb80 78 70 6c 61 69 6e 45 78 70 72 28 70 56 64 62 65  xplainExpr(pVdbe
2fb90 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20  , p->pLimit);.  
2fba0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2fbb0 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a 20  NL(pVdbe);.  }. 
2fbc0 20 69 66 28 20 70 2d 3e 70 4f 66 66 73 65 74 20   if( p->pOffset 
2fbd0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
2fbe0 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62  plainPrintf(pVdb
2fbf0 65 2c 20 22 4f 46 46 53 45 54 20 22 29 3b 0a 20  e, "OFFSET ");. 
2fc00 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2fc10 6e 45 78 70 72 28 70 56 64 62 65 2c 20 70 2d 3e  nExpr(pVdbe, p->
2fc20 70 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 73 71  pOffset);.    sq
2fc30 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70  lite3ExplainNL(p
2fc40 56 64 62 65 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69  Vdbe);.  }.}.voi
2fc50 64 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e  d sqlite3Explain
2fc60 53 65 6c 65 63 74 28 56 64 62 65 20 2a 70 56 64  Select(Vdbe *pVd
2fc70 62 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  be, Select *p){.
2fc80 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20    if( p==0 ){.  
2fc90 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2fca0 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 28  Printf(pVdbe, "(
2fcb0 6e 75 6c 6c 2d 73 65 6c 65 63 74 29 22 29 3b 0a  null-select)");.
2fcc0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
2fcd0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2fce0 50 75 73 68 28 70 56 64 62 65 29 3b 0a 20 20 77  Push(pVdbe);.  w
2fcf0 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 65  hile( p ){.    e
2fd00 78 70 6c 61 69 6e 4f 6e 65 53 65 6c 65 63 74 28  xplainOneSelect(
2fd10 70 56 64 62 65 2c 20 70 29 3b 0a 20 20 20 20 70  pVdbe, p);.    p
2fd20 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   = p->pNext;.   
2fd30 20 69 66 28 20 70 3d 3d 30 20 29 20 62 72 65 61   if( p==0 ) brea
2fd40 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  k;.    sqlite3Ex
2fd50 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a  plainNL(pVdbe);.
2fd60 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
2fd70 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20  inPrintf(pVdbe, 
2fd80 22 25 73 5c 6e 22 2c 20 73 65 6c 65 63 74 4f 70  "%s\n", selectOp
2fd90 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20  Name(p->op));.  
2fda0 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61  }.  sqlite3Expla
2fdb0 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20  inPrintf(pVdbe, 
2fdc0 22 45 4e 44 22 29 3b 0a 20 20 73 71 6c 69 74 65  "END");.  sqlite
2fdd0 33 45 78 70 6c 61 69 6e 50 6f 70 28 70 56 64 62  3ExplainPop(pVdb
2fde0 65 29 3b 0a 7d 0a 0a 2f 2a 20 45 6e 64 20 6f 66  e);.}../* End of
2fdf0 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 64   the structure d
2fe00 65 62 75 67 20 70 72 69 6e 74 69 6e 67 20 63 6f  ebug printing co
2fe10 64 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  de.*************
2fe20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2fe30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2fe40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2fe50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2fe60 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69  /.#endif /* defi
2fe70 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
2fe80 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 29 20  E_TREE_EXPLAIN) 
2fe90 2a 2f 0a                                         */.